]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/mutators/mutator/random_items/sv_random_items.qc
Refactoring item system.
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mutators / mutator / random_items / sv_random_items.qc
1 /// \file
2 /// \brief Source file that contains implementation of the random items mutator.
3 /// \author Lyberta
4 /// \copyright GNU GPLv2 or any later version.
5
6 //============================ Constants ======================================
7
8 enum
9 {
10         RANDOM_ITEM_TYPE_HEALTH,
11         RANDOM_ITEM_TYPE_ARMOR,
12         RANDOM_ITEM_TYPE_RESOURCE,
13         RANDOM_ITEM_TYPE_WEAPON,
14         RANDOM_ITEM_TYPE_POWERUP
15 };
16
17 enum
18 {
19         RANDOM_ITEM_SUBTYPE_HEALTH_SMALL,
20         RANDOM_ITEM_SUBTYPE_HEALTH_MEDIUM,
21         RANDOM_ITEM_SUBTYPE_HEALTH_BIG,
22         RANDOM_ITEM_SUBTYPE_HEALTH_MEGA
23 };
24
25 enum
26 {
27         RANDOM_ITEM_SUBTYPE_ARMOR_SMALL,
28         RANDOM_ITEM_SUBTYPE_ARMOR_MEDIUM,
29         RANDOM_ITEM_SUBTYPE_ARMOR_BIG,
30         RANDOM_ITEM_SUBTYPE_ARMOR_MEGA
31 };
32
33 enum
34 {
35         RANDOM_ITEM_SUBTYPE_RESOURCE_SHELLS,
36         RANDOM_ITEM_SUBTYPE_RESOURCE_BULLETS,
37         RANDOM_ITEM_SUBTYPE_RESOURCE_ROCKETS,
38         RANDOM_ITEM_SUBTYPE_RESOURCE_CELLS,
39         RANDOM_ITEM_SUBTYPE_RESOURCE_PLASMA,
40         RANDOM_ITEM_SUBTYPE_RESOURCE_FUEL,
41 };
42
43 enum
44 {
45         RANDOM_ITEM_SUBTYPE_WEAPON_BLASTER,
46         RANDOM_ITEM_SUBTYPE_WEAPON_SHOTGUN,
47         RANDOM_ITEM_SUBTYPE_WEAPON_MACHINEGUN,
48         RANDOM_ITEM_SUBTYPE_WEAPON_MORTAR,
49         RANDOM_ITEM_SUBTYPE_WEAPON_ELECTRO,
50         RANDOM_ITEM_SUBTYPE_WEAPON_CRYLINK,
51         RANDOM_ITEM_SUBTYPE_WEAPON_VORTEX,
52         RANDOM_ITEM_SUBTYPE_WEAPON_HAGAR,
53         RANDOM_ITEM_SUBTYPE_WEAPON_DEVASTATOR,
54         RANDOM_ITEM_SUBTYPE_WEAPON_SHOCKWAVE,
55         RANDOM_ITEM_SUBTYPE_WEAPON_ARC,
56         RANDOM_ITEM_SUBTYPE_WEAPON_HOOK,
57         RANDOM_ITEM_SUBTYPE_WEAPON_TUBA,
58         RANDOM_ITEM_SUBTYPE_WEAPON_PORTO,
59         RANDOM_ITEM_SUBTYPE_WEAPON_FIREBALL,
60         RANDOM_ITEM_SUBTYPE_WEAPON_MINELAYER,
61         RANDOM_ITEM_SUBTYPE_WEAPON_HLAC,
62         RANDOM_ITEM_SUBTYPE_WEAPON_RIFLE,
63         RANDOM_ITEM_SUBTYPE_WEAPON_SEEKER,
64         RANDOM_ITEM_SUBTYPE_WEAPON_VAPORIZER
65 };
66
67 enum
68 {
69         RANDOM_ITEM_SUBTYPE_POWERUP_STRENGTH,
70         RANDOM_ITEM_SUBTYPE_POWERUP_SHIELD,
71         RANDOM_ITEM_SUBTYPE_POWERUP_FUEL_REGEN,
72         RANDOM_ITEM_SUBTYPE_POWERUP_JETPACK
73 };
74
75 //======================= Global variables ====================================
76
77 bool autocvar_g_random_items; ///< Whether to enable random items.
78
79 // Replace cvars
80
81 /// \brief Whether to randomly replace small health.
82 bool autocvar_g_random_items_replace_health_small;
83 /// \brief Whether to randomly replace medium health.
84 bool autocvar_g_random_items_replace_health_medium;
85 /// \brief Whether to randomly replace big health.
86 bool autocvar_g_random_items_replace_health_big;
87 /// \brief Whether to randomly replace mega health.
88 bool autocvar_g_random_items_replace_health_mega;
89
90 /// \brief Whether to randomly replace small armor.
91 bool autocvar_g_random_items_replace_armor_small;
92 /// \brief Whether to randomly replace medium armor.
93 bool autocvar_g_random_items_replace_armor_medium;
94 /// \brief Whether to randomly replace big armor.
95 bool autocvar_g_random_items_replace_armor_big;
96 /// \brief Whether to randomly replace mega armor.
97 bool autocvar_g_random_items_replace_armor_mega;
98
99 /// \brief Whether to randomly replace shells.
100 bool autocvar_g_random_items_replace_item_shells;
101 /// \brief Whether to randomly replace bullets.
102 bool autocvar_g_random_items_replace_item_bullets;
103 /// \brief Whether to randomly replace rockets.
104 bool autocvar_g_random_items_replace_item_rockets;
105 /// \brief Whether to randomly replace cells.
106 bool autocvar_g_random_items_replace_item_cells;
107 /// \brief Whether to randomly replace plasma.
108 bool autocvar_g_random_items_replace_item_plasma;
109 /// \brief Whether to randomly replace fuel.
110 bool autocvar_g_random_items_replace_item_fuel;
111
112 /// \brief Whether to randomly replace blaster.
113 bool autocvar_g_random_items_replace_weapon_blaster;
114 /// \brief Whether to randomly replace shotgun.
115 bool autocvar_g_random_items_replace_weapon_shotgun;
116 /// \brief Whether to randomly replace machinegun.
117 bool autocvar_g_random_items_replace_weapon_machinegun;
118 /// \brief Whether to randomly replace mortar.
119 bool autocvar_g_random_items_replace_weapon_mortar;
120 /// \brief Whether to randomly replace electro.
121 bool autocvar_g_random_items_replace_weapon_electro;
122 /// \brief Whether to randomly replace crylink.
123 bool autocvar_g_random_items_replace_weapon_crylink;
124 /// \brief Whether to randomly replace vortex.
125 bool autocvar_g_random_items_replace_weapon_vortex;
126 /// \brief Whether to randomly replace hagar.
127 bool autocvar_g_random_items_replace_weapon_hagar;
128 /// \brief Whether to randomly replace devastator.
129 bool autocvar_g_random_items_replace_weapon_devastator;
130 /// \brief Whether to randomly replace shockwave.
131 bool autocvar_g_random_items_replace_weapon_shockwave;
132 /// \brief Whether to randomly replace arc.
133 bool autocvar_g_random_items_replace_weapon_arc;
134 /// \brief Whether to randomly replace hook.
135 bool autocvar_g_random_items_replace_weapon_hook;
136 /// \brief Whether to randomly replace tuba.
137 bool autocvar_g_random_items_replace_weapon_tuba;
138 /// \brief Whether to randomly replace port-o-launch.
139 bool autocvar_g_random_items_replace_weapon_porto;
140 /// \brief Whether to randomly replace fireball.
141 bool autocvar_g_random_items_replace_weapon_fireball;
142 /// \brief Whether to randomly replace mine layer.
143 bool autocvar_g_random_items_replace_weapon_minelayer;
144 /// \brief Whether to randomly replace HLAC.
145 bool autocvar_g_random_items_replace_weapon_hlac;
146 /// \brief Whether to randomly replace rifle.
147 bool autocvar_g_random_items_replace_weapon_rifle;
148 /// \brief Whether to randomly replace TAG seeker.
149 bool autocvar_g_random_items_replace_weapon_seeker;
150 /// \brief Whether to randomly replace vaporizer.
151 bool autocvar_g_random_items_replace_weapon_vaporizer;
152
153 /// \brief Whether to randomly replace strength.
154 bool autocvar_g_random_items_replace_item_strength;
155 /// \brief Whether to randomly replace shield.
156 bool autocvar_g_random_items_replace_item_shield;
157 /// \brief Whether to randomly replace fuel regeneration.
158 bool autocvar_g_random_items_replace_item_fuel_regen;
159 /// \brief Whether to randomly replace jetpack.
160 bool autocvar_g_random_items_replace_item_jetpack;
161
162 bool autocvar_g_random_items_replace_item_minst_cells;
163 bool autocvar_g_random_items_replace_item_invisibility;
164 bool autocvar_g_random_items_replace_item_extralife;
165 bool autocvar_g_random_items_replace_item_speed;
166
167 // Map probability cvars
168
169 /// \brief Probability of random health items spawning in the map.
170 float autocvar_g_random_items_health_probability;
171 /// \brief Probability of random armor items spawning in the map.
172 float autocvar_g_random_items_armor_probability;
173 /// \brief Probability of random resource items spawning in the map.
174 float autocvar_g_random_items_resource_probability;
175 /// \brief Probability of random weapons spawning in the map.
176 float autocvar_g_random_items_weapon_probability;
177 /// \brief Probability of random powerups spawning in the map.
178 float autocvar_g_random_items_powerup_probability;
179
180 /// \brief Probability of random small health spawning in the map.
181 float autocvar_g_random_items_health_small_probability;
182 /// \brief Probability of random medium health spawning in the map.
183 float autocvar_g_random_items_health_medium_probability;
184 /// \brief Probability of random big health spawning in the map.
185 float autocvar_g_random_items_health_big_probability;
186 /// \brief Probability of random mega health spawning in the map.
187 float autocvar_g_random_items_health_mega_probability;
188
189 /// \brief Probability of random small armor spawning in the map.
190 float autocvar_g_random_items_armor_small_probability;
191 /// \brief Probability of random medium armor.spawning in the map.
192 float autocvar_g_random_items_armor_medium_probability;
193 /// \brief Probability of random big armor spawning in the map.
194 float autocvar_g_random_items_armor_big_probability;
195 /// \brief Probability of random mega armor spawning in the map.
196 float autocvar_g_random_items_armor_mega_probability;
197
198 /// \brief Probability of random shells spawning in the map.
199 float autocvar_g_random_items_resource_shells_probability;
200 /// \brief Probability of random bullets spawning in the map.
201 float autocvar_g_random_items_resource_bullets_probability;
202 /// \brief Probability of random rockets spawning in the map.
203 float autocvar_g_random_items_resource_rockets_probability;
204 /// \brief Probability of random cells spawning in the map.
205 float autocvar_g_random_items_resource_cells_probability;
206 /// \brief Probability of random plasma spawning in the map.
207 float autocvar_g_random_items_resource_plasma_probability;
208 /// \brief Probability of random fuel spawning in the map.
209 float autocvar_g_random_items_resource_fuel_probability;
210
211 /// \brief Probability of random blaster spawning in the map.
212 float autocvar_g_random_items_weapon_blaster_probability;
213 /// \brief Probability of random shotgun spawning in the map.
214 float autocvar_g_random_items_weapon_shotgun_probability;
215 /// \brief Probability of random machinegun spawning in the map.
216 float autocvar_g_random_items_weapon_machinegun_probability;
217 /// \brief Probability of random mortar spawning in the map.
218 float autocvar_g_random_items_weapon_mortar_probability;
219 /// \brief Probability of random electro spawning in the map.
220 float autocvar_g_random_items_weapon_electro_probability;
221 /// \brief Probability of random crylink spawning in the map.
222 float autocvar_g_random_items_weapon_crylink_probability;
223 /// \brief Probability of random vortex spawning in the map.
224 float autocvar_g_random_items_weapon_vortex_probability;
225 /// \brief Probability of random hagar spawning in the map.
226 float autocvar_g_random_items_weapon_hagar_probability;
227 /// \brief Probability of random devastator spawning in the map.
228 float autocvar_g_random_items_weapon_devastator_probability;
229 /// \brief Probability of random shockwave spawning in the map.
230 float autocvar_g_random_items_weapon_shockwave_probability;
231 /// \brief Probability of random arc spawning in the map.
232 float autocvar_g_random_items_weapon_arc_probability;
233 /// \brief Probability of random hook spawning in the map.
234 float autocvar_g_random_items_weapon_hook_probability;
235 /// \brief Probability of random tuba spawning in the map.
236 float autocvar_g_random_items_weapon_tuba_probability;
237 /// \brief Probability of random port-o-launch spawning in the map.
238 float autocvar_g_random_items_weapon_porto_probability;
239 /// \brief Probability of random fireball spawning in the map.
240 float autocvar_g_random_items_weapon_fireball_probability;
241 /// \brief Probability of random mine layer spawning in the map.
242 float autocvar_g_random_items_weapon_minelayer_probability;
243 /// \brief Probability of random HLAC spawning in the map.
244 float autocvar_g_random_items_weapon_hlac_probability;
245 /// \brief Probability of random rifle spawning in the map.
246 float autocvar_g_random_items_weapon_rifle_probability;
247 /// \brief Probability of random TAG seeker spawning in the map.
248 float autocvar_g_random_items_weapon_seeker_probability;
249 /// \brief Probability of random vaporizer spawning in the map.
250 float autocvar_g_random_items_weapon_vaporizer_probability;
251
252 /// \brief Probability of random strength spawning in the map.
253 float autocvar_g_random_items_strength_probability;
254 /// \brief Probability of random shield spawning in the map.
255 float autocvar_g_random_items_shield_probability;
256 /// \brief Probability of random fuel regeneration spawning in the map.
257 float autocvar_g_random_items_fuel_regen_probability;
258 /// \brief Probability of random jetpack spawning in the map.
259 float autocvar_g_random_items_jetpack_probability;
260
261 //float autocvar_g_random_items_minst_cells_probability;
262 //float autocvar_g_random_items_invisibility_probability;
263 //float autocvar_g_random_items_extralife_probability;
264 //float autocvar_g_random_items_speed_probability;
265
266 // Loot
267
268 bool autocvar_g_random_loot; ///< Whether to enable random loot.
269
270 float autocvar_g_random_loot_min; ///< Minimum amount of loot items.
271 float autocvar_g_random_loot_max; ///< Maximum amount of loot items.
272 float autocvar_g_random_loot_time; ///< Amount of time the loot will stay.
273 float autocvar_g_random_loot_spread; ///< How far can loot be thrown.
274
275 // Loot probability cvars
276
277 /// \brief Probability of random health items spawning as loot.
278 float autocvar_g_random_loot_health_probability;
279 /// \brief Probability of random armor items spawning as loot.
280 float autocvar_g_random_loot_armor_probability;
281 /// \brief Probability of random resource items spawning as loot.
282 float autocvar_g_random_loot_resource_probability;
283 /// \brief Probability of random weapons spawning as loot.
284 float autocvar_g_random_loot_weapon_probability;
285 /// \brief Probability of random powerups spawning as loot.
286 float autocvar_g_random_loot_powerup_probability;
287
288 /// \brief Probability of random small health spawning as loot.
289 float autocvar_g_random_loot_health_small_probability;
290 /// \brief Probability of random medium health spawning as loot.
291 float autocvar_g_random_loot_health_medium_probability;
292 /// \brief Probability of random big health spawning as loot.
293 float autocvar_g_random_loot_health_big_probability;
294 /// \brief Probability of random mega health spawning as loot.
295 float autocvar_g_random_loot_health_mega_probability;
296
297 /// \brief Probability of random small armor spawning as loot.
298 float autocvar_g_random_loot_armor_small_probability;
299 /// \brief Probability of random medium armor.spawning as loot.
300 float autocvar_g_random_loot_armor_medium_probability;
301 /// \brief Probability of random big armor spawning as loot.
302 float autocvar_g_random_loot_armor_big_probability;
303 /// \brief Probability of random mega armor spawning as loot.
304 float autocvar_g_random_loot_armor_mega_probability;
305
306 /// \brief Probability of random shells spawning as loot.
307 float autocvar_g_random_loot_resource_shells_probability;
308 /// \brief Probability of random bullets spawning as loot.
309 float autocvar_g_random_loot_resource_bullets_probability;
310 /// \brief Probability of random rockets spawning as loot.
311 float autocvar_g_random_loot_resource_rockets_probability;
312 /// \brief Probability of random cells spawning as loot.
313 float autocvar_g_random_loot_resource_cells_probability;
314 /// \brief Probability of random plasma spawning as loot.
315 float autocvar_g_random_loot_resource_plasma_probability;
316 /// \brief Probability of random fuel spawning as loot.
317 float autocvar_g_random_loot_resource_fuel_probability;
318
319 /// \brief Probability of random blaster spawning as loot.
320 float autocvar_g_random_loot_weapon_blaster_probability;
321 /// \brief Probability of random shotgun spawning as loot.
322 float autocvar_g_random_loot_weapon_shotgun_probability;
323 /// \brief Probability of random machinegun spawning as loot.
324 float autocvar_g_random_loot_weapon_machinegun_probability;
325 /// \brief Probability of random mortar spawning as loot.
326 float autocvar_g_random_loot_weapon_mortar_probability;
327 /// \brief Probability of random electro spawning as loot.
328 float autocvar_g_random_loot_weapon_electro_probability;
329 /// \brief Probability of random crylink spawning as loot.
330 float autocvar_g_random_loot_weapon_crylink_probability;
331 /// \brief Probability of random vortex spawning as loot.
332 float autocvar_g_random_loot_weapon_vortex_probability;
333 /// \brief Probability of random hagar spawning as loot.
334 float autocvar_g_random_loot_weapon_hagar_probability;
335 /// \brief Probability of random devastator spawning as loot.
336 float autocvar_g_random_loot_weapon_devastator_probability;
337 /// \brief Probability of random shockwave spawning as loot.
338 float autocvar_g_random_loot_weapon_shockwave_probability;
339 /// \brief Probability of random arc spawning as loot.
340 float autocvar_g_random_loot_weapon_arc_probability;
341 /// \brief Probability of random hook spawning as loot.
342 float autocvar_g_random_loot_weapon_hook_probability;
343 /// \brief Probability of random tuba spawning as loot.
344 float autocvar_g_random_loot_weapon_tuba_probability;
345 /// \brief Probability of random port-o-launch spawning as loot.
346 float autocvar_g_random_loot_weapon_porto_probability;
347 /// \brief Probability of random fireball spawning as loot.
348 float autocvar_g_random_loot_weapon_fireball_probability;
349 /// \brief Probability of random mine layer spawning as loot.
350 float autocvar_g_random_loot_weapon_minelayer_probability;
351 /// \brief Probability of random HLAC spawning as loot.
352 float autocvar_g_random_loot_weapon_hlac_probability;
353 /// \brief Probability of random rifle spawning as loot.
354 float autocvar_g_random_loot_weapon_rifle_probability;
355 /// \brief Probability of random TAG seeker spawning as loot.
356 float autocvar_g_random_loot_weapon_seeker_probability;
357 /// \brief Probability of random vaporizer spawning as loot.
358 float autocvar_g_random_loot_weapon_vaporizer_probability;
359
360 /// \brief Probability of random strength spawning as loot.
361 float autocvar_g_random_loot_strength_probability;
362 /// \brief Probability of random shield spawning as loot.
363 float autocvar_g_random_loot_shield_probability;
364 /// \brief Probability of random fuel regeneration spawning as loot.
365 float autocvar_g_random_loot_fuel_regen_probability;
366 /// \brief Probability of random jetpack spawning as loot.
367 float autocvar_g_random_loot_jetpack_probability;
368
369 /// \brief Holds whether random item is spawning. Used to prevent infinite
370 /// recursion.
371 bool random_items_is_spawning = false;
372
373 //========================= Free functions ====================================
374
375 /// \brief Returns whether a map item should be replaced.
376 /// \param[in] item Item to inspect.
377 /// \return True if the item should be replaced, false otherwise.
378 bool RandomItems_ShouldReplaceItem(entity item)
379 {
380         switch (item.classname)
381         {
382                 case "item_health_small":
383                 {
384                         return autocvar_g_random_items_replace_health_small;
385                 }
386                 case "item_health_medium":
387                 {
388                         return autocvar_g_random_items_replace_health_medium;
389                 }
390                 case "item_health_big":
391                 case "item_health_large":
392                 {
393                         return autocvar_g_random_items_replace_health_big;
394                 }
395                 case "item_health_mega":
396                 {
397                         return autocvar_g_random_items_replace_health_mega;
398                 }
399                 case "item_armor_small":
400                 {
401                         return autocvar_g_random_items_replace_armor_small;
402                 }
403                 case "item_armor_medium":
404                 {
405                         return autocvar_g_random_items_replace_armor_medium;
406                 }
407                 case "item_armor_big":
408                 case "item_armor_large":
409                 {
410                         return autocvar_g_random_items_replace_armor_big;
411                 }
412                 case "item_armor_mega":
413                 {
414                         return autocvar_g_random_items_replace_armor_mega;
415                 }
416                 case "item_shells":
417                 {
418                         return autocvar_g_random_items_replace_item_shells;
419                 }
420                 case "item_bullets":
421                 {
422                         return autocvar_g_random_items_replace_item_bullets;
423                 }
424                 case "item_rockets":
425                 {
426                         return autocvar_g_random_items_replace_item_rockets;
427                 }
428                 case "item_cells":
429                 {
430                         return autocvar_g_random_items_replace_item_cells;
431                 }
432                 case "item_plasma":
433                 {
434                         return autocvar_g_random_items_replace_item_plasma;
435                 }
436                 case "item_fuel":
437                 {
438                         return autocvar_g_random_items_replace_item_fuel;
439                 }
440                 case "weapon_blaster":
441                 case "weapon_laser":
442                 {
443                         return autocvar_g_random_items_replace_weapon_blaster;
444                 }
445                 case "weapon_shotgun":
446                 {
447                         return autocvar_g_random_items_replace_weapon_shotgun;
448                 }
449                 case "weapon_machinegun":
450                 case "weapon_uzi":
451                 {
452                         return autocvar_g_random_items_replace_weapon_machinegun;
453                 }
454                 case "weapon_mortar":
455                 case "weapon_grenadelauncher":
456                 {
457                         return autocvar_g_random_items_replace_weapon_mortar;
458                 }
459                 case "weapon_electro":
460                 {
461                         return autocvar_g_random_items_replace_weapon_electro;
462                 }
463                 case "weapon_crylink":
464                 {
465                         return autocvar_g_random_items_replace_weapon_crylink;
466                 }
467                 case "weapon_vortex":
468                 case "weapon_nex":
469                 {
470                         return autocvar_g_random_items_replace_weapon_vortex;
471                 }
472                 case "weapon_hagar":
473                 {
474                         return autocvar_g_random_items_replace_weapon_hagar;
475                 }
476                 case "weapon_devastator":
477                 case "weapon_rocketlauncher":
478                 {
479                         return autocvar_g_random_items_replace_weapon_devastator;
480                 }
481                 case "weapon_shockwave":
482                 {
483                         return autocvar_g_random_items_replace_weapon_shockwave;
484                 }
485                 case "weapon_arc":
486                 {
487                         return autocvar_g_random_items_replace_weapon_arc;
488                 }
489                 case "weapon_hook":
490                 {
491                         return autocvar_g_random_items_replace_weapon_hook;
492                 }
493                 case "weapon_tuba":
494                 {
495                         return autocvar_g_random_items_replace_weapon_tuba;
496                 }
497                 case "weapon_porto":
498                 {
499                         return autocvar_g_random_items_replace_weapon_porto;
500                 }
501                 case "weapon_fireball":
502                 {
503                         return autocvar_g_random_items_replace_weapon_fireball;
504                 }
505                 case "weapon_minelayer":
506                 {
507                         return autocvar_g_random_items_replace_weapon_minelayer;
508                 }
509                 case "weapon_hlac":
510                 {
511                         return autocvar_g_random_items_replace_weapon_hlac;
512                 }
513                 case "weapon_rifle":
514                 case "weapon_campingrifle":
515                 case "weapon_sniperrifle":
516                 {
517                         return autocvar_g_random_items_replace_weapon_rifle;
518                 }
519                 case "weapon_seeker":
520                 {
521                         return autocvar_g_random_items_replace_weapon_seeker;
522                 }
523                 case "weapon_vaporizer":
524                 case "weapon_minstanex":
525                 {
526                         return autocvar_g_random_items_replace_weapon_vaporizer;
527                 }
528                 case "item_strength":
529                 {
530                         return autocvar_g_random_items_replace_item_strength;
531                 }
532                 case "item_invincible":
533                 {
534                         return autocvar_g_random_items_replace_item_shield;
535                 }
536                 case "item_fuel_regen":
537                 {
538                         return autocvar_g_random_items_replace_item_fuel_regen;
539                 }
540                 case "item_jetpack":
541                 {
542                         return autocvar_g_random_items_replace_item_jetpack;
543                 }
544                 case "item_minst_cells":
545                 {
546                         return autocvar_g_random_items_replace_item_minst_cells;
547                 }
548                 case "item_invisibility":
549                 {
550                         return autocvar_g_random_items_replace_item_invisibility;
551                 }
552                 case "item_extralife":
553                 {
554                         return autocvar_g_random_items_replace_item_extralife;
555                 }
556                 case "item_speed":
557                 {
558                         return autocvar_g_random_items_replace_item_speed;
559                 }
560                 case "replacedweapon":
561                 {
562                         switch (item.weapon)
563                         {
564                                 case WEP_MINE_LAYER.m_id:
565                                 {
566                                         return autocvar_g_random_items_replace_weapon_minelayer;
567                                 }
568                                 case WEP_HLAC.m_id:
569                                 {
570                                         return autocvar_g_random_items_replace_weapon_hlac;
571                                 }
572                                 case WEP_RIFLE.m_id:
573                                 {
574                                         return autocvar_g_random_items_replace_weapon_rifle;
575                                 }
576                                 case WEP_SEEKER.m_id:
577                                 {
578                                         return autocvar_g_random_items_replace_weapon_seeker;
579                                 }
580                                 default:
581                                 {
582                                         return false;
583                                 }
584                         }
585                 }
586                 default:
587                 {
588                         return false;
589                 }
590         }
591 }
592
593 /// \brief Returns a random classname of the map item.
594 /// \return Random classname of the map item.
595 string RandomItems_GetRandomMapItemClassName()
596 {
597         RandomSelection_Init();
598         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_HEALTH,
599                 autocvar_g_random_items_health_probability, 1);
600         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_ARMOR,
601                 autocvar_g_random_items_armor_probability, 1);
602         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_RESOURCE,
603                 autocvar_g_random_items_resource_probability, 1);
604         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_WEAPON,
605                 autocvar_g_random_items_weapon_probability, 1);
606         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_POWERUP,
607                 autocvar_g_random_items_powerup_probability, 1);
608         int item_type = RandomSelection_chosen_float;
609         switch (item_type)
610         {
611                 case RANDOM_ITEM_TYPE_HEALTH:
612                 {
613                         RandomSelection_Init();
614                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_SMALL,
615                                 autocvar_g_random_items_health_small_probability, 1);
616                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_MEDIUM,
617                                 autocvar_g_random_items_health_medium_probability, 1);
618                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_BIG,
619                                 autocvar_g_random_items_health_big_probability, 1);
620                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_MEGA,
621                                 autocvar_g_random_items_health_mega_probability, 1);
622                         item_type = RandomSelection_chosen_float;
623                         switch (item_type)
624                         {
625                                 case RANDOM_ITEM_SUBTYPE_HEALTH_SMALL:
626                                 {
627                                         return "item_health_small";
628                                 }
629                                 case RANDOM_ITEM_SUBTYPE_HEALTH_MEDIUM:
630                                 {
631                                         return "item_health_medium";
632                                 }
633                                 case RANDOM_ITEM_SUBTYPE_HEALTH_BIG:
634                                 {
635                                         return "item_health_big";
636                                 }
637                                 case RANDOM_ITEM_SUBTYPE_HEALTH_MEGA:
638                                 {
639                                         return "item_health_mega";
640                                 }
641                         }
642                         return string_null;
643                 }
644                 case RANDOM_ITEM_TYPE_ARMOR:
645                 {
646                         RandomSelection_Init();
647                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_SMALL,
648                                 autocvar_g_random_items_armor_small_probability, 1);
649                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_MEDIUM,
650                                 autocvar_g_random_items_armor_medium_probability, 1);
651                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_BIG,
652                                 autocvar_g_random_items_armor_big_probability, 1);
653                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_MEGA,
654                                 autocvar_g_random_items_armor_mega_probability, 1);
655                         item_type = RandomSelection_chosen_float;
656                         switch (item_type)
657                         {
658                                 case RANDOM_ITEM_SUBTYPE_ARMOR_SMALL:
659                                 {
660                                         return "item_armor_small";
661                                 }
662                                 case RANDOM_ITEM_SUBTYPE_ARMOR_MEDIUM:
663                                 {
664                                         return "item_armor_medium";
665                                 }
666                                 case RANDOM_ITEM_SUBTYPE_ARMOR_BIG:
667                                 {
668                                         return "item_armor_big";
669                                 }
670                                 case RANDOM_ITEM_SUBTYPE_ARMOR_MEGA:
671                                 {
672                                         return "item_armor_mega";
673                                 }
674                         }
675                         return string_null;
676                 }
677                 case RANDOM_ITEM_TYPE_RESOURCE:
678                 {
679                         RandomSelection_Init();
680                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_SHELLS,
681                                 autocvar_g_random_items_resource_shells_probability, 1);
682                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_BULLETS,
683                                 autocvar_g_random_items_resource_bullets_probability, 1);
684                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_ROCKETS,
685                                 autocvar_g_random_items_resource_rockets_probability, 1);
686                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_CELLS,
687                                 autocvar_g_random_items_resource_cells_probability, 1);
688                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_PLASMA,
689                                 autocvar_g_random_items_resource_plasma_probability, 1);
690                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_FUEL,
691                                 autocvar_g_random_items_resource_fuel_probability, 1);
692                         item_type = RandomSelection_chosen_float;
693                         switch (item_type)
694                         {
695                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_SHELLS:
696                                 {
697                                         return "item_shells";
698                                 }
699                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_BULLETS:
700                                 {
701                                         return "item_bullets";
702                                 }
703                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_ROCKETS:
704                                 {
705                                         return "item_rockets";
706                                 }
707                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_CELLS:
708                                 {
709                                         return "item_cells";
710                                 }
711                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_PLASMA:
712                                 {
713                                         return "item_plasma";
714                                 }
715                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_FUEL:
716                                 {
717                                         return "item_fuel";
718                                 }
719                         }
720                         return string_null;
721                 }
722                 case RANDOM_ITEM_TYPE_WEAPON:
723                 {
724                         RandomSelection_Init();
725                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_BLASTER,
726                                 autocvar_g_random_items_weapon_blaster_probability, 1);
727                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_SHOTGUN,
728                                 autocvar_g_random_items_weapon_shotgun_probability, 1);
729                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_MACHINEGUN,
730                                 autocvar_g_random_items_weapon_machinegun_probability, 1);
731                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_MORTAR,
732                                 autocvar_g_random_items_weapon_mortar_probability, 1);
733                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_ELECTRO,
734                                 autocvar_g_random_items_weapon_electro_probability, 1);
735                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_CRYLINK,
736                                 autocvar_g_random_items_weapon_crylink_probability, 1);
737                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_VORTEX,
738                                 autocvar_g_random_items_weapon_vortex_probability, 1);
739                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_HAGAR,
740                                 autocvar_g_random_items_weapon_hagar_probability, 1);
741                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_DEVASTATOR,
742                                 autocvar_g_random_items_weapon_devastator_probability, 1);
743                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_SHOCKWAVE,
744                                 autocvar_g_random_items_weapon_shockwave_probability, 1);
745                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_ARC,
746                                 autocvar_g_random_items_weapon_arc_probability, 1);
747                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_HOOK,
748                                 autocvar_g_random_items_weapon_hook_probability, 1);
749                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_TUBA,
750                                 autocvar_g_random_items_weapon_tuba_probability, 1);
751                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_PORTO,
752                                 autocvar_g_random_items_weapon_porto_probability, 1);
753                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_FIREBALL,
754                                 autocvar_g_random_items_weapon_fireball_probability, 1);
755                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_MINELAYER,
756                                 autocvar_g_random_items_weapon_minelayer_probability, 1);
757                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_HLAC,
758                                 autocvar_g_random_items_weapon_hlac_probability, 1);
759                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_RIFLE,
760                                 autocvar_g_random_items_weapon_rifle_probability, 1);
761                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_SEEKER,
762                                 autocvar_g_random_items_weapon_seeker_probability, 1);
763                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_VAPORIZER,
764                                 autocvar_g_random_items_weapon_vaporizer_probability, 1);
765                         item_type = RandomSelection_chosen_float;
766                         switch (item_type)
767                         {
768                                 case RANDOM_ITEM_SUBTYPE_WEAPON_BLASTER:
769                                 {
770                                         return "weapon_blaster";
771                                 }
772                                 case RANDOM_ITEM_SUBTYPE_WEAPON_SHOTGUN:
773                                 {
774                                         return "weapon_shotgun";
775                                 }
776                                 case RANDOM_ITEM_SUBTYPE_WEAPON_MACHINEGUN:
777                                 {
778                                         return "weapon_machinegun";
779                                 }
780                                 case RANDOM_ITEM_SUBTYPE_WEAPON_MORTAR:
781                                 {
782                                         return "weapon_mortar";
783                                 }
784                                 case RANDOM_ITEM_SUBTYPE_WEAPON_ELECTRO:
785                                 {
786                                         return "weapon_electro";
787                                 }
788                                 case RANDOM_ITEM_SUBTYPE_WEAPON_CRYLINK:
789                                 {
790                                         return "weapon_crylink";
791                                 }
792                                 case RANDOM_ITEM_SUBTYPE_WEAPON_VORTEX:
793                                 {
794                                         return "weapon_vortex";
795                                 }
796                                 case RANDOM_ITEM_SUBTYPE_WEAPON_HAGAR:
797                                 {
798                                         return "weapon_hagar";
799                                 }
800                                 case RANDOM_ITEM_SUBTYPE_WEAPON_DEVASTATOR:
801                                 {
802                                         return "weapon_devastator";
803                                 }
804                                 case RANDOM_ITEM_SUBTYPE_WEAPON_SHOCKWAVE:
805                                 {
806                                         return "weapon_shockwave";
807                                 }
808                                 case RANDOM_ITEM_SUBTYPE_WEAPON_ARC:
809                                 {
810                                         return "weapon_arc";
811                                 }
812                                 case RANDOM_ITEM_SUBTYPE_WEAPON_HOOK:
813                                 {
814                                         return "weapon_hook";
815                                 }
816                                 case RANDOM_ITEM_SUBTYPE_WEAPON_TUBA:
817                                 {
818                                         return "weapon_tuba";
819                                 }
820                                 case RANDOM_ITEM_SUBTYPE_WEAPON_PORTO:
821                                 {
822                                         return "weapon_porto";
823                                 }
824                                 case RANDOM_ITEM_SUBTYPE_WEAPON_FIREBALL:
825                                 {
826                                         return "weapon_fireball";
827                                 }
828                                 case RANDOM_ITEM_SUBTYPE_WEAPON_MINELAYER:
829                                 {
830                                         return "weapon_minelayer";
831                                 }
832                                 case RANDOM_ITEM_SUBTYPE_WEAPON_HLAC:
833                                 {
834                                         return "weapon_hlac";
835                                 }
836                                 case RANDOM_ITEM_SUBTYPE_WEAPON_RIFLE:
837                                 {
838                                         return "weapon_rifle";
839                                 }
840                                 case RANDOM_ITEM_SUBTYPE_WEAPON_SEEKER:
841                                 {
842                                         return "weapon_seeker";
843                                 }
844                                 case RANDOM_ITEM_SUBTYPE_WEAPON_VAPORIZER:
845                                 {
846                                         return "weapon_vaporizer";
847                                 }
848                         }
849                         return string_null;
850                 }
851                 case RANDOM_ITEM_TYPE_POWERUP:
852                 {
853                         RandomSelection_Init();
854                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_STRENGTH,
855                                 autocvar_g_random_items_strength_probability, 1);
856                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_SHIELD,
857                                 autocvar_g_random_items_shield_probability, 1);
858                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_FUEL_REGEN,
859                                 autocvar_g_random_items_fuel_regen_probability, 1);
860                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_JETPACK,
861                                 autocvar_g_random_items_jetpack_probability, 1);
862                         item_type = RandomSelection_chosen_float;
863                         switch (item_type)
864                         {
865                                 case RANDOM_ITEM_SUBTYPE_POWERUP_STRENGTH:
866                                 {
867                                         return "item_strength";
868                                 }
869                                 case RANDOM_ITEM_SUBTYPE_POWERUP_SHIELD:
870                                 {
871                                         return "item_invincible";
872                                 }
873                                 case RANDOM_ITEM_SUBTYPE_POWERUP_FUEL_REGEN:
874                                 {
875                                         return "item_fuel_regen";
876                                 }
877                                 case RANDOM_ITEM_SUBTYPE_POWERUP_JETPACK:
878                                 {
879                                         return "item_jetpack";
880                                 }
881                         }
882                         return string_null;
883                 }
884         }
885         return string_null;
886 }
887
888 /// \brief Spawns a random map item.
889 /// \param[in] position Position of the item.
890 /// \return Spawned item on success, NULL otherwise.
891 entity RandomItems_SpawnMapItem(vector position)
892 {
893         string class_name = RandomItems_GetRandomMapItemClassName();
894         if (!class_name)
895         {
896                 return NULL;
897         }
898         random_items_is_spawning = true;
899         entity item = spawn();
900         item.classname = class_name;
901         Item_Initialize(item, class_name);
902         random_items_is_spawning = false;
903         if (wasfreed(item))
904         {
905                 return NULL;
906         }
907         setorigin(item, position);
908         return item;
909 }
910
911 /// \brief Returns a random classname of the loot item.
912 /// \return Random classname of the loot item.
913 string RandomItems_GetRandomLootItemClassName()
914 {
915         RandomSelection_Init();
916         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_HEALTH,
917                 autocvar_g_random_loot_health_probability, 1);
918         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_ARMOR,
919                 autocvar_g_random_loot_armor_probability, 1);
920         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_RESOURCE,
921                 autocvar_g_random_loot_resource_probability, 1);
922         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_WEAPON,
923                 autocvar_g_random_loot_weapon_probability, 1);
924         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_POWERUP,
925                 autocvar_g_random_loot_powerup_probability, 1);
926         int item_type = RandomSelection_chosen_float;
927         switch (item_type)
928         {
929                 case RANDOM_ITEM_TYPE_HEALTH:
930                 {
931                         RandomSelection_Init();
932                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_SMALL,
933                                 autocvar_g_random_loot_health_small_probability, 1);
934                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_MEDIUM,
935                                 autocvar_g_random_loot_health_medium_probability, 1);
936                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_BIG,
937                                 autocvar_g_random_loot_health_big_probability, 1);
938                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_MEGA,
939                                 autocvar_g_random_loot_health_mega_probability, 1);
940                         item_type = RandomSelection_chosen_float;
941                         switch (item_type)
942                         {
943                                 case RANDOM_ITEM_SUBTYPE_HEALTH_SMALL:
944                                 {
945                                         return "item_health_small";
946                                 }
947                                 case RANDOM_ITEM_SUBTYPE_HEALTH_MEDIUM:
948                                 {
949                                         return "item_health_medium";
950                                 }
951                                 case RANDOM_ITEM_SUBTYPE_HEALTH_BIG:
952                                 {
953                                         return "item_health_big";
954                                 }
955                                 case RANDOM_ITEM_SUBTYPE_HEALTH_MEGA:
956                                 {
957                                         return "item_health_mega";
958                                 }
959                         }
960                         return string_null;
961                 }
962                 case RANDOM_ITEM_TYPE_ARMOR:
963                 {
964                         RandomSelection_Init();
965                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_SMALL,
966                                 autocvar_g_random_loot_armor_small_probability, 1);
967                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_MEDIUM,
968                                 autocvar_g_random_loot_armor_medium_probability, 1);
969                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_BIG,
970                                 autocvar_g_random_loot_armor_big_probability, 1);
971                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_MEGA,
972                                 autocvar_g_random_loot_armor_mega_probability, 1);
973                         item_type = RandomSelection_chosen_float;
974                         switch (item_type)
975                         {
976                                 case RANDOM_ITEM_SUBTYPE_ARMOR_SMALL:
977                                 {
978                                         return "item_armor_small";
979                                 }
980                                 case RANDOM_ITEM_SUBTYPE_ARMOR_MEDIUM:
981                                 {
982                                         return "item_armor_medium";
983                                 }
984                                 case RANDOM_ITEM_SUBTYPE_ARMOR_BIG:
985                                 {
986                                         return "item_armor_big";
987                                 }
988                                 case RANDOM_ITEM_SUBTYPE_ARMOR_MEGA:
989                                 {
990                                         return "item_armor_mega";
991                                 }
992                         }
993                         return string_null;
994                 }
995                 case RANDOM_ITEM_TYPE_RESOURCE:
996                 {
997                         RandomSelection_Init();
998                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_SHELLS,
999                                 autocvar_g_random_loot_resource_shells_probability, 1);
1000                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_BULLETS,
1001                                 autocvar_g_random_loot_resource_bullets_probability, 1);
1002                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_ROCKETS,
1003                                 autocvar_g_random_loot_resource_rockets_probability, 1);
1004                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_CELLS,
1005                                 autocvar_g_random_loot_resource_cells_probability, 1);
1006                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_PLASMA,
1007                                 autocvar_g_random_loot_resource_plasma_probability, 1);
1008                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_FUEL,
1009                                 autocvar_g_random_loot_resource_fuel_probability, 1);
1010                         item_type = RandomSelection_chosen_float;
1011                         switch (item_type)
1012                         {
1013                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_SHELLS:
1014                                 {
1015                                         return "item_shells";
1016                                 }
1017                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_BULLETS:
1018                                 {
1019                                         return "item_bullets";
1020                                 }
1021                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_ROCKETS:
1022                                 {
1023                                         return "item_rockets";
1024                                 }
1025                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_CELLS:
1026                                 {
1027                                         return "item_cells";
1028                                 }
1029                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_PLASMA:
1030                                 {
1031                                         return "item_plasma";
1032                                 }
1033                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_FUEL:
1034                                 {
1035                                         return "item_fuel";
1036                                 }
1037                         }
1038                         return string_null;
1039                 }
1040                 case RANDOM_ITEM_TYPE_WEAPON:
1041                 {
1042                         RandomSelection_Init();
1043                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_BLASTER,
1044                                 autocvar_g_random_loot_weapon_blaster_probability, 1);
1045                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_SHOTGUN,
1046                                 autocvar_g_random_loot_weapon_shotgun_probability, 1);
1047                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_MACHINEGUN,
1048                                 autocvar_g_random_loot_weapon_machinegun_probability, 1);
1049                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_MORTAR,
1050                                 autocvar_g_random_loot_weapon_mortar_probability, 1);
1051                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_ELECTRO,
1052                                 autocvar_g_random_loot_weapon_electro_probability, 1);
1053                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_CRYLINK,
1054                                 autocvar_g_random_loot_weapon_crylink_probability, 1);
1055                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_VORTEX,
1056                                 autocvar_g_random_loot_weapon_vortex_probability, 1);
1057                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_HAGAR,
1058                                 autocvar_g_random_loot_weapon_hagar_probability, 1);
1059                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_DEVASTATOR,
1060                                 autocvar_g_random_loot_weapon_devastator_probability, 1);
1061                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_SHOCKWAVE,
1062                                 autocvar_g_random_loot_weapon_shockwave_probability, 1);
1063                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_ARC,
1064                                 autocvar_g_random_loot_weapon_arc_probability, 1);
1065                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_HOOK,
1066                                 autocvar_g_random_loot_weapon_hook_probability, 1);
1067                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_TUBA,
1068                                 autocvar_g_random_loot_weapon_tuba_probability, 1);
1069                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_PORTO,
1070                                 autocvar_g_random_loot_weapon_porto_probability, 1);
1071                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_FIREBALL,
1072                                 autocvar_g_random_loot_weapon_fireball_probability, 1);
1073                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_MINELAYER,
1074                                 autocvar_g_random_loot_weapon_minelayer_probability, 1);
1075                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_HLAC,
1076                                 autocvar_g_random_loot_weapon_hlac_probability, 1);
1077                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_RIFLE,
1078                                 autocvar_g_random_loot_weapon_rifle_probability, 1);
1079                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_SEEKER,
1080                                 autocvar_g_random_loot_weapon_seeker_probability, 1);
1081                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_VAPORIZER,
1082                                 autocvar_g_random_loot_weapon_vaporizer_probability, 1);
1083                         item_type = RandomSelection_chosen_float;
1084                         switch (item_type)
1085                         {
1086                                 case RANDOM_ITEM_SUBTYPE_WEAPON_BLASTER:
1087                                 {
1088                                         return "weapon_blaster";
1089                                 }
1090                                 case RANDOM_ITEM_SUBTYPE_WEAPON_SHOTGUN:
1091                                 {
1092                                         return "weapon_shotgun";
1093                                 }
1094                                 case RANDOM_ITEM_SUBTYPE_WEAPON_MACHINEGUN:
1095                                 {
1096                                         return "weapon_machinegun";
1097                                 }
1098                                 case RANDOM_ITEM_SUBTYPE_WEAPON_MORTAR:
1099                                 {
1100                                         return "weapon_mortar";
1101                                 }
1102                                 case RANDOM_ITEM_SUBTYPE_WEAPON_ELECTRO:
1103                                 {
1104                                         return "weapon_electro";
1105                                 }
1106                                 case RANDOM_ITEM_SUBTYPE_WEAPON_CRYLINK:
1107                                 {
1108                                         return "weapon_crylink";
1109                                 }
1110                                 case RANDOM_ITEM_SUBTYPE_WEAPON_VORTEX:
1111                                 {
1112                                         return "weapon_vortex";
1113                                 }
1114                                 case RANDOM_ITEM_SUBTYPE_WEAPON_HAGAR:
1115                                 {
1116                                         return "weapon_hagar";
1117                                 }
1118                                 case RANDOM_ITEM_SUBTYPE_WEAPON_DEVASTATOR:
1119                                 {
1120                                         return "weapon_devastator";
1121                                 }
1122                                 case RANDOM_ITEM_SUBTYPE_WEAPON_SHOCKWAVE:
1123                                 {
1124                                         return "weapon_shockwave";
1125                                 }
1126                                 case RANDOM_ITEM_SUBTYPE_WEAPON_ARC:
1127                                 {
1128                                         return "weapon_arc";
1129                                 }
1130                                 case RANDOM_ITEM_SUBTYPE_WEAPON_HOOK:
1131                                 {
1132                                         return "weapon_hook";
1133                                 }
1134                                 case RANDOM_ITEM_SUBTYPE_WEAPON_TUBA:
1135                                 {
1136                                         return "weapon_tuba";
1137                                 }
1138                                 case RANDOM_ITEM_SUBTYPE_WEAPON_PORTO:
1139                                 {
1140                                         return "weapon_porto";
1141                                 }
1142                                 case RANDOM_ITEM_SUBTYPE_WEAPON_FIREBALL:
1143                                 {
1144                                         return "weapon_fireball";
1145                                 }
1146                                 case RANDOM_ITEM_SUBTYPE_WEAPON_MINELAYER:
1147                                 {
1148                                         return "weapon_minelayer";
1149                                 }
1150                                 case RANDOM_ITEM_SUBTYPE_WEAPON_HLAC:
1151                                 {
1152                                         return "weapon_hlac";
1153                                 }
1154                                 case RANDOM_ITEM_SUBTYPE_WEAPON_RIFLE:
1155                                 {
1156                                         return "weapon_rifle";
1157                                 }
1158                                 case RANDOM_ITEM_SUBTYPE_WEAPON_SEEKER:
1159                                 {
1160                                         return "weapon_seeker";
1161                                 }
1162                                 case RANDOM_ITEM_SUBTYPE_WEAPON_VAPORIZER:
1163                                 {
1164                                         return "weapon_vaporizer";
1165                                 }
1166                         }
1167                         return string_null;
1168                 }
1169                 case RANDOM_ITEM_TYPE_POWERUP:
1170                 {
1171                         RandomSelection_Init();
1172                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_STRENGTH,
1173                                 autocvar_g_random_loot_strength_probability, 1);
1174                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_SHIELD,
1175                                 autocvar_g_random_loot_shield_probability, 1);
1176                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_FUEL_REGEN,
1177                                 autocvar_g_random_loot_fuel_regen_probability, 1);
1178                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_JETPACK,
1179                                 autocvar_g_random_loot_jetpack_probability, 1);
1180                         item_type = RandomSelection_chosen_float;
1181                         switch (item_type)
1182                         {
1183                                 case RANDOM_ITEM_SUBTYPE_POWERUP_STRENGTH:
1184                                 {
1185                                         return "item_strength";
1186                                 }
1187                                 case RANDOM_ITEM_SUBTYPE_POWERUP_SHIELD:
1188                                 {
1189                                         return "item_invincible";
1190                                 }
1191                                 case RANDOM_ITEM_SUBTYPE_POWERUP_FUEL_REGEN:
1192                                 {
1193                                         return "item_fuel_regen";
1194                                 }
1195                                 case RANDOM_ITEM_SUBTYPE_POWERUP_JETPACK:
1196                                 {
1197                                         return "item_jetpack";
1198                                 }
1199                         }
1200                         return string_null;
1201                 }
1202         }
1203         return string_null;
1204 }
1205
1206 /// \brief Spawns a random loot item.
1207 /// \param[in] position Position of the item.
1208 /// \return No return.
1209 void RandomItems_SpawnLootItem(vector position)
1210 {
1211         string class_name = RandomItems_GetRandomLootItemClassName();
1212         if (!class_name)
1213         {
1214                 return;
1215         }
1216         vector spread = '0 0 0';
1217         spread.z = autocvar_g_random_loot_spread / 2;
1218         spread += randomvec() * autocvar_g_random_loot_spread;
1219         random_items_is_spawning = true;
1220         Item_CreateLoot(class_name, position, spread, autocvar_g_random_loot_time);
1221         random_items_is_spawning = false;
1222 }
1223
1224 //============================= Hooks ========================================
1225
1226 REGISTER_MUTATOR(random_items, (autocvar_g_random_items ||
1227         autocvar_g_random_loot));
1228
1229 MUTATOR_HOOKFUNCTION(random_items, BuildMutatorsString)
1230 {
1231         M_ARGV(0, string) = strcat(M_ARGV(0, string), ":random_items");
1232 }
1233
1234 MUTATOR_HOOKFUNCTION(random_items, BuildMutatorsPrettyString)
1235 {
1236         M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Random items");
1237 }
1238
1239 /// \brief Hook that is called when an item is about to spawn.
1240 MUTATOR_HOOKFUNCTION(random_items, FilterItem, CBC_ORDER_LAST)
1241 {
1242         //PrintToChatAll("FilterItem");
1243         if (!autocvar_g_random_items)
1244         {
1245                 return false;
1246         }
1247         if (random_items_is_spawning == true)
1248         {
1249                 return false;
1250         }
1251         entity item = M_ARGV(0, entity);
1252         if (Item_IsLoot(item))
1253         {
1254                 return false;
1255         }
1256         if (!RandomItems_ShouldReplaceItem(item))
1257         {
1258                 return false;
1259         }
1260         if (RandomItems_SpawnMapItem(item.origin) == NULL)
1261         {
1262                 return false;
1263         }
1264         return true;
1265 }
1266
1267 /// \brief Hook that is called after the player has touched an item.
1268 MUTATOR_HOOKFUNCTION(random_items, ItemTouched, CBC_ORDER_LAST)
1269 {
1270         //PrintToChatAll("ItemTouched");
1271         if (!autocvar_g_random_items)
1272         {
1273                 return;
1274         }
1275         entity item = M_ARGV(0, entity);
1276         if (Item_IsLoot(item))
1277         {
1278                 return;
1279         }
1280         if (!RandomItems_ShouldReplaceItem(item))
1281         {
1282                 return;
1283         }
1284         entity new_item = RandomItems_SpawnMapItem(item.origin);
1285         if (new_item == NULL)
1286         {
1287                 return;
1288         }
1289         Item_ScheduleRespawn(new_item);
1290         delete(item);
1291 }
1292
1293 /// \brief Hook which is called when the player dies.
1294 MUTATOR_HOOKFUNCTION(random_items, PlayerDies)
1295 {
1296         //PrintToChatAll("PlayerDies");
1297         if (!autocvar_g_random_loot)
1298         {
1299                 return;
1300         }
1301         entity victim = M_ARGV(2, entity);
1302         vector loot_position = victim.origin + '0 0 32';
1303         int num_loot_items = floor(autocvar_g_random_loot_min + random() *
1304                 autocvar_g_random_loot_max);
1305         for (int item_index = 0; item_index < num_loot_items; ++item_index)
1306         {
1307                 RandomItems_SpawnLootItem(loot_position);
1308         }
1309 }