‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_zm_perks.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\array_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\demo_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\laststand_shared;
8 #using scripts\shared\trigger_shared;
9 #using scripts\shared\util_shared;
10 #using scripts\shared\visionset_mgr_shared;
11 
12 #insert scripts\shared\shared.gsh;
13 #insert scripts\shared\version.gsh;
14 
15 #using scripts\shared\ai\zombie_utility;
16 
17 #using scripts\zm\_util;
18 #using scripts\zm\_zm;
19 #using scripts\zm\_bb;
20 #using scripts\zm\_zm_audio;
21 #using scripts\zm\_zm_bgb;
22 #using scripts\zm\_zm_equipment;
23 #using scripts\zm\_zm_laststand;
24 #using scripts\zm\_zm_magicbox;
25 #using scripts\zm\_zm_pers_upgrades_functions;
26 #using scripts\zm\_zm_power;
27 #using scripts\zm\_zm_score;
28 #using scripts\zm\_zm_stats;
29 #using scripts\zm\_zm_utility;
30 #using scripts\zm\_zm_weapons;
31 
32 #insert scripts\zm\_zm_perks.gsh;
33 #insert scripts\zm\_zm_utility.gsh;
34 
35 #precache( "fx", "_t6/misc/fx_zombie_cola_dtap_on" );
36 #precache( "fx", "_t6/misc/fx_zombie_cola_jugg_on" );
37 #precache( "fx", "_t6/misc/fx_zombie_cola_on" );
38 
39 #namespace zm_perks;
40 
41 function ‪init()
42 {
43  level.perk_purchase_limit = 4;
44 
45  // Register the perk client field
47 
48  if(!level.enable_magic)
49  {
50  return;
51  }
52 
54 
55  //sets up spawned perk machines.
57 
58  vending_weapon_upgrade_trigger = [];
59 
60  // Perks-a-cola vending machine use triggers
61  vending_triggers = GetEntArray( "zombie_vending", "targetname" );
62 
63  //level flag::init( "solo_game" );
64 
65  if ( vending_triggers.size < 1 )
66  {
67  return;
68  }
69 
70  level.machine_assets = [];
71 
72  //Perks machine
73  if( !isDefined( level.custom_vending_precaching ) )
74  {
75  level.custom_vending_precaching = &‪default_vending_precaching;
76  }
77  [[ level.custom_vending_precaching ]]();
78 
79  ‪zombie_utility::set_zombie_var( "zombie_perk_cost", 2000 );
80 
81  array::thread_all( vending_triggers, &‪vending_trigger_think );
82  array::thread_all( vending_triggers, &‪electric_perks_dialog );
83 
84  if ( level._custom_perks.size > 0 )
85  {
86  a_keys = GetArrayKeys( level._custom_perks );
87 
88  for ( i = 0; i < a_keys.size; i++ )
89  {
90  if ( isdefined( level._custom_perks[ a_keys[ i ] ].perk_machine_thread ) )
91  {
92  level thread [[ level._custom_perks[ a_keys[ i ] ].perk_machine_thread ]]();
93  }
94  if( isdefined( level._custom_perks[ a_keys[ i ] ].perk_machine_power_override_thread ) )//Quick Revive uses this
95  {
96  level thread [[ level._custom_perks[ a_keys[ i ] ].perk_machine_power_override_thread ]]();
97  }
98  else if( isdefined( level._custom_perks[ a_keys[ i ] ].alias ) && isdefined( level._custom_perks[ a_keys[ i ] ].radiant_machine_name ) && isdefined( level._custom_perks[ a_keys[ i ] ].machine_light_effect ) )
99  {
100  level thread ‪perk_machine_think( a_keys[ i ], level._custom_perks[ a_keys[ i ] ] );
101  }
102  }
103  }
104 
105  if ( isdefined( level.quantum_bomb_register_result_func ) )
106  {
107  [[level.quantum_bomb_register_result_func]]( "give_nearest_perk", &‪quantum_bomb_give_nearest_perk_result, 10, &‪quantum_bomb_give_nearest_perk_validation );
108  }
109 
110  level thread ‪perk_hostmigration();
111 }
112 
113 function ‪perk_machine_think( str_key, s_custom_perk )
114 {
115  str_endon = str_key + ‪PERK_END_POWER_THREAD;
116  level endon( str_endon );//Support endon for any perk machine
117 
118  str_on = s_custom_perk.alias + "_on";
119  str_off = s_custom_perk.alias + "_off";
120  str_notify = str_key + "_power_on";
121 
122  while ( true )
123  {
124  machine = getentarray( s_custom_perk.radiant_machine_name, "targetname");
125  machine_triggers = GetEntArray( s_custom_perk.radiant_machine_name, "target" );
126 
127  for( i = 0; i < machine.size; i++ )
128  {
129  machine[i] SetModel(level.machine_assets[str_key].off_model);
130  machine[i] Solid();
131  }
132 
133  level thread ‪zm_perks::do_initial_power_off_callback( machine, str_key );
134  array::thread_all( machine_triggers, &‪zm_perks::set_power_on, false );
135 
136  level waittill( str_on );
137 
138  for( i = 0; i < machine.size; i++ )
139  {
140  machine[i] SetModel(level.machine_assets[str_key].on_model);
141  machine[i] vibrate((0,-100,0), 0.3, 0.4, 3);
142  machine[i] playsound("zmb_perks_power_on");
143  machine[i] thread ‪zm_perks::perk_fx( s_custom_perk.machine_light_effect );
144  machine[i] thread ‪zm_perks::play_loop_on_machine();
145  }
146  level notify( str_notify );
147 
148  array::thread_all( machine_triggers, &‪zm_perks::set_power_on, true );
149  if( isdefined( level.machine_assets[ str_key ].power_on_callback ) )
150  {
151  array::thread_all( machine, level.machine_assets[ str_key ].power_on_callback );
152  }
153 
154  level waittill( str_off );
155 
156  if( isdefined( level.machine_assets[ str_key ].power_off_callback ) )
157  {
158  array::thread_all( machine, level.machine_assets[ str_key ].power_off_callback );
159  }
160  array::thread_all( machine, &‪zm_perks::turn_perk_off );
161  }
162 }
163 
164 //
165 // Precaches all machines
166 //
167 // "weapon" - 1st person Bottle when drinking
168 // icon - Texture for when perk is active
169 // model - Perk Machine on/off versions
170 // fx - machine on
171 // sound
173 {
174  // precache all custom perks
175  if ( level._custom_perks.size > 0 )
176  {
177  a_keys = GetArrayKeys( level._custom_perks );
178  for ( i = 0; i < a_keys.size; i++ )
179  {
180  if ( isdefined( level._custom_perks[ a_keys[ i ] ].precache_func ) )
181  {
182  level [[ level._custom_perks[ a_keys[ i ] ].precache_func ]]();
183  }
184  }
185  }
186 }
187 
188 
189 
190 //############################################################################
191 // P E R K M A C H I N E S
192 //############################################################################
193 
194 //
195 // Threads to turn the machines to their ON state.
196 //
197 
198 function ‪do_initial_power_off_callback( machine_array, perkname )
199 {
200  if( !isdefined( level.machine_assets[ perkname ] ) )
201  {
202  return;
203  }
204  if( !isdefined( level.machine_assets[ perkname ].power_off_callback ) )
205  {
206  return;
207  }
208 
209  ‪WAIT_SERVER_FRAME; // wait to prevent setting the clientflag before it has been initialized
210 
211  array::thread_all( machine_array, level.machine_assets[ perkname ].power_off_callback );
212 }
213 
215 {
216  if( isdefined(level.override_use_solo_revive) )
217  {
218  return [[level.override_use_solo_revive]]();
219  }
220 
221  players = GetPlayers();
222  solo_mode = 0;
223  if ( players.size == 1 || ‪IS_TRUE( level.force_solo_quick_revive ) )
224  {
225  solo_mode = 1;
226  }
227  level.using_solo_revive = solo_mode;
228  return solo_mode;
229 }
230 
231 //
232 //
233 function ‪set_power_on( state )
234 {
235  self.power_on = state;
236 }
237 
238 //
239 //
240 function ‪turn_perk_off(ishidden)
241 {
242  self notify( "stop_loopsound" );
243 
244  if ( !‪IS_TRUE( self.b_keep_when_turned_off ) )
245  {
246  newMachine = ‪Spawn( "script_model", self.origin );
247  newMachine.angles = self.angles;
248  newMachine.targetname = self.targetname;
249  if(‪IS_TRUE(ishidden))
250  {
251  newMachine.ishidden = true;
252  newMachine Ghost();
253  newMachine NotSolid();
254  }
255 
256  self Delete();
257  }
258  else
259  {
260  // If b_keep_when_turned_off, turn off the fx on the machine but don't delete it.
261  ‪zm_perks::perk_fx( undefined, true );
262  }
263 }
264 
266 {
267  if( isdefined( level.sndPerksacolaLoopOverride ) )
268  return;
269 
270  sound_ent = ‪spawn( "script_origin", self.origin );
271  sound_ent playloopsound("zmb_perks_machine_loop");
272  sound_ent LinkTo( self );
273  self waittill( "stop_loopsound" );
274  sound_ent UnLink();
275  sound_ent delete();
276 }
277 
278 //
279 //
280 function ‪perk_fx( fx, turnOffFx )
281 {
282  if( isdefined( turnOffFx ) )
283  {
284  self.perk_fx = false;
285 
286  if ( ‪IS_TRUE( self.b_keep_when_turned_off ) && ( isdefined( self.s_fxloc )))
287  {
288  self.s_fxloc Delete();
289  }
290  }
291  else
292  {
293  wait(3);
294 
295  if ( !isdefined(self) )
296  return;
297 
298  if ( !‪IS_TRUE( self.b_keep_when_turned_off ))
299  {
300  if ( isdefined( self ) && !‪IS_TRUE(self.‪perk_fx) )
301  {
302  playfxontag( level._effect[ fx ], self, "tag_origin" );
303  self.perk_fx = true;
304  }
305  }
306  else
307  {
308  if ( isdefined( self ) && ( !isdefined( self.s_fxloc )))
309  {
310  self.s_fxloc = ‪util::spawn_model( "tag_origin", self.origin );
311  playfxontag( level._effect[ fx ], self.s_fxloc, "tag_origin" );
312  self.perk_fx = true;
313  }
314  }
315  }
316 }
317 
318 
319 
320 
322 {
323  self endon("death");
324 
325  // TODO: This hack allows the thread to start after the gametype init has had a chance to run
326  wait 0.01;
327 
328  //TODO TEMP Disable Revive in Solo games
329  level ‪flag::wait_till( "start_zombie_round_logic" );
330  players = GetPlayers();
331  if ( players.size == 1 )
332  {
333  return;
334  }
335 
336  self endon ("warning_dialog");
337  level endon("switch_flipped");
338  ‪timer =0;
339  while(1)
340  {
341  wait(0.5);
342  players = GetPlayers();
343  for(i = 0; i < players.size; i++)
344  {
345  if(!isDefined(players[i] ))
346  {
347  continue;
348  }
349 
350  dist = distancesquared(players[i].origin, self.origin );
351  if(dist > 70*70)
352  {
353  ‪timer = 0;
354  continue;
355  }
356  if(dist < 70*70 && ‪timer < 3)
357  {
358  wait(0.5);
359  ‪timer ++;
360  }
361  if(dist < 70*70 && ‪timer == 3)
362  {
363  if(!isDefined(players[i] ))
364  {
365  continue;
366  }
367 
368  players[i] thread ‪zm_utility::do_player_vo("vox_start", 5);
369  wait(3);
370  self notify ("warning_dialog");
371  }
372  }
373  }
374 }
375 
377 {
378  perk = self.script_noteworthy;
380 
381  if( isdefined( level._custom_perks ) )
382  {
383  if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].cost ) && isdefined( level._custom_perks[ perk ].hint_string ) )
384  {
385  //will convert function override to string / int value as needed.
386  if( IsFunctionPtr( level._custom_perks[ perk ].cost ) )
387  {
388  n_cost = [[level._custom_perks[ perk ].cost]]();
389  }
390  else
391  {
392  n_cost = level._custom_perks[ perk ].cost;
393  }
394 
395  self SetHintString( level._custom_perks[ perk ].hint_string, n_cost );
396  }
397  }
398 }
399 
401 {
402  if (player ‪laststand::player_is_in_laststand() || ‪IS_TRUE( player.intermission ) )
403  {
404  return false;
405  }
406 
408  {
409  return false;
410  }
411 
412  if( !player ‪zm_magicbox::can_buy_weapon() )
413  {
414  return false;
415  }
416 
417  if( player isThrowingGrenade() )
418  {
419  return false;
420  }
421 
422  if( player isSwitchingWeapons() )
423  {
424  return false;
425  }
426 
427  if( ‪IS_DRINKING(player.is_drinking) )
428  {
429  return false;
430  }
431 
432  return true;
433 }
434 
435 //
436 //
438 {
439  self endon( "death" );
440 
441  // TODO: This hack allows the thread to start after the gametype init has had a chance to run
442  wait 0.01;
443 
444  //self thread turn_cola_off();
445  perk = self.script_noteworthy;
446  solo = false;
447  start_on = false;
448  level.revive_machine_is_solo = false;
449 
450  //TODO TEMP Disable Revive in Solo games
451  if ( isdefined( perk ) && perk == ‪PERK_QUICK_REVIVE )
452  {
453  level ‪flag::wait_till( "start_zombie_round_logic" );
454  solo = ‪use_solo_revive();
455  self endon("stop_quickrevive_logic");
456  level.quick_revive_trigger = self;
457  if (solo)
458  {
459  if (!‪IS_TRUE(level.revive_machine_is_solo))
460  {
461  // Quick Revive turned off at start
462  if ( !‪IS_TRUE( level.initial_quick_revive_power_off ) )
463  {
464  start_on = true;
465  }
466  players = GetPlayers();
467  foreach ( player in players )
468  {
469  if(!isDefined(player.lives))
470  player.lives = 0;
471  }
473  }
474  level.revive_machine_is_solo = true;
475  }
476  }
477 
478  //if ( !solo )
479  {
480  self SetHintString( &"ZOMBIE_NEED_POWER" );
481  }
482 
483  self SetCursorHint( "HINT_NOICON" );
484  self UseTriggerRequireLookAt();
485 
486  cost = level.zombie_vars["zombie_perk_cost"];
487 
488  if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].cost ) )
489  {
490  if( IsInt( level._custom_perks[ perk ].cost ) )
491  {
492  cost = level._custom_perks[ perk ].cost;
493  }
494  else
495  {
496  cost = [[ level._custom_perks[ perk ].cost ]]();
497  }
498  }
499 
500  self.cost = cost;
501 
502  if ( !start_on )
503  {
504  notify_name = perk + "_power_on";
505  level waittill( notify_name );
506  }
507  start_on = false;
508 
509  if(!isdefined(level._perkmachinenetworkchoke))
510  {
511  level._perkmachinenetworkchoke = 0;
512  }
513  else
514  {
515  level._perkmachinenetworkchoke ++;
516  }
517 
518  for(i = 0; i < level._perkmachinenetworkchoke; i ++)
519  {
521  }
522 
523  //Turn on music timer
525 
526  self thread ‪check_player_has_perk(perk);
527 
528  if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].hint_string ) )
529  {
530  self SetHintString( level._custom_perks[ perk ].hint_string, cost );
531  }
532 
533  for( ;; )
534  {
535  self waittill( "trigger", player );
536 
537  index = ‪zm_utility::get_player_index(player);
538 
539  if ( !‪vending_trigger_can_player_use( player ) )
540  {
541  wait( 0.1 );
542  continue;
543  }
544 
545  if ( player HasPerk( perk ) || player ‪has_perk_paused( perk ) )
546  {
547  cheat = false;
548 
549  if ( cheat != true )
550  {
551  //player iprintln( "Already using Perk: " + perk );
552  self playsound("evt_perk_deny");
553  player ‪zm_audio::create_and_play_dialog( "general", "sigh" );
554 
555 
556  continue;
557  }
558  }
559 
560  if( isdefined( level.custom_perk_validation ) )
561  {
562  valid = self [[ level.custom_perk_validation ]]( player );
563 
564  if( !valid )
565  {
566  continue;
567  }
568  }
569 
570  current_cost = self.cost;
571  // If the persistent upgrade "double_points" is active, the cost is halved
573  {
574  current_cost = player ‪zm_pers_upgrades_functions::pers_upgrade_double_points_cost( current_cost );
575  }
576 
577  if( !player ‪zm_score::can_player_purchase( current_cost ) )
578  {
579  //player iprintln( "Not enough points to buy Perk: " + perk );
580  self playsound("evt_perk_deny");
581  player ‪zm_audio::create_and_play_dialog( "general", "outofmoney" );
582  continue;
583  }
584 
586  {
587  //player iprintln( "Too many perks already to buy Perk: " + perk );
588  self playsound("evt_perk_deny");
589  // COLLIN: do we have a VO that would work for this? if not we'll leave it at just the deny sound
590  player ‪zm_audio::create_and_play_dialog( "general", "sigh" );
591  continue;
592  }
593 
594  sound = "evt_bottle_dispense";
595  playsoundatposition(sound, self.origin);
596  player ‪zm_score::minus_to_player_score( current_cost );
597  perkHash = -1;
598  if (isDefined(level._custom_perks[ perk ]) && isDefined(level._custom_perks[ perk ].hash_id))
599  {
600  perkHash = level._custom_perks[ perk ].hash_id;
601  }
602  player RecordMapEvent(‪ZM_MAP_EVENT_PERK_MACHINE_USED, GetTime(), self.origin, level.round_number, perkHash);
603 
604  player.perk_purchased = perk;
605  player notify( "perk_purchased", perk );
606 
608 
609  self thread ‪vending_trigger_post_think( player, perk );
610  }
611 }
612 
613 function ‪vending_trigger_post_think( player, perk )
614 {
615  player endon( "disconnect" );
616  player endon( "end_game" );
617  player endon( "perk_abort_drinking" );
618 
619  // do the drink animation
620  gun = player ‪perk_give_bottle_begin( perk );
621  evt = player ‪util::waittill_any_return( "fake_death", "death", "player_downed", "weapon_change_complete", "perk_abort_drinking", "disconnect" );
622 
623  // once they start drinking they get the perk - if the machine is disabled in mid drink they will have it disabled
624  if (evt == "weapon_change_complete" )
625  {
626  player thread ‪wait_give_perk( perk, true );
627  }
628 
629  // restore player controls and movement
630  player ‪perk_give_bottle_end( gun, perk );
631 
632  // TODO: race condition?
633  if ( player ‪laststand::player_is_in_laststand() || ‪IS_TRUE( player.intermission ) )
634  {
635  return;
636  }
637 
638  player notify("burp");
639 
640  // Only in classic mode - Update the "cash_back" persistent unlock
641  if( ‪IS_TRUE(level.pers_upgrade_cash_back) )
642  {
644  }
645 
646  // Another persistent player ability
647  if( ‪IS_TRUE(level.pers_upgrade_perk_lose) )
648  {
650  }
651 
652  if ( isDefined( level.perk_bought_func ) )
653  {
654  player [[ level.perk_bought_func ]]( perk );
655  }
656 
657  player.perk_purchased = undefined;
658 
659  // Check If Perk Machine Was Powered Down While Drinking, Is So Pause The Perks
660  //-----------------------------------------------------------------------------
661  if ( !‪IS_TRUE( self.power_on ) )
662  {
663  wait 1;
664  ‪perk_pause( self.script_noteworthy );
665  }
666 
667  //player iprintln( "Bought Perk: " + perk );
668 }
669 
670 
671 //*****************************************************************************
672 //*****************************************************************************
673 
674 // unlocked_perk_upgrade( perk )
675 // {
676 // ch_ref = string(tablelookup( "mp/challengeTable_zmPerk.csv", 12, perk, 7 ));
677 // ch_max = int(tablelookup( "mp/challengeTable_zmPerk.csv", 12, perk, 4 ));
678 // ch_progress = self getdstat( "challengeStats", ch_ref, "challengeProgress" );
679 //
680 // if( ch_progress >= ch_max )
681 // {
682 // return true;
683 // }
684 // return false;
685 // }
686 
687 function ‪wait_give_perk( perk, bought )
688 {
689  self endon( "player_downed" );
690  self endon( "disconnect" );
691  self endon( "end_game" );
692  self endon( "perk_abort_drinking" );
693 
694  self ‪util::waittill_any_timeout(0.5, "burp", "player_downed", "disconnect", "end_game", "perk_abort_drinking" );
695  self ‪give_perk( perk, bought );
696 }
697 
699 {
700  if ( isdefined(self._retain_perks_array) )
701  {
702  keys = getarraykeys( self._retain_perks_array );
703  foreach( perk in keys )
704  {
705  if ( ‪IS_TRUE(self._retain_perks_array[perk]) )
706  self ‪give_perk( perk, false );
707  }
708 
709  }
710 }
711 
712 //*****************************************************************************
713 //*****************************************************************************
714 
716 {
717  self endon( "player_downed" );
718  self endon( "disconnect" );
719  self endon( "end_game" );
720  self endon( "perk_abort_drinking" );
721 
722  //AUDIO: Ayers - Sending Perk Name over to audio common script to play VOX
723  self ‪zm_audio::playerExert( "burp" );
724  if ( ‪IS_TRUE( level.remove_perk_vo_delay ) )
725  {
726  self ‪zm_audio::create_and_play_dialog( "perk", perk );
727  }
728  else
729  {
730  self ‪util::delay(1.5, undefined, &‪zm_audio::create_and_play_dialog, "perk", perk );
731  }
732  self setblur( 9, 0.1 );
733  wait(0.1);
734  self setblur(0, 0.1);
735  //earthquake (0.4, 0.2, self.origin, 100);
736 }
737 
738 function ‪give_perk( perk, bought )
739 {
740  self SetPerk( perk );
741  self.num_perks++;
742 
743  if( ‪IS_TRUE(bought) )
744  {
745  self thread ‪give_perk_presentation( perk );
746 
747  self notify( "perk_bought", perk );
748  self ‪zm_stats::increment_challenge_stat( "SURVIVALIST_BUY_PERK" );
749  }
750 
751  if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].player_thread_give ) )
752  {
753  self thread [[ level._custom_perks[ perk ].player_thread_give ]]();
754  }
755 
757 
758  ‪demo::bookmark( "zm_player_perk", gettime(), self );
759 
760  //stat tracking
761  self ‪zm_stats::increment_client_stat( "perks_drank" );
762  self ‪zm_stats::increment_client_stat( perk + "_drank" );
763  self ‪zm_stats::increment_player_stat( perk + "_drank" );
764  self ‪zm_stats::increment_player_stat( "perks_drank" );
765 
766  //Happy Hour achievement tracking
767  if(!isDefined(self.perk_history))
768  {
769  self.perk_history = [];
770  }
771  ‪array::add(self.perk_history,perk,false);
772 
773  if ( !isdefined( self.perks_active ) )
774  {
775  self.perks_active = [];
776  }
777 
778  ‪ARRAY_ADD( self.perks_active, perk );
779 
780  self notify("perk_acquired");
781 
782  self thread ‪perk_think( perk );
783 }
784 
785 
786 //*****************************************************************************
787 // Increment player max health if its the jugg perk
788 //*****************************************************************************
789 
790 // self = player
791 function ‪perk_set_max_health_if_jugg( str_perk, set_preMaxHealth, clamp_health_to_max_health )
792 {
793  n_max_total_health = undefined;
794 
795  // Is it the Jugg (or upgraded) Perk?
796  switch ( str_perk )
797  {
798  case ‪PERK_JUGGERNOG:
799  if( set_preMaxHealth )
800  {
801  self.preMaxHealth = self.maxhealth;
802  }
803  n_max_total_health = self.maxhealth + level.zombie_vars["zombie_perk_juggernaut_health"];
804  break;
805 
806  // Is if the Jugg persistent upgrade?
807  case "jugg_upgrade":
808  if( set_preMaxHealth )
809  {
810  self.preMaxHealth = self.maxhealth;
811  }
812  // If we have jugg
813  if( self HasPerk(‪PERK_JUGGERNOG) )
814  {
815  n_max_total_health += level.zombie_vars["zombie_perk_juggernaut_health"];
816  }
817  else
818  {
819  n_max_total_health = level.zombie_vars["player_base_health"];
820  }
821  break;
822 
823  case "health_reboot":
824  // This doesn't seem like the ideal place to do this, but many things call this function to set player health
825  // Give players more health in the early rounds
826  n_max_total_health = level.zombie_vars["player_base_health"];
827 
828  if( isdefined(self.n_player_health_boost) )
829  {
830  n_max_total_health += self.n_player_health_boost;
831  }
832 
833  if ( self HasPerk( ‪PERK_JUGGERNOG ) )
834  {
835  n_max_total_health += level.zombie_vars["zombie_perk_juggernaut_health"];
836  }
837  }
838 
839  // Was the health upgraded by Jugg?
840  if( isdefined(n_max_total_health) )
841  {
842  // If the PERSISTENT Jugg upgrade is active, add the extra health
844  {
845  n_max_total_health = n_max_total_health + level.pers_jugg_upgrade_health_bonus;
846  }
847 
848  self.maxhealth = n_max_total_health;
849  self SetMaxHealth( n_max_total_health );
850 
851  if( isdefined(clamp_health_to_max_health) && (clamp_health_to_max_health == true) )
852  {
853  if( self.health > self.maxhealth )
854  {
855  self.health = self.maxhealth;
856  }
857  }
858  }
859 }
860 
861 
862 //*****************************************************************************
863 //*****************************************************************************
864 
866 {
867  self endon( "death" );
868 
869  dist = 128 * 128;
870  while(true)
871  {
872  players = GetPlayers();
873  for( i = 0; i < players.size; i++ )
874  {
875  if(DistanceSquared( players[i].origin, self.origin ) < dist)
876  {
877  if(!players[i] HasPerk(perk) &&
878  self ‪vending_trigger_can_player_use( players[i] ) &&
879  !players[i] ‪has_perk_paused(perk) &&
880  !(players[i] ‪zm_utility::in_revive_trigger()) &&
881  !(‪zm_equipment::is_equipment_that_blocks_purchase( players[i] getcurrentweapon() ) ) &&
882  (!players[i] ‪zm_equipment::hacker_active()))
883  {
884  self setinvisibletoplayer(players[i], false);
885  }
886  else
887  {
888  self SetInvisibleToPlayer(players[i], true);
889  }
890  }
891  }
892  wait(0.1);
893 
894  }
895 }
896 
897 
899 {
900  switch( perk )
901  {
902  case "specialty_armorvest":
903  break;
904 
905  }
906 }
907 
908 function ‪perk_think( perk )
909 {
910  self endon("disconnect");
911 
912  perk_str = perk + "_stop";
913 
914  ‪result = self ‪util::waittill_any_return( "fake_death", "death", "player_downed", perk_str );
915 
916  // give the bgb system a chance to override losing the perk, or to do something triggered by the loss of the perk
917  while( self ‪bgb::lost_perk_override( perk ) )
918  {
919  ‪result = self ‪util::waittill_any_return( "fake_death", "death", "player_downed", perk_str );
920  }
921 
922  do_retain = true;
923 
924  if( ‪use_solo_revive() && perk == ‪PERK_QUICK_REVIVE)
925  {
926  do_retain = false;
927  }
928 
929  if( do_retain )
930  {
931  if ( isdefined(self._retain_perks) && self._retain_perks )
932  {
933  return;
934  }
935  else if ( isdefined( self._retain_perks_array ) && ‪IS_TRUE( self._retain_perks_array[ perk ] ) )
936  {
937  return;
938  }
939  }
940 
941  self UnsetPerk( perk );
942  self.num_perks--;
943 
944  // turn off perk when perk is paused, if custom func is set
945  if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].player_thread_take ) )
946  {
947  self thread [[ level._custom_perks[ perk ].player_thread_take ]]( false, perk_str, ‪result );
948  }
949 
951  //self perk_hud_destroy( perk );
952 
953  self.perk_purchased = undefined;
954  //self iprintln( "Perk Lost: " + perk );
955 
956  if ( isdefined( level.perk_lost_func ) )
957  {
958  self [[ level.perk_lost_func ]]( perk );
959  }
960 
961  if ( isdefined( self.perks_active ) && IsInArray( self.perks_active, perk ) )
962  {
963  ArrayRemoveValue( self.perks_active, perk, false );
964  }
965 
966  self notify( "perk_lost" );
967 }
968 
969 function ‪set_perk_clientfield( perk, state )
970 {
971  if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].clientfield_set ) )
972  {
973  self [[ level._custom_perks[ perk ].clientfield_set ]]( state );
974  }
975 }
976 
977 
978 function ‪perk_hud_destroy( perk )
979 {
980  self.perk_hud[ perk ] ‪zm_utility::destroy_hud();
981  self.perk_hud[ perk ] = undefined;
982 }
983 
984 function ‪perk_hud_grey( perk, grey_on_off )
985 {
986  if ( grey_on_off )
987  self.perk_hud[ perk ].alpha = 0.3;
988  else
989  self.perk_hud[ perk ].alpha = 1.0;
990 }
991 
993 {
995 
997 
998  original_weapon = self GetCurrentWeapon();
999 
1000  weapon = "";
1001 
1002  if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].perk_bottle_weapon ) )
1003  {
1004  weapon = level._custom_perks[ perk ].perk_bottle_weapon;
1005  }
1006 
1007  self GiveWeapon( weapon );
1008  self SwitchToWeapon( weapon );
1009 
1010  return original_weapon;
1011 }
1012 
1013 // self == player
1014 function ‪perk_give_bottle_end( original_weapon, perk )
1015 {
1016  self endon( "perk_abort_drinking" );
1017 
1018  Assert( !original_weapon.isPerkBottle );
1019  Assert( original_weapon != level.weaponReviveTool );
1020 
1022 
1023  weapon = "";
1024 
1025  if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].perk_bottle_weapon ) )
1026  {
1027  weapon = level._custom_perks[ perk ].perk_bottle_weapon;
1028  }
1029 
1030  // TODO: race condition?
1032  {
1033  self TakeWeapon(weapon);
1034  return;
1035  }
1036 
1037  self TakeWeapon(weapon);
1038 
1040  {
1042  return;
1043  }
1044  else if( original_weapon != level.weaponNone && !‪zm_utility::is_placeable_mine( original_weapon ) && !‪zm_equipment::is_equipment_that_blocks_purchase( original_weapon ) )
1045  {
1046  self ‪zm_weapons::switch_back_primary_weapon( original_weapon );
1047 
1048  // ww: the knives have no first raise anim so they will never get a "weapon_change_complete" notify
1049  // meaning it will never leave this funciton and will break buying weapons for the player
1050  if( ‪zm_utility::is_melee_weapon( original_weapon ) )
1051  {
1053  return;
1054  }
1055  }
1056  else
1057  {
1059  }
1060 
1061  self waittill( "weapon_change_complete" );
1062 
1064  {
1066  }
1067 }
1068 
1069 //*****************************************************************************
1070 // Abort and cleanup the perk drinking process
1071 //*****************************************************************************
1072 
1073 // self = player
1074 function ‪perk_abort_drinking( post_delay )
1075 {
1076  if( self.is_drinking )
1077  {
1078  self notify( "perk_abort_drinking" );
1081 
1082  if( isdefined(post_delay) )
1083  {
1084  wait( post_delay );
1085  }
1086  }
1087 }
1088 
1089 
1090 //*****************************************************************************
1091 //*****************************************************************************
1092 
1094 {
1095  random_perk = undefined;
1096 
1097  a_str_perks = GetArrayKeys( level._custom_perks );
1098 
1099  perks = [];
1100  for ( i = 0; i < a_str_perks.size; i++ )
1101  {
1102  perk = a_str_perks[i];
1103 
1104  if ( isdefined( self.perk_purchased ) && self.perk_purchased == perk )
1105  {
1106  continue;
1107  }
1108 
1109  if ( !self HasPerk( perk ) && !self ‪has_perk_paused( perk ) )
1110  {
1111  perks[ perks.size ] = perk;
1112  }
1113  }
1114 
1115  if ( perks.size > 0 )
1116  {
1117  perks = array::randomize( perks );
1118  random_perk = perks[0];
1119  self ‪give_perk( random_perk );
1120  }
1121  else
1122  {
1123  // No Perks Left To Get
1124  self PlaySoundToPlayer( level.zmb_laugh_alias, self );
1125  }
1126 
1127  return( random_perk );
1128 }
1129 
1130 
1132 {
1133  a_str_perks = GetArrayKeys( level._custom_perks );
1134 
1135  perks = [];
1136  for ( i = 0; i < a_str_perks.size; i++ )
1137  {
1138  perk = a_str_perks[i];
1139 
1140  if ( isdefined( self.perk_purchased ) && self.perk_purchased == perk )
1141  {
1142  continue;
1143  }
1144 
1145  if ( self HasPerk( perk ) || self ‪has_perk_paused( perk ) )
1146  {
1147  perks[ perks.size ] = perk;
1148  }
1149  }
1150 
1151  if ( perks.size > 0 )
1152  {
1153  perks = array::randomize( perks );
1154  perk = perks[0];
1155 
1156  perk_str = perk + "_stop";
1157  self notify( perk_str );
1158 
1159  if ( ‪use_solo_revive() && perk == ‪PERK_QUICK_REVIVE )
1160  {
1161  self.lives--;
1162  }
1163  }
1164 }
1165 
1167 {
1168  if ( isdefined( self.perk_hud ) )
1169  {
1170  keys = getarraykeys( self.perk_hud );
1171  for ( i = 0; i < self.perk_hud.size; i++ )
1172  {
1173  self.perk_hud[ keys[i] ].x = i * 30;
1174  }
1175  }
1176 }
1177 
1179 {
1180  vending_triggers = GetEntArray( "zombie_vending", "targetname" );
1181 
1182  range_squared = 180 * 180; // 15 feet
1183  for ( i = 0; i < vending_triggers.size; i++ )
1184  {
1185  if ( DistanceSquared( vending_triggers[i].origin, position ) < range_squared )
1186  {
1187  return true;
1188  }
1189  }
1190 
1191  return false;
1192 }
1193 
1194 
1196 {
1197  [[level.quantum_bomb_play_mystery_effect_func]]( position );
1198 
1199  vending_triggers = GetEntArray( "zombie_vending", "targetname" );
1200 
1201  nearest = 0;
1202  for ( i = 1; i < vending_triggers.size; i++ )
1203  {
1204  if ( DistanceSquared( vending_triggers[i].origin, position ) < DistanceSquared( vending_triggers[nearest].origin, position ) )
1205  {
1206  nearest = i;
1207  }
1208  }
1209 
1210  players = GetPlayers();
1211  perk = vending_triggers[nearest].script_noteworthy;
1212  for ( i = 0; i < players.size; i++ )
1213  {
1214  player = players[i];
1215 
1216  if ( player.sessionstate == "spectator" || player ‪laststand::player_is_in_laststand() )
1217  {
1218  continue;
1219  }
1220 
1221  if ( !player HasPerk( perk ) && ( !isdefined( player.perk_purchased ) || player.perk_purchased != perk) && RandomInt( 5 ) ) // 80% chance
1222  {
1223  if( player == self )
1224  {
1225  self thread ‪zm_audio::create_and_play_dialog( "kill", "quant_good" );
1226  }
1227 
1228  player ‪give_perk( perk );
1229  player [[level.quantum_bomb_play_player_effect_func]]();
1230  }
1231  }
1232 }
1233 
1234 function ‪perk_pause( perk )
1235 {
1236  if( ‪IS_TRUE( level.dont_unset_perk_when_machine_paused ) )
1237  {
1238  return;
1239  }
1240 
1241  for ( j = 0; j < GetPlayers().size; j++ )
1242  {
1243  player = GetPlayers()[j];
1244  if (!isdefined(player.disabled_perks))
1245  player.disabled_perks=[];
1246  player.disabled_perks[perk] = ‪IS_TRUE(player.disabled_perks[perk]) || player HasPerk( perk );
1247  if ( player.disabled_perks[perk] )
1248  {
1249  player UnsetPerk( perk );
1251 
1252  // turn off perk when perk is paused, if custom func is set
1253  if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].player_thread_take ) )
1254  {
1255  player thread [[ level._custom_perks[ perk ].player_thread_take ]]( true );
1256  }
1257 
1258  //player perk_hud_grey( perk, true );
1259  }
1260  }
1261 }
1262 
1263 function ‪perk_unpause( perk )
1264 {
1265  if( ‪IS_TRUE( level.dont_unset_perk_when_machine_paused ) )
1266  {
1267  return;
1268  }
1269 
1270  if(!isDefined(perk))
1271  {
1272  return;
1273  }
1274 
1275  for ( j = 0; j < GetPlayers().size; j++ )
1276  {
1277  player = GetPlayers()[j];
1278  if ( isdefined(player.disabled_perks) && ‪IS_TRUE(player.disabled_perks[perk]) )
1279  {
1280  player.disabled_perks[perk]=false;
1282  // player perk_hud_grey( perk, false );
1283  player SetPerk( perk );
1284 
1285  player ‪perk_set_max_health_if_jugg( perk, false, false );
1286 
1287  if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].player_thread_give ) )
1288  {
1289  player thread [[ level._custom_perks[ perk ].player_thread_give ]]();
1290  }
1291  }
1292  }
1293 }
1294 
1295 function ‪perk_pause_all_perks( power_zone )
1296 {
1297  vending_triggers = GetEntArray( "zombie_vending", "targetname" );
1298  foreach ( trigger in vending_triggers )
1299  {
1300  //if power switch does not have an assigned zone will turn off all perk machines.
1301  if(!isdefined(power_zone))
1302  {
1303  ‪zm_perks::perk_pause(trigger.script_noteworthy);
1304  }
1305  //if power switch has a power zone associated with it will only turn off perk machines in its zone.
1306  else if(isdefined(trigger.script_int) && trigger.script_int == power_zone)
1307  {
1308  ‪zm_perks::perk_pause(trigger.script_noteworthy);
1309  }
1310  }
1311 }
1312 
1313 
1314 function ‪perk_unpause_all_perks( power_zone )
1315 {
1316  vending_triggers = GetEntArray( "zombie_vending", "targetname" );
1317  foreach ( trigger in vending_triggers )
1318  {
1319  //if power switch does not have an assigned zone will turn on all perk machines.
1320  if(!isdefined(power_zone))
1321  {
1322  ‪zm_perks::perk_unpause(trigger.script_noteworthy);
1323  }
1324  //if power switch has a power zone associated with it will only turn on perk machines in its zone.
1325  else if(isdefined(trigger.script_int) && trigger.script_int == power_zone)
1326  {
1327  ‪zm_perks::perk_unpause(trigger.script_noteworthy);
1328  }
1329  }
1330 }
1331 
1332 function ‪has_perk_paused( perk ) // self = player
1333 {
1334  if ( isdefined(self.disabled_perks) && isdefined(self.disabled_perks[perk]) && self.disabled_perks[perk] )
1335  {
1336  return true;
1337  }
1338  return false;
1339 }
1340 
1341 
1343 {
1344  if(!isDefined(self))
1345  {
1346  return "";
1347  }
1348 
1349  str_perk = undefined;
1350 
1351  if ( isdefined( level._custom_perks[ self.script_noteworthy ] ) && isdefined( isdefined( level._custom_perks[ self.script_noteworthy ].alias ) ) )
1352  {
1353  str_perk = level._custom_perks[ self.script_noteworthy ].alias;
1354  }
1355 
1356  return str_perk;
1357 }
1358 
1359 //=====================================================================
1360 // Simple utility to remove a perk machine and replace it with a model.
1361 //=====================================================================
1362 function ‪perk_machine_removal(machine, replacement_model)
1363 {
1364  if(!isdefined(machine))
1365  {
1366  return;
1367  }
1368 
1369  trig = GetEnt(machine, "script_noteworthy");
1370  machine_model = undefined;
1371 
1372  if(isdefined(trig))
1373  {
1374  // remove from vending array.
1375  trig notify ("warning_dialog");
1376 
1377  if(isdefined(trig.target))
1378  {
1379  parts = GetEntArray(trig.target, "targetname");
1380  for ( i = 0; i < parts.size; i++ )
1381  {
1382  if(isdefined(parts[i].classname) && parts[i].classname == "script_model")
1383  {
1384  machine_model = parts[i];
1385  }
1386  else if(isdefined(parts[i].script_noteworthy && parts[i].script_noteworthy == "clip"))
1387  {
1388  model_clip = parts[i];
1389  }
1390  else
1391  {
1392  parts[i] Delete();
1393  }
1394  }
1395  }
1396 
1397  // If a replacement model is not specified it will just delete the perk machine.
1398  if(isdefined(replacement_model) && isdefined(machine_model))
1399  {
1400  machine_model SetModel(replacement_model);
1401  }
1402  else if(!isdefined(replacement_model) && isdefined(machine_model))
1403  {
1404  machine_model Delete();
1405  if(isdefined(model_clip))
1406  model_clip Delete();
1407  if(isdefined(trig.clip)) //from spawned perk clip.
1408  trig.clip Delete();
1409  }
1410 
1411  if(isdefined(trig.bump))
1412  trig.bump Delete();
1413 
1414  trig Delete();
1415  }
1416 }
1417 //=====================================================================
1418 // Simple utility to Add a perk machine.
1419 // model and script_noteworthy need to be set on struct.
1420 //=====================================================================
1422 {
1423  match_string = "";
1424 
1425  location = level.scr_zm_map_start_location;
1426  if ((location == "default" || location == "" ) && isdefined(level.default_start_location))
1427  {
1428  location = level.default_start_location;
1429  }
1430 
1431  match_string = level.scr_zm_ui_gametype + "_perks_" + location;
1432 
1433  a_s_spawn_pos = [];
1434  if( isdefined( level.override_perk_targetname ) )
1435  structs = ‪struct::get_array( level.override_perk_targetname, "targetname");
1436  else
1437  structs = ‪struct::get_array("zm_perk_machine", "targetname");
1438 
1439  foreach(struct in structs)
1440  {
1441  if(isdefined(struct.script_string) )
1442  {
1443  tokens = strtok(struct.script_string," ");
1444  foreach(token in tokens)
1445  {
1446  if(token == match_string )
1447  {
1448  a_s_spawn_pos[a_s_spawn_pos.size] = struct;
1449  }
1450  }
1451  }
1452  else
1453  {
1454  a_s_spawn_pos[a_s_spawn_pos.size] = struct;
1455  }
1456  }
1457 
1458  if( a_s_spawn_pos.size == 0 )
1459  {
1460  return;
1461  }
1462 
1463 
1464  //randomize perk machine setup
1465  if( ‪IS_TRUE( level.randomize_perk_machine_location ) )
1466  {
1467  a_s_random_perk_locs = ‪struct::get_array( "perk_random_machine_location", "targetname" );
1468 
1469  if( a_s_random_perk_locs.size > 0 )
1470  {
1471  a_s_random_perk_locs = array::randomize( a_s_random_perk_locs );
1472  }
1473 
1474  n_random_perks_assigned = 0;
1475  }
1476 
1477  // Now spawn perk machines
1478  foreach( s_spawn_pos in a_s_spawn_pos )
1479  {
1480  perk = s_spawn_pos.script_noteworthy;
1481  if(isdefined(perk) && isdefined(s_spawn_pos.model))
1482  {
1483  // Setting a script_notify on the perk machine struct indicates this machine will be assigned a random location
1484  // if script_notify doesn't exist on the perk machine, it's not randomized.
1485  // Make sure the number of perk_random_machine_locations matches the number you want to randomize
1486  if( ‪IS_TRUE( level.randomize_perk_machine_location ) && a_s_random_perk_locs.size > 0 && isdefined( s_spawn_pos.script_notify ) )
1487  {
1488  s_new_loc = a_s_random_perk_locs[n_random_perks_assigned];
1489 
1490  s_spawn_pos.origin = s_new_loc.origin;
1491  s_spawn_pos.angles = s_new_loc.angles;
1492 
1493  // Make sure it uses power at the current location
1494  if ( isdefined( s_new_loc.script_int ) )
1495  {
1496  s_spawn_pos.script_int = s_new_loc.script_int;
1497  }
1498 
1499  //setup up perk machine tells (broken bottle) if is available
1500  if( isdefined( s_new_loc.target ) )
1501  {
1502  s_tell_location = ‪struct::get( s_new_loc.target );
1503 
1504  if( isdefined( s_tell_location ) )
1505  {
1506  ‪util::spawn_model( "p7_zm_perk_bottle_broken_" + perk , s_tell_location.origin, s_tell_location.angles );
1507  }
1508  }
1509 
1510  n_random_perks_assigned++;
1511  }
1512 
1513  t_use = ‪Spawn( "trigger_radius_use", s_spawn_pos.origin + (0, 0, 60), 0, 40, 80 );
1514  t_use.targetname = "zombie_vending";
1515  t_use.script_noteworthy = perk;
1516 
1517  //DCS: setup power_zone if required
1518  if(isdefined(s_spawn_pos.script_int))
1519  {
1520  t_use.script_int = s_spawn_pos.script_int;
1521  }
1522 
1523  t_use TriggerIgnoreTeam();
1524  //t_use thread debug_spot();
1525 
1526  perk_machine = ‪Spawn("script_model", s_spawn_pos.origin);
1527  if( !isdefined(s_spawn_pos.angles) )
1528  s_spawn_pos.angles = (0,0,0);
1529  perk_machine.angles = s_spawn_pos.angles;
1530  perk_machine SetModel(s_spawn_pos.model);
1531 
1532  if(‪IS_TRUE(level._no_vending_machine_bump_trigs))
1533  {
1534  bump_trigger = undefined; // make the var even though we might not use it
1535  }
1536  else
1537  {
1538  bump_trigger = ‪Spawn( "trigger_radius", s_spawn_pos.origin + (0, 0, 20), 0, 40, 80);
1539  bump_trigger.script_activated = 1;
1540  bump_trigger.script_sound = "zmb_perks_bump_bottle";
1541  bump_trigger.targetname = "audio_bump_trigger";
1542  }
1543 
1544 
1545  if(‪IS_TRUE(level._no_vending_machine_auto_collision))
1546  {
1547  collision = undefined; // make the var even though we might not use it
1548  }
1549  else
1550  {
1551  collision = ‪Spawn("script_model", s_spawn_pos.origin, 1);
1552  collision.angles = s_spawn_pos.angles;
1553  collision SetModel("zm_collision_perks1");
1554  collision.script_noteworthy = "clip";
1555  collision DisconnectPaths();
1556  }
1557 
1558  // Connect all of the pieces for easy access.
1559  t_use.clip = collision;
1560  t_use.machine = perk_machine;
1561  t_use.bump = bump_trigger;
1562 
1563  if ( isdefined( s_spawn_pos.script_notify ) )
1564  {
1565  perk_machine.script_notify = s_spawn_pos.script_notify;
1566  }
1567 
1568  // targets attack positions for machines
1569  if ( isdefined( s_spawn_pos.target ) )
1570  {
1571  perk_machine.target = s_spawn_pos.target;
1572  }
1573 
1574  if( isdefined( s_spawn_pos.blocker_model ) )
1575  {
1576  t_use.blocker_model = s_spawn_pos.blocker_model;
1577  }
1578 
1579  if( isdefined( s_spawn_pos.script_int ) )
1580  {
1581  perk_machine.script_int = s_spawn_pos.script_int;
1582  }
1583 
1584  if( isdefined( s_spawn_pos.turn_on_notify ) )
1585  {
1586  perk_machine.turn_on_notify = s_spawn_pos.turn_on_notify;
1587  }
1588 
1589  t_use.script_sound = "mus_perks_speed_jingle";
1590  t_use.script_string = "speedcola_perk";
1591  t_use.script_label = "mus_perks_speed_sting";
1592  t_use.target = "vending_sleight";
1593  perk_machine.script_string = "speedcola_perk";
1594  perk_machine.targetname = "vending_sleight";
1595  if(isdefined(bump_trigger))
1596  bump_trigger.script_string = "speedcola_perk";
1597 
1598  // handle custom perk fields here
1599  if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].perk_machine_set_kvps ) )
1600  {
1601  [[ level._custom_perks[ perk ].perk_machine_set_kvps ]]( t_use, perk_machine, bump_trigger, collision );
1602  }
1603  }
1604  }
1605 }
1606 
1608 {
1609  if ( ‪IS_TRUE( level.vending_machines_powered_on_at_start ) )
1610  {
1611  return true;
1612  }
1613 
1614  if ( perk == ‪PERK_QUICK_REVIVE )
1615  {
1616  assert(isdefined(level.revive_machine_is_solo));
1617  return level.revive_machine_is_solo;
1618  }
1619 
1620  return false;
1621 }
1622 
1623 
1625 {
1626  if( ‪IS_TRUE( level.zombiemode_using_perk_intro_fx) )
1627  {
1628  ‪clientfield::register( "scriptmover", "clientfield_perk_intro_fx" , ‪VERSION_SHIP , 1 ,"int");
1629  }
1630 
1631  // run any custom perk clientfield registration funcs here
1632  if ( isdefined( level._custom_perks ) )
1633  {
1634  a_keys = GetArrayKeys( level._custom_perks );
1635 
1636  for ( i = 0; i < a_keys.size; i++ )
1637  {
1638  if ( isdefined( level._custom_perks[ a_keys[ i ] ].clientfield_register ) )
1639  {
1640  level [[ level._custom_perks[ a_keys[ i ] ].clientfield_register ]]();
1641  }
1642  }
1643  }
1644 }
1645 
1647 {
1648  for(;;)
1649  {
1650  self waittill( "trigger", trigPlayer );
1651  trigPlayer playsound( self.script_sound );
1652 
1653  while( ‪zm_utility::is_player_valid(trigPlayer) && trigplayer istouching( self ) )
1654  {
1655  wait(.5);
1656  }
1657  }
1658 }
1659 
1660 function ‪players_are_in_perk_area(perk_machine)
1661 {
1662  perk_area_origin = level.quick_revive_default_origin;
1663 
1664  if(isdefined(perk_machine._linked_ent))
1665  {
1666  perk_area_origin = perk_machine._linked_ent.origin;
1667 
1668  if(isdefined(perk_machine._linked_ent_offset))
1669  {
1670  perk_area_origin += perk_machine._linked_ent_offset;
1671  }
1672  }
1673 
1674  in_area = false;
1675  players = GetPlayers();
1676  dist_check = 96*96;
1677 
1678  foreach( player in players )
1679  {
1680  if( DistanceSquared(player.origin,perk_area_origin) < dist_check )
1681  {
1682  return true;
1683  }
1684  }
1685 
1686  return false;
1687 
1688 }
1689 
1691 {
1692  level endon("end_game");
1693 
1694  level notify("perk_hostmigration");
1695  level endon("perk_hostmigration");
1696 
1697  while(1)
1698  {
1699  level waittill("host_migration_end");
1700 
1701  if ( isdefined( level._custom_perks ) && level._custom_perks.size > 0 )
1702  {
1703  a_keys = GetArrayKeys( level._custom_perks );
1704 
1705  foreach( key in a_keys )
1706  {
1707  if( isdefined( level._custom_perks[key].radiant_machine_name ) && isdefined( level._custom_perks[key].machine_light_effect ) )
1708  {
1709  level thread ‪host_migration_func( level._custom_perks[key], key );
1710  }
1711  }
1712  }
1713  }
1714 }
1715 
1716 // when host migration occurs, fx don't carry over. If perk machine is on, turn the light back on.
1717 function ‪host_migration_func( s_custom_perk, keyName )
1718 {
1719  a_machines = GetEntArray( s_custom_perk.radiant_machine_name, "targetname" );
1720 
1721  foreach( perk in a_machines)
1722  {
1723  if(isDefined(perk.model) && perk.model == level.machine_assets[keyName].on_model )
1724  {
1725  perk ‪zm_perks::perk_fx( undefined, true );
1726  perk thread ‪zm_perks::perk_fx( s_custom_perk.machine_light_effect );
1727  }
1728  }
1729 }
1730 
1731 function ‪spare_change( str_trigger = "audio_bump_trigger", str_sound = "zmb_perks_bump_bottle" )
1732 {
1733  // Check under the machines for change
1734  a_t_audio = GetEntArray( str_trigger, "targetname" );
1735  foreach( t_audio_bump in a_t_audio )
1736  {
1737  if ( t_audio_bump.script_sound === str_sound )
1738  {
1739  t_audio_bump thread ‪check_for_change();
1740  }
1741  }
1742 }
1743 
1744 function ‪check_for_change()//self = trigger
1745 {
1746  self endon( "death" );
1747 
1748  while( true )
1749  {
1750  self waittill( "trigger", player );
1751 
1752  if ( player GetStance() == "prone" )
1753  {
1754  player ‪zm_score::add_to_player_score( 100 );
1755  ‪zm_utility::play_sound_at_pos( "purchase", player.origin );
1756  break;
1757  }
1758 
1759  wait 0.1;
1760  }
1761 }
1762 
1763 //*****************************************************************************
1764 // Returns an array of all the perks the player has
1765 //*****************************************************************************
1766 
1767 // self = player
1769 {
1770  perk_array = [];
1771 
1772  // handle custom perks
1773  if ( level._custom_perks.size > 0 )
1774  {
1775  a_keys = GetArrayKeys( level._custom_perks );
1776 
1777  for ( i = 0; i < a_keys.size; i++ )
1778  {
1779  if ( self HasPerk( a_keys[ i ] ) )
1780  {
1781  perk_array[ perk_array.size ] = a_keys[ i ];
1782  }
1783  }
1784  }
1785 
1786  return( perk_array );
1787 }
1788 
1790 {
1791  if ( !isdefined( level._custom_perks ) )
1792  {
1793  level._custom_perks = [];
1794  }
1795 }
1796 
1798 {
1799  if( !isdefined( level.a_revive_success_perk_func ) )
1800  {
1801  level.a_revive_success_perk_func = [];
1802  }
1803 
1804  level.a_revive_success_perk_func[ level.a_revive_success_perk_func.size ] = revive_func;
1805 }
1806 
1820 function ‪register_perk_basic_info( str_perk, str_alias, n_perk_cost, str_hint_string, w_perk_bottle_weapon )
1821 {
1822  Assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_basic_info!" );
1823  Assert( isdefined( str_alias ), "str_alias is a required argument for register_perk_basic_info!" );
1824  Assert( isdefined( n_perk_cost ), "n_perk_cost is a required argument for register_perk_basic_info!" );
1825  Assert( isdefined( str_hint_string ), "str_hint_string is a required argument for register_perk_basic_info!" );
1826  Assert( isdefined( w_perk_bottle_weapon ), "w_perk_bottle_weapon is a required argument for register_perk_basic_info!" );
1827 
1828  ‪_register_undefined_perk( str_perk );
1829 
1830  level._custom_perks[ str_perk ].alias = str_alias;
1831  level._custom_perks[ str_perk ].hash_id = HashString(str_alias);
1832  level._custom_perks[ str_perk ].cost = n_perk_cost;
1833  level._custom_perks[ str_perk ].hint_string = str_hint_string;
1834  level._custom_perks[ str_perk ].perk_bottle_weapon = w_perk_bottle_weapon;
1835 
1836 }
1837 
1849 function ‪register_perk_machine( str_perk, func_perk_machine_setup, func_perk_machine_thread )
1850 {
1851  Assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_machine!" );
1852  Assert( isdefined( func_perk_machine_setup ), "func_perk_machine_setup is a required argument for register_perk_machine!" );
1853 
1854  ‪_register_undefined_perk( str_perk );
1855 
1856  if ( !isdefined( level._custom_perks[ str_perk ].perk_machine_set_kvps ) )
1857  {
1858  level._custom_perks[ str_perk ].perk_machine_set_kvps = func_perk_machine_setup;
1859  }
1860 
1861  if ( !isdefined( level._custom_perks[ str_perk ].perk_machine_thread ) && isdefined( func_perk_machine_thread ) )
1862  {
1863  level._custom_perks[ str_perk ].perk_machine_thread = func_perk_machine_thread;
1864  }
1865 }
1866 
1877 function ‪register_perk_machine_power_override( str_perk, func_perk_machine_power_override )
1878 {
1879  Assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_machine_power_override!" );
1880  Assert( isdefined( func_perk_machine_power_override ), "func_perk_machine_power_override is a required argument for register_perk_machine_power_override!" );
1881 
1882  ‪_register_undefined_perk( str_perk );
1883 
1884  if ( !isdefined( level._custom_perks[ str_perk ].perk_machine_power_override_thread ) && isdefined( func_perk_machine_power_override ) )
1885  {
1886  level._custom_perks[ str_perk ].perk_machine_power_override_thread = func_perk_machine_power_override;
1887  }
1888 }
1889 
1900 function ‪register_perk_precache_func( str_perk, func_precache )
1901 {
1902  Assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_precache_func!" );
1903  Assert( isdefined( func_precache ), "func_precache is a required argument for register_perk_precache_func!" );
1904 
1905  ‪_register_undefined_perk( str_perk );
1906 
1907  if ( !isdefined( level._custom_perks[ str_perk ].precache_func ) )
1908  {
1909  level._custom_perks[ str_perk ].precache_func = func_precache;
1910  }
1911 }
1912 
1924 function ‪register_perk_threads( str_perk, func_give_player_perk, func_take_player_perk )
1925 {
1926  Assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_threads!" );
1927  Assert( isdefined( func_give_player_perk ), "func_give_player_perk is a required argument for register_perk_threads!" );
1928 
1929  ‪_register_undefined_perk( str_perk );
1930 
1931  if( !isdefined( level._custom_perks[ str_perk ].player_thread_give ) )
1932  {
1933  level._custom_perks[ str_perk ].player_thread_give = func_give_player_perk;
1934  }
1935 
1936  if ( isdefined( func_take_player_perk ) )
1937  {
1938  if ( !isdefined( level._custom_perks[ str_perk ].player_thread_take ) )
1939  {
1940  level._custom_perks[ str_perk ].player_thread_take = func_take_player_perk;
1941  }
1942  }
1943 }
1944 
1945 
1957 function ‪register_perk_clientfields( str_perk, func_clientfield_register, func_clientfield_set )
1958 {
1959  Assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_clientfields!" );
1960  Assert( isdefined( func_clientfield_register ), "func_clientfield_register is a required argument for register_perk_clientfields!" );
1961  Assert( isdefined( func_clientfield_set ), "func_clientfield_set is a required argument for register_perk_clientfields!" );
1962 
1963  ‪_register_undefined_perk( str_perk );
1964 
1965  if ( !isdefined( level._custom_perks[ str_perk ].clientfield_register ) )
1966  {
1967  level._custom_perks[ str_perk ].clientfield_register = func_clientfield_register;
1968  }
1969 
1970  if ( !isdefined( level._custom_perks[ str_perk ].clientfield_set ) )
1971  {
1972  level._custom_perks[ str_perk ].clientfield_set = func_clientfield_set;
1973  }
1974 }
1975 
1986 function ‪register_perk_host_migration_params( str_perk, str_radiant_name, str_effect_name )
1987 {
1988  Assert( isdefined( str_perk ), "str_perk is a required argument for register_perk_host_migration_params!" );
1989  Assert( isdefined( str_radiant_name ), "str_radiant_name is a required argument for register_perk_host_migration_params!" );
1990  Assert( isdefined( str_effect_name ), "str_effect_name is a required argument for register_perk_host_migration_params!" );
1991 
1992  ‪_register_undefined_perk( str_perk );
1993 
1994  if ( !isdefined( level._custom_perks[ str_perk ].radiant_name ) )
1995  {
1996  level._custom_perks[ str_perk ].radiant_machine_name = str_radiant_name;
1997  }
1998 
1999  if ( !isdefined( level._custom_perks[ str_perk ].light_effect ) )
2000  {
2001  level._custom_perks[ str_perk ].machine_light_effect = str_effect_name;
2002  }
2003 }
2004 
2005 // make sure perk exists before we actually try to set fields on it. Does nothing if it exists already
2006 function ‪_register_undefined_perk( str_perk )
2007 {
2008  if ( !isdefined( level._custom_perks ) )
2009  {
2010  level._custom_perks = [];
2011  }
2012 
2013  if ( !isdefined( level._custom_perks[ str_perk ] ) )
2014  {
2015  level._custom_perks[ str_perk ] = SpawnStruct();
2016  }
2017 }
2018 
2028 function ‪register_perk_damage_override_func( func_damage_override )
2029 {
2030  Assert( isdefined( func_damage_override ), "func_damage_override is a required argument for register_perk_damage_override_func!" );
2031 
2032  if ( !isdefined( level.perk_damage_override ) )
2033  {
2034  level.perk_damage_override = [];
2035  }
2036 
2037  ‪array::add( level.perk_damage_override, func_damage_override, false );
2038 }
2039 
2040 // PI_CHANGE_END
2041 
‪get_perk_array
‪function get_perk_array()
Definition: _zm_perks.gsc:1768
‪PERK_JUGGERNOG
‪#define PERK_JUGGERNOG
Definition: mechz.gsc:47
‪destroy_hud
‪function destroy_hud()
Definition: _zm_utility.gsc:384
‪perk_hud_destroy
‪function perk_hud_destroy(perk)
Definition: _zm_perks.gsc:978
‪players_are_in_perk_area
‪function players_are_in_perk_area(perk_machine)
Definition: _zm_perks.gsc:1660
‪perk_unpause
‪function perk_unpause(perk)
Definition: _zm_perks.gsc:1263
‪init
‪function init()
Definition: _zm_perks.gsc:41
‪set_perk_clientfield
‪function set_perk_clientfield(perk, state)
Definition: _zm_perks.gsc:969
‪increment_client_stat
‪function increment_client_stat(stat_name, include_gametype)
Definition: _zm_stats.gsc:389
‪timer
‪function timer(n_time, str_endon, x, y, height)
Definition: lui_shared.gsc:163
‪play_sound_at_pos
‪function play_sound_at_pos(ref, pos, ent)
Definition: _zm_utility.gsc:3040
‪do_player_vo
‪function do_player_vo(snd, variation_count)
Definition: _zm_utility.gsc:3448
‪PERK_STATE_NOT_OWNED
‪#define PERK_STATE_NOT_OWNED
Definition: _zm_perks.gsh:2
‪intermission
‪function intermission()
Definition: _zm.gsc:6542
‪increment_player_stat
‪function increment_player_stat(stat_name)
Definition: _zm_stats.gsc:369
‪sndPerksJingles_Player
‪function sndPerksJingles_Player(type)
Definition: _zm_audio.gsc:1598
‪reset_vending_hint_string
‪function reset_vending_hint_string()
Definition: _zm_perks.gsc:376
‪perks_register_clientfield
‪function perks_register_clientfield()
Definition: _zm_perks.gsc:1624
‪add_to_player_score
‪function add_to_player_score(points, b_add_to_total=true, str_awarded_by="")
Definition: _zm_score.gsc:521
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪perk_machine_removal
‪function perk_machine_removal(machine, replacement_model)
Definition: _zm_perks.gsc:1362
‪update_perk_hud
‪function update_perk_hud()
Definition: _zm_perks.gsc:1166
‪waittill_any_return
‪function waittill_any_return(string1, string2, string3, string4, string5, string6, string7)
Definition: util_shared.csc:212
‪perk_machine_think
‪function perk_machine_think(str_key, s_custom_perk)
Definition: _zm_perks.gsc:113
‪thread_bump_trigger
‪function thread_bump_trigger()
Definition: _zm_perks.gsc:1646
‪get_array
‪function get_array(kvp_value, kvp_key="targetname")
Definition: struct.csc:34
‪vending_trigger_can_player_use
‪function vending_trigger_can_player_use(player)
Definition: _zm_perks.gsc:400
‪disable_player_move_states
‪function disable_player_move_states(forceStanceChange)
Definition: _zm_utility.gsc:5536
‪set_zombie_var
‪function set_zombie_var(zvar, value, is_float=false, column=1, is_team_based=false)
Definition: zombie_utility.gsc:1434
‪perk_hostmigration
‪function perk_hostmigration()
Definition: _zm_perks.gsc:1690
‪register_perk_basic_info
‪function register_perk_basic_info(str_perk, str_alias, n_perk_cost, str_hint_string, w_perk_bottle_weapon)
Definition: _zm_perks.gsc:1820
‪wait_give_perk
‪function wait_give_perk(perk, bought)
Definition: _zm_perks.gsc:687
‪hacker_active
‪function hacker_active()
Definition: _zm_equipment.gsc:748
‪playerExert
‪function playerExert(localClientNum, exert)
Definition: _zm_audio.csc:157
‪pers_upgrade_perk_lose_bought
‪function pers_upgrade_perk_lose_bought()
Definition: _zm_pers_upgrades_functions.gsc:15
‪turn_perk_off
‪function turn_perk_off(ishidden)
Definition: _zm_perks.gsc:240
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪waittill_any_timeout
‪function waittill_any_timeout(n_timeout, string1, string2, string3, string4, string5)
Definition: util_shared.csc:423
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪get_player_index
‪function get_player_index(player)
Definition: _zm_utility.gsc:5949
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪set_power_on
‪function set_power_on(state)
Definition: _zm_perks.gsc:233
‪perk_think
‪function perk_think(perk)
Definition: _zm_perks.gsc:908
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪play_loop_on_machine
‪function play_loop_on_machine()
Definition: _zm_perks.gsc:265
‪add
‪function add(entity, dyingplayer, team, timeout)
Definition: _deathicons.gsc:43
‪enable_player_move_states
‪function enable_player_move_states()
Definition: _zm_utility.gsc:5554
‪spawn_model
‪function spawn_model(n_client, str_model, origin=(0, 0, 0), angles=(0, 0, 0))
Definition: util_shared.csc:92
‪is_player_valid
‪function is_player_valid(player, checkIgnoreMeFlag, ignore_laststand_players)
Definition: skeleton.gsc:256
‪register_perk_machine
‪function register_perk_machine(str_perk, func_perk_machine_setup, func_perk_machine_thread)
Definition: _zm_perks.gsc:1849
‪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
‪sndPerksJingles_Timer
‪function sndPerksJingles_Timer()
Definition: _zm_audio.gsc:1579
‪vending_trigger_post_think
‪function vending_trigger_post_think(player, perk)
Definition: _zm_perks.gsc:613
‪increment_challenge_stat
‪function increment_challenge_stat(stat_name, amount=1)
Definition: _zm_stats.gsc:478
‪perk_machine_spawn_init
‪function perk_machine_spawn_init()
Definition: _zm_perks.gsc:1421
‪minus_to_player_score
‪function minus_to_player_score(points)
Definition: _zm_score.gsc:551
‪register_perk_precache_func
‪function register_perk_precache_func(str_perk, func_precache)
Definition: _zm_perks.gsc:1900
‪_register_undefined_perk
‪function _register_undefined_perk(str_perk)
Definition: _zm_perks.gsc:2006
‪can_player_purchase
‪function can_player_purchase(n_cost)
Definition: _zm_score.gsc:655
‪wait_network_frame
‪function wait_network_frame(n_count=1)
Definition: util_shared.gsc:64
‪set_default_laststand_pistol
‪function set_default_laststand_pistol(solo_mode)
Definition: _zm.gsc:7051
‪PERK_QUICK_REVIVE
‪#define PERK_QUICK_REVIVE
Definition: _zm_perks.gsh:24
‪PERK_END_POWER_THREAD
‪#define PERK_END_POWER_THREAD
Definition: _zm_perks.gsh:38
‪quantum_bomb_give_nearest_perk_validation
‪function quantum_bomb_give_nearest_perk_validation(position)
Definition: _zm_perks.gsc:1178
‪vending_set_hintstring
‪function vending_set_hintstring(perk)
Definition: _zm_perks.gsc:898
‪register_revive_success_perk_func
‪function register_revive_success_perk_func(revive_func)
Definition: _zm_perks.gsc:1797
‪use_solo_revive
‪function use_solo_revive()
Definition: _zm_perks.gsc:214
‪perk_give_bottle_begin
‪function perk_give_bottle_begin(perk)
Definition: _zm_perks.gsc:992
‪is_equipment_that_blocks_purchase
‪function is_equipment_that_blocks_purchase(weapon)
Definition: _zm_equipment.gsc:701
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪default_vending_precaching
‪function default_vending_precaching()
Definition: _zm_perks.gsc:172
‪lost_perk_override
‪function lost_perk_override(perk)
Definition: _zm_bgb.gsc:11
‪decrement_is_drinking
‪function decrement_is_drinking()
Definition: _zm_utility.gsc:3898
‪perk_hud_grey
‪function perk_hud_grey(perk, grey_on_off)
Definition: _zm_perks.gsc:984
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪can_player_purchase_perk
‪function can_player_purchase_perk()
Definition: _zm_utility.gsc:5899
‪PERK_STATE_PAUSED
‪#define PERK_STATE_PAUSED
Definition: _zm_perks.gsh:4
‪ZM_MAP_EVENT_PERK_MACHINE_USED
‪#define ZM_MAP_EVENT_PERK_MACHINE_USED
Definition: _zm_utility.gsh:101
‪is_pers_double_points_active
‪function is_pers_double_points_active()
Definition: _zm_pers_upgrades_functions.gsc:12
‪bookmark
‪function bookmark(type, time, mainClientEnt, otherClientEnt, eventPriority, inflictorEnt, overrideEntityCamera, actorEnt)
Definition: demo_shared.gsc:25
‪register_perk_threads
‪function register_perk_threads(str_perk, func_give_player_perk, func_take_player_perk)
Definition: _zm_perks.gsc:1924
‪perk_abort_drinking
‪function perk_abort_drinking(post_delay)
Definition: _zm_perks.gsc:1074
‪cash_back_player_drinks_perk
‪function cash_back_player_drinks_perk()
Definition: _zm_pers_upgrades_functions.gsc:14
‪perk_pause_all_perks
‪function perk_pause_all_perks(power_zone)
Definition: _zm_perks.gsc:1295
‪register_perk_host_migration_params
‪function register_perk_host_migration_params(str_perk, str_radiant_name, str_effect_name)
Definition: _zm_perks.gsc:1986
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪getVendingMachineNotify
‪function getVendingMachineNotify()
Definition: _zm_perks.gsc:1342
‪register_perk_machine_power_override
‪function register_perk_machine_power_override(str_perk, func_perk_machine_power_override)
Definition: _zm_perks.gsc:1877
‪is_multiple_drinking
‪function is_multiple_drinking()
Definition: _zm_utility.gsc:3891
‪give_perk
‪function give_perk(perk, bought)
Definition: _zm_perks.gsc:738
‪spare_change
‪function spare_change(str_trigger="audio_bump_trigger", str_sound="zmb_perks_bump_bottle")
Definition: _zm_perks.gsc:1731
‪pers_upgrade_double_points_cost
‪function pers_upgrade_double_points_cost(current_cost)
Definition: _zm_pers_upgrades_functions.gsc:13
‪return_retained_perks
‪function return_retained_perks()
Definition: _zm_perks.gsc:698
‪get_perk_machine_start_state
‪function get_perk_machine_start_state(perk)
Definition: _zm_perks.gsc:1607
‪check_for_change
‪function check_for_change()
Definition: _zm_perks.gsc:1744
‪quantum_bomb_give_nearest_perk_result
‪function quantum_bomb_give_nearest_perk_result(position)
Definition: _zm_perks.gsc:1195
‪register_perk_clientfields
‪function register_perk_clientfields(str_perk, func_clientfield_register, func_clientfield_set)
Definition: _zm_perks.gsc:1957
‪vending_trigger_think
‪function vending_trigger_think()
Definition: _zm_perks.gsc:437
‪player_is_in_laststand
‪function player_is_in_laststand()
Definition: laststand_shared.gsc:18
‪perk_unpause_all_perks
‪function perk_unpause_all_perks(power_zone)
Definition: _zm_perks.gsc:1314
‪has_perk_paused
‪function has_perk_paused(perk)
Definition: _zm_perks.gsc:1332
‪is_melee_weapon
‪function is_melee_weapon(weapon)
Definition: _zm_utility.gsc:4339
‪PERK_STATE_OWNED
‪#define PERK_STATE_OWNED
Definition: _zm_perks.gsh:3
‪perk_pause
‪function perk_pause(perk)
Definition: _zm_perks.gsc:1234
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪initialize_custom_perk_arrays
‪function initialize_custom_perk_arrays()
Definition: _zm_perks.gsc:1789
‪create_and_play_dialog
‪function create_and_play_dialog(category, subcategory, force_variant)
Definition: _zm_audio.gsc:603
‪host_migration_func
‪function host_migration_func(s_custom_perk, keyName)
Definition: _zm_perks.gsc:1717
‪register_perk_damage_override_func
‪function register_perk_damage_override_func(func_damage_override)
Definition: _zm_perks.gsc:2028
‪in_revive_trigger
‪function in_revive_trigger()
Definition: _zm_utility.gsc:1684
‪do_initial_power_off_callback
‪function do_initial_power_off_callback(machine_array, perkname)
Definition: _zm_perks.gsc:198
‪result
‪function result(death, attacker, mod, weapon)
Definition: _zm_aat_blast_furnace.gsc:46
‪IS_DRINKING
‪#define IS_DRINKING(_is_drinking)
Definition: _zm_utility.gsh:1
‪is_placeable_mine
‪function is_placeable_mine(weapon)
Definition: _zm_utility.gsc:4267
‪give_random_perk
‪function give_random_perk()
Definition: _zm_perks.gsc:1093
‪perk_give_bottle_end
‪function perk_give_bottle_end(original_weapon, perk)
Definition: _zm_perks.gsc:1014
‪give_perk_presentation
‪function give_perk_presentation(perk)
Definition: _zm_perks.gsc:715
‪electric_perks_dialog
‪function electric_perks_dialog()
Definition: _zm_perks.gsc:321
‪pers_jugg_active
‪function pers_jugg_active()
Definition: _zm_pers_upgrades_functions.gsc:16
‪can_buy_weapon
‪function can_buy_weapon()
Definition: _zm_magicbox.gsc:937
‪check_player_has_perk
‪function check_player_has_perk(perk)
Definition: _zm_perks.gsc:865
‪perk_fx
‪function perk_fx(fx, turnOffFx)
Definition: _zm_perks.gsc:280
‪perk_set_max_health_if_jugg
‪function perk_set_max_health_if_jugg(str_perk, set_preMaxHealth, clamp_health_to_max_health)
Definition: _zm_perks.gsc:791
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪lose_random_perk
‪function lose_random_perk()
Definition: _zm_perks.gsc:1131