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