‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_zm_powerups.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\demo_shared;
7 #using scripts\shared\flag_shared;
8 #using scripts\shared\flagsys_shared;
9 #using scripts\shared\hud_util_shared;
10 #using scripts\shared\laststand_shared;
11 #using scripts\shared\util_shared;
12 
13 #insert scripts\shared\shared.gsh;
14 #insert scripts\shared\version.gsh;
15 #insert scripts\shared\ai\systems\gib.gsh;
16 
17 #using scripts\shared\ai\zombie_utility;
18 #using scripts\shared\ai\systems\gib;
19 
20 #using scripts\zm\_util;
21 #using scripts\zm\_bb;
22 #using scripts\zm\_zm_audio;
23 #using scripts\zm\_zm_bgb;
24 #using scripts\zm\_zm_blockers;
25 #using scripts\zm\_zm_laststand;
26 #using scripts\zm\_zm_magicbox;
27 #using scripts\zm\_zm_melee_weapon;
28 #using scripts\zm\_zm_net;
29 #using scripts\zm\_zm_perks;
30 #using scripts\zm\_zm_pers_upgrades;
31 #using scripts\zm\_zm_pers_upgrades_functions;
32 #using scripts\zm\_zm_score;
33 #using scripts\zm\_zm_spawner;
34 #using scripts\zm\_zm_stats;
35 #using scripts\zm\_zm_utility;
36 #using scripts\zm\_zm_weapons;
37 
38 #insert scripts\zm\_zm_perks.gsh;
39 #insert scripts\zm\_zm_powerups.gsh;
40 #insert scripts\zm\_zm_utility.gsh;
41 
42 #precache( "material", "black" );
43 
44 #precache( "fx", "zombie/fx_powerup_on_green_zmb" );
45 #precache( "fx", "zombie/fx_powerup_off_green_zmb" );
46 #precache( "fx", "zombie/fx_powerup_grab_green_zmb" );
47 #precache( "fx", "zombie/fx_powerup_on_red_zmb" );
48 #precache( "fx", "zombie/fx_powerup_grab_red_zmb" );
49 #precache( "fx", "zombie/fx_powerup_on_solo_zmb" );
50 #precache( "fx", "zombie/fx_powerup_grab_solo_zmb" );
51 #precache( "fx", "zombie/fx_powerup_on_caution_zmb" );
52 #precache( "fx", "zombie/fx_powerup_grab_caution_zmb" );
53 
54 #namespace zm_powerups;
55 
56 function ‪init()
57 {
58  // powerup Vars
59  ‪zombie_utility::set_zombie_var( "zombie_insta_kill", 0, undefined, undefined, true );
60  ‪zombie_utility::set_zombie_var( "zombie_point_scalar", 1, undefined, undefined, true );
61  ‪zombie_utility::set_zombie_var( "zombie_drop_item", 0 );
62  ‪zombie_utility::set_zombie_var( "zombie_timer_offset", 350 ); // hud offsets
63  ‪zombie_utility::set_zombie_var( "zombie_timer_offset_interval", 30 );
64  ‪zombie_utility::set_zombie_var( "zombie_powerup_fire_sale_on", false );
65  ‪zombie_utility::set_zombie_var( "zombie_powerup_fire_sale_time", ‪N_POWERUP_DEFAULT_TIME );
66  ‪zombie_utility::set_zombie_var( "zombie_powerup_bonfire_sale_on", false );
67  ‪zombie_utility::set_zombie_var( "zombie_powerup_bonfire_sale_time", ‪N_POWERUP_DEFAULT_TIME );
68  ‪zombie_utility::set_zombie_var( "zombie_powerup_insta_kill_on", false, undefined, undefined, true );
69  ‪zombie_utility::set_zombie_var( "zombie_powerup_insta_kill_time", ‪N_POWERUP_DEFAULT_TIME, undefined, undefined, true ); // length of insta kill
70  ‪zombie_utility::set_zombie_var( "zombie_powerup_double_points_on", false, undefined, undefined, true );
71  ‪zombie_utility::set_zombie_var( "zombie_powerup_double_points_time", ‪N_POWERUP_DEFAULT_TIME, undefined, undefined, true ); // length of point doubler
72  // Modify by the percentage of points that the player gets
73  ‪zombie_utility::set_zombie_var( "zombie_powerup_drop_increment", 2000 ); // 2000, lower this to make drop happen more often
74  ‪zombie_utility::set_zombie_var( "zombie_powerup_drop_max_per_round", 4 ); // 4, raise this to make drop happen more often
75 
76  // special vars for individual power ups
78 
79  // powerups
80  level._effect["powerup_on"] = "zombie/fx_powerup_on_green_zmb";
81  level._effect["powerup_off"] = "zombie/fx_powerup_off_green_zmb";
82  level._effect["powerup_grabbed"] = "zombie/fx_powerup_grab_green_zmb";
83  if (‪IS_TRUE(level.using_zombie_powerups))
84  {
85  level._effect["powerup_on_red"] = "zombie/fx_powerup_on_red_zmb";
86  level._effect["powerup_grabbed_red"] = "zombie/fx_powerup_grab_red_zmb";
87  }
88  level._effect["powerup_on_solo"] = "zombie/fx_powerup_on_solo_zmb";
89  level._effect["powerup_grabbed_solo"] = "zombie/fx_powerup_grab_solo_zmb";
90  level._effect["powerup_on_caution"] = "zombie/fx_powerup_on_caution_zmb";
91  level._effect["powerup_grabbed_caution"] = "zombie/fx_powerup_grab_caution_zmb";
92 
94 
95  if(!level.enable_magic)
96  {
97  return;
98  }
99 
100  thread ‪watch_for_drop();
101 }
102 
103 
104 //
106 {
107  level ‪flag::init( "zombie_drop_powerups" ); // As long as it's set, powerups will be able to spawn
108 
109  if(‪IS_TRUE(level.enable_magic))
110  {
111  level ‪flag::set( "zombie_drop_powerups" );
112  }
113 
114  if( !IsDefined( level.active_powerups ) )
115  {
116  level.active_powerups = [];
117  }
118 
119  //Random Drops
120 
121  //not sure if there's a better place to put this function call
122  ‪add_zombie_powerup( "insta_kill_ug", "zombie_skull", &"ZOMBIE_POWERUP_INSTA_KILL", &‪func_should_never_drop, ‪POWERUP_ONLY_AFFECTS_GRABBER, !‪POWERUP_ANY_TEAM, !‪POWERUP_ZOMBIE_GRABBABLE, undefined, ‪CLIENTFIELD_POWERUP_INSTANT_KILL_UG, "zombie_powerup_insta_kill_ug_time", "zombie_powerup_insta_kill_ug_on", ‪VERSION_SHIP );
123 
124  if(isDefined(level.level_specific_init_powerups))
125  {
126  [[level.level_specific_init_powerups]]();
127  }
128 
129  // Randomize the order
131  level.zombie_powerup_index = 0;
133 
134  // Rare powerups
135  level.rare_powerups_active = 0;
136 
137  //AUDIO: Prevents the long firesale vox from playing more than once
138  level.firesale_vox_firstime = false;
139 
140  // start the power up process monitor:
141  level thread ‪powerup_hud_monitor();
143 }
144 
145 
146 // Creates zombie_vars that need to be tracked on an individual basis rather than as
147 // a group.
149 {
150  self.zombie_vars[ "zombie_powerup_insta_kill_ug_on" ] = false; // persistent instant kill upgrade
151  self.zombie_vars[ "zombie_powerup_insta_kill_ug_time" ] = 18; //level.pers_insta_kill_upgrade_active_time
152 }
153 
155 {
156  if ( !IsDefined( level.zombie_weapons_no_max_ammo ) )
157  {
158  level.zombie_weapons_no_max_ammo = [];
159  }
160 
161  level.zombie_weapons_no_max_ammo[ weapon ] = 1;
162 }
163 
164 //
166 {
167  level ‪flag::wait_till( "start_zombie_round_logic" );
168 
169  // race mode has no global powerup drops for now
170  if(isDefined(level.current_game_module) && level.current_game_module == 2)
171  {
172  return;
173  }
174 
175  // Setting up flashing timer and clientfield values
176  flashing_timers = [];
177  flashing_values = [];
178  flashing_timer = ‪POWERUP_FLASHING_STAGE_ONE_TIME;
179  flashing_delta_time = 0;
180  flashing_is_on = false;
182  flashing_min_timer = ‪POWERUP_FLASHING_STAGE_TWO_DELTA_TIME+0.05;
183  while( flashing_timer >= flashing_min_timer )
184  {
185  if ( flashing_timer < ‪POWERUP_FLASHING_STAGE_TWO_TIME)
186  {
187  flashing_delta_time = ‪POWERUP_FLASHING_STAGE_TWO_DELTA_TIME;
188  }
189  else
190  {
191  flashing_delta_time = ‪POWERUP_FLASHING_STAGE_ONE_DELTA_TIME;
192  }
193 
194  if( flashing_is_on )
195  {
196  flashing_timer = flashing_timer - flashing_delta_time - 0.05;
198  }
199  else
200  {
201  flashing_timer = flashing_timer - flashing_delta_time;
203  }
204 
205  flashing_timers[flashing_timers.size] = flashing_timer;
206  flashing_values[flashing_values.size] = flashing_value;
207 
208  flashing_is_on = !flashing_is_on;
209  }
210 
211  // Setting up client_fields
212  client_fields = [];
213  powerup_keys = GetArrayKeys( level.zombie_powerups );
214  for ( powerup_key_index = 0; powerup_key_index < powerup_keys.size; powerup_key_index++ )
215  {
216  if ( IsDefined( level.zombie_powerups[powerup_keys[powerup_key_index]].client_field_name ) )
217  {
218  powerup_name = powerup_keys[powerup_key_index];
219  client_fields[powerup_name] = SpawnStruct();
220 
221  client_fields[powerup_name].client_field_name = level.zombie_powerups[powerup_name].client_field_name;
222  client_fields[powerup_name].only_affects_grabber = level.zombie_powerups[powerup_name].only_affects_grabber;
223  client_fields[powerup_name].time_name = level.zombie_powerups[powerup_name].time_name;
224  client_fields[powerup_name].on_name = level.zombie_powerups[powerup_name].on_name;
225  }
226  }
227  client_field_keys = GetArrayKeys( client_fields );
228 
229  // main logic
230  while ( true )
231  {
233  waittillframeend;
234 
235  players = level.players; //GetPlayers();
236  // for loop over clientfields
237  // for loop over players
238  for( playerIndex = 0; playerIndex < players.size; playerIndex++ )
239  {
240  for ( client_field_key_index = 0; client_field_key_index < client_field_keys.size; client_field_key_index++ )
241  {
242  player = players[playerIndex];
243 
244 
245  if (isdefined(level.powerup_player_valid))
246  {
247  if ( ! [[level.powerup_player_valid]]( player ))
248  continue;
249  }
250 
251  client_field_name = client_fields[client_field_keys[client_field_key_index]].client_field_name;
252  time_name = client_fields[client_field_keys[client_field_key_index]].time_name;
253  on_name = client_fields[client_field_keys[client_field_key_index]].on_name;
254  powerup_timer = undefined;
255  powerup_on = undefined;
256 
257  // if solo, pass in player.var
258  if ( client_fields[client_field_keys[client_field_key_index]].only_affects_grabber )
259  {
260  if( IsDefined( player._show_solo_hud ) && player._show_solo_hud == true )
261  {
262  powerup_timer = player.zombie_vars[time_name];
263  powerup_on = player.zombie_vars[on_name];
264  }
265  }
266  else if ( IsDefined( level.zombie_vars[player.team][time_name] ) )
267  {
268  powerup_timer = level.zombie_vars[player.team][time_name];
269  powerup_on = level.zombie_vars[player.team][on_name];
270  }
271  else if ( IsDefined( level.zombie_vars[time_name] ) )
272  {
273  powerup_timer = level.zombie_vars[time_name];
274  powerup_on = level.zombie_vars[on_name];
275  }
276 
277  if ( IsDefined( powerup_timer ) && IsDefined( powerup_on ) )
278  {
279  player ‪set_clientfield_powerups( client_field_name, powerup_timer, powerup_on, flashing_timers, flashing_values );
280  }
281  else
282  {
284  }
285  }
286  }
287  }
288 }
289 
290 //
291 function ‪set_clientfield_powerups( clientfield_name, powerup_timer, powerup_on, flashing_timers, flashing_values )
292 {
293  if ( powerup_on )
294  {
295  if ( powerup_timer < ‪POWERUP_FLASHING_STAGE_ONE_TIME )
296  {
297  // flashing stage
299  for ( i = flashing_timers.size - 1; i > 0; i-- )
300  {
301  if ( powerup_timer < flashing_timers[i] )
302  {
303  flashing_value = flashing_values[i];
304  break;
305  }
306  }
307  self ‪clientfield::set_to_player( clientfield_name, flashing_value );
308  }
309  else
310  {
312  }
313  }
314  else
315  {
317  }
318 }
319 
320 
322 {
323  if( !isdefined( level.zombie_powerup_array ) )
324  {
325  level.zombie_powerup_array = [];
326  }
327  else
328  {
329  level.zombie_powerup_array = array::randomize( level.zombie_powerup_array );
330  }
331 }
332 
333 //
334 // Get the next powerup in the list
335 //
337 {
338  powerup = level.zombie_powerup_array[ level.zombie_powerup_index ];
339 
340  level.zombie_powerup_index++;
341  if( level.zombie_powerup_index >= level.zombie_powerup_array.size )
342  {
343  level.zombie_powerup_index = 0;
345  }
346 
347  return powerup;
348 }
349 
350 
351 //
352 // Figure out what the next powerup drop is
353 //
354 // Powerup Rules:
355 // "carpenter": Needs at least 5 windows destroyed
356 // "fire_sale": Needs the box to have moved
357 //
358 //
360 {
361  if ( isdefined( level.zombie_powerup_boss ) )
362  {
363  i = level.zombie_powerup_boss;
364  level.zombie_powerup_boss = undefined;
365  return level.zombie_powerup_array[ i ];
366  }
367 
368  if ( isdefined( level.zombie_powerup_ape ) )
369  {
370  powerup = level.zombie_powerup_ape;
371  level.zombie_powerup_ape = undefined;
372  return powerup;
373  }
374 
375 
376  powerup = ‪get_next_powerup();
377  while( 1 )
378  {
379  if( ![[level.zombie_powerups[powerup].func_should_drop_with_regular_powerups]]() )
380  {
381  powerup = ‪get_next_powerup();
382  continue;
383  }
384  return powerup;
385  }
386 }
387 
389 {
390  players = GetPlayers();
391  for ( i=0; i<players.size; i++ )
392  {
393  if( players[i].zombie_vars[ "zombie_powerup_minigun_on" ] == true )
394  {
395  return true;
396  }
397  }
398 
399  if( !level ‪flag::get( "power_on" ) ) // if power is not on check for solo
400  {
401  if( level ‪flag::get( "solo_game" ) ) // if it is a solo game then perform another check
402  {
403  if( !isdefined( level.solo_lives_given ) || level.solo_lives_given == 0 ) // the power isn't on, it is a solo game, has the player purchased a life/revive?
404  {
405  return true; // no drop because the player has no bought a life/revive
406  }
407  }
408  else
409  {
410  return true; // not a solo game, powerup is invalid
411  }
412  }
413 
414  return false;
415 }
416 
418 {
419  level endon("unloaded");
420  level ‪flag::wait_till( "start_zombie_round_logic" );
421  level ‪flag::wait_till( "begin_spawning" );
423 
424  players = GetPlayers();
425  score_to_drop = ( players.size * level.zombie_vars["zombie_score_start_"+players.size+"p"] ) + level.zombie_vars["zombie_powerup_drop_increment"];
426 
427  ‪while (1)
428  {
429  level ‪flag::wait_till( "zombie_drop_powerups" );
430 
431  players = GetPlayers();
432 
433  curr_total_score = 0;
434 
435  for (i = 0; i < players.size; i++)
436  {
437  if(isdefined(players[i].score_total))
438  {
439  curr_total_score += players[i].score_total;
440  }
441  }
442 
443  if (curr_total_score > score_to_drop )
444  {
445  level.zombie_vars["zombie_powerup_drop_increment"] *= 1.14;
446  score_to_drop = curr_total_score + level.zombie_vars["zombie_powerup_drop_increment"];
447  level.zombie_vars["zombie_drop_item"] = 1;
448  }
449 
450  wait( 0.5 );
451  }
452 }
453 
455 {
456  powerup_keys = GetArrayKeys( level.zombie_powerups );
457  powerup_keys = array::randomize( powerup_keys );
458  return powerup_keys[0];
459 }
460 
462 {
463  powerup_keys = GetArrayKeys( level.zombie_powerups );
464  powerup_keys = array::randomize( powerup_keys );
465 
466  for ( i = 0; i < powerup_keys.size; i++ )
467  {
468  if ( [[level.zombie_powerups[powerup_keys[i]].func_should_drop_with_regular_powerups]]() )
469  {
470  return powerup_keys[i];
471  }
472  }
473 
474  return powerup_keys[0];
475 }
476 
477 function ‪add_zombie_powerup( powerup_name, model_name, hint, func_should_drop_with_regular_powerups, only_affects_grabber, any_team, zombie_grabbable, fx, client_field_name, time_name, on_name, clientfield_version = ‪VERSION_SHIP, player_specific = false )
478 {
479  if( IsDefined( level.zombie_include_powerups ) && !‪IS_TRUE( level.zombie_include_powerups[powerup_name] ) )
480  {
481  return;
482  }
483 
484  if( !IsDefined( level.zombie_powerup_array ) )
485  {
486  level.zombie_powerup_array = [];
487  }
488 
489  struct = SpawnStruct();
490 
491  if( !IsDefined( level.zombie_powerups ) )
492  {
493  level.zombie_powerups = [];
494  }
495 
496  struct.powerup_name = powerup_name;
497  struct.model_name = model_name;
498  struct.weapon_classname = "script_model";
499  struct.hint = hint;
500  struct.func_should_drop_with_regular_powerups = func_should_drop_with_regular_powerups;
501  struct.only_affects_grabber = only_affects_grabber;
502  struct.any_team = any_team;
503  struct.zombie_grabbable = zombie_grabbable;
504 
505  struct.hash_id = HashString(powerup_name);
506 
507  struct.player_specific = player_specific;
508 
509  struct.can_pick_up_in_last_stand = true;
510 
511  if( IsDefined( fx ) )
512  {
513  struct.fx = fx;
514  }
515 
516  level.zombie_powerups[powerup_name] = struct;
517  level.zombie_powerup_array[level.zombie_powerup_array.size] = powerup_name;
518  ‪add_zombie_special_drop( powerup_name );
519 
520  if( IsDefined( client_field_name ) )
521  {
522  ‪clientfield::register( "toplayer", client_field_name, clientfield_version, 2, "int" );
523  struct.client_field_name = client_field_name;
524  struct.time_name = time_name;
525  struct.on_name = on_name;
526  }
527 }
528 
529 function ‪powerup_set_can_pick_up_in_last_stand( powerup_name, b_can_pick_up )
530 {
531  level.zombie_powerups[ powerup_name ].can_pick_up_in_last_stand = b_can_pick_up;
532 }
533 
534 function ‪powerup_set_prevent_pick_up_if_drinking( powerup_name, b_prevent_pick_up )
535 {
536  level._custom_powerups[ powerup_name ].prevent_pick_up_if_drinking = b_prevent_pick_up;
537 }
538 
539 function ‪powerup_set_player_specific( powerup_name, b_player_specific = ‪POWERUP_FOR_SPECIFIC_PLAYER )
540 {
541  level.zombie_powerups[ powerup_name ].player_specific = b_player_specific;
542 }
543 
544 function ‪powerup_set_statless_powerup( powerup_name )
545 {
546  ‪DEFAULT( level.zombie_statless_powerups, [] );
547 
548  level.zombie_statless_powerups[ powerup_name ] = true;
549 }
550 
551 // special powerup list for the teleporter drop
552 function ‪add_zombie_special_drop( powerup_name )
553 {
554  if ( !IsDefined( level.zombie_special_drop_array ) )
555  {
556  level.zombie_special_drop_array = [];
557  }
558 
559  level.zombie_special_drop_array[ level.zombie_special_drop_array.size ] = powerup_name;
560 }
561 
562 function ‪include_zombie_powerup( powerup_name )
563 {
564  if( !IsDefined( level.zombie_include_powerups ) )
565  {
566  level.zombie_include_powerups = [];
567  }
568 
569  level.zombie_include_powerups[powerup_name] = true;
570 }
571 
572 function ‪powerup_remove_from_regular_drops( powerup_name )
573 {
574  // do this in "main" not "init" so the powerup will be present.
575  assert( isdefined( level.zombie_powerups ) );
576  assert( isdefined( level.zombie_powerups[ powerup_name ] ) );
577 
578  level.zombie_powerups[ powerup_name ].func_should_drop_with_regular_powerups = &‪zm_powerups::func_should_never_drop;
579 }
580 
582 {
583  level.powerup_drop_count = 0;
584 }
585 
586 function ‪powerup_drop(drop_point)
587 {
588  if( isdefined( level.custom_zombie_powerup_drop ) )
589  {
590  b_outcome = [[ level.custom_zombie_powerup_drop ]]( drop_point );
591 
592  if( ‪IS_TRUE( b_outcome ) )
593  {
594  return;
595  }
596  }
597 
598  if( level.powerup_drop_count >= level.zombie_vars["zombie_powerup_drop_max_per_round"] )
599  {
600  return;
601  }
602 
603  if( !isDefined(level.zombie_include_powerups) || level.zombie_include_powerups.size == 0 )
604  {
605  return;
606  }
607 
608  // some guys randomly drop, but most of the time they check for the drop flag
609  rand_drop = randomint(100);
610 
611  if( ‪bgb::is_team_enabled( "zm_bgb_power_vacuum" ) && rand_drop < 20 )
612  {
613  debug = "zm_bgb_power_vacuum";
614  }
615  else if (rand_drop > 2)
616  {
617  if (!level.zombie_vars["zombie_drop_item"])
618  {
619  return;
620  }
621 
622  debug = "score";
623  }
624  else
625  {
626  debug = "random";
627  }
628 
629  // Never drop unless in the playable area
630  playable_area = getentarray("player_volume","script_noteworthy");
631 
632  // This needs to go above the network_safe_spawn because that has a wait.
633  // Otherwise, multiple threads could attempt to drop powerups.
634  level.powerup_drop_count++;
635 
636  powerup = ‪zm_net::network_safe_spawn( "powerup", 1, "script_model", drop_point + (0,0,40));
637 
638  //chris_p - fixed bug where you could not have more than 1 playable area trigger for the whole map
639  valid_drop = false;
640  for (i = 0; i < playable_area.size; i++)
641  {
642  if (powerup istouching(playable_area[i]))
643  {
644  valid_drop = true;
645  break;
646  }
647  }
648 
649  // If a valid drop
650  // We will rarely override the drop with a "rare drop" (MikeA 3/23/10)
651  if( valid_drop && level.rare_powerups_active )
652  {
653  pos = ( drop_point[0], drop_point[1], drop_point[2] + 42 );
655  {
656  level.zombie_vars["zombie_drop_item"] = 0;
657  valid_drop = 0;
658  }
659  }
660 
661  // If not a valid drop, allow another spawn to be attempted
662  if(! valid_drop )
663  {
664  level.powerup_drop_count--;
665  powerup delete();
666  return;
667  }
668 
669  powerup ‪powerup_setup();
670 
671  ‪print_powerup_drop( powerup.powerup_name, debug );
672  powerup thread ‪powerup_timeout();
673  powerup thread ‪powerup_wobble();
674  powerup thread ‪powerup_grab();
675  powerup thread ‪powerup_move();
676  powerup thread ‪powerup_emp();
677 
678  level.zombie_vars["zombie_drop_item"] = 0;
679 
680  // RAVEN BEGIN bhackbarth: let the level know that a powerup has been dropped
681  level notify("powerup_dropped", powerup);
682  // RAVEN END
683 }
684 
685 
686 //
687 // Drop the specified powerup
688 function ‪specific_powerup_drop( powerup_name, drop_spot, powerup_team, powerup_location, pickup_delay, powerup_player, b_stay_forever )
689 {
690  powerup = ‪zm_net::network_safe_spawn( "powerup", 1, "script_model", drop_spot + (0,0,40));
691 
692  level notify("powerup_dropped", powerup);
693 
694  if ( IsDefined(powerup) )
695  {
696  powerup ‪powerup_setup( powerup_name,powerup_team, powerup_location, powerup_player );
697 
698  if( !‪IS_TRUE( b_stay_forever ) )
699  {
700  powerup thread ‪powerup_timeout();
701  }
702  powerup thread ‪powerup_wobble();
703  if ( isdefined( pickup_delay ) && pickup_delay > 0 )
704  {
705  powerup ‪util::delay( pickup_delay, "powerup_timedout", &‪powerup_grab, powerup_team);
706  }
707  else
708  {
709  powerup thread ‪powerup_grab( powerup_team );
710  }
711  powerup thread ‪powerup_move();
712  powerup thread ‪powerup_emp();
713  return powerup;
714  }
715 }
716 
717 
718 //
719 // Special power up drop - done outside of the powerup system.
720 function ‪special_powerup_drop(drop_point)
721 {
722 // if( level.powerup_drop_count == level.zombie_vars["zombie_powerup_drop_max_per_round"] )
723 // {
724 // println( "^3POWERUP DROP EXCEEDED THE MAX PER ROUND!" );
725 // return;
726 // }
727 
728  if( !isDefined(level.zombie_include_powerups) || level.zombie_include_powerups.size == 0 )
729  {
730  return;
731  }
732 
733  powerup = ‪spawn ("script_model", drop_point + (0,0,40));
734 
735  // never drop unless in the playable area
736  playable_area = getentarray("player_volume","script_noteworthy");
737  //chris_p - fixed bug where you could not have more than 1 playable area trigger for the whole map
738  valid_drop = false;
739  for (i = 0; i < playable_area.size; i++)
740  {
741  if (powerup istouching(playable_area[i]))
742  {
743  valid_drop = true;
744  break;
745  }
746  }
747 
748  if(!valid_drop)
749  {
750  powerup Delete();
751  return;
752  }
753 
754  powerup ‪special_drop_setup();
755 }
756 
757 //
758 // Pick the next powerup in the list
759 function ‪powerup_setup( powerup_override,powerup_team, powerup_location, powerup_player, shouldplaysound = true )
760 {
761  powerup = undefined;
762 
763  if ( !IsDefined( powerup_override ) )
764  {
765  powerup = ‪get_valid_powerup();
766  }
767  else
768  {
769  powerup = powerup_override;
770 
771  if ( "tesla" == powerup && ‪tesla_powerup_active() )
772  {
773  // only one tesla at a time, give a minigun instead
774  powerup = "minigun";
775  }
776  }
777 
778  struct = level.zombie_powerups[powerup];
779 
780  if ( IsDefined( level._custom_powerups ) && IsDefined( level._custom_powerups[ powerup ] ) && IsDefined( level._custom_powerups[ powerup ].setup_powerup ) )
781  {
782  self [[level._custom_powerups[ powerup ].setup_powerup]]();
783  }
784  else
785  {
786  self SetModel( struct.model_name );
787  }
788 
789  ‪demo::bookmark( "zm_powerup_dropped", gettime(), undefined, undefined, 1 );
790 
791  //TUEY Spawn Powerup
792  if( ‪IS_TRUE( shouldplaysound ) )
793  {
794  playsoundatposition("zmb_spawn_powerup", self.origin);
795  }
796 
797  if(isDefined(powerup_team))
798  {
799  self.powerup_team = powerup_team; //for encounters
800  }
801  if(isDefined(powerup_location))
802  {
803  self.powerup_location = powerup_location; //for encounters
804  }
805  if(isDefined(powerup_player))
806  {
807  //assert( IS_TRUE(struct.player_specific), "Non-Player specific powerup dropped with player specified" );
808  self.powerup_player = powerup_player;
809  //self SetInvisibleToAll();
810  //self SetVisibleToPlayer( powerup_player );
811  }
812  else
813  {
814  assert( !‪IS_TRUE(struct.player_specific), "Player specific powerup dropped with no player specified" );
815  }
816  self.powerup_name = struct.powerup_name;
817  self.hint = struct.hint;
818  self.only_affects_grabber = struct.only_affects_grabber;
819  self.any_team = struct.any_team;
820  self.zombie_grabbable = struct.zombie_grabbable;
821  self.func_should_drop_with_regular_powerups = struct.func_should_drop_with_regular_powerups;
822 
823  if( IsDefined( struct.fx ) )
824  {
825  self.fx = struct.fx;
826  }
827 
828  if( IsDefined( struct.can_pick_up_in_last_stand ) )
829  {
830  self.can_pick_up_in_last_stand = struct.can_pick_up_in_last_stand;
831  }
832 
833  self PlayLoopSound("zmb_spawn_powerup_loop");
834 
835  level.active_powerups[level.active_powerups.size]=self;
836 }
837 
838 
839 //
840 // Get the special teleporter drop
842 {
843  powerup = undefined;
844 
845  if( isdefined( level.powerup_special_drop_override ) )
846  {
847  powerup = [[ level.powerup_special_drop_override ]]();
848  }
849  else
850  {
851  powerup = ‪get_valid_powerup();
852  }
853 
854  if ( isdefined( powerup ) )
855  {
856  Playfx( level._effect["lightning_dog_spawn"], self.origin );
857  playsoundatposition( "zmb_hellhound_prespawn", self.origin );
858  wait( 1.5 );
859  playsoundatposition( "zmb_hellhound_bolt", self.origin );
860 
861  Earthquake( 0.5, 0.75, self.origin, 1000);
862  //PlayRumbleOnPosition("explosion_generic", self.origin);//TODO T7 - update rumble
863  playsoundatposition( "zmb_hellhound_spawn", self.origin );
864 
865 // wait( 0.5 );
866 
867  self ‪powerup_setup( powerup );
868 
869  self thread ‪powerup_timeout();
870  self thread ‪powerup_wobble();
871  self thread ‪powerup_grab();
872  self thread ‪powerup_move();
873  self thread ‪powerup_emp();
874  }
875 }
876 
878 {
879  self ‪util::waittill_any( "powerup_timedout", "powerup_grabbed", "hacked" );
880 
881  trigger delete();
882 }
883 
884 function ‪powerup_zombie_grab(powerup_team)
885 {
886  self endon( "powerup_timedout" );
887  self endon( "powerup_grabbed" );
888  self endon( "hacked" );
889 
890  zombie_grab_trigger = ‪spawn( "trigger_radius", self.origin - (0,0,40), ‪SPAWNFLAG_TRIGGER_AI_AXIS + ‪SPAWNFLAG_TRIGGER_NOT_PLAYER, 32, 72 );
891  zombie_grab_trigger enablelinkto();
892  zombie_grab_trigger linkto( self );
893  zombie_grab_trigger SetTeamForTrigger( level.zombie_team );
894 
895  self thread ‪powerup_zombie_grab_trigger_cleanup( zombie_grab_trigger );
896  poi_dist = 300;
897  if(isDefined(level._zombie_grabbable_poi_distance_override))
898  {
899  poi_dist = level._zombie_grabbable_poi_distance_override;
900  }
901  zombie_grab_trigger ‪zm_utility::create_zombie_point_of_interest( poi_dist, 2, 0, true,undefined,undefined,powerup_team );
902 
903  while ( isdefined( self ) )
904  {
905  zombie_grab_trigger waittill( "trigger", who );
906  if ( isdefined( level._powerup_grab_check ) )
907  {
908  if ( ! self [[level._powerup_grab_check]]( who ) )
909  continue;
910  }
911  /*
912  if(level.gametype == "zcleansed" ) //if playing cleansed/returned than human players can be zombies too, so we need to check for that. Might want to change this to a function pointer later
913  {
914  if(!isDefined(who) || !IS_TRUE (who.is_zombie))
915  {
916  continue;
917  }
918  }
919  */
920  else if( !isdefined( who ) || !IsAI( who ) )
921  {
922  continue;
923  }
924 
925  playfx( level._effect["powerup_grabbed_red"], self.origin );
926 
927  if( isdefined( level._custom_powerups ) && isdefined( level._custom_powerups[ self.powerup_name ] ) && isdefined( level._custom_powerups[ self.powerup_name ].grab_powerup ) )
928  {
929  b_continue = self [[ level._custom_powerups[ self.powerup_name ].grab_powerup ]]();
930  if( ‪IS_TRUE( b_continue ) )
931  {
932  continue;
933  }
934  }
935  else
936  {
937  if ( IsDefined( level._zombiemode_powerup_zombie_grab ) )
938  {
939  level thread [[ level._zombiemode_powerup_zombie_grab ]]( self );
940  }
941 
942  if ( IsDefined( level._game_mode_powerup_zombie_grab ) )
943  {
944  level thread [[ level._game_mode_powerup_zombie_grab ]]( self,who );
945  }
946 
947 
948  // RAVEN END
949  else
950  {
951 
952  }
953  }
954 
955  level thread ‪zm_audio::sndAnnouncerPlayVox(self.powerup_name);
956 
957  wait( 0.1 );
958 
959  playsoundatposition( "zmb_powerup_grabbed", self.origin );
960  self stoploopsound();
961 
962  self thread ‪powerup_delete_delayed();
963  self notify( "powerup_grabbed" );
964  }
965 }
966 
967 function ‪powerup_grab(powerup_team)
968 {
969  if ( isdefined( self ) && self.zombie_grabbable )
970  {
971  self thread ‪powerup_zombie_grab(powerup_team);
972  return;
973  }
974 
975  self endon ("powerup_timedout");
976  self endon ("powerup_grabbed");
977 
978  range_squared = 64 * 64;
979  while (isdefined(self))
980  {
981  if( IsDefined( self.powerup_player ) )
982  {
983  grabbers = [];
984  grabbers[0] = self.powerup_player;
985  }
986  else if( IsDefined(level.powerup_grab_get_players_override) )
987  {
988  grabbers = [[level.powerup_grab_get_players_override]]();
989  }
990  else
991  {
992  grabbers = GetPlayers();
993  }
994 
995  for (i = 0; i < grabbers.size; i++)
996  {
997  grabber = grabbers[i];
998  if ( IsAlive( grabber.owner ) && IsPlayer( grabber.owner ) )
999  {
1000  player = grabber.owner;
1001  }
1002  else if ( IsPlayer( grabber ) )
1003  {
1004  player = grabber;
1005  }
1006 
1007  // if it's a personal power up, require a player
1008  if ( self.only_affects_grabber && !isdefined( player ) )
1009  {
1010  continue;
1011  }
1012 
1013  if( IsDefined( player.is_drinking ) && ‪IS_DRINKING( player.is_drinking ) && IsDefined( level._custom_powerups ) && IsDefined( level._custom_powerups[ self.powerup_name ] ) && ‪IS_TRUE( level._custom_powerups[ self.powerup_name ].prevent_pick_up_if_drinking ) )
1014  {
1015  continue;
1016  }
1017 
1018  // Don't let them grab the minigun, tesla, or random weapon if they're downed or reviving
1019  // due to weapon switching issues.
1020  if ( (self.powerup_name == "minigun" || self.powerup_name == "tesla" || self.powerup_name == "random_weapon" ) &&
1021  ( !IsPlayer( grabber ) ||
1023  ( player UseButtonPressed() && player ‪zm_utility::in_revive_trigger() ) ||
1024  player ‪bgb::is_enabled( "zm_bgb_disorderly_combat" ) ) )
1025  {
1026  continue;
1027  }
1028 
1029  // Don't let them grab this power up if they are in last stand and this power is not for last stand players
1030  if ( !‪IS_TRUE( self.can_pick_up_in_last_stand ) && player ‪laststand::player_is_in_laststand() )
1031  {
1032  continue;
1033  }
1034 
1035  ignore_range = false;
1036  if ( grabber.ignore_range_powerup === self )
1037  {
1038  grabber.ignore_range_powerup = undefined;
1039  ignore_range = true;
1040  }
1041 
1042  if ( DistanceSquared( grabber.origin, self.origin ) < range_squared || ignore_range )
1043  {
1044  if ( isdefined( level._powerup_grab_check ) )
1045  {
1046  if ( ! self [[level._powerup_grab_check]]( player ) )
1047  continue;
1048  }
1049  /*
1050  if(level.gametype == "zcleansed" ) //if playing cleansed/returned than human players can be zombies too, so we need to check for that
1051  {
1052  if( IS_TRUE (players[i].is_zombie))
1053  {
1054  continue;
1055  }
1056  }
1057  */
1058 
1059  if( isdefined( level._custom_powerups ) && isdefined( level._custom_powerups[ self.powerup_name ] ) && isdefined( level._custom_powerups[ self.powerup_name ].grab_powerup ) )
1060  {
1061  b_continue = self [[ level._custom_powerups[ self.powerup_name ].grab_powerup ]]( player );
1062  if( ‪IS_TRUE( b_continue ) )
1063  {
1064  continue;
1065  }
1066  }
1067  else
1068  {
1069  switch (self.powerup_name)
1070  {
1071  case "teller_withdrawl":
1072  level thread ‪teller_withdrawl(self,player);
1073  //TODO - play some sound/vo stuff here?
1074  break;
1075 
1076  default:
1077  // RAVEN BEGIN bhackbarth: callback for level specific powerups
1078  if ( IsDefined( level._zombiemode_powerup_grab ) )
1079  {
1080  level thread [[ level._zombiemode_powerup_grab ]]( self, player );
1081  }
1082  // RAVEN END
1083  else
1084  {
1085 
1086  }
1087 
1088  break;
1089 
1090  }
1091  }
1092 
1093  ‪demo::bookmark( "zm_player_powerup_grabbed", gettime(), player );
1094  if (isDefined(self.hash_id))
1095  {
1096  player RecordMapEvent(‪ZM_MAP_EVENT_POWERUP_GRABBED, GetTime(), grabber.origin, level.round_number, self.hash_id);
1097  }
1098 
1099  if( ‪should_award_stat ( self.powerup_name ) && IsPlayer(player) ) //don't do this for things that aren't really a powerup
1100  {
1101  //track # of picked up powerups/drops for the player
1102  player ‪zm_stats::increment_client_stat( "drops" );
1103  player ‪zm_stats::increment_player_stat( "drops" );
1104  player ‪zm_stats::increment_client_stat( self.powerup_name + "_pickedup" );
1105  player ‪zm_stats::increment_player_stat( self.powerup_name + "_pickedup" );
1106  player ‪zm_stats::increment_challenge_stat( "SURVIVALIST_POWERUP" );
1107  }
1108 
1109  if ( self.only_affects_grabber )
1110  {
1111  playfx( level._effect["powerup_grabbed_solo"], self.origin );
1112  }
1113  else if ( self.any_team )
1114  {
1115  playfx( level._effect["powerup_grabbed_caution"], self.origin );
1116  }
1117  else
1118  {
1119  playfx( level._effect["powerup_grabbed"], self.origin );
1120  }
1121 
1122  if ( ‪IS_TRUE( self.stolen ) )
1123  {
1124  level notify( "monkey_see_monkey_dont_achieved" );
1125  }
1126 
1127  if( IsDefined( self.grabbed_level_notify ) )
1128  {
1129  level notify( self.grabbed_level_notify );
1130  }
1131 
1132  // RAVEN BEGIN bhackbarth: since there is a wait here, flag the powerup as being taken
1133  self.claimed = true;
1134  self.power_up_grab_player = player; //Player who grabbed the power up
1135  // RAVEN END
1136 
1137  wait( 0.1 );
1138 
1139  playsoundatposition("zmb_powerup_grabbed", self.origin);
1140  self stoploopsound();
1141  self hide();
1142 
1143  //Preventing the line from playing AGAIN if fire sale becomes active before it runs out
1144  if( self.powerup_name != "fire_sale" )
1145  {
1146  if( isdefined( self.power_up_grab_player ) )
1147  {
1148  if(isDefined(level.powerup_intro_vox))
1149  {
1150  level thread [[level.powerup_intro_vox]](self);
1151  return;
1152  }
1153  else
1154  {
1155  if(isDefined(level.powerup_vo_available) )
1156  {
1157  can_say_vo = [[level.powerup_vo_available]]();
1158  if(!can_say_vo)
1159  {
1160  self thread ‪powerup_delete_delayed();
1161  self notify ("powerup_grabbed");
1162  return;
1163  }
1164  }
1165  }
1166  }
1167  }
1168 
1169  if( ‪IS_TRUE( self.only_affects_grabber ) )
1170  level thread ‪zm_audio::sndAnnouncerPlayVox(self.powerup_name, player);
1171  else
1172  level thread ‪zm_audio::sndAnnouncerPlayVox(self.powerup_name );
1173 
1174  self thread ‪powerup_delete_delayed();
1175  self notify ("powerup_grabbed");
1176  }
1177  }
1178  wait 0.1;
1179  }
1180 }
1181 
1182 function ‪get_closest_window_repair( windows, origin )
1183 {
1184  current_window = undefined;
1185  shortest_distance = undefined;
1186  for( i = 0; i < windows.size; i++ )
1187  {
1188  if( ‪zm_utility::all_chunks_intact(windows, windows[i].barrier_chunks ) )
1189  continue;
1190 
1191  if( !IsDefined( current_window ) )
1192  {
1193  current_window = windows[i];
1194  shortest_distance = DistanceSquared( current_window.origin, origin );
1195 
1196  }
1197  else
1198  {
1199  if( DistanceSquared(windows[i].origin, origin) < shortest_distance )
1200  {
1201 
1202  current_window = windows[i];
1203  shortest_distance = DistanceSquared( windows[i].origin, origin );
1204  }
1205 
1206  }
1207 
1208  }
1209 
1210  return current_window;
1211 
1212 
1213 }
1214 
1215 //SELF = Player
1216 function ‪powerup_vo( type )
1217 {
1218  self endon("death");
1219  self endon("disconnect");
1220 
1221  if( !isPlayer( self ) )
1222  return;
1223 
1224  if(isDefined(level.powerup_vo_available) )
1225  {
1226  if(![[level.powerup_vo_available]]() )
1227  {
1228  return;
1229  }
1230  }
1231 
1232  wait( randomfloatrange(2,2.5) );
1233 
1234  if( type == "tesla" )
1235  {
1236  self ‪zm_audio::create_and_play_dialog( "weapon_pickup", type );
1237  }
1238  else
1239  {
1240  self ‪zm_audio::create_and_play_dialog( "powerup", type );
1241  }
1242 
1243  if(isDefined(level.custom_powerup_vo_response))
1244  {
1245  level [[level.custom_powerup_vo_response]](self,type);
1246  }
1247 }
1248 
1250 {
1251  self endon( "death" );
1252 
1253  if ( !isdefined( self ) )
1254  {
1255  return;
1256  }
1257 
1258  if ( isDefined(level.powerup_fx_func) )
1259  {
1260  self thread [[level.powerup_fx_func]]();
1261  return;
1262  }
1263 
1264  //wait( 0.5 ); // must wait a bit because of the bug where a new entity has its events ignored on the client side //bumping it up from .1 to .5, this was failing in some instances
1265 
1266  if ( self.only_affects_grabber )
1267  {
1269  }
1270  else if ( self.any_team )
1271  {
1273  }
1274  else if ( self.zombie_grabbable )
1275  {
1277  }
1278  else
1279  {
1281  }
1282 }
1283 
1285 {
1286  self endon( "powerup_grabbed" );
1287  self endon( "powerup_timedout" );
1288 
1289  self thread ‪powerup_wobble_fx();
1290 
1291  while ( isdefined( self ) )
1292  {
1293  waittime = randomfloatrange( 2.5, 5 );
1294  yaw = RandomInt( 360 );
1295  if( yaw > 300 )
1296  {
1297  yaw = 300;
1298  }
1299  else if( yaw < 60 )
1300  {
1301  yaw = 60;
1302  }
1303  yaw = self.angles[1] + yaw;
1304  new_angles = (-60 + randomint( 120 ), yaw, -45 + randomint( 90 ));
1305  self rotateto( new_angles, waittime, waittime * 0.5, waittime * 0.5 );
1306  if ( isdefined( self.worldgundw ) )
1307  {
1308  self.worldgundw rotateto( new_angles, waittime, waittime * 0.5, waittime * 0.5 );
1309  }
1310  wait randomfloat( waittime - 0.1 );
1311  }
1312 }
1313 
1314 function ‪powerup_show( visible )
1315 {
1316  if ( !visible )
1317  {
1318  self ghost();
1319  if ( isdefined( self.worldgundw ) )
1320  {
1321  self.worldgundw ghost();
1322  }
1323  }
1324  else
1325  {
1326  self show();
1327  if ( isdefined( self.worldgundw ) )
1328  {
1329  self.worldgundw show();
1330  }
1331  if(isDefined(self.powerup_player))
1332  {
1333  self SetInvisibleToAll();
1334  self SetVisibleToPlayer( self.powerup_player );
1335  if ( isdefined( self.worldgundw ) )
1336  {
1337  self.worldgundw SetInvisibleToAll();
1338  self.worldgundw SetVisibleToPlayer( self.powerup_player );
1339  }
1340  }
1341  }
1342 }
1343 
1345 {
1346  if(isDefined(level._powerup_timeout_override)&& !isDefined(self.powerup_team))
1347  {
1348  self thread [[level._powerup_timeout_override]]();
1349  return;
1350  }
1351  self endon( "powerup_grabbed" );
1352  self endon( "death" );
1353  self endon("powerup_reset");
1354 
1355  self ‪powerup_show( true );
1356 
1357  wait_time = 15;
1358  if (isDefined( level._powerup_timeout_custom_time ) )
1359  {
1360  time = [[level._powerup_timeout_custom_time]](self);
1361  if ( time == 0 )
1362  {
1363  return;
1364  }
1365  wait_time = time;
1366 
1367  }
1368 
1369  if( ‪bgb::is_team_enabled( "zm_bgb_temporal_gift" ) )
1370  {
1371  wait_time += ‪N_POWERUP_DEFAULT_TIME;//Get extra 30 seconds
1372  }
1373 
1374  wait wait_time;
1375 
1376  for ( i = 0; i < 40; i++ )
1377  {
1378  // hide and show
1379  if ( i % 2 )
1380  {
1381  self ‪powerup_show( false );
1382  }
1383  else
1384  {
1385  self ‪powerup_show( true );
1386  }
1387 
1388  if ( i < 15 )
1389  {
1390  wait( 0.5 );
1391  }
1392  else if ( i < 25 )
1393  {
1394  wait( 0.25 );
1395  }
1396  else
1397  {
1398  wait( 0.1 );
1399  }
1400  }
1401 
1402  self notify( "powerup_timedout" );
1403  self ‪powerup_delete();
1404 }
1405 
1406 
1408 {
1409  ArrayRemoveValue(level.active_powerups,self,false);
1410  if ( isdefined( self.worldgundw ) )
1411  {
1412  self.worldgundw delete();
1413  }
1414  self delete();
1415 }
1416 
1418 {
1419  if (isdefined(time))
1420  wait time;
1421  else
1422  wait 0.01;
1423  self ‪powerup_delete();
1424 }
1425 
1426 //*****************************************************************************
1427 //*****************************************************************************
1428 
1429 // self == player
1431 {
1432  return( level.zombie_vars[self.team]["zombie_insta_kill"] );
1433 }
1434 
1435 //*****************************************************************************
1436 //*****************************************************************************
1437 
1438 function ‪check_for_instakill( player, mod, hit_location )
1439 {
1440  if(isDefined(player) && isAlive(player) && isDefined(level.check_for_instakill_override))
1441  {
1442  if ( !self [[level.check_for_instakill_override]](player) )
1443  {
1444  return;
1445  }
1446 
1447  if(player.use_weapon_type == "MOD_MELEE")
1448  {
1449  player.last_kill_method = "MOD_MELEE";
1450  }
1451  else
1452  {
1453  player.last_kill_method = "MOD_UNKNOWN";
1454 
1455  }
1457  if ( !‪IS_TRUE( self.no_gib ) )
1458  {
1460  }
1461  self.health = 1;
1462  self DoDamage( self.health + 666, self.origin, player, self, hit_location, modName );
1463  player notify("zombie_killed");
1464 
1465  }
1466 
1467  if( IsDefined( player ) && IsAlive( player ) && ( level.zombie_vars[player.team]["zombie_insta_kill"] || ‪IS_TRUE( player.personal_instakill )) )
1468  {
1470  {
1471  return;
1472  }
1473 
1474  if ( IsDefined( self.instakill_func ) )
1475  {
1476  b_result = self thread [[ self.instakill_func ]]( player, mod, hit_location );
1477  if ( ‪IS_TRUE( b_result) )
1478  {
1479  return;
1480  }
1481  }
1482 
1483  if(player.use_weapon_type == "MOD_MELEE")
1484  {
1485  player.last_kill_method = "MOD_MELEE";
1486  }
1487  else
1488  {
1489  player.last_kill_method = "MOD_UNKNOWN";
1490 
1491  }
1492 
1494  if( !level ‪flag::get( "special_round" ) && !‪IS_TRUE( self.no_gib ) ) // normal zombie round, and zombie is gibbable
1495  {
1497  }
1498  self.health = 1;
1499  self DoDamage( self.health + 666, self.origin, player, self, hit_location, modName );
1500  player notify("zombie_killed");
1501  }
1502 }
1503 
1504 function ‪point_doubler_on_hud( drop_item, player_team )
1505 {
1506  self endon ("disconnect");
1507 
1508  // check to see if this is on or not
1509  if ( level.zombie_vars[player_team]["zombie_powerup_double_points_on"] )
1510  {
1511  // reset the time and keep going
1512  level.zombie_vars[player_team]["zombie_powerup_double_points_time"] = ‪N_POWERUP_DEFAULT_TIME;
1513  return;
1514  }
1515 
1516  level.zombie_vars[player_team]["zombie_powerup_double_points_on"] = true;
1517  //level.powerup_hud_array[0] = true;
1518  // set up the hudelem
1519  //hudelem = hud::createFontString( "objective", 2 );
1520  //hudelem hud::setPoint( "TOP", undefined, 0, level.zombie_vars["zombie_timer_offset"] );
1521  //hudelem.sort = 0.5;
1522  //hudelem.alpha = 0;
1523  //hudelem fadeovertime( 0.5 );
1524  //hudelem.alpha = 1;
1525  //hudelem.label = drop_item.hint;
1526 
1527  // set time remaining for point doubler
1528  level thread ‪time_remaining_on_point_doubler_powerup( player_team );
1529 
1530  // offset in case we get another powerup
1531  //level.zombie_timer_offset -= level.zombie_timer_offset_interval;
1532 }
1533 
1535 {
1536  //self setvalue( level.zombie_vars["zombie_powerup_double_points_time"] );
1537 
1538  temp_ent = ‪spawn("script_origin", (0,0,0));
1539  temp_ent playloopsound ("zmb_double_point_loop");
1540 
1541  // time it down!
1542  while ( level.zombie_vars[player_team]["zombie_powerup_double_points_time"] >= 0)
1543  {
1545  level.zombie_vars[player_team]["zombie_powerup_double_points_time"] = level.zombie_vars[player_team]["zombie_powerup_double_points_time"] - 0.05;
1546  //self setvalue( level.zombie_vars["zombie_powerup_double_points_time"] );
1547  }
1548 
1549  // turn off the timer
1550  level.zombie_vars[player_team]["zombie_powerup_double_points_on"] = false;
1551  players = GetPlayers( player_team );
1552  for (i = 0; i < players.size; i++)
1553  {
1554  //players[i] stoploopsound("zmb_double_point_loop", 2);
1555  players[i] playsound("zmb_points_loop_off");
1556  }
1557  temp_ent stoploopsound(2);
1558 
1559 
1560  // remove the offset to make room for new powerups, reset timer for next time
1561  level.zombie_vars[player_team]["zombie_powerup_double_points_time"] = ‪N_POWERUP_DEFAULT_TIME;
1562  //level.zombie_timer_offset += level.zombie_timer_offset_interval;
1563  //self destroy();
1564  temp_ent delete();
1565 }
1566 
1568 {
1569  wait(1.0);
1570 }
1571 
1572 //*****************************************************************************
1573 // Here we have a selection of special case rare powerups that may get dropped
1574 // by the random powerup generator
1575 //*****************************************************************************
1577 {
1578  if ( level ‪flagsys::get( "ape_round") )
1579  {
1580  return( 0 );
1581  }
1582 
1583  return( 0 );
1584 }
1585 
1587 {
1588  players = GetPlayers();
1589  for ( i = 0; i < players.size; i++ )
1590  {
1591  if ( players[i].zombie_vars[ "zombie_powerup_tesla_on" ] )
1592  {
1593  return true;
1594  }
1595  }
1596 
1597  return false;
1598 }
1599 
1600 
1601 //******************************************************************************
1602 //
1603 // DEBUG
1604 //
1605 function ‪print_powerup_drop( powerup, type )
1606 {
1607 }
1608 
1610 {
1611  if(!isdefined(level._additional_carpenter_nodes))
1612  {
1613  level._additional_carpenter_nodes = [];
1614  }
1615 
1616  node._post_carpenter_callback = ‪callback;
1617 
1618  level._additional_carpenter_nodes[level._additional_carpenter_nodes.size] = node;
1619 }
1620 
1621 //*****************************************************************************
1622 // Boards are upgraded if the player that uses the carpenter has the upgrade
1623 //*****************************************************************************
1624 
1626 {
1627  if( IsDefined(level.pers_carpenter_boards_active) && (level.pers_carpenter_boards_active == true) )
1628  {
1629  return( 1 );
1630  }
1631  return( 0 );
1632 }
1633 
1634 
1635 
1636 //*****************************************************************************
1637 //*****************************************************************************
1638 
1640 {
1641  return false;
1642 }
1643 
1645 {
1646  return true;
1647 }
1648 
1650 {
1651  self endon ("powerup_timedout");
1652  self endon ("powerup_grabbed");
1653 
1654  drag_speed = 75;
1655  while ( 1 )
1656  {
1657  self waittill("move_powerup", moveto, distance);
1658  drag_vector = moveto - self.origin;
1659  range_squared = LengthSquared(drag_vector); //DistanceSquared( self.origin, self.drag_target );
1660  if ( range_squared > distance * distance )
1661  {
1662  drag_vector = VectorNormalize( drag_vector );
1663  drag_vector = distance * drag_vector;
1664  moveto = self.origin + drag_vector;
1665  }
1666  self.origin = moveto;
1667  }
1668 }
1669 
1670 function ‪powerup_emp()
1671 {
1672  self endon ("powerup_timedout");
1673  self endon ("powerup_grabbed");
1675  return;
1676  while(1)
1677  {
1678  level waittill("emp_detonate",origin,radius);
1679  if ( DistanceSquared( origin, self.origin) < radius * radius )
1680  {
1681  PlayFX( level._effect[ "powerup_off" ], self.origin );
1682  self thread ‪powerup_delete_delayed();
1683  self notify( "powerup_timedout" );
1684  }
1685  }
1686 }
1687 
1688 function ‪get_powerups( origin, radius )
1689 {
1690  if (isdefined(origin) && isdefined(radius))
1691  {
1692  powerups = [];
1693  foreach( powerup in level.active_powerups )
1694  {
1695  if ( DistanceSquared( origin, powerup.origin) < radius * radius )
1696  {
1697  powerups[powerups.size] = powerup;
1698  }
1699  }
1700  return powerups;
1701  }
1702  return level.active_powerups;
1703 }
1704 
1705 function ‪should_award_stat( powerup_name )
1706 {
1707  if ( powerup_name == "teller_withdrawl" || powerup_name == "blue_monkey" || powerup_name == "free_perk" || powerup_name == "bonus_points_player" )
1708  {
1709  return false;
1710  }
1711 
1712  if ( isdefined( level.zombie_statless_powerups ) && isdefined( level.zombie_statless_powerups[powerup_name] ) && level.zombie_statless_powerups[powerup_name] )
1713  {
1714  return false;
1715  }
1716 
1717  return true;
1718 }
1719 
1720 function ‪teller_withdrawl(powerup,player)
1721 {
1722  player ‪zm_score::add_to_player_score( powerup.value);
1723 }
1724 
1725 //HUD powerup functions
1726 function ‪show_on_hud( player_team, str_powerup )
1727 {
1728  self endon ("disconnect");
1729 
1730  str_index_on = "zombie_powerup_" + str_powerup + "_on";
1731  str_index_time = "zombie_powerup_" + str_powerup + "_time";
1732 
1733  // check to see if this is on or not
1734  if ( level.zombie_vars[player_team][str_index_on] )
1735  {
1736  // reset the time and keep going
1737  level.zombie_vars[player_team][str_index_time] = ‪N_POWERUP_DEFAULT_TIME;
1738  if( ‪bgb::is_team_enabled( "zm_bgb_temporal_gift" ) )
1739  {
1740  level.zombie_vars[player_team][str_index_time] += ‪N_POWERUP_DEFAULT_TIME;//Get extra 30 seconds
1741  }
1742  return;
1743  }
1744 
1745  level.zombie_vars[player_team][str_index_on] = true;
1746 
1747  // set time remaining for powerup
1748  level thread ‪time_remaining_on_powerup( player_team, str_powerup );
1749 }
1750 
1751 function ‪time_remaining_on_powerup( player_team, str_powerup )
1752 {
1753  str_index_on = "zombie_powerup_" + str_powerup + "_on";
1754  str_index_time = "zombie_powerup_" + str_powerup + "_time";
1755  str_sound_loop = "zmb_" + str_powerup + "_loop";
1756  str_sound_off = "zmb_" + str_powerup + "_loop_off";
1757 
1758  temp_ent = ‪Spawn("script_origin", (0,0,0));
1759  temp_ent PlayLoopSound (str_sound_loop);
1760 
1761  if( ‪bgb::is_team_enabled( "zm_bgb_temporal_gift" ) )
1762  {
1763  level.zombie_vars[player_team][str_index_time] += ‪N_POWERUP_DEFAULT_TIME;
1764  }
1765 
1766  // time it down!
1767  while ( level.zombie_vars[player_team][str_index_time] >= 0)
1768  {
1770  level.zombie_vars[player_team][str_index_time] = level.zombie_vars[player_team][str_index_time] - 0.05;
1771  }
1772 
1773  // turn off the timer
1774  level.zombie_vars[player_team][str_index_on] = false;
1775 
1776  GetPlayers()[0] PlaySoundToTeam(str_sound_off, player_team);
1777 
1778  temp_ent StopLoopSound(2);
1779 
1780  // remove the offset to make room for new powerups, reset timer for next time
1781  level.zombie_vars[player_team][str_index_time] = ‪N_POWERUP_DEFAULT_TIME;
1782 
1783  temp_ent delete();
1784 }
1786 
1787 //Special weapon powerup functions
1788 
1789 function ‪weapon_powerup( ent_player, time, str_weapon, allow_cycling = false )
1790 {
1791  str_weapon_on = "zombie_powerup_" + str_weapon + "_on";
1792  str_weapon_time_over = str_weapon + "_time_over";
1793 
1794  ent_player notify( "replace_weapon_powerup" );
1795  ent_player._show_solo_hud = true;
1796 
1797  ent_player.has_specific_powerup_weapon[ str_weapon ] = true;
1798  ent_player.has_powerup_weapon = true;
1799 
1801 
1802  if( allow_cycling )
1803  {
1804  ent_player EnableWeaponCycling();
1805  }
1806 
1807  ent_player._zombie_weapon_before_powerup[ str_weapon ] = ent_player GetCurrentWeapon();
1808 
1809  // give player the powerup weapon
1810  ent_player GiveWeapon( level.zombie_powerup_weapon[ str_weapon ] );
1811  ent_player SwitchToWeapon( level.zombie_powerup_weapon[ str_weapon ] );
1812 
1813  ent_player.zombie_vars[ str_weapon_on ] = true;
1814 
1815  level thread ‪weapon_powerup_countdown( ent_player, str_weapon_time_over, time, str_weapon );
1816  level thread ‪weapon_powerup_replace( ent_player, str_weapon_time_over, str_weapon );
1817  level thread ‪weapon_powerup_change( ent_player, str_weapon_time_over, str_weapon );
1818 }
1819 
1820 function ‪weapon_powerup_change( ent_player, str_gun_return_notify, str_weapon )
1821 {
1822  ent_player endon( "death" );
1823  ent_player endon( "disconnect" );
1824  ent_player endon( "player_downed" );
1825  ent_player endon( str_gun_return_notify );
1826  ent_player endon( "replace_weapon_powerup" );
1827 
1828  while( 1 )
1829  {
1830  ent_player waittill( "weapon_change", newWeapon, oldWeapon );
1831 
1832  if( newWeapon != level.weaponNone && newWeapon != level.zombie_powerup_weapon[ str_weapon ] )
1833  {
1834  break;
1835  }
1836  }
1837 
1838  level thread ‪weapon_powerup_remove( ent_player, str_gun_return_notify, str_weapon, false );
1839 }
1840 
1841 function ‪weapon_powerup_countdown( ent_player, str_gun_return_notify, time, str_weapon )
1842 {
1843  ent_player endon( "death" );
1844  ent_player endon( "disconnect" );
1845  ent_player endon( "player_downed" );
1846  ent_player endon( str_gun_return_notify );
1847  ent_player endon( "replace_weapon_powerup" );
1848 
1849  str_weapon_time = "zombie_powerup_" + str_weapon + "_time";
1850 
1851  ent_player.zombie_vars[str_weapon_time] = time;
1852 
1853  if( ‪bgb::is_team_enabled( "zm_bgb_temporal_gift" ) )
1854  {
1855  ent_player.zombie_vars[str_weapon_time] += ‪N_POWERUP_DEFAULT_TIME;
1856  }
1857 
1858  [[level._custom_powerups[ str_weapon ].weapon_countdown]]( ent_player, str_weapon_time );
1859 
1860  level thread ‪weapon_powerup_remove( ent_player, str_gun_return_notify, str_weapon, true );
1861 }
1862 
1863 function ‪weapon_powerup_replace( ent_player, str_gun_return_notify, str_weapon )
1864 {
1865  ent_player endon( "death" );
1866  ent_player endon( "disconnect" );
1867  ent_player endon( "player_downed" );
1868  ent_player endon( str_gun_return_notify );
1869 
1870  str_weapon_on = "zombie_powerup_" + str_weapon + "_on";
1871 
1872  ent_player waittill( "replace_weapon_powerup" );
1873 
1874  ent_player TakeWeapon( level.zombie_powerup_weapon[ str_weapon ] );
1875 
1876  ent_player.zombie_vars[ str_weapon_on ] = false;
1877 
1878  ent_player.has_specific_powerup_weapon[ str_weapon ] = false;
1879  ent_player.has_powerup_weapon = false;
1880 
1882 }
1883 
1884 function ‪weapon_powerup_remove( ent_player, str_gun_return_notify, str_weapon, b_switch_back_weapon = true )
1885 {
1886  ent_player endon( "death" );
1887  ent_player endon( "player_downed" );
1888 
1889  str_weapon_on = "zombie_powerup_" + str_weapon + "_on";
1890 
1891  // take the minigun back
1892  ent_player TakeWeapon( level.zombie_powerup_weapon[ str_weapon ] );
1893 
1894  ent_player.zombie_vars[ str_weapon_on ] = false;
1895  ent_player._show_solo_hud = false;
1896 
1897  ent_player.has_specific_powerup_weapon[ str_weapon ] = false;
1898  ent_player.has_powerup_weapon = false;
1899 
1900  // this gives the player back their weapons
1901  ent_player notify( str_gun_return_notify );
1902 
1904 
1905  if ( b_switch_back_weapon )
1906  {
1907  ent_player ‪zm_weapons::switch_back_primary_weapon( ent_player._zombie_weapon_before_powerup[ str_weapon ] );
1908  }
1909 }
1910 
1911 function ‪weapon_watch_gunner_downed( str_weapon )
1912 {
1913  str_notify = str_weapon + "_time_over";
1914  str_weapon_on = "zombie_powerup_" + str_weapon + "_on";
1915 
1916  if ( !IsDefined( self.has_specific_powerup_weapon ) || !‪IS_TRUE( self.has_specific_powerup_weapon[ str_weapon ] ) )
1917  {
1918  return;
1919  }
1920 
1921  primaryWeapons = self GetWeaponsListPrimaries();
1922 
1923  for( i = 0; i < primaryWeapons.size; i++ )
1924  {
1925  if( primaryWeapons[i] == level.zombie_powerup_weapon[ str_weapon ] )
1926  {
1927  self TakeWeapon( level.zombie_powerup_weapon[ str_weapon ] );
1928  }
1929  }
1930 
1931  // this gives the player back their weapons
1932  self notify( str_notify );
1933  self.zombie_vars[ str_weapon_on ] = false;
1934  self._show_solo_hud = false;
1935 
1936  // wait a frame to let last stand finish initializing so that
1937  // the wholethe system knows we went into last stand with a powerup weapon
1939  self.has_specific_powerup_weapon[ str_weapon ] = false;
1940  self.has_powerup_weapon = false;
1941 }
1942 
1943 //END special weapon powerup functions
1944 
1956 function ‪register_powerup( str_powerup, func_grab_powerup, func_setup )
1957 {
1958  Assert( IsDefined( str_powerup ), "str_powerup is a required argument for register_powerup!" );
1959 
1960  ‪_register_undefined_powerup( str_powerup );
1961 
1962  if ( IsDefined( func_grab_powerup ) )
1963  {
1964  if ( !IsDefined( level._custom_powerups[ str_powerup ].grab_powerup ) )
1965  {
1966  level._custom_powerups[ str_powerup ].grab_powerup = func_grab_powerup;
1967  }
1968  }
1969 
1970  if ( IsDefined( func_setup ) )
1971  {
1972  if ( !IsDefined( level._custom_powerups[ str_powerup ].setup_powerup ) )
1973  {
1974  level._custom_powerups[ str_powerup ].setup_powerup = func_setup;
1975  }
1976  }
1977 }
1978 
1979 // make sure powerup exists before we actually try to set fields on it. Does nothing if it exists already
1980 function ‪_register_undefined_powerup( str_powerup )
1981 {
1982  if ( !IsDefined( level._custom_powerups ) )
1983  {
1984  level._custom_powerups = [];
1985  }
1986 
1987  if ( !IsDefined( level._custom_powerups[ str_powerup ] ) )
1988  {
1989  level._custom_powerups[ str_powerup ] = SpawnStruct();
1990  ‪include_zombie_powerup( str_powerup );
1991  }
1992 }
1993 
2004 function ‪register_powerup_weapon( str_powerup, func_countdown )
2005 {
2006  Assert( IsDefined( str_powerup ), "str_powerup is a required argument for register_powerup!" );
2007 
2008  ‪_register_undefined_powerup( str_powerup );
2009 
2010  if ( IsDefined( func_countdown ) )
2011  {
2012  if ( !IsDefined( level._custom_powerups[ str_powerup ].weapon_countdown ) )
2013  {
2014  level._custom_powerups[ str_powerup ].weapon_countdown = func_countdown;
2015  }
2016  }
2017 }
‪powerup_delete
‪function powerup_delete()
Definition: _zm_powerups.gsc:1407
‪include_zombie_powerup
‪function include_zombie_powerup(powerup_name)
Definition: _zm_powerups.gsc:562
‪minigun_no_drop
‪function minigun_no_drop()
Definition: _zm_powerups.gsc:388
‪callback
‪function callback(event, localclientnum, params)
Definition: callbacks_shared.csc:13
‪weapon_powerup_countdown
‪function weapon_powerup_countdown(ent_player, str_gun_return_notify, time, str_weapon)
Definition: _zm_powerups.gsc:1841
‪get_random_powerup_name
‪function get_random_powerup_name()
Definition: _zm_powerups.gsc:454
‪CLIENTFIELD_POWERUP_STATE_FLASHING_ON
‪#define CLIENTFIELD_POWERUP_STATE_FLASHING_ON
Definition: _zm_powerups.gsh:4
‪get_next_powerup
‪function get_next_powerup()
Definition: _zm_powerups.gsc:336
‪time_remaining_on_powerup
‪function time_remaining_on_powerup(player_team, str_powerup)
Definition: _zm_powerups.gsc:1751
‪all_chunks_intact
‪function all_chunks_intact(barrier, barrier_chunks)
Definition: _zm_utility.gsc:392
‪powerup_emp
‪function powerup_emp()
Definition: _zm_powerups.gsc:1670
‪increment_client_stat
‪function increment_client_stat(stat_name, include_gametype)
Definition: _zm_stats.gsc:389
‪func_should_never_drop
‪function func_should_never_drop()
Definition: _zm_powerups.gsc:1639
‪powerup_remove_from_regular_drops
‪function powerup_remove_from_regular_drops(powerup_name)
Definition: _zm_powerups.gsc:572
‪tesla_powerup_active
‪function tesla_powerup_active()
Definition: _zm_powerups.gsc:1586
‪remove_mod_from_methodofdeath
‪function remove_mod_from_methodofdeath(mod)
Definition: _zm_utility.gsc:3683
‪increment_player_stat
‪function increment_player_stat(stat_name)
Definition: _zm_stats.gsc:369
‪specific_powerup_drop
‪function specific_powerup_drop(powerup_name, drop_spot, powerup_team, powerup_location, pickup_delay, powerup_player, b_stay_forever)
Definition: _zm_powerups.gsc:688
‪add_zombie_powerup
‪function add_zombie_powerup(powerup_name, model_name, hint, func_should_drop_with_regular_powerups, only_affects_grabber, any_team, zombie_grabbable, fx, client_field_name, time_name, on_name, clientfield_version=VERSION_SHIP, player_specific=false)
Definition: _zm_powerups.gsc:477
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪is_carpenter_boards_upgraded
‪function is_carpenter_boards_upgraded()
Definition: _zm_powerups.gsc:1625
‪create_zombie_point_of_interest
‪function create_zombie_point_of_interest(attract_dist, num_attractors, added_poi_value, start_turned_on, initial_attract_func, arrival_attract_func, poi_team)
Definition: _zm_utility.gsc:624
‪special_drop_setup
‪function special_drop_setup()
Definition: _zm_powerups.gsc:841
‪CLIENTFIELD_POWERUP_FX_ONLY_AFFECTS_GRABBER_ON
‪#define CLIENTFIELD_POWERUP_FX_ONLY_AFFECTS_GRABBER_ON
Definition: _zm_powerups.gsh:27
‪zombie_head_gib
‪function zombie_head_gib(attacker, means_of_death)
Definition: zombie_utility.gsc:2952
‪powerup_set_statless_powerup
‪function powerup_set_statless_powerup(powerup_name)
Definition: _zm_powerups.gsc:544
‪add_to_player_score
‪function add_to_player_score(points, b_add_to_total=true, str_awarded_by="")
Definition: _zm_score.gsc:521
‪register_powerup_weapon
‪function register_powerup_weapon(str_powerup, func_countdown)
Definition: _zm_powerups.gsc:2004
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪CLIENTFIELD_POWERUP_STATE_FLASHING_OFF
‪#define CLIENTFIELD_POWERUP_STATE_FLASHING_OFF
Definition: _zm_powerups.gsh:5
‪set_zombie_var
‪function set_zombie_var(zvar, value, is_float=false, column=1, is_team_based=false)
Definition: zombie_utility.gsc:1434
‪powerup_wobble
‪function powerup_wobble()
Definition: _zm_powerups.gsc:1284
‪check_for_instakill
‪function check_for_instakill(player, mod, hit_location)
Definition: _zm_powerups.gsc:1438
‪register_powerup
‪function register_powerup(str_powerup, func_grab_powerup, func_setup)
Definition: _zm_powerups.gsc:1956
‪watch_for_drop
‪function watch_for_drop()
Definition: _zm_powerups.gsc:417
‪set_clientfield_powerups
‪function set_clientfield_powerups(clientfield_name, powerup_timer, powerup_on, flashing_timers, flashing_values)
Definition: _zm_powerups.gsc:291
‪randomize_powerups
‪function randomize_powerups()
Definition: _zm_powerups.gsc:321
‪weapon_powerup_change
‪function weapon_powerup_change(ent_player, str_gun_return_notify, str_weapon)
Definition: _zm_powerups.gsc:1820
‪powerup_drop
‪function powerup_drop(drop_point)
Definition: _zm_powerups.gsc:586
‪sndAnnouncerPlayVox
‪function sndAnnouncerPlayVox(type, player)
Definition: _zm_audio.gsc:1319
‪powerup_grab
‪function powerup_grab(powerup_team)
Definition: _zm_powerups.gsc:967
‪CLIENTFIELD_POWERUP_FX_ON
‪#define CLIENTFIELD_POWERUP_FX_ON
Definition: _zm_powerups.gsh:26
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪get_regular_random_powerup_name
‪function get_regular_random_powerup_name()
Definition: _zm_powerups.gsc:461
‪SPAWNFLAG_TRIGGER_AI_AXIS
‪#define SPAWNFLAG_TRIGGER_AI_AXIS
Definition: shared.gsh:29
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪CLIENTFIELD_POWERUP_FX_ANY_TEAM_ON
‪#define CLIENTFIELD_POWERUP_FX_ANY_TEAM_ON
Definition: _zm_powerups.gsh:29
‪get_powerups
‪function get_powerups(origin, radius)
Definition: _zm_powerups.gsc:1688
‪POWERUP_FLASHING_STAGE_TWO_TIME
‪#define POWERUP_FLASHING_STAGE_TWO_TIME
Definition: _zm_powerups.gsh:8
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪ZM_MAP_EVENT_POWERUP_GRABBED
‪#define ZM_MAP_EVENT_POWERUP_GRABBED
Definition: _zm_utility.gsh:77
‪get_closest_window_repair
‪function get_closest_window_repair(windows, origin)
Definition: _zm_powerups.gsc:1182
‪should_award_stat
‪function should_award_stat(powerup_name)
Definition: _zm_powerups.gsc:1705
‪weapon_powerup_remove
‪function weapon_powerup_remove(ent_player, str_gun_return_notify, str_weapon, b_switch_back_weapon=true)
Definition: _zm_powerups.gsc:1884
‪get_valid_powerup
‪function get_valid_powerup()
Definition: _zm_powerups.gsc:359
‪_register_undefined_powerup
‪function _register_undefined_powerup(str_powerup)
Definition: _zm_powerups.gsc:1980
‪POWERUP_FLASHING_STAGE_ONE_TIME
‪#define POWERUP_FLASHING_STAGE_ONE_TIME
Definition: _zm_powerups.gsh:7
‪weapon_watch_gunner_downed
‪function weapon_watch_gunner_downed(str_weapon)
Definition: _zm_powerups.gsc:1911
‪powerup_hud_monitor
‪function powerup_hud_monitor()
Definition: _zm_powerups.gsc:165
‪increment_is_drinking
‪function increment_is_drinking()
Definition: _zm_utility.gsc:3859
‪switch_back_primary_weapon
‪function switch_back_primary_weapon(oldprimary, immediate=false)
Definition: _zm_weapons.gsc:280
‪show_on_hud
‪function show_on_hud(player_team, str_powerup)
Definition: _zm_powerups.gsc:1726
‪POWERUP_FOR_SPECIFIC_PLAYER
‪#define POWERUP_FOR_SPECIFIC_PLAYER
Definition: _zm_powerups.gsh:34
‪increment_challenge_stat
‪function increment_challenge_stat(stat_name, amount=1)
Definition: _zm_stats.gsc:478
‪powerup_round_start
‪function powerup_round_start()
Definition: _zm_powerups.gsc:581
‪POWERUP_ONLY_AFFECTS_GRABBER
‪#define POWERUP_ONLY_AFFECTS_GRABBER
Definition: _zm_powerups.gsh:31
‪init_player_zombie_vars
‪function init_player_zombie_vars()
Definition: _zm_powerups.gsc:148
‪CLIENTFIELD_POWERUP_FX_ZOMBIE_GRABBABLE_ON
‪#define CLIENTFIELD_POWERUP_FX_ZOMBIE_GRABBABLE_ON
Definition: _zm_powerups.gsh:28
‪check_for_rare_drop_override
‪function check_for_rare_drop_override(pos)
Definition: _zm_powerups.gsc:1576
‪POWERUP_FLASHING_STAGE_ONE_DELTA_TIME
‪#define POWERUP_FLASHING_STAGE_ONE_DELTA_TIME
Definition: _zm_powerups.gsh:9
‪powerup_show
‪function powerup_show(visible)
Definition: _zm_powerups.gsc:1314
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪POWERUP_ZOMBIE_GRABBABLE
‪#define POWERUP_ZOMBIE_GRABBABLE
Definition: _zm_powerups.gsh:33
‪powerup_set_player_specific
‪function powerup_set_player_specific(powerup_name, b_player_specific=POWERUP_FOR_SPECIFIC_PLAYER)
Definition: _zm_powerups.gsc:539
‪CLIENTFIELD_POWERUP_STATE_OFF
‪#define CLIENTFIELD_POWERUP_STATE_OFF
Definition: _zm_powerups.gsh:2
‪point_doubler_on_hud
‪function point_doubler_on_hud(drop_item, player_team)
Definition: _zm_powerups.gsc:1504
‪is_insta_kill_active
‪function is_insta_kill_active()
Definition: _zm_powerups.gsc:1430
‪time_remaining_on_point_doubler_powerup
‪function time_remaining_on_point_doubler_powerup(player_team)
Definition: _zm_powerups.gsc:1534
‪powerup_zombie_grab
‪function powerup_zombie_grab(powerup_team)
Definition: _zm_powerups.gsc:884
‪powerup_zombie_grab_trigger_cleanup
‪function powerup_zombie_grab_trigger_cleanup(trigger)
Definition: _zm_powerups.gsc:877
‪powerup_vo
‪function powerup_vo(type)
Definition: _zm_powerups.gsc:1216
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪devil_dialog_delay
‪function devil_dialog_delay()
Definition: _zm_powerups.gsc:1567
‪decrement_is_drinking
‪function decrement_is_drinking()
Definition: _zm_utility.gsc:3898
‪is_enabled
‪function is_enabled(name)
Definition: _zm_bgb.gsc:4
‪is_team_enabled
‪function is_team_enabled(str_name)
Definition: _zm_bgb.gsc:13
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪powerup_timeout
‪function powerup_timeout()
Definition: _zm_powerups.gsc:1344
‪print_powerup_drop
‪function print_powerup_drop(powerup, type)
Definition: _zm_powerups.gsc:1605
‪bookmark
‪function bookmark(type, time, mainClientEnt, otherClientEnt, eventPriority, inflictorEnt, overrideEntityCamera, actorEnt)
Definition: demo_shared.gsc:25
‪powerup_setup
‪function powerup_setup(powerup_override, powerup_team, powerup_location, powerup_player, shouldplaysound=true)
Definition: _zm_powerups.gsc:759
‪should_watch_for_emp
‪function should_watch_for_emp()
Definition: _zm_utility.gsc:4466
‪init_powerups
‪function init_powerups()
Definition: _zm_powerups.gsc:105
‪while
‪while(!done &&array.size > 0)
Definition: util_shared.csc:924
‪SPAWNFLAG_TRIGGER_NOT_PLAYER
‪#define SPAWNFLAG_TRIGGER_NOT_PLAYER
Definition: shared.gsh:32
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪weapon_powerup_replace
‪function weapon_powerup_replace(ent_player, str_gun_return_notify, str_weapon)
Definition: _zm_powerups.gsc:1863
‪N_POWERUP_DEFAULT_TIME
‪#define N_POWERUP_DEFAULT_TIME
Definition: _zm_powerups.gsh:36
‪set_weapon_ignore_max_ammo
‪function set_weapon_ignore_max_ammo(weapon)
Definition: _zm_powerups.gsc:154
‪register_carpenter_node
‪function register_carpenter_node(node, callback)
Definition: _zm_powerups.gsc:1609
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪func_should_always_drop
‪function func_should_always_drop()
Definition: _zm_powerups.gsc:1644
‪teller_withdrawl
‪function teller_withdrawl(powerup, player)
Definition: _zm_powerups.gsc:1720
‪weapon_powerup
‪function weapon_powerup(ent_player, time, str_weapon, allow_cycling=false)
Definition: _zm_powerups.gsc:1789
‪powerup_wobble_fx
‪function powerup_wobble_fx()
Definition: _zm_powerups.gsc:1249
‪player_is_in_laststand
‪function player_is_in_laststand()
Definition: laststand_shared.gsc:18
‪init
‪function init()
Definition: _zm_powerups.gsc:56
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪add_zombie_special_drop
‪function add_zombie_special_drop(powerup_name)
Definition: _zm_powerups.gsc:552
‪special_powerup_drop
‪function special_powerup_drop(drop_point)
Definition: _zm_powerups.gsc:720
‪create_and_play_dialog
‪function create_and_play_dialog(category, subcategory, force_variant)
Definition: _zm_audio.gsc:603
‪powerup_set_prevent_pick_up_if_drinking
‪function powerup_set_prevent_pick_up_if_drinking(powerup_name, b_prevent_pick_up)
Definition: _zm_powerups.gsc:534
‪CLIENTFIELD_POWERUP_FX_NAME
‪#define CLIENTFIELD_POWERUP_FX_NAME
Definition: _zm_powerups.gsh:23
‪in_revive_trigger
‪function in_revive_trigger()
Definition: _zm_utility.gsc:1684
‪on_connect
‪function on_connect()
Definition: _arena.gsc:20
‪IS_DRINKING
‪#define IS_DRINKING(_is_drinking)
Definition: _zm_utility.gsh:1
‪powerup_set_can_pick_up_in_last_stand
‪function powerup_set_can_pick_up_in_last_stand(powerup_name, b_can_pick_up)
Definition: _zm_powerups.gsc:529
‪POWERUP_FLASHING_STAGE_TWO_DELTA_TIME
‪#define POWERUP_FLASHING_STAGE_TWO_DELTA_TIME
Definition: _zm_powerups.gsh:10
‪CLIENTFIELD_POWERUP_STATE_ON
‪#define CLIENTFIELD_POWERUP_STATE_ON
Definition: _zm_powerups.gsh:3
‪network_safe_spawn
‪function network_safe_spawn(id, max, classname, origin)
Definition: _zm_net.gsc:93
‪powerup_move
‪function powerup_move()
Definition: _zm_powerups.gsc:1649
‪POWERUP_ANY_TEAM
‪#define POWERUP_ANY_TEAM
Definition: _zm_powerups.gsh:32
‪CLIENTFIELD_POWERUP_INSTANT_KILL_UG
‪#define CLIENTFIELD_POWERUP_INSTANT_KILL_UG
Definition: _zm_powerups.gsh:19
‪powerup_delete_delayed
‪function powerup_delete_delayed(time)
Definition: _zm_powerups.gsc:1417
‪is_magic_bullet_shield_enabled
‪function is_magic_bullet_shield_enabled(ent)
Definition: _zm_utility.gsc:3474
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265