]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/mutators/mutator/random_items/sv_random_items.qc
eb4a34c229b516dc8a65385b7566be0c733f56b4
[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 = 1,
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 = 1,
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 = 1,
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 = 1,
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 = 1,
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 = 1,
70         RANDOM_ITEM_SUBTYPE_POWERUP_SHIELD,
71         RANDOM_ITEM_SUBTYPE_POWERUP_FUEL_REGEN,
72         RANDOM_ITEM_SUBTYPE_POWERUP_JETPACK
73 };
74
75 enum
76 {
77         RANDOM_ITEM_SUBTYPE_INSTAGIB_VAPORIZER_CELLS = 1,
78         RANDOM_ITEM_SUBTYPE_INSTAGIB_INVISIBILITY,
79         RANDOM_ITEM_SUBTYPE_INSTAGIB_EXTRA_LIFE,
80         RANDOM_ITEM_SUBTYPE_INSTAGIB_SPEED
81 };
82
83 enum
84 {
85         RANDOM_ITEM_SUBTYPE_OVERKILL_HEALTH_MEGA = 1,
86         RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_SMALL,
87         RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEDIUM,
88         RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_BIG,
89         RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEGA,
90         RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_HMG,
91         RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_RPC
92 };
93
94 //======================= Global variables ====================================
95
96 bool autocvar_g_random_items; ///< Whether to enable random items.
97
98 // Replace cvars
99
100 /// \brief Classnames to replace small health with.
101 string autocvar_g_random_items_replace_health_small;
102 /// \brief Classnames to replace medium health with.
103 string autocvar_g_random_items_replace_health_medium;
104 /// \brief Classnames to replace big health with.
105 string autocvar_g_random_items_replace_health_big;
106 /// \brief Classnames to replace mega health with.
107 string autocvar_g_random_items_replace_health_mega;
108
109 /// \brief Classnames to replace small armor with.
110 string autocvar_g_random_items_replace_armor_small;
111 /// \brief Classnames to replace medium armor with.
112 string autocvar_g_random_items_replace_armor_medium;
113 /// \brief Classnames to replace big armor with.
114 string autocvar_g_random_items_replace_armor_big;
115 /// \brief Classnames to replace mega armor with.
116 string autocvar_g_random_items_replace_armor_mega;
117
118 /// \brief Classnames to replace shells with.
119 string autocvar_g_random_items_replace_item_shells;
120 /// \brief Classnames to replace bullets with.
121 string autocvar_g_random_items_replace_item_bullets;
122 /// \brief Classnames to replace rockets with.
123 string autocvar_g_random_items_replace_item_rockets;
124 /// \brief Classnames to replace cells with.
125 string autocvar_g_random_items_replace_item_cells;
126 /// \brief Classnames to replace plasma with.
127 string autocvar_g_random_items_replace_item_plasma;
128 /// \brief Classnames to replace fuel with.
129 string autocvar_g_random_items_replace_item_fuel;
130
131 /// \brief Classnames to replace blaster with.
132 string autocvar_g_random_items_replace_weapon_blaster;
133 /// \brief Classnames to replace shotgun with.
134 string autocvar_g_random_items_replace_weapon_shotgun;
135 /// \brief Classnames to replace machinegun with.
136 string autocvar_g_random_items_replace_weapon_machinegun;
137 /// \brief Classnames to replace mortar with.
138 string autocvar_g_random_items_replace_weapon_mortar;
139 /// \brief Classnames to replace electro with.
140 string autocvar_g_random_items_replace_weapon_electro;
141 /// \brief Classnames to replace crylink with.
142 string autocvar_g_random_items_replace_weapon_crylink;
143 /// \brief Classnames to replace vortex with.
144 string autocvar_g_random_items_replace_weapon_vortex;
145 /// \brief Classnames to replace hagar with.
146 string autocvar_g_random_items_replace_weapon_hagar;
147 /// \brief Classnames to replace devastator with.
148 string autocvar_g_random_items_replace_weapon_devastator;
149 /// \brief Classnames to replace shockwave with.
150 string autocvar_g_random_items_replace_weapon_shockwave;
151 /// \brief Classnames to replace arc with.
152 string autocvar_g_random_items_replace_weapon_arc;
153 /// \brief Classnames to replace hook with.
154 string autocvar_g_random_items_replace_weapon_hook;
155 /// \brief Classnames to replace tuba with.
156 string autocvar_g_random_items_replace_weapon_tuba;
157 /// \brief Classnames to replace port-o-launch with.
158 string autocvar_g_random_items_replace_weapon_porto;
159 /// \brief Classnames to replace fireball with.
160 string autocvar_g_random_items_replace_weapon_fireball;
161 /// \brief Classnames to replace mine layer with.
162 string autocvar_g_random_items_replace_weapon_minelayer;
163 /// \brief Classnames to replace HLAC with.
164 string autocvar_g_random_items_replace_weapon_hlac;
165 /// \brief Classnames to replace rifle with.
166 string autocvar_g_random_items_replace_weapon_rifle;
167 /// \brief Classnames to replace TAG seeker with.
168 string autocvar_g_random_items_replace_weapon_seeker;
169 /// \brief Classnames to replace vaporizer with.
170 string autocvar_g_random_items_replace_weapon_vaporizer;
171 /// \brief Classnames to replace HMG with.
172 string autocvar_g_random_items_replace_weapon_hmg;
173 /// \brief Classnames to replace RPC with.
174 string autocvar_g_random_items_replace_weapon_rpc;
175
176 /// \brief Classnames to replace strength with.
177 string autocvar_g_random_items_replace_item_strength;
178 /// \brief Classnames to replace shield with.
179 string autocvar_g_random_items_replace_item_shield;
180 /// \brief Classnames to replace fuel regeneration with.
181 string autocvar_g_random_items_replace_item_fuel_regen;
182 /// \brief Classnames to replace jetpack with.
183 string autocvar_g_random_items_replace_item_jetpack;
184
185 /// \brief Classnames to replace vaporizer cells with.
186 string autocvar_g_random_items_replace_item_vaporizer_cells;
187 /// \brief Classnames to replace invisibility with.
188 string autocvar_g_random_items_replace_item_invisibility;
189 /// \brief Classnames to replace extra life with.
190 string autocvar_g_random_items_replace_item_extralife;
191 /// \brief Classnames to replace speed with.
192 string autocvar_g_random_items_replace_item_speed;
193
194 // Map probability cvars
195
196 /// \brief Probability of random health items spawning in the map.
197 float autocvar_g_random_items_health_probability;
198 /// \brief Probability of random armor items spawning in the map.
199 float autocvar_g_random_items_armor_probability;
200 /// \brief Probability of random resource items spawning in the map.
201 float autocvar_g_random_items_resource_probability;
202 /// \brief Probability of random weapons spawning in the map.
203 float autocvar_g_random_items_weapon_probability;
204 /// \brief Probability of random powerups spawning in the map.
205 float autocvar_g_random_items_powerup_probability;
206
207 /// \brief Probability of random small health spawning in the map.
208 float autocvar_g_random_items_health_small_probability;
209 /// \brief Probability of random medium health spawning in the map.
210 float autocvar_g_random_items_health_medium_probability;
211 /// \brief Probability of random big health spawning in the map.
212 float autocvar_g_random_items_health_big_probability;
213 /// \brief Probability of random mega health spawning in the map.
214 float autocvar_g_random_items_health_mega_probability;
215
216 /// \brief Probability of random small armor spawning in the map.
217 float autocvar_g_random_items_armor_small_probability;
218 /// \brief Probability of random medium armor.spawning in the map.
219 float autocvar_g_random_items_armor_medium_probability;
220 /// \brief Probability of random big armor spawning in the map.
221 float autocvar_g_random_items_armor_big_probability;
222 /// \brief Probability of random mega armor spawning in the map.
223 float autocvar_g_random_items_armor_mega_probability;
224
225 /// \brief Probability of random shells spawning in the map.
226 float autocvar_g_random_items_resource_shells_probability;
227 /// \brief Probability of random bullets spawning in the map.
228 float autocvar_g_random_items_resource_bullets_probability;
229 /// \brief Probability of random rockets spawning in the map.
230 float autocvar_g_random_items_resource_rockets_probability;
231 /// \brief Probability of random cells spawning in the map.
232 float autocvar_g_random_items_resource_cells_probability;
233 /// \brief Probability of random plasma spawning in the map.
234 float autocvar_g_random_items_resource_plasma_probability;
235 /// \brief Probability of random fuel spawning in the map.
236 float autocvar_g_random_items_resource_fuel_probability;
237
238 /// \brief Probability of random blaster spawning in the map.
239 float autocvar_g_random_items_weapon_blaster_probability;
240 /// \brief Probability of random shotgun spawning in the map.
241 float autocvar_g_random_items_weapon_shotgun_probability;
242 /// \brief Probability of random machinegun spawning in the map.
243 float autocvar_g_random_items_weapon_machinegun_probability;
244 /// \brief Probability of random mortar spawning in the map.
245 float autocvar_g_random_items_weapon_mortar_probability;
246 /// \brief Probability of random electro spawning in the map.
247 float autocvar_g_random_items_weapon_electro_probability;
248 /// \brief Probability of random crylink spawning in the map.
249 float autocvar_g_random_items_weapon_crylink_probability;
250 /// \brief Probability of random vortex spawning in the map.
251 float autocvar_g_random_items_weapon_vortex_probability;
252 /// \brief Probability of random hagar spawning in the map.
253 float autocvar_g_random_items_weapon_hagar_probability;
254 /// \brief Probability of random devastator spawning in the map.
255 float autocvar_g_random_items_weapon_devastator_probability;
256 /// \brief Probability of random shockwave spawning in the map.
257 float autocvar_g_random_items_weapon_shockwave_probability;
258 /// \brief Probability of random arc spawning in the map.
259 float autocvar_g_random_items_weapon_arc_probability;
260 /// \brief Probability of random hook spawning in the map.
261 float autocvar_g_random_items_weapon_hook_probability;
262 /// \brief Probability of random tuba spawning in the map.
263 float autocvar_g_random_items_weapon_tuba_probability;
264 /// \brief Probability of random port-o-launch spawning in the map.
265 float autocvar_g_random_items_weapon_porto_probability;
266 /// \brief Probability of random fireball spawning in the map.
267 float autocvar_g_random_items_weapon_fireball_probability;
268 /// \brief Probability of random mine layer spawning in the map.
269 float autocvar_g_random_items_weapon_minelayer_probability;
270 /// \brief Probability of random HLAC spawning in the map.
271 float autocvar_g_random_items_weapon_hlac_probability;
272 /// \brief Probability of random rifle spawning in the map.
273 float autocvar_g_random_items_weapon_rifle_probability;
274 /// \brief Probability of random TAG seeker spawning in the map.
275 float autocvar_g_random_items_weapon_seeker_probability;
276 /// \brief Probability of random vaporizer spawning in the map.
277 float autocvar_g_random_items_weapon_vaporizer_probability;
278
279 /// \brief Probability of random strength spawning in the map.
280 float autocvar_g_random_items_strength_probability;
281 /// \brief Probability of random shield spawning in the map.
282 float autocvar_g_random_items_shield_probability;
283 /// \brief Probability of random fuel regeneration spawning in the map.
284 float autocvar_g_random_items_fuel_regen_probability;
285 /// \brief Probability of random jetpack spawning in the map.
286 float autocvar_g_random_items_jetpack_probability;
287
288 /// \brief Probability of random vaporizer cells spawning in the map.
289 float autocvar_g_random_items_vaporizer_cells_probability;
290 /// \brief Probability of random invisibility spawning in the map.
291 float autocvar_g_random_items_invisibility_probability;
292 /// \brief Probability of random extra life spawning in the map.
293 float autocvar_g_random_items_extralife_probability;
294 /// \brief Probability of random speed spawning in the map.
295 float autocvar_g_random_items_speed_probability;
296
297 /// \brief Probability of random mega health spawning in the map during overkill.
298 float autocvar_g_random_items_overkill_health_mega_probability;
299 /// \brief Probability of random small armor spawning in the map during
300 /// overkill.
301 float autocvar_g_random_items_overkill_armor_small_probability;
302 /// \brief Probability of random medium armor spawning in the map during
303 /// overkill.
304 float autocvar_g_random_items_overkill_armor_medium_probability;
305 /// \brief Probability of random big armor spawning in the map during overkill.
306 float autocvar_g_random_items_overkill_armor_big_probability;
307 /// \brief Probability of random mega armor spawning in the map during overkill.
308 float autocvar_g_random_items_overkill_armor_mega_probability;
309 /// \brief Probability of random HMG spawning in the map during overkill.
310 float autocvar_g_random_items_overkill_weapon_hmg_probability;
311 /// \brief Probability of random RPC spawning in the map during overkill.
312 float autocvar_g_random_items_overkill_weapon_rpc_probability;
313
314 // Loot
315
316 bool autocvar_g_random_loot; ///< Whether to enable random loot.
317
318 float autocvar_g_random_loot_min; ///< Minimum amount of loot items.
319 float autocvar_g_random_loot_max; ///< Maximum amount of loot items.
320 float autocvar_g_random_loot_time; ///< Amount of time the loot will stay.
321 float autocvar_g_random_loot_spread; ///< How far can loot be thrown.
322
323 // Loot probability cvars
324
325 /// \brief Probability of random health items spawning as loot.
326 float autocvar_g_random_loot_health_probability;
327 /// \brief Probability of random armor items spawning as loot.
328 float autocvar_g_random_loot_armor_probability;
329 /// \brief Probability of random resource items spawning as loot.
330 float autocvar_g_random_loot_resource_probability;
331 /// \brief Probability of random weapons spawning as loot.
332 float autocvar_g_random_loot_weapon_probability;
333 /// \brief Probability of random powerups spawning as loot.
334 float autocvar_g_random_loot_powerup_probability;
335
336 /// \brief Probability of random small health spawning as loot.
337 float autocvar_g_random_loot_health_small_probability;
338 /// \brief Probability of random medium health spawning as loot.
339 float autocvar_g_random_loot_health_medium_probability;
340 /// \brief Probability of random big health spawning as loot.
341 float autocvar_g_random_loot_health_big_probability;
342 /// \brief Probability of random mega health spawning as loot.
343 float autocvar_g_random_loot_health_mega_probability;
344
345 /// \brief Probability of random small armor spawning as loot.
346 float autocvar_g_random_loot_armor_small_probability;
347 /// \brief Probability of random medium armor.spawning as loot.
348 float autocvar_g_random_loot_armor_medium_probability;
349 /// \brief Probability of random big armor spawning as loot.
350 float autocvar_g_random_loot_armor_big_probability;
351 /// \brief Probability of random mega armor spawning as loot.
352 float autocvar_g_random_loot_armor_mega_probability;
353
354 /// \brief Probability of random shells spawning as loot.
355 float autocvar_g_random_loot_resource_shells_probability;
356 /// \brief Probability of random bullets spawning as loot.
357 float autocvar_g_random_loot_resource_bullets_probability;
358 /// \brief Probability of random rockets spawning as loot.
359 float autocvar_g_random_loot_resource_rockets_probability;
360 /// \brief Probability of random cells spawning as loot.
361 float autocvar_g_random_loot_resource_cells_probability;
362 /// \brief Probability of random plasma spawning as loot.
363 float autocvar_g_random_loot_resource_plasma_probability;
364 /// \brief Probability of random fuel spawning as loot.
365 float autocvar_g_random_loot_resource_fuel_probability;
366
367 /// \brief Probability of random blaster spawning as loot.
368 float autocvar_g_random_loot_weapon_blaster_probability;
369 /// \brief Probability of random shotgun spawning as loot.
370 float autocvar_g_random_loot_weapon_shotgun_probability;
371 /// \brief Probability of random machinegun spawning as loot.
372 float autocvar_g_random_loot_weapon_machinegun_probability;
373 /// \brief Probability of random mortar spawning as loot.
374 float autocvar_g_random_loot_weapon_mortar_probability;
375 /// \brief Probability of random electro spawning as loot.
376 float autocvar_g_random_loot_weapon_electro_probability;
377 /// \brief Probability of random crylink spawning as loot.
378 float autocvar_g_random_loot_weapon_crylink_probability;
379 /// \brief Probability of random vortex spawning as loot.
380 float autocvar_g_random_loot_weapon_vortex_probability;
381 /// \brief Probability of random hagar spawning as loot.
382 float autocvar_g_random_loot_weapon_hagar_probability;
383 /// \brief Probability of random devastator spawning as loot.
384 float autocvar_g_random_loot_weapon_devastator_probability;
385 /// \brief Probability of random shockwave spawning as loot.
386 float autocvar_g_random_loot_weapon_shockwave_probability;
387 /// \brief Probability of random arc spawning as loot.
388 float autocvar_g_random_loot_weapon_arc_probability;
389 /// \brief Probability of random hook spawning as loot.
390 float autocvar_g_random_loot_weapon_hook_probability;
391 /// \brief Probability of random tuba spawning as loot.
392 float autocvar_g_random_loot_weapon_tuba_probability;
393 /// \brief Probability of random port-o-launch spawning as loot.
394 float autocvar_g_random_loot_weapon_porto_probability;
395 /// \brief Probability of random fireball spawning as loot.
396 float autocvar_g_random_loot_weapon_fireball_probability;
397 /// \brief Probability of random mine layer spawning as loot.
398 float autocvar_g_random_loot_weapon_minelayer_probability;
399 /// \brief Probability of random HLAC spawning as loot.
400 float autocvar_g_random_loot_weapon_hlac_probability;
401 /// \brief Probability of random rifle spawning as loot.
402 float autocvar_g_random_loot_weapon_rifle_probability;
403 /// \brief Probability of random TAG seeker spawning as loot.
404 float autocvar_g_random_loot_weapon_seeker_probability;
405 /// \brief Probability of random vaporizer spawning as loot.
406 float autocvar_g_random_loot_weapon_vaporizer_probability;
407
408 /// \brief Probability of random strength spawning as loot.
409 float autocvar_g_random_loot_strength_probability;
410 /// \brief Probability of random shield spawning as loot.
411 float autocvar_g_random_loot_shield_probability;
412 /// \brief Probability of random fuel regeneration spawning as loot.
413 float autocvar_g_random_loot_fuel_regen_probability;
414 /// \brief Probability of random jetpack spawning as loot.
415 float autocvar_g_random_loot_jetpack_probability;
416
417 /// \brief Probability of random vaporizer cells spawning as loot.
418 float autocvar_g_random_loot_vaporizer_cells_probability;
419 /// \brief Probability of random invisibility spawning as loot.
420 float autocvar_g_random_loot_invisibility_probability;
421 /// \brief Probability of random extra life spawning as loot.
422 float autocvar_g_random_loot_extralife_probability;
423 /// \brief Probability of random speed spawning as loot.
424 float autocvar_g_random_loot_speed_probability;
425
426 /// \brief Probability of random mega health spawning as loot during overkill.
427 float autocvar_g_random_loot_overkill_health_mega_probability;
428 /// \brief Probability of random small armor spawning as loot during overkill.
429 float autocvar_g_random_loot_overkill_armor_small_probability;
430 /// \brief Probability of random medium armor spawning as loot during overkill.
431 float autocvar_g_random_loot_overkill_armor_medium_probability;
432 /// \brief Probability of random big armor spawning as loot during overkill.
433 float autocvar_g_random_loot_overkill_armor_big_probability;
434 /// \brief Probability of random mega armor spawning as loot during overkill.
435 float autocvar_g_random_loot_overkill_armor_mega_probability;
436 /// \brief Probability of random HMG spawning as loot during overkill.
437 float autocvar_g_random_loot_overkill_weapon_hmg_probability;
438 /// \brief Probability of random RPC spawning as loot during overkill.
439 float autocvar_g_random_loot_overkill_weapon_rpc_probability;
440
441
442 /// \brief Holds whether random item is spawning. Used to prevent infinite
443 /// recursion.
444 bool random_items_is_spawning = false;
445
446 //========================= Free functions ====================================
447
448 /// \brief Returns list of classnames to replace a map item with.
449 /// \param[in] item Item to inspect.
450 /// \return List of classnames to replace a map item with.
451 string RandomItems_GetItemReplacementClassNames(entity item)
452 {
453         switch (item.classname)
454         {
455                 case "item_health_small":
456                 {
457                         return autocvar_g_random_items_replace_health_small;
458                 }
459                 case "item_health_medium":
460                 {
461                         return autocvar_g_random_items_replace_health_medium;
462                 }
463                 case "item_health_big":
464                 case "item_health_large":
465                 {
466                         return autocvar_g_random_items_replace_health_big;
467                 }
468                 case "item_health_mega":
469                 {
470                         return autocvar_g_random_items_replace_health_mega;
471                 }
472                 case "item_armor_small":
473                 {
474                         return autocvar_g_random_items_replace_armor_small;
475                 }
476                 case "item_armor_medium":
477                 {
478                         return autocvar_g_random_items_replace_armor_medium;
479                 }
480                 case "item_armor_big":
481                 case "item_armor_large":
482                 {
483                         return autocvar_g_random_items_replace_armor_big;
484                 }
485                 case "item_armor_mega":
486                 {
487                         return autocvar_g_random_items_replace_armor_mega;
488                 }
489                 case "item_shells":
490                 {
491                         return autocvar_g_random_items_replace_item_shells;
492                 }
493                 case "item_bullets":
494                 {
495                         return autocvar_g_random_items_replace_item_bullets;
496                 }
497                 case "item_rockets":
498                 {
499                         return autocvar_g_random_items_replace_item_rockets;
500                 }
501                 case "item_cells":
502                 {
503                         return autocvar_g_random_items_replace_item_cells;
504                 }
505                 case "item_plasma":
506                 {
507                         return autocvar_g_random_items_replace_item_plasma;
508                 }
509                 case "item_fuel":
510                 {
511                         return autocvar_g_random_items_replace_item_fuel;
512                 }
513                 case "weapon_blaster":
514                 case "weapon_laser":
515                 {
516                         return autocvar_g_random_items_replace_weapon_blaster;
517                 }
518                 case "weapon_shotgun":
519                 {
520                         return autocvar_g_random_items_replace_weapon_shotgun;
521                 }
522                 case "weapon_machinegun":
523                 case "weapon_uzi":
524                 {
525                         return autocvar_g_random_items_replace_weapon_machinegun;
526                 }
527                 case "weapon_mortar":
528                 case "weapon_grenadelauncher":
529                 {
530                         return autocvar_g_random_items_replace_weapon_mortar;
531                 }
532                 case "weapon_electro":
533                 {
534                         return autocvar_g_random_items_replace_weapon_electro;
535                 }
536                 case "weapon_crylink":
537                 {
538                         return autocvar_g_random_items_replace_weapon_crylink;
539                 }
540                 case "weapon_vortex":
541                 case "weapon_nex":
542                 {
543                         return autocvar_g_random_items_replace_weapon_vortex;
544                 }
545                 case "weapon_hagar":
546                 {
547                         return autocvar_g_random_items_replace_weapon_hagar;
548                 }
549                 case "weapon_devastator":
550                 case "weapon_rocketlauncher":
551                 {
552                         return autocvar_g_random_items_replace_weapon_devastator;
553                 }
554                 case "weapon_shockwave":
555                 {
556                         return autocvar_g_random_items_replace_weapon_shockwave;
557                 }
558                 case "weapon_arc":
559                 {
560                         return autocvar_g_random_items_replace_weapon_arc;
561                 }
562                 case "weapon_hook":
563                 {
564                         return autocvar_g_random_items_replace_weapon_hook;
565                 }
566                 case "weapon_tuba":
567                 {
568                         return autocvar_g_random_items_replace_weapon_tuba;
569                 }
570                 case "weapon_porto":
571                 {
572                         return autocvar_g_random_items_replace_weapon_porto;
573                 }
574                 case "weapon_fireball":
575                 {
576                         return autocvar_g_random_items_replace_weapon_fireball;
577                 }
578                 case "weapon_minelayer":
579                 {
580                         return autocvar_g_random_items_replace_weapon_minelayer;
581                 }
582                 case "weapon_hlac":
583                 {
584                         return autocvar_g_random_items_replace_weapon_hlac;
585                 }
586                 case "weapon_rifle":
587                 case "weapon_campingrifle":
588                 case "weapon_sniperrifle":
589                 {
590                         return autocvar_g_random_items_replace_weapon_rifle;
591                 }
592                 case "weapon_seeker":
593                 {
594                         return autocvar_g_random_items_replace_weapon_seeker;
595                 }
596                 case "weapon_vaporizer":
597                 case "weapon_minstanex":
598                 {
599                         return autocvar_g_random_items_replace_weapon_vaporizer;
600                 }
601                 case "weapon_hmg":
602                 {
603                         return autocvar_g_random_items_replace_weapon_hmg;
604                 }
605                 case "weapon_rpc":
606                 {
607                         return autocvar_g_random_items_replace_weapon_rpc;
608                 }
609                 case "item_strength":
610                 {
611                         return autocvar_g_random_items_replace_item_strength;
612                 }
613                 case "item_invincible":
614                 {
615                         return autocvar_g_random_items_replace_item_shield;
616                 }
617                 case "item_fuel_regen":
618                 {
619                         return autocvar_g_random_items_replace_item_fuel_regen;
620                 }
621                 case "item_jetpack":
622                 {
623                         return autocvar_g_random_items_replace_item_jetpack;
624                 }
625                 case "item_vaporizer_cells":
626                 {
627                         return autocvar_g_random_items_replace_item_vaporizer_cells;
628                 }
629                 case "item_invisibility":
630                 {
631                         return autocvar_g_random_items_replace_item_invisibility;
632                 }
633                 case "item_extralife":
634                 {
635                         return autocvar_g_random_items_replace_item_extralife;
636                 }
637                 case "item_speed":
638                 {
639                         return autocvar_g_random_items_replace_item_speed;
640                 }
641                 case "replacedweapon":
642                 {
643                         switch (item.weapon)
644                         {
645                                 case WEP_MINE_LAYER.m_id:
646                                 {
647                                         return autocvar_g_random_items_replace_weapon_minelayer;
648                                 }
649                                 case WEP_HLAC.m_id:
650                                 {
651                                         return autocvar_g_random_items_replace_weapon_hlac;
652                                 }
653                                 case WEP_RIFLE.m_id:
654                                 {
655                                         return autocvar_g_random_items_replace_weapon_rifle;
656                                 }
657                                 case WEP_SEEKER.m_id:
658                                 {
659                                         return autocvar_g_random_items_replace_weapon_seeker;
660                                 }
661                                 default:
662                                 {
663                                         return "";
664                                 }
665                         }
666                 }
667                 default:
668                 {
669                         return "";
670                 }
671         }
672 }
673
674 /// \brief Returns a random classname of the instagib map item.
675 /// \return Random classname of the instagib map item.
676 string RandomItems_GetRandomInstagibMapItemClassName()
677 {
678         RandomSelection_Init();
679         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_INSTAGIB_VAPORIZER_CELLS,
680                 autocvar_g_random_items_vaporizer_cells_probability, 1);
681         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_INSTAGIB_INVISIBILITY,
682                 autocvar_g_random_items_invisibility_probability, 1);
683         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_INSTAGIB_EXTRA_LIFE,
684                 autocvar_g_random_items_extralife_probability, 1);
685         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_INSTAGIB_SPEED,
686                 autocvar_g_random_items_speed_probability, 1);
687         int item_type = RandomSelection_chosen_float;
688         switch (item_type)
689         {
690                 case RANDOM_ITEM_SUBTYPE_INSTAGIB_VAPORIZER_CELLS:
691                 {
692                         return "item_vaporizer_cells";
693                 }
694                 case RANDOM_ITEM_SUBTYPE_INSTAGIB_INVISIBILITY:
695                 {
696                         return "item_invisibility";
697                 }
698                 case RANDOM_ITEM_SUBTYPE_INSTAGIB_EXTRA_LIFE:
699                 {
700                         return "item_extralife";
701                 }
702                 case RANDOM_ITEM_SUBTYPE_INSTAGIB_SPEED:
703                 {
704                         return "item_speed";
705                 }
706         }
707         return "";
708 }
709
710 /// \brief Returns a random classname of the overkill map item.
711 /// \return Random classname of the overkill map item.
712 string RandomItems_GetRandomOverkillMapItemClassName()
713 {
714         RandomSelection_Init();
715         if (!autocvar_g_overkill_filter_healthmega)
716         {
717                 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_HEALTH_MEGA,
718                         autocvar_g_random_items_overkill_health_mega_probability, 1);
719         }
720         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_SMALL,
721                 autocvar_g_random_items_overkill_armor_small_probability, 1);
722         if (!autocvar_g_overkill_filter_armormedium)
723         {
724                 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEDIUM,
725                         autocvar_g_random_items_overkill_armor_medium_probability, 1);
726         }
727         if (!autocvar_g_overkill_filter_armorbig)
728         {
729                 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_BIG,
730                         autocvar_g_random_items_overkill_armor_big_probability, 1);
731         }
732         if (!autocvar_g_overkill_filter_armormega)
733         {
734                 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEGA,
735                         autocvar_g_random_items_overkill_armor_mega_probability, 1);
736         }
737         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_HMG,
738                 autocvar_g_random_items_overkill_weapon_hmg_probability, 1);
739         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_RPC,
740                 autocvar_g_random_items_overkill_weapon_rpc_probability, 1);
741         int item_type = RandomSelection_chosen_float;
742         switch (item_type)
743         {
744                 case RANDOM_ITEM_SUBTYPE_OVERKILL_HEALTH_MEGA:
745                 {
746                         return "item_health_mega";
747                 }
748                 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_SMALL:
749                 {
750                         return "item_armor_small";
751                 }
752                 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEDIUM:
753                 {
754                         return "item_armor_medium";
755                 }
756                 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_BIG:
757                 {
758                         return "item_armor_big";
759                 }
760                 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEGA:
761                 {
762                         return "item_armor_mega";
763                 }
764                 case RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_HMG:
765                 {
766                         return "weapon_hmg";
767                 }
768                 case RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_RPC:
769                 {
770                         return "weapon_rpc";
771                 }
772         }
773         return "";
774 }
775
776 /// \brief Returns a random classname of the map item.
777 /// \return Random classname of the map item.
778 string RandomItems_GetRandomMapItemClassName()
779 {
780         if (autocvar_g_instagib)
781         {
782                 return RandomItems_GetRandomInstagibMapItemClassName();
783         }
784         if (expr_evaluate(autocvar_g_overkill))
785         {
786                 return RandomItems_GetRandomOverkillMapItemClassName();
787         }
788         RandomSelection_Init();
789         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_HEALTH,
790                 autocvar_g_random_items_health_probability, 1);
791         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_ARMOR,
792                 autocvar_g_random_items_armor_probability, 1);
793         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_RESOURCE,
794                 autocvar_g_random_items_resource_probability, 1);
795         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_WEAPON,
796                 autocvar_g_random_items_weapon_probability, 1);
797         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_POWERUP,
798                 autocvar_g_random_items_powerup_probability, 1);
799         int item_type = RandomSelection_chosen_float;
800         switch (item_type)
801         {
802                 case RANDOM_ITEM_TYPE_HEALTH:
803                 {
804                         RandomSelection_Init();
805                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_SMALL,
806                                 autocvar_g_random_items_health_small_probability, 1);
807                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_MEDIUM,
808                                 autocvar_g_random_items_health_medium_probability, 1);
809                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_BIG,
810                                 autocvar_g_random_items_health_big_probability, 1);
811                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_MEGA,
812                                 autocvar_g_random_items_health_mega_probability, 1);
813                         item_type = RandomSelection_chosen_float;
814                         switch (item_type)
815                         {
816                                 case RANDOM_ITEM_SUBTYPE_HEALTH_SMALL:
817                                 {
818                                         return "item_health_small";
819                                 }
820                                 case RANDOM_ITEM_SUBTYPE_HEALTH_MEDIUM:
821                                 {
822                                         return "item_health_medium";
823                                 }
824                                 case RANDOM_ITEM_SUBTYPE_HEALTH_BIG:
825                                 {
826                                         return "item_health_big";
827                                 }
828                                 case RANDOM_ITEM_SUBTYPE_HEALTH_MEGA:
829                                 {
830                                         return "item_health_mega";
831                                 }
832                         }
833                         return "";
834                 }
835                 case RANDOM_ITEM_TYPE_ARMOR:
836                 {
837                         RandomSelection_Init();
838                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_SMALL,
839                                 autocvar_g_random_items_armor_small_probability, 1);
840                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_MEDIUM,
841                                 autocvar_g_random_items_armor_medium_probability, 1);
842                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_BIG,
843                                 autocvar_g_random_items_armor_big_probability, 1);
844                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_MEGA,
845                                 autocvar_g_random_items_armor_mega_probability, 1);
846                         item_type = RandomSelection_chosen_float;
847                         switch (item_type)
848                         {
849                                 case RANDOM_ITEM_SUBTYPE_ARMOR_SMALL:
850                                 {
851                                         return "item_armor_small";
852                                 }
853                                 case RANDOM_ITEM_SUBTYPE_ARMOR_MEDIUM:
854                                 {
855                                         return "item_armor_medium";
856                                 }
857                                 case RANDOM_ITEM_SUBTYPE_ARMOR_BIG:
858                                 {
859                                         return "item_armor_big";
860                                 }
861                                 case RANDOM_ITEM_SUBTYPE_ARMOR_MEGA:
862                                 {
863                                         return "item_armor_mega";
864                                 }
865                         }
866                         return "";
867                 }
868                 case RANDOM_ITEM_TYPE_RESOURCE:
869                 {
870                         RandomSelection_Init();
871                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_SHELLS,
872                                 autocvar_g_random_items_resource_shells_probability, 1);
873                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_BULLETS,
874                                 autocvar_g_random_items_resource_bullets_probability, 1);
875                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_ROCKETS,
876                                 autocvar_g_random_items_resource_rockets_probability, 1);
877                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_CELLS,
878                                 autocvar_g_random_items_resource_cells_probability, 1);
879                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_PLASMA,
880                                 autocvar_g_random_items_resource_plasma_probability, 1);
881                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_FUEL,
882                                 autocvar_g_random_items_resource_fuel_probability, 1);
883                         item_type = RandomSelection_chosen_float;
884                         switch (item_type)
885                         {
886                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_SHELLS:
887                                 {
888                                         return "item_shells";
889                                 }
890                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_BULLETS:
891                                 {
892                                         return "item_bullets";
893                                 }
894                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_ROCKETS:
895                                 {
896                                         return "item_rockets";
897                                 }
898                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_CELLS:
899                                 {
900                                         return "item_cells";
901                                 }
902                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_PLASMA:
903                                 {
904                                         return "item_plasma";
905                                 }
906                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_FUEL:
907                                 {
908                                         return "item_fuel";
909                                 }
910                         }
911                         return "";
912                 }
913                 case RANDOM_ITEM_TYPE_WEAPON:
914                 {
915                         RandomSelection_Init();
916                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_BLASTER,
917                                 autocvar_g_random_items_weapon_blaster_probability, 1);
918                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_SHOTGUN,
919                                 autocvar_g_random_items_weapon_shotgun_probability, 1);
920                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_MACHINEGUN,
921                                 autocvar_g_random_items_weapon_machinegun_probability, 1);
922                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_MORTAR,
923                                 autocvar_g_random_items_weapon_mortar_probability, 1);
924                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_ELECTRO,
925                                 autocvar_g_random_items_weapon_electro_probability, 1);
926                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_CRYLINK,
927                                 autocvar_g_random_items_weapon_crylink_probability, 1);
928                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_VORTEX,
929                                 autocvar_g_random_items_weapon_vortex_probability, 1);
930                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_HAGAR,
931                                 autocvar_g_random_items_weapon_hagar_probability, 1);
932                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_DEVASTATOR,
933                                 autocvar_g_random_items_weapon_devastator_probability, 1);
934                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_SHOCKWAVE,
935                                 autocvar_g_random_items_weapon_shockwave_probability, 1);
936                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_ARC,
937                                 autocvar_g_random_items_weapon_arc_probability, 1);
938                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_HOOK,
939                                 autocvar_g_random_items_weapon_hook_probability, 1);
940                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_TUBA,
941                                 autocvar_g_random_items_weapon_tuba_probability, 1);
942                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_PORTO,
943                                 autocvar_g_random_items_weapon_porto_probability, 1);
944                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_FIREBALL,
945                                 autocvar_g_random_items_weapon_fireball_probability, 1);
946                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_MINELAYER,
947                                 autocvar_g_random_items_weapon_minelayer_probability, 1);
948                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_HLAC,
949                                 autocvar_g_random_items_weapon_hlac_probability, 1);
950                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_RIFLE,
951                                 autocvar_g_random_items_weapon_rifle_probability, 1);
952                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_SEEKER,
953                                 autocvar_g_random_items_weapon_seeker_probability, 1);
954                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_VAPORIZER,
955                                 autocvar_g_random_items_weapon_vaporizer_probability, 1);
956                         item_type = RandomSelection_chosen_float;
957                         switch (item_type)
958                         {
959                                 case RANDOM_ITEM_SUBTYPE_WEAPON_BLASTER:
960                                 {
961                                         return "weapon_blaster";
962                                 }
963                                 case RANDOM_ITEM_SUBTYPE_WEAPON_SHOTGUN:
964                                 {
965                                         return "weapon_shotgun";
966                                 }
967                                 case RANDOM_ITEM_SUBTYPE_WEAPON_MACHINEGUN:
968                                 {
969                                         return "weapon_machinegun";
970                                 }
971                                 case RANDOM_ITEM_SUBTYPE_WEAPON_MORTAR:
972                                 {
973                                         return "weapon_mortar";
974                                 }
975                                 case RANDOM_ITEM_SUBTYPE_WEAPON_ELECTRO:
976                                 {
977                                         return "weapon_electro";
978                                 }
979                                 case RANDOM_ITEM_SUBTYPE_WEAPON_CRYLINK:
980                                 {
981                                         return "weapon_crylink";
982                                 }
983                                 case RANDOM_ITEM_SUBTYPE_WEAPON_VORTEX:
984                                 {
985                                         return "weapon_vortex";
986                                 }
987                                 case RANDOM_ITEM_SUBTYPE_WEAPON_HAGAR:
988                                 {
989                                         return "weapon_hagar";
990                                 }
991                                 case RANDOM_ITEM_SUBTYPE_WEAPON_DEVASTATOR:
992                                 {
993                                         return "weapon_devastator";
994                                 }
995                                 case RANDOM_ITEM_SUBTYPE_WEAPON_SHOCKWAVE:
996                                 {
997                                         return "weapon_shockwave";
998                                 }
999                                 case RANDOM_ITEM_SUBTYPE_WEAPON_ARC:
1000                                 {
1001                                         return "weapon_arc";
1002                                 }
1003                                 case RANDOM_ITEM_SUBTYPE_WEAPON_HOOK:
1004                                 {
1005                                         return "weapon_hook";
1006                                 }
1007                                 case RANDOM_ITEM_SUBTYPE_WEAPON_TUBA:
1008                                 {
1009                                         return "weapon_tuba";
1010                                 }
1011                                 case RANDOM_ITEM_SUBTYPE_WEAPON_PORTO:
1012                                 {
1013                                         return "weapon_porto";
1014                                 }
1015                                 case RANDOM_ITEM_SUBTYPE_WEAPON_FIREBALL:
1016                                 {
1017                                         return "weapon_fireball";
1018                                 }
1019                                 case RANDOM_ITEM_SUBTYPE_WEAPON_MINELAYER:
1020                                 {
1021                                         return "weapon_minelayer";
1022                                 }
1023                                 case RANDOM_ITEM_SUBTYPE_WEAPON_HLAC:
1024                                 {
1025                                         return "weapon_hlac";
1026                                 }
1027                                 case RANDOM_ITEM_SUBTYPE_WEAPON_RIFLE:
1028                                 {
1029                                         return "weapon_rifle";
1030                                 }
1031                                 case RANDOM_ITEM_SUBTYPE_WEAPON_SEEKER:
1032                                 {
1033                                         return "weapon_seeker";
1034                                 }
1035                                 case RANDOM_ITEM_SUBTYPE_WEAPON_VAPORIZER:
1036                                 {
1037                                         return "weapon_vaporizer";
1038                                 }
1039                         }
1040                         return "";
1041                 }
1042                 case RANDOM_ITEM_TYPE_POWERUP:
1043                 {
1044                         RandomSelection_Init();
1045                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_STRENGTH,
1046                                 autocvar_g_random_items_strength_probability, 1);
1047                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_SHIELD,
1048                                 autocvar_g_random_items_shield_probability, 1);
1049                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_FUEL_REGEN,
1050                                 autocvar_g_random_items_fuel_regen_probability, 1);
1051                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_JETPACK,
1052                                 autocvar_g_random_items_jetpack_probability, 1);
1053                         item_type = RandomSelection_chosen_float;
1054                         switch (item_type)
1055                         {
1056                                 case RANDOM_ITEM_SUBTYPE_POWERUP_STRENGTH:
1057                                 {
1058                                         return "item_strength";
1059                                 }
1060                                 case RANDOM_ITEM_SUBTYPE_POWERUP_SHIELD:
1061                                 {
1062                                         return "item_invincible";
1063                                 }
1064                                 case RANDOM_ITEM_SUBTYPE_POWERUP_FUEL_REGEN:
1065                                 {
1066                                         return "item_fuel_regen";
1067                                 }
1068                                 case RANDOM_ITEM_SUBTYPE_POWERUP_JETPACK:
1069                                 {
1070                                         return "item_jetpack";
1071                                 }
1072                         }
1073                         return "";
1074                 }
1075         }
1076         return "";
1077 }
1078
1079 /// \brief Replaces a map item.
1080 /// \param[in] item Item to replace.
1081 /// \return Spawned item on success, NULL otherwise.
1082 entity RandomItems_ReplaceMapItem(entity item)
1083 {
1084         //PrintToChatAll(strcat("Replacing ", item.classname));
1085         string new_classnames = RandomItems_GetItemReplacementClassNames(item);
1086         if (new_classnames == "")
1087         {
1088                 return NULL;
1089         }
1090         string new_classname;
1091         if (new_classnames == "random")
1092         {
1093                 new_classname = RandomItems_GetRandomMapItemClassName();
1094                 if (new_classname == "")
1095                 {
1096                         return NULL;
1097                 }
1098         }
1099         else
1100         {
1101                 int num_new_classnames = tokenize_console(new_classnames);
1102                 if (num_new_classnames == 1)
1103                 {
1104                         new_classname = new_classnames;
1105                 }
1106                 else
1107                 {
1108                         int classname_index = floor(random() * num_new_classnames);
1109                         new_classname = argv(classname_index);
1110                 }
1111         }
1112         //PrintToChatAll(strcat("Replacing with ", new_classname));
1113         if (new_classname == item.classname)
1114         {
1115                 return NULL;
1116         }
1117         random_items_is_spawning = true;
1118         entity new_item;
1119         if (!expr_evaluate(autocvar_g_overkill))
1120         {
1121                 new_item = Item_Create(strzone(new_classname), item.origin);
1122         }
1123         else
1124         {
1125                 new_item = spawn();
1126                 new_item.classname = strzone(new_classname);
1127                 new_item.spawnfunc_checked = true;
1128                 new_item.ok_item = true;
1129                 Item_Initialize(new_item, new_classname);
1130                 if (wasfreed(new_item))
1131                 {
1132                         return NULL;
1133                 }
1134                 setorigin(new_item, item.origin);
1135         }
1136         random_items_is_spawning = false;
1137         return new_item;
1138 }
1139
1140 /// \brief Returns a random classname of the instagib loot item.
1141 /// \return Random classname of the instagib loot item.
1142 string RandomItems_GetRandomInstagibLootItemClassName()
1143 {
1144         RandomSelection_Init();
1145         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_INSTAGIB_VAPORIZER_CELLS,
1146                 autocvar_g_random_loot_vaporizer_cells_probability, 1);
1147         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_INSTAGIB_INVISIBILITY,
1148                 autocvar_g_random_loot_invisibility_probability, 1);
1149         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_INSTAGIB_EXTRA_LIFE,
1150                 autocvar_g_random_loot_extralife_probability, 1);
1151         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_INSTAGIB_SPEED,
1152                 autocvar_g_random_loot_speed_probability, 1);
1153         int item_type = RandomSelection_chosen_float;
1154         switch (item_type)
1155         {
1156                 case RANDOM_ITEM_SUBTYPE_INSTAGIB_VAPORIZER_CELLS:
1157                 {
1158                         return "item_vaporizer_cells";
1159                 }
1160                 case RANDOM_ITEM_SUBTYPE_INSTAGIB_INVISIBILITY:
1161                 {
1162                         return "item_invisibility";
1163                 }
1164                 case RANDOM_ITEM_SUBTYPE_INSTAGIB_EXTRA_LIFE:
1165                 {
1166                         return "item_extralife";
1167                 }
1168                 case RANDOM_ITEM_SUBTYPE_INSTAGIB_SPEED:
1169                 {
1170                         return "item_speed";
1171                 }
1172         }
1173         return "";
1174 }
1175
1176 /// \brief Returns a random classname of the overkill loot item.
1177 /// \return Random classname of the overkill loot item.
1178 string RandomItems_GetRandomOverkillLootItemClassName()
1179 {
1180         RandomSelection_Init();
1181         if (!autocvar_g_overkill_filter_healthmega)
1182         {
1183                 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_HEALTH_MEGA,
1184                         autocvar_g_random_loot_overkill_health_mega_probability, 1);
1185         }
1186         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_SMALL,
1187                 autocvar_g_random_loot_overkill_armor_small_probability, 1);
1188         if (!autocvar_g_overkill_filter_armormedium)
1189         {
1190                 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEDIUM,
1191                         autocvar_g_random_loot_overkill_armor_medium_probability, 1);
1192         }
1193         if (!autocvar_g_overkill_filter_armorbig)
1194         {
1195                 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_BIG,
1196                         autocvar_g_random_loot_overkill_armor_big_probability, 1);
1197         }
1198         if (!autocvar_g_overkill_filter_armormega)
1199         {
1200                 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEGA,
1201                         autocvar_g_random_loot_overkill_armor_mega_probability, 1);
1202         }
1203         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_HMG,
1204                 autocvar_g_random_loot_overkill_weapon_hmg_probability, 1);
1205         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_RPC,
1206                 autocvar_g_random_loot_overkill_weapon_rpc_probability, 1);
1207         int item_type = RandomSelection_chosen_float;
1208         switch (item_type)
1209         {
1210                 case RANDOM_ITEM_SUBTYPE_OVERKILL_HEALTH_MEGA:
1211                 {
1212                         return "item_health_mega";
1213                 }
1214                 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_SMALL:
1215                 {
1216                         return "item_armor_small";
1217                 }
1218                 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEDIUM:
1219                 {
1220                         return "item_armor_medium";
1221                 }
1222                 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_BIG:
1223                 {
1224                         return "item_armor_big";
1225                 }
1226                 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEGA:
1227                 {
1228                         return "item_armor_mega";
1229                 }
1230                 case RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_HMG:
1231                 {
1232                         return "weapon_hmg";
1233                 }
1234                 case RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_RPC:
1235                 {
1236                         return "weapon_rpc";
1237                 }
1238         }
1239         return "";
1240 }
1241
1242 /// \brief Returns a random classname of the loot item.
1243 /// \return Random classname of the loot item.
1244 string RandomItems_GetRandomLootItemClassName()
1245 {
1246         if (autocvar_g_instagib)
1247         {
1248                 return RandomItems_GetRandomInstagibLootItemClassName();
1249         }
1250         if (expr_evaluate(autocvar_g_overkill))
1251         {
1252                 return RandomItems_GetRandomOverkillLootItemClassName();
1253         }
1254         RandomSelection_Init();
1255         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_HEALTH,
1256                 autocvar_g_random_loot_health_probability, 1);
1257         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_ARMOR,
1258                 autocvar_g_random_loot_armor_probability, 1);
1259         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_RESOURCE,
1260                 autocvar_g_random_loot_resource_probability, 1);
1261         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_WEAPON,
1262                 autocvar_g_random_loot_weapon_probability, 1);
1263         RandomSelection_AddFloat(RANDOM_ITEM_TYPE_POWERUP,
1264                 autocvar_g_random_loot_powerup_probability, 1);
1265         int item_type = RandomSelection_chosen_float;
1266         switch (item_type)
1267         {
1268                 case RANDOM_ITEM_TYPE_HEALTH:
1269                 {
1270                         RandomSelection_Init();
1271                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_SMALL,
1272                                 autocvar_g_random_loot_health_small_probability, 1);
1273                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_MEDIUM,
1274                                 autocvar_g_random_loot_health_medium_probability, 1);
1275                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_BIG,
1276                                 autocvar_g_random_loot_health_big_probability, 1);
1277                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_HEALTH_MEGA,
1278                                 autocvar_g_random_loot_health_mega_probability, 1);
1279                         item_type = RandomSelection_chosen_float;
1280                         switch (item_type)
1281                         {
1282                                 case RANDOM_ITEM_SUBTYPE_HEALTH_SMALL:
1283                                 {
1284                                         return "item_health_small";
1285                                 }
1286                                 case RANDOM_ITEM_SUBTYPE_HEALTH_MEDIUM:
1287                                 {
1288                                         return "item_health_medium";
1289                                 }
1290                                 case RANDOM_ITEM_SUBTYPE_HEALTH_BIG:
1291                                 {
1292                                         return "item_health_big";
1293                                 }
1294                                 case RANDOM_ITEM_SUBTYPE_HEALTH_MEGA:
1295                                 {
1296                                         return "item_health_mega";
1297                                 }
1298                         }
1299                         return "";
1300                 }
1301                 case RANDOM_ITEM_TYPE_ARMOR:
1302                 {
1303                         RandomSelection_Init();
1304                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_SMALL,
1305                                 autocvar_g_random_loot_armor_small_probability, 1);
1306                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_MEDIUM,
1307                                 autocvar_g_random_loot_armor_medium_probability, 1);
1308                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_BIG,
1309                                 autocvar_g_random_loot_armor_big_probability, 1);
1310                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_ARMOR_MEGA,
1311                                 autocvar_g_random_loot_armor_mega_probability, 1);
1312                         item_type = RandomSelection_chosen_float;
1313                         switch (item_type)
1314                         {
1315                                 case RANDOM_ITEM_SUBTYPE_ARMOR_SMALL:
1316                                 {
1317                                         return "item_armor_small";
1318                                 }
1319                                 case RANDOM_ITEM_SUBTYPE_ARMOR_MEDIUM:
1320                                 {
1321                                         return "item_armor_medium";
1322                                 }
1323                                 case RANDOM_ITEM_SUBTYPE_ARMOR_BIG:
1324                                 {
1325                                         return "item_armor_big";
1326                                 }
1327                                 case RANDOM_ITEM_SUBTYPE_ARMOR_MEGA:
1328                                 {
1329                                         return "item_armor_mega";
1330                                 }
1331                         }
1332                         return "";
1333                 }
1334                 case RANDOM_ITEM_TYPE_RESOURCE:
1335                 {
1336                         RandomSelection_Init();
1337                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_SHELLS,
1338                                 autocvar_g_random_loot_resource_shells_probability, 1);
1339                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_BULLETS,
1340                                 autocvar_g_random_loot_resource_bullets_probability, 1);
1341                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_ROCKETS,
1342                                 autocvar_g_random_loot_resource_rockets_probability, 1);
1343                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_CELLS,
1344                                 autocvar_g_random_loot_resource_cells_probability, 1);
1345                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_PLASMA,
1346                                 autocvar_g_random_loot_resource_plasma_probability, 1);
1347                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_RESOURCE_FUEL,
1348                                 autocvar_g_random_loot_resource_fuel_probability, 1);
1349                         item_type = RandomSelection_chosen_float;
1350                         switch (item_type)
1351                         {
1352                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_SHELLS:
1353                                 {
1354                                         return "item_shells";
1355                                 }
1356                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_BULLETS:
1357                                 {
1358                                         return "item_bullets";
1359                                 }
1360                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_ROCKETS:
1361                                 {
1362                                         return "item_rockets";
1363                                 }
1364                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_CELLS:
1365                                 {
1366                                         return "item_cells";
1367                                 }
1368                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_PLASMA:
1369                                 {
1370                                         return "item_plasma";
1371                                 }
1372                                 case RANDOM_ITEM_SUBTYPE_RESOURCE_FUEL:
1373                                 {
1374                                         return "item_fuel";
1375                                 }
1376                         }
1377                         return "";
1378                 }
1379                 case RANDOM_ITEM_TYPE_WEAPON:
1380                 {
1381                         RandomSelection_Init();
1382                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_BLASTER,
1383                                 autocvar_g_random_loot_weapon_blaster_probability, 1);
1384                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_SHOTGUN,
1385                                 autocvar_g_random_loot_weapon_shotgun_probability, 1);
1386                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_MACHINEGUN,
1387                                 autocvar_g_random_loot_weapon_machinegun_probability, 1);
1388                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_MORTAR,
1389                                 autocvar_g_random_loot_weapon_mortar_probability, 1);
1390                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_ELECTRO,
1391                                 autocvar_g_random_loot_weapon_electro_probability, 1);
1392                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_CRYLINK,
1393                                 autocvar_g_random_loot_weapon_crylink_probability, 1);
1394                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_VORTEX,
1395                                 autocvar_g_random_loot_weapon_vortex_probability, 1);
1396                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_HAGAR,
1397                                 autocvar_g_random_loot_weapon_hagar_probability, 1);
1398                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_DEVASTATOR,
1399                                 autocvar_g_random_loot_weapon_devastator_probability, 1);
1400                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_SHOCKWAVE,
1401                                 autocvar_g_random_loot_weapon_shockwave_probability, 1);
1402                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_ARC,
1403                                 autocvar_g_random_loot_weapon_arc_probability, 1);
1404                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_HOOK,
1405                                 autocvar_g_random_loot_weapon_hook_probability, 1);
1406                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_TUBA,
1407                                 autocvar_g_random_loot_weapon_tuba_probability, 1);
1408                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_PORTO,
1409                                 autocvar_g_random_loot_weapon_porto_probability, 1);
1410                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_FIREBALL,
1411                                 autocvar_g_random_loot_weapon_fireball_probability, 1);
1412                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_MINELAYER,
1413                                 autocvar_g_random_loot_weapon_minelayer_probability, 1);
1414                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_HLAC,
1415                                 autocvar_g_random_loot_weapon_hlac_probability, 1);
1416                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_RIFLE,
1417                                 autocvar_g_random_loot_weapon_rifle_probability, 1);
1418                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_SEEKER,
1419                                 autocvar_g_random_loot_weapon_seeker_probability, 1);
1420                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_WEAPON_VAPORIZER,
1421                                 autocvar_g_random_loot_weapon_vaporizer_probability, 1);
1422                         item_type = RandomSelection_chosen_float;
1423                         switch (item_type)
1424                         {
1425                                 case RANDOM_ITEM_SUBTYPE_WEAPON_BLASTER:
1426                                 {
1427                                         return "weapon_blaster";
1428                                 }
1429                                 case RANDOM_ITEM_SUBTYPE_WEAPON_SHOTGUN:
1430                                 {
1431                                         return "weapon_shotgun";
1432                                 }
1433                                 case RANDOM_ITEM_SUBTYPE_WEAPON_MACHINEGUN:
1434                                 {
1435                                         return "weapon_machinegun";
1436                                 }
1437                                 case RANDOM_ITEM_SUBTYPE_WEAPON_MORTAR:
1438                                 {
1439                                         return "weapon_mortar";
1440                                 }
1441                                 case RANDOM_ITEM_SUBTYPE_WEAPON_ELECTRO:
1442                                 {
1443                                         return "weapon_electro";
1444                                 }
1445                                 case RANDOM_ITEM_SUBTYPE_WEAPON_CRYLINK:
1446                                 {
1447                                         return "weapon_crylink";
1448                                 }
1449                                 case RANDOM_ITEM_SUBTYPE_WEAPON_VORTEX:
1450                                 {
1451                                         return "weapon_vortex";
1452                                 }
1453                                 case RANDOM_ITEM_SUBTYPE_WEAPON_HAGAR:
1454                                 {
1455                                         return "weapon_hagar";
1456                                 }
1457                                 case RANDOM_ITEM_SUBTYPE_WEAPON_DEVASTATOR:
1458                                 {
1459                                         return "weapon_devastator";
1460                                 }
1461                                 case RANDOM_ITEM_SUBTYPE_WEAPON_SHOCKWAVE:
1462                                 {
1463                                         return "weapon_shockwave";
1464                                 }
1465                                 case RANDOM_ITEM_SUBTYPE_WEAPON_ARC:
1466                                 {
1467                                         return "weapon_arc";
1468                                 }
1469                                 case RANDOM_ITEM_SUBTYPE_WEAPON_HOOK:
1470                                 {
1471                                         return "weapon_hook";
1472                                 }
1473                                 case RANDOM_ITEM_SUBTYPE_WEAPON_TUBA:
1474                                 {
1475                                         return "weapon_tuba";
1476                                 }
1477                                 case RANDOM_ITEM_SUBTYPE_WEAPON_PORTO:
1478                                 {
1479                                         return "weapon_porto";
1480                                 }
1481                                 case RANDOM_ITEM_SUBTYPE_WEAPON_FIREBALL:
1482                                 {
1483                                         return "weapon_fireball";
1484                                 }
1485                                 case RANDOM_ITEM_SUBTYPE_WEAPON_MINELAYER:
1486                                 {
1487                                         return "weapon_minelayer";
1488                                 }
1489                                 case RANDOM_ITEM_SUBTYPE_WEAPON_HLAC:
1490                                 {
1491                                         return "weapon_hlac";
1492                                 }
1493                                 case RANDOM_ITEM_SUBTYPE_WEAPON_RIFLE:
1494                                 {
1495                                         return "weapon_rifle";
1496                                 }
1497                                 case RANDOM_ITEM_SUBTYPE_WEAPON_SEEKER:
1498                                 {
1499                                         return "weapon_seeker";
1500                                 }
1501                                 case RANDOM_ITEM_SUBTYPE_WEAPON_VAPORIZER:
1502                                 {
1503                                         return "weapon_vaporizer";
1504                                 }
1505                         }
1506                         return "";
1507                 }
1508                 case RANDOM_ITEM_TYPE_POWERUP:
1509                 {
1510                         RandomSelection_Init();
1511                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_STRENGTH,
1512                                 autocvar_g_random_loot_strength_probability, 1);
1513                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_SHIELD,
1514                                 autocvar_g_random_loot_shield_probability, 1);
1515                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_FUEL_REGEN,
1516                                 autocvar_g_random_loot_fuel_regen_probability, 1);
1517                         RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_POWERUP_JETPACK,
1518                                 autocvar_g_random_loot_jetpack_probability, 1);
1519                         item_type = RandomSelection_chosen_float;
1520                         switch (item_type)
1521                         {
1522                                 case RANDOM_ITEM_SUBTYPE_POWERUP_STRENGTH:
1523                                 {
1524                                         return "item_strength";
1525                                 }
1526                                 case RANDOM_ITEM_SUBTYPE_POWERUP_SHIELD:
1527                                 {
1528                                         return "item_invincible";
1529                                 }
1530                                 case RANDOM_ITEM_SUBTYPE_POWERUP_FUEL_REGEN:
1531                                 {
1532                                         return "item_fuel_regen";
1533                                 }
1534                                 case RANDOM_ITEM_SUBTYPE_POWERUP_JETPACK:
1535                                 {
1536                                         return "item_jetpack";
1537                                 }
1538                         }
1539                         return "";
1540                 }
1541         }
1542         return "";
1543 }
1544
1545 /// \brief Spawns a random loot item.
1546 /// \param[in] position Position of the item.
1547 /// \return No return.
1548 void RandomItems_SpawnLootItem(vector position)
1549 {
1550         string class_name = RandomItems_GetRandomLootItemClassName();
1551         if (class_name == "")
1552         {
1553                 return;
1554         }
1555         vector spread = '0 0 0';
1556         spread.z = autocvar_g_random_loot_spread / 2;
1557         spread += randomvec() * autocvar_g_random_loot_spread;
1558         random_items_is_spawning = true;
1559         if (!expr_evaluate(autocvar_g_overkill))
1560         {
1561                 Item_CreateLoot(class_name, position, spread,
1562                         autocvar_g_random_loot_time);
1563         }
1564         else
1565         {
1566                 entity item = spawn();
1567                 item.ok_item = true;
1568                 item.classname = class_name;
1569                 Item_InitializeLoot(item, class_name, position, spread,
1570                         autocvar_g_random_loot_time);
1571         }
1572         random_items_is_spawning = false;
1573 }
1574
1575 //============================= Hooks ========================================
1576
1577 REGISTER_MUTATOR(random_items, (autocvar_g_random_items ||
1578         autocvar_g_random_loot));
1579
1580 MUTATOR_HOOKFUNCTION(random_items, BuildMutatorsString)
1581 {
1582         M_ARGV(0, string) = strcat(M_ARGV(0, string), ":random_items");
1583 }
1584
1585 MUTATOR_HOOKFUNCTION(random_items, BuildMutatorsPrettyString)
1586 {
1587         M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Random items");
1588 }
1589
1590 /// \brief Hook that is called when an item is about to spawn.
1591 MUTATOR_HOOKFUNCTION(random_items, FilterItem, CBC_ORDER_LAST)
1592 {
1593         //PrintToChatAll("FilterItem");
1594         if (!autocvar_g_random_items)
1595         {
1596                 return false;
1597         }
1598         if (random_items_is_spawning == true)
1599         {
1600                 return false;
1601         }
1602         entity item = M_ARGV(0, entity);
1603         if (Item_IsLoot(item))
1604         {
1605                 return false;
1606         }
1607         if (RandomItems_ReplaceMapItem(item) == NULL)
1608         {
1609                 return false;
1610         }
1611         return true;
1612 }
1613
1614 /// \brief Hook that is called after the player has touched an item.
1615 MUTATOR_HOOKFUNCTION(random_items, ItemTouched, CBC_ORDER_LAST)
1616 {
1617         //PrintToChatAll("ItemTouched");
1618         if (!autocvar_g_random_items)
1619         {
1620                 return;
1621         }
1622         entity item = M_ARGV(0, entity);
1623         if (Item_IsLoot(item))
1624         {
1625                 return;
1626         }
1627         entity new_item = RandomItems_ReplaceMapItem(item);
1628         if (new_item == NULL)
1629         {
1630                 return;
1631         }
1632         Item_ScheduleRespawn(new_item);
1633         delete(item);
1634 }
1635
1636 /// \brief Hook which is called when the player dies.
1637 MUTATOR_HOOKFUNCTION(random_items, PlayerDies)
1638 {
1639         //PrintToChatAll("PlayerDies");
1640         if (!autocvar_g_random_loot)
1641         {
1642                 return;
1643         }
1644         entity victim = M_ARGV(2, entity);
1645         vector loot_position = victim.origin + '0 0 32';
1646         int num_loot_items = floor(autocvar_g_random_loot_min + random() *
1647                 autocvar_g_random_loot_max);
1648         for (int item_index = 0; item_index < num_loot_items; ++item_index)
1649         {
1650                 RandomItems_SpawnLootItem(loot_position);
1651         }
1652 }