2 /// \brief Source file that contains implementation of the random items mutator.
4 /// \copyright GNU GPLv2 or any later version.
6 //============================ Constants ======================================
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
19 RANDOM_ITEM_SUBTYPE_HEALTH_SMALL,
20 RANDOM_ITEM_SUBTYPE_HEALTH_MEDIUM,
21 RANDOM_ITEM_SUBTYPE_HEALTH_BIG,
22 RANDOM_ITEM_SUBTYPE_HEALTH_MEGA
27 RANDOM_ITEM_SUBTYPE_ARMOR_SMALL,
28 RANDOM_ITEM_SUBTYPE_ARMOR_MEDIUM,
29 RANDOM_ITEM_SUBTYPE_ARMOR_BIG,
30 RANDOM_ITEM_SUBTYPE_ARMOR_MEGA
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,
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
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
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
85 RANDOM_ITEM_SUBTYPE_OVERKILL_HEALTH_MEGA,
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
94 //======================= Global variables ====================================
96 bool autocvar_g_random_items; ///< Whether to enable random items.
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;
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;
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;
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;
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;
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;
194 // Map probability cvars
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;
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;
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;
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;
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;
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;
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;
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
301 float autocvar_g_random_items_overkill_armor_small_probability;
302 /// \brief Probability of random medium armor spawning in the map during
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;
316 bool autocvar_g_random_loot; ///< Whether to enable random loot.
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.
323 // Loot probability cvars
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;
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;
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;
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;
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;
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;
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;
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;
442 /// \brief Holds whether random item is spawning. Used to prevent infinite
444 bool random_items_is_spawning = false;
446 //========================= Free functions ====================================
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)
453 switch (item.classname)
455 case "item_health_small":
457 return autocvar_g_random_items_replace_health_small;
459 case "item_health_medium":
461 return autocvar_g_random_items_replace_health_medium;
463 case "item_health_big":
464 case "item_health_large":
466 return autocvar_g_random_items_replace_health_big;
468 case "item_health_mega":
470 return autocvar_g_random_items_replace_health_mega;
472 case "item_armor_small":
474 return autocvar_g_random_items_replace_armor_small;
476 case "item_armor_medium":
478 return autocvar_g_random_items_replace_armor_medium;
480 case "item_armor_big":
481 case "item_armor_large":
483 return autocvar_g_random_items_replace_armor_big;
485 case "item_armor_mega":
487 return autocvar_g_random_items_replace_armor_mega;
491 return autocvar_g_random_items_replace_item_shells;
495 return autocvar_g_random_items_replace_item_bullets;
499 return autocvar_g_random_items_replace_item_rockets;
503 return autocvar_g_random_items_replace_item_cells;
507 return autocvar_g_random_items_replace_item_plasma;
511 return autocvar_g_random_items_replace_item_fuel;
513 case "weapon_blaster":
516 return autocvar_g_random_items_replace_weapon_blaster;
518 case "weapon_shotgun":
520 return autocvar_g_random_items_replace_weapon_shotgun;
522 case "weapon_machinegun":
525 return autocvar_g_random_items_replace_weapon_machinegun;
527 case "weapon_mortar":
528 case "weapon_grenadelauncher":
530 return autocvar_g_random_items_replace_weapon_mortar;
532 case "weapon_electro":
534 return autocvar_g_random_items_replace_weapon_electro;
536 case "weapon_crylink":
538 return autocvar_g_random_items_replace_weapon_crylink;
540 case "weapon_vortex":
543 return autocvar_g_random_items_replace_weapon_vortex;
547 return autocvar_g_random_items_replace_weapon_hagar;
549 case "weapon_devastator":
550 case "weapon_rocketlauncher":
552 return autocvar_g_random_items_replace_weapon_devastator;
554 case "weapon_shockwave":
556 return autocvar_g_random_items_replace_weapon_shockwave;
560 return autocvar_g_random_items_replace_weapon_arc;
564 return autocvar_g_random_items_replace_weapon_hook;
568 return autocvar_g_random_items_replace_weapon_tuba;
572 return autocvar_g_random_items_replace_weapon_porto;
574 case "weapon_fireball":
576 return autocvar_g_random_items_replace_weapon_fireball;
578 case "weapon_minelayer":
580 return autocvar_g_random_items_replace_weapon_minelayer;
584 return autocvar_g_random_items_replace_weapon_hlac;
587 case "weapon_campingrifle":
588 case "weapon_sniperrifle":
590 return autocvar_g_random_items_replace_weapon_rifle;
592 case "weapon_seeker":
594 return autocvar_g_random_items_replace_weapon_seeker;
596 case "weapon_vaporizer":
597 case "weapon_minstanex":
599 return autocvar_g_random_items_replace_weapon_vaporizer;
603 return autocvar_g_random_items_replace_weapon_hmg;
607 return autocvar_g_random_items_replace_weapon_rpc;
609 case "item_strength":
611 return autocvar_g_random_items_replace_item_strength;
613 case "item_invincible":
615 return autocvar_g_random_items_replace_item_shield;
617 case "item_fuel_regen":
619 return autocvar_g_random_items_replace_item_fuel_regen;
623 return autocvar_g_random_items_replace_item_jetpack;
625 case "item_vaporizer_cells":
627 return autocvar_g_random_items_replace_item_vaporizer_cells;
629 case "item_invisibility":
631 return autocvar_g_random_items_replace_item_invisibility;
633 case "item_extralife":
635 return autocvar_g_random_items_replace_item_extralife;
639 return autocvar_g_random_items_replace_item_speed;
641 case "replacedweapon":
645 case WEP_MINE_LAYER.m_id:
647 return autocvar_g_random_items_replace_weapon_minelayer;
651 return autocvar_g_random_items_replace_weapon_hlac;
655 return autocvar_g_random_items_replace_weapon_rifle;
657 case WEP_SEEKER.m_id:
659 return autocvar_g_random_items_replace_weapon_seeker;
674 /// \brief Returns a random classname of the instagib map item.
675 /// \return Random classname of the instagib map item.
676 string RandomItems_GetRandomInstagibMapItemClassName()
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;
690 case RANDOM_ITEM_SUBTYPE_INSTAGIB_VAPORIZER_CELLS:
692 return "item_vaporizer_cells";
694 case RANDOM_ITEM_SUBTYPE_INSTAGIB_INVISIBILITY:
696 return "item_invisibility";
698 case RANDOM_ITEM_SUBTYPE_INSTAGIB_EXTRA_LIFE:
700 return "item_extralife";
702 case RANDOM_ITEM_SUBTYPE_INSTAGIB_SPEED:
710 /// \brief Returns a random classname of the overkill map item.
711 /// \return Random classname of the overkill map item.
712 string RandomItems_GetRandomOverkillMapItemClassName()
714 RandomSelection_Init();
715 if (!autocvar_g_overkill_filter_healthmega)
717 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_HEALTH_MEGA,
718 autocvar_g_random_items_overkill_health_mega_probability, 1);
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)
724 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEDIUM,
725 autocvar_g_random_items_overkill_armor_medium_probability, 1);
727 if (!autocvar_g_overkill_filter_armorbig)
729 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_BIG,
730 autocvar_g_random_items_overkill_armor_big_probability, 1);
732 if (!autocvar_g_overkill_filter_armormega)
734 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEGA,
735 autocvar_g_random_items_overkill_armor_mega_probability, 1);
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;
744 case RANDOM_ITEM_SUBTYPE_OVERKILL_HEALTH_MEGA:
746 return "item_health_mega";
748 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_SMALL:
750 return "item_armor_small";
752 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEDIUM:
754 return "item_armor_medium";
756 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_BIG:
758 return "item_armor_big";
760 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEGA:
762 return "item_armor_mega";
764 case RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_HMG:
768 case RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_RPC:
776 /// \brief Returns a random classname of the map item.
777 /// \return Random classname of the map item.
778 string RandomItems_GetRandomMapItemClassName()
780 if (autocvar_g_instagib)
782 return RandomItems_GetRandomInstagibMapItemClassName();
784 if (expr_evaluate(autocvar_g_overkill))
786 return RandomItems_GetRandomOverkillMapItemClassName();
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;
802 case RANDOM_ITEM_TYPE_HEALTH:
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;
816 case RANDOM_ITEM_SUBTYPE_HEALTH_SMALL:
818 return "item_health_small";
820 case RANDOM_ITEM_SUBTYPE_HEALTH_MEDIUM:
822 return "item_health_medium";
824 case RANDOM_ITEM_SUBTYPE_HEALTH_BIG:
826 return "item_health_big";
828 case RANDOM_ITEM_SUBTYPE_HEALTH_MEGA:
830 return "item_health_mega";
835 case RANDOM_ITEM_TYPE_ARMOR:
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;
849 case RANDOM_ITEM_SUBTYPE_ARMOR_SMALL:
851 return "item_armor_small";
853 case RANDOM_ITEM_SUBTYPE_ARMOR_MEDIUM:
855 return "item_armor_medium";
857 case RANDOM_ITEM_SUBTYPE_ARMOR_BIG:
859 return "item_armor_big";
861 case RANDOM_ITEM_SUBTYPE_ARMOR_MEGA:
863 return "item_armor_mega";
868 case RANDOM_ITEM_TYPE_RESOURCE:
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;
886 case RANDOM_ITEM_SUBTYPE_RESOURCE_SHELLS:
888 return "item_shells";
890 case RANDOM_ITEM_SUBTYPE_RESOURCE_BULLETS:
892 return "item_bullets";
894 case RANDOM_ITEM_SUBTYPE_RESOURCE_ROCKETS:
896 return "item_rockets";
898 case RANDOM_ITEM_SUBTYPE_RESOURCE_CELLS:
902 case RANDOM_ITEM_SUBTYPE_RESOURCE_PLASMA:
904 return "item_plasma";
906 case RANDOM_ITEM_SUBTYPE_RESOURCE_FUEL:
913 case RANDOM_ITEM_TYPE_WEAPON:
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;
959 case RANDOM_ITEM_SUBTYPE_WEAPON_BLASTER:
961 return "weapon_blaster";
963 case RANDOM_ITEM_SUBTYPE_WEAPON_SHOTGUN:
965 return "weapon_shotgun";
967 case RANDOM_ITEM_SUBTYPE_WEAPON_MACHINEGUN:
969 return "weapon_machinegun";
971 case RANDOM_ITEM_SUBTYPE_WEAPON_MORTAR:
973 return "weapon_mortar";
975 case RANDOM_ITEM_SUBTYPE_WEAPON_ELECTRO:
977 return "weapon_electro";
979 case RANDOM_ITEM_SUBTYPE_WEAPON_CRYLINK:
981 return "weapon_crylink";
983 case RANDOM_ITEM_SUBTYPE_WEAPON_VORTEX:
985 return "weapon_vortex";
987 case RANDOM_ITEM_SUBTYPE_WEAPON_HAGAR:
989 return "weapon_hagar";
991 case RANDOM_ITEM_SUBTYPE_WEAPON_DEVASTATOR:
993 return "weapon_devastator";
995 case RANDOM_ITEM_SUBTYPE_WEAPON_SHOCKWAVE:
997 return "weapon_shockwave";
999 case RANDOM_ITEM_SUBTYPE_WEAPON_ARC:
1001 return "weapon_arc";
1003 case RANDOM_ITEM_SUBTYPE_WEAPON_HOOK:
1005 return "weapon_hook";
1007 case RANDOM_ITEM_SUBTYPE_WEAPON_TUBA:
1009 return "weapon_tuba";
1011 case RANDOM_ITEM_SUBTYPE_WEAPON_PORTO:
1013 return "weapon_porto";
1015 case RANDOM_ITEM_SUBTYPE_WEAPON_FIREBALL:
1017 return "weapon_fireball";
1019 case RANDOM_ITEM_SUBTYPE_WEAPON_MINELAYER:
1021 return "weapon_minelayer";
1023 case RANDOM_ITEM_SUBTYPE_WEAPON_HLAC:
1025 return "weapon_hlac";
1027 case RANDOM_ITEM_SUBTYPE_WEAPON_RIFLE:
1029 return "weapon_rifle";
1031 case RANDOM_ITEM_SUBTYPE_WEAPON_SEEKER:
1033 return "weapon_seeker";
1035 case RANDOM_ITEM_SUBTYPE_WEAPON_VAPORIZER:
1037 return "weapon_vaporizer";
1042 case RANDOM_ITEM_TYPE_POWERUP:
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;
1056 case RANDOM_ITEM_SUBTYPE_POWERUP_STRENGTH:
1058 return "item_strength";
1060 case RANDOM_ITEM_SUBTYPE_POWERUP_SHIELD:
1062 return "item_invincible";
1064 case RANDOM_ITEM_SUBTYPE_POWERUP_FUEL_REGEN:
1066 return "item_fuel_regen";
1068 case RANDOM_ITEM_SUBTYPE_POWERUP_JETPACK:
1070 return "item_jetpack";
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)
1084 //PrintToChatAll(strcat("Replacing ", item.classname));
1085 string new_classnames = RandomItems_GetItemReplacementClassNames(item);
1086 if (new_classnames == "")
1090 string new_classname;
1091 if (new_classnames == "random")
1093 new_classname = RandomItems_GetRandomMapItemClassName();
1094 if (new_classname == "")
1101 int num_new_classnames = tokenize_console(new_classnames);
1102 if (num_new_classnames == 1)
1104 new_classname = new_classnames;
1108 int classname_index = floor(random() * num_new_classnames);
1109 new_classname = argv(classname_index);
1112 //PrintToChatAll(strcat("Replacing with ", new_classname));
1113 if (new_classname == item.classname)
1117 random_items_is_spawning = true;
1119 if (!expr_evaluate(autocvar_g_overkill))
1121 new_item = Item_Create(strzone(new_classname), item.origin);
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))
1134 setorigin(new_item, item.origin);
1136 random_items_is_spawning = false;
1140 /// \brief Returns a random classname of the instagib loot item.
1141 /// \return Random classname of the instagib loot item.
1142 string RandomItems_GetRandomInstagibLootItemClassName()
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;
1156 case RANDOM_ITEM_SUBTYPE_INSTAGIB_VAPORIZER_CELLS:
1158 return "item_vaporizer_cells";
1160 case RANDOM_ITEM_SUBTYPE_INSTAGIB_INVISIBILITY:
1162 return "item_invisibility";
1164 case RANDOM_ITEM_SUBTYPE_INSTAGIB_EXTRA_LIFE:
1166 return "item_extralife";
1168 case RANDOM_ITEM_SUBTYPE_INSTAGIB_SPEED:
1170 return "item_speed";
1176 /// \brief Returns a random classname of the overkill loot item.
1177 /// \return Random classname of the overkill loot item.
1178 string RandomItems_GetRandomOverkillLootItemClassName()
1180 RandomSelection_Init();
1181 if (!autocvar_g_overkill_filter_healthmega)
1183 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_HEALTH_MEGA,
1184 autocvar_g_random_loot_overkill_health_mega_probability, 1);
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)
1190 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEDIUM,
1191 autocvar_g_random_loot_overkill_armor_medium_probability, 1);
1193 if (!autocvar_g_overkill_filter_armorbig)
1195 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_BIG,
1196 autocvar_g_random_loot_overkill_armor_big_probability, 1);
1198 if (!autocvar_g_overkill_filter_armormega)
1200 RandomSelection_AddFloat(RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEGA,
1201 autocvar_g_random_loot_overkill_armor_mega_probability, 1);
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;
1210 case RANDOM_ITEM_SUBTYPE_OVERKILL_HEALTH_MEGA:
1212 return "item_health_mega";
1214 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_SMALL:
1216 return "item_armor_small";
1218 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEDIUM:
1220 return "item_armor_medium";
1222 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_BIG:
1224 return "item_armor_big";
1226 case RANDOM_ITEM_SUBTYPE_OVERKILL_ARMOR_MEGA:
1228 return "item_armor_mega";
1230 case RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_HMG:
1232 return "weapon_hmg";
1234 case RANDOM_ITEM_SUBTYPE_OVERKILL_WEAPON_RPC:
1236 return "weapon_rpc";
1242 /// \brief Returns a random classname of the loot item.
1243 /// \return Random classname of the loot item.
1244 string RandomItems_GetRandomLootItemClassName()
1246 if (autocvar_g_instagib)
1248 return RandomItems_GetRandomInstagibLootItemClassName();
1250 if (expr_evaluate(autocvar_g_overkill))
1252 return RandomItems_GetRandomOverkillLootItemClassName();
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;
1268 case RANDOM_ITEM_TYPE_HEALTH:
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;
1282 case RANDOM_ITEM_SUBTYPE_HEALTH_SMALL:
1284 return "item_health_small";
1286 case RANDOM_ITEM_SUBTYPE_HEALTH_MEDIUM:
1288 return "item_health_medium";
1290 case RANDOM_ITEM_SUBTYPE_HEALTH_BIG:
1292 return "item_health_big";
1294 case RANDOM_ITEM_SUBTYPE_HEALTH_MEGA:
1296 return "item_health_mega";
1301 case RANDOM_ITEM_TYPE_ARMOR:
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;
1315 case RANDOM_ITEM_SUBTYPE_ARMOR_SMALL:
1317 return "item_armor_small";
1319 case RANDOM_ITEM_SUBTYPE_ARMOR_MEDIUM:
1321 return "item_armor_medium";
1323 case RANDOM_ITEM_SUBTYPE_ARMOR_BIG:
1325 return "item_armor_big";
1327 case RANDOM_ITEM_SUBTYPE_ARMOR_MEGA:
1329 return "item_armor_mega";
1334 case RANDOM_ITEM_TYPE_RESOURCE:
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;
1352 case RANDOM_ITEM_SUBTYPE_RESOURCE_SHELLS:
1354 return "item_shells";
1356 case RANDOM_ITEM_SUBTYPE_RESOURCE_BULLETS:
1358 return "item_bullets";
1360 case RANDOM_ITEM_SUBTYPE_RESOURCE_ROCKETS:
1362 return "item_rockets";
1364 case RANDOM_ITEM_SUBTYPE_RESOURCE_CELLS:
1366 return "item_cells";
1368 case RANDOM_ITEM_SUBTYPE_RESOURCE_PLASMA:
1370 return "item_plasma";
1372 case RANDOM_ITEM_SUBTYPE_RESOURCE_FUEL:
1379 case RANDOM_ITEM_TYPE_WEAPON:
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;
1425 case RANDOM_ITEM_SUBTYPE_WEAPON_BLASTER:
1427 return "weapon_blaster";
1429 case RANDOM_ITEM_SUBTYPE_WEAPON_SHOTGUN:
1431 return "weapon_shotgun";
1433 case RANDOM_ITEM_SUBTYPE_WEAPON_MACHINEGUN:
1435 return "weapon_machinegun";
1437 case RANDOM_ITEM_SUBTYPE_WEAPON_MORTAR:
1439 return "weapon_mortar";
1441 case RANDOM_ITEM_SUBTYPE_WEAPON_ELECTRO:
1443 return "weapon_electro";
1445 case RANDOM_ITEM_SUBTYPE_WEAPON_CRYLINK:
1447 return "weapon_crylink";
1449 case RANDOM_ITEM_SUBTYPE_WEAPON_VORTEX:
1451 return "weapon_vortex";
1453 case RANDOM_ITEM_SUBTYPE_WEAPON_HAGAR:
1455 return "weapon_hagar";
1457 case RANDOM_ITEM_SUBTYPE_WEAPON_DEVASTATOR:
1459 return "weapon_devastator";
1461 case RANDOM_ITEM_SUBTYPE_WEAPON_SHOCKWAVE:
1463 return "weapon_shockwave";
1465 case RANDOM_ITEM_SUBTYPE_WEAPON_ARC:
1467 return "weapon_arc";
1469 case RANDOM_ITEM_SUBTYPE_WEAPON_HOOK:
1471 return "weapon_hook";
1473 case RANDOM_ITEM_SUBTYPE_WEAPON_TUBA:
1475 return "weapon_tuba";
1477 case RANDOM_ITEM_SUBTYPE_WEAPON_PORTO:
1479 return "weapon_porto";
1481 case RANDOM_ITEM_SUBTYPE_WEAPON_FIREBALL:
1483 return "weapon_fireball";
1485 case RANDOM_ITEM_SUBTYPE_WEAPON_MINELAYER:
1487 return "weapon_minelayer";
1489 case RANDOM_ITEM_SUBTYPE_WEAPON_HLAC:
1491 return "weapon_hlac";
1493 case RANDOM_ITEM_SUBTYPE_WEAPON_RIFLE:
1495 return "weapon_rifle";
1497 case RANDOM_ITEM_SUBTYPE_WEAPON_SEEKER:
1499 return "weapon_seeker";
1501 case RANDOM_ITEM_SUBTYPE_WEAPON_VAPORIZER:
1503 return "weapon_vaporizer";
1508 case RANDOM_ITEM_TYPE_POWERUP:
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;
1522 case RANDOM_ITEM_SUBTYPE_POWERUP_STRENGTH:
1524 return "item_strength";
1526 case RANDOM_ITEM_SUBTYPE_POWERUP_SHIELD:
1528 return "item_invincible";
1530 case RANDOM_ITEM_SUBTYPE_POWERUP_FUEL_REGEN:
1532 return "item_fuel_regen";
1534 case RANDOM_ITEM_SUBTYPE_POWERUP_JETPACK:
1536 return "item_jetpack";
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)
1550 string class_name = RandomItems_GetRandomLootItemClassName();
1551 if (class_name == "")
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))
1561 Item_CreateLoot(class_name, position, spread,
1562 autocvar_g_random_loot_time);
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);
1572 random_items_is_spawning = false;
1575 //============================= Hooks ========================================
1577 REGISTER_MUTATOR(random_items, (autocvar_g_random_items ||
1578 autocvar_g_random_loot));
1580 MUTATOR_HOOKFUNCTION(random_items, BuildMutatorsString)
1582 M_ARGV(0, string) = strcat(M_ARGV(0, string), ":random_items");
1585 MUTATOR_HOOKFUNCTION(random_items, BuildMutatorsPrettyString)
1587 M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Random items");
1590 /// \brief Hook that is called when an item is about to spawn.
1591 MUTATOR_HOOKFUNCTION(random_items, FilterItem, CBC_ORDER_LAST)
1593 //PrintToChatAll("FilterItem");
1594 if (!autocvar_g_random_items)
1598 if (random_items_is_spawning == true)
1602 entity item = M_ARGV(0, entity);
1603 if (Item_IsLoot(item))
1607 if (RandomItems_ReplaceMapItem(item) == NULL)
1614 /// \brief Hook that is called after the player has touched an item.
1615 MUTATOR_HOOKFUNCTION(random_items, ItemTouched, CBC_ORDER_LAST)
1617 //PrintToChatAll("ItemTouched");
1618 if (!autocvar_g_random_items)
1622 entity item = M_ARGV(0, entity);
1623 if (Item_IsLoot(item))
1627 entity new_item = RandomItems_ReplaceMapItem(item);
1628 if (new_item == NULL)
1632 Item_ScheduleRespawn(new_item);
1636 /// \brief Hook which is called when the player dies.
1637 MUTATOR_HOOKFUNCTION(random_items, PlayerDies)
1639 //PrintToChatAll("PlayerDies");
1640 if (!autocvar_g_random_loot)
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)
1650 RandomItems_SpawnLootItem(loot_position);