‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
All Data Structures Files Functions Variables Macros
_zm_jump_pad.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\flag_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\trigger_shared;
7 
8 #insert scripts\shared\shared.gsh;
9 
10 #using scripts\zm\_util;
11 #using scripts\zm\_zm_audio;
12 #using scripts\zm\_zm_utility;
13 
14 #namespace zm_jump_pad;
15 
16 ‪REGISTER_SYSTEM( "zm_jump_pad", &‪__init__, undefined )
17 
18 // Jump Pad
19 // Trigger points to a struct which is the start point
20 // Start point targets another struct which is the end point
21 // If the End Point has a target then this should be used to create the poi for the landing area
22 // Each jump pad can have multiple landing spots that are chosen randomly by default
23 // Overrides are as follows:
24 // On Trigger:
25 // Script_flag_wait - This string dictates when the pad will become active. Should probably be "on_power"
26 // Script_parameters - This variable should also be added to the level._jump_pad_override array, the function should set where the pad's destination is.
27 // Script_string - This variable should also be added to the level._jump_pad_override_array, and the function should return an array.
28 // This first spot in the array should be the velocity to send the player and the second spot should be the amount of time the player should be in
29 // the air.
30 
31 function ‪__init__()
32 {
33  level ‪jump_pad_init();
34 }
35 
36 // jumppad setup
37 function ‪jump_pad_init()
38 {
39  // set up the override array
40  level._jump_pad_override = [];
41 
42  jump_pad_triggers = GetEntArray( "trig_jump_pad", "targetname" );
43 
44  if( !isdefined( jump_pad_triggers ) )
45  {
46  return;
47  }
48 
49  for( i = 0; i < jump_pad_triggers.size; i++ )
50  {
51  jump_pad_triggers[i].start = ‪struct::get( jump_pad_triggers[i].target, "targetname" );
52  jump_pad_triggers[i].destination = ‪struct::get_array( jump_pad_triggers[i].start.target, "targetname" );
53 
54  if( isdefined( jump_pad_triggers[i].script_string ) )
55  {
56  jump_pad_triggers[i].overrides = StrTok( jump_pad_triggers[i].script_string, "," );
57  }
58 
59  jump_pad_triggers[i] thread ‪jump_pad_think();
60  }
61 
62  // anything that needs to be on the player should go here
64 }
65 
66 // variables for the player when it comes to jump pads
68 {
69  self._padded = false;
70  self.lander = false;
71 }
72 
73 // jump pad main function
75 {
76  self endon( "destroyed" );
77 
78  end_point = undefined;
79  start_point = undefined;
80  z_velocity = undefined;
81  z_dist = undefined;
82  fling_this_way = undefined;
83  jump_time = undefined;
84 
85  world_gravity = GetDvarInt( "bg_gravity" ); // 800;
86  gravity_pulls = 13.3 * -1; // this is gravity divided by the amount of frames in a second (800/60).
87  top_velocity_sq = 900 * 900;
88  forward_scaling = 1.0;
89 
90  if( isdefined( self.‪script_flag_wait ) )
91  {
92  if( !isdefined( level.flag[ self.script_flag_wait ] ) )
93  {
94  level ‪flag::init( self.‪script_flag_wait );
95  }
96 
98  }
99 
100  while( isdefined( self ) )
101  {
102  self waittill( "trigger", who );
103 
104  if( IsPlayer( who ) )
105  {
106  self thread ‪delayed_jump_pad_start( who );
107  }
108  }
109 }
110 
112 {
113  wait( 0.5 );
114  if ( who IsTouching( self ) )
115  {
117  }
118 }
119 
120 // figures out where to send the player then launches them if they haven't left the pad
121 function ‪jump_pad_start( ent_player, endon_condition )
122 {
123  self endon( "endon_condition" );
124 
125  ent_player endon( "left_jump_pad" );
126  ent_player endon("death");
127  ent_player endon("disconnect");
128 
129 
130  // objects
131  end_point = undefined;
132  start_point = undefined;
133  z_velocity = undefined;
134  z_dist = undefined;
135  fling_this_way = undefined;
136  jump_time = undefined;
137 
138  world_gravity = GetDvarInt( "bg_gravity" ); // 800;
139 
140  gravity_pulls = 13.3 * -1; // this is gravity divided by the amount of frames in a second (800/60).
141  top_velocity_sq = 900 * 900;
142  forward_scaling = 1.0;
143 
144  start_point = self.start; // using the start struct here because we don't want the player to be sent without having to steer a bit
145 
146  // any extra special trigger behavior should go on the trigger in the name KVP, tokenize that string then use a switch to decide at the action
147  if( isdefined( self.‪name ) )
148  {
149  self._action_overrides = StrTok( self.‪name, "," );
150 
151  if( isdefined( self._action_overrides ) )
152  {
153  for( i = 0; i < self._action_overrides.size; i++ )
154  {
155  ent_player ‪jump_pad_player_overrides( self._action_overrides[i] );
156  }
157  }
158  }
159 
160  if( isdefined( self.‪script_wait ) )
161  {
162  if( self.‪script_wait < 1 )
163  {
164  self playsound( "evt_jump_pad_charge_short" );
165  }
166  else
167  {
168  self playsound( "evt_jump_pad_charge" );
169  }
170  wait( self.‪script_wait );
171  }
172  else
173  {
174  self playsound( "evt_jump_pad_charge" );
175  wait( 1.0 ); // give the player a moment if they don't want to jump
176  }
177 
178 
179  // if the trigger has an override set up then use it to find the end point
180  if( isdefined( self.script_parameters ) && isdefined( level._jump_pad_override[ self.script_parameters ] ) )
181  {
182  end_point = self [[ level._jump_pad_override[ self.script_parameters ] ]]( ent_player );
183  }
184 
185  if( !isdefined( end_point ) )
186  {
187  // choose randomly between all the end points
188  end_point = self.destination[ RandomInt( self.destination.size ) ];
189  }
190 
191  /#
192  if( GetDvarInt( "jump_pad_tweaks" ) ) // TODO: Remove check in to dvars for debugging
193  {
194  line( start_point.origin, end_point.origin, ( 1, 1, 0 ), 1, 1, 500 );
195  sphere( start_point.origin, 12, (0,1,0), 1, 1, 12, 500 );
196  sphere( end_point.origin, 12, (1,0,0), 1, 1, 12, 500 );
197 
198  }
199  #/
200 
201  // special override to change the velocity and jump timing for a pad
202  if( isdefined( self.script_string ) && isdefined( level._jump_pad_override[ self.script_string ] ) )
203  {
204  info_array = self [[ level._jump_pad_override[ self.script_string ] ]]( start_point, end_point );
205 
206  fling_this_way = info_array[0];
207  jump_time = info_array[1];
208  }
209  else
210  {
211  end_spot = end_point.origin;
212 
213  // randomness
214  if( !‪IS_TRUE( self.script_airspeed ) )
215  {
216  rand_end = ( RandomFloatRange( -1, 1 ), RandomFloatRange( -1, 1 ), 0 );
217 
218  rand_scale = RandomInt( 100 );
219 
220  rand_spot = VectorScale( rand_end, rand_scale );
221 
222  end_spot = end_point.origin + rand_spot;
223  }
224 
225  // distance
226  pad_dist = Distance( start_point.origin, end_spot );
227 
228  z_dist = end_spot[2] - start_point.origin[2];
229 
230  // velocity
231  jump_velocity = end_spot - start_point.origin;
232 
233  // the end point is much higher than the start point so we need to double the z_velocity and scale up the x & y
234  if( z_dist > 40 && z_dist < 135 )
235  {
236  z_dist *= 2.5;
237  forward_scaling = 1.1;
238  }
239  else if( z_dist >= 135 )
240  {
241  z_dist *= 2.7;
242  forward_scaling = 1.3;
243  }
244  else if( z_dist < 0 ) // end_point is lower than the start point
245  {
246  z_dist *= 2.4;
247  forward_scaling = 1.0;
248  }
249 
250 
251  // get the z velocity
252  N_REDUCTION = 0.0015;//T7 value need to match original shipped velocity
253  /#
254  if( GetDvarFloat( "scr_jump_pad_reduction" ) > 0.0 )
255  {
256  N_REDUCTION = GetDvarFloat( "scr_jump_pad_reduction" );
257  }
258  #/
259  z_velocity = N_REDUCTION * 2 * z_dist * world_gravity;
260 
261  // make sure the z velocity isn't a negative
262  if( z_velocity < 0 )
263  {
264  z_velocity *= -1;
265  }
266 
267  // make sure the distance isn't a negative
268  if( z_dist < 0 )
269  {
270  z_dist *= -1;
271  }
272 
273  // time
274  jump_time = Sqrt( 2 * pad_dist / world_gravity );
275  jump_time_2 = Sqrt( 2 * z_dist / world_gravity );
276  jump_time = jump_time + jump_time_2;
277  if( jump_time < 0 )
278  {
279  jump_time *= -1;
280  }
281 
282  // velocity
283  x = jump_velocity[0] * forward_scaling / jump_time;
284  y = jump_velocity[1] * forward_scaling / jump_time;
285  z = z_velocity / jump_time;
286 
287  // final vector
288  fling_this_way = ( x, y, z );
289  }
290 
291  // create poi
292  if( isdefined( end_point.target ) )
293  {
294  poi_spot = ‪struct::get( end_point.target, "targetname" );
295  }
296  else
297  {
298  poi_spot = end_point;
299  }
300 
301  // pass on any checks info needed for the poi creation in to jump_pad_move
302  if( !isdefined( self.script_index ) ) // this checks to see if the attract function should be started on the poi_spot
303  {
304  ent_player.script_index = undefined;
305  }
306  else
307  {
308  ent_player.script_index = self.script_index;
309  }
310 
311  // some pads should probably send the player even if they are jumping
312  if( isdefined( self.script_start ) && self.script_start == 1 )
313  {
314  if( !‪IS_TRUE( ent_player._padded ) && ent_player IsOnGround() )
315  {
316  self playsound( "evt_jump_pad_launch" );
317  if( isdefined( level.func_jump_pad_pulse_override ) )
318  {
319  self [[ level.func_jump_pad_pulse_override ]]();
320  }
321  else
322  {
323  playfx(level._effect["jump_pad_jump"],self.origin);
324  }
325  ent_player thread ‪jump_pad_move( fling_this_way, jump_time, poi_spot, self ); // move the player in the proper direction
326 
327  if( isdefined( self.script_label ) )
328  {
329  level notify( self.script_label );
330  }
331 
332  return;
333  }
334  }
335  else // player must be on the ground to be tossed
336  {
337  if( ent_player IsOnGround() && !‪IS_TRUE( ent_player._padded ) )
338  {
339  self playsound( "evt_jump_pad_launch" );
340  if( isdefined( level.func_jump_pad_pulse_override ) )
341  {
342  self [[ level.func_jump_pad_pulse_override ]]();
343  }
344  else
345  {
346  playfx(level._effect["jump_pad_jump"],self.origin);
347  }
348  ent_player thread ‪jump_pad_move( fling_this_way, jump_time, poi_spot, self ); // move the player in the proper direction
349 
350  if( isdefined( self.script_label ) )
351  {
352  level notify( self.script_label );
353  }
354 
355  return;
356  }
357  }
358 
359  // failsafe against timing where the player spams jump button as they land and being able to stay on the pad
360  if ( ent_player IsTouching( self ) )
361  {
362  wait( 0.5 );
363  if ( ent_player IsTouching( self ) )
364  {
365  self ‪jump_pad_start( ent_player, endon_condition );
366  }
367  }
368 }
369 
370 // player left the jump pad trigger, don't toss them
371 function ‪jump_pad_cancel( ent_player )
372 {
373  ent_player notify( "left_jump_pad" );
374 
375  if( isdefined( ent_player.poi_spot ) && !‪IS_TRUE( ent_player._padded ) )
376  {
377  // ent_player.poi_spot Delete();
378  }
379 
380  // any extra special trigger behavior should go on the trigger in the name KVP, tokenize that string then use a switch to decide at the action
381  if( isdefined( self.‪name ) )
382  {
383  self._action_overrides = StrTok( self.‪name, "," );
384 
385  if( isdefined( self._action_overrides ) )
386  {
387 
388  for( i = 0; i < self._action_overrides.size; i++ )
389  {
390 
391  ent_player ‪jump_pad_player_overrides( self._action_overrides[i] );
392 
393  }
394 
395  }
396 
397  }
398 
399 }
400 
401 
402 function ‪jump_pad_move( vec_direction, flt_time, struct_poi, trigger )
403 {
404  self endon( "death" );
405  self endon( "disconnect" );
406 
407  start_time = GetTime();
408  jump_time = flt_time * 500;
409 
410  attract_dist = undefined;
411  num_attractors = 30;
412  added_poi_value = 0;
413  start_turned_on = true;
414  // poi_spot = undefined;
415  poi_start_func = undefined;
416 
417  while( ‪IS_TRUE( self.divetoprone ) || ‪IS_TRUE( self._padded ) )
418  {
420  // util::wait_network_frame();
421  }
422 
423  self._padded = 1;
424  self.lander = 1;
425 
426  self SetStance( "stand" );
427 
428  wait( 0.1 );
429 
430  // low triggers are ok because they get turned off
431  if ( isdefined( trigger.script_label ) )
432  {
433  if ( issubstr( trigger.script_label, "low" ) )
434  {
435  self.jump_pad_current = undefined;
436  self.jump_pad_previous = undefined;
437  }
438  else if ( !isdefined( self.jump_pad_current ) )
439  {
440  self.jump_pad_current = trigger;
441  }
442  else
443  {
444  self.jump_pad_previous = self.jump_pad_current;
445  self.jump_pad_current = trigger;
446  }
447  }
448 
449  if( isdefined( self.poi_spot ) )
450  {
451  level ‪jump_pad_ignore_poi_cleanup( self.poi_spot );
452 
454 
455  self.poi_spot Delete();
456  }
457 
458  if( isdefined( struct_poi ) )
459  {
460  self.poi_spot = ‪spawn( "script_origin", struct_poi.origin );
461 
462  if( isdefined( level._pad_poi_ignore ) )
463  {
464  level [[level._pad_poi_ignore]]( self.poi_spot );
465  }
466 
467  self thread ‪jump_pad_enemy_follow_or_ignore( self.poi_spot );
468 
469  if( isdefined( level._jump_pad_poi_start_override ) && !‪IS_TRUE( self.script_index ) )
470  {
471  poi_start_func = level._jump_pad_poi_start_override;
472  }
473 
474  if( isdefined( level._jump_pad_poi_end_override ) )
475  {
476  poi_end_func = level._jump_pad_poi_end_override;
477  }
478 
479  self.poi_spot ‪zm_utility::create_zombie_point_of_interest( attract_dist, num_attractors, added_poi_value, start_turned_on, poi_start_func );
481  }
482 
483 
484  self SetOrigin( self.origin + ( 0, 0, 1 ) );
485 
486  if( 20 >= randomintrange( 0, 101 ) )
487  {
488  self thread ‪zm_audio::create_and_play_dialog( "general", "jumppad" );
489  }
490 
491  while( GetTime() - start_time < jump_time )
492  {
493  self SetVelocity( vec_direction );
495  }
496 
497  while( !self IsOnGround() )
498  {
500  }
501 
502  self._padded = 0;
503  self.lander = 0;
504 
505  jump_pad_triggers = GetEntArray( "trig_jump_pad", "targetname" );
506 
507  for( i = 0; i < jump_pad_triggers.size; i++ )
508  {
509  if( self IsTouching( jump_pad_triggers[i] ) )
510  {
511  level thread ‪failsafe_pad_poi_clean( jump_pad_triggers[i], self.poi_spot );
512  return;
513  }
514  }
515 
516  if( isdefined( self.poi_spot ) )
517  {
518  level ‪jump_pad_ignore_poi_cleanup( self.poi_spot );
519  self.poi_spot Delete();
520  }
521 
522 
523 }
524 
525 // make sure to delete the poi in cases where the player disconnects while it's active
527 {
528  self notify( "kill_disconnect_failsafe_pad_poi_clean" );
529  self endon( "kill_disconnect_failsafe_pad_poi_clean" );
530  self.poi_spot endon( "death" );
531 
532  self waittill( "disconnect" );
533 
534  if ( isdefined( self.poi_spot ) )
535  {
536  level ‪jump_pad_ignore_poi_cleanup( self.poi_spot );
537 
539 
540  self.poi_spot Delete();
541  }
542 }
543 
544 // make sure to delete the poi in cases where the player lands on the pad for just a moment before falling off
545 function ‪failsafe_pad_poi_clean( ent_trig, ent_poi )
546 {
547  if( isdefined( ent_trig.script_wait ) )
548  {
549  wait( ent_trig.script_wait );
550  }
551  else
552  {
553  wait( 0.5 );
554  }
555 
556  if( isdefined( ent_poi ) )
557  {
558  level ‪jump_pad_ignore_poi_cleanup( ent_poi );
559 
561 
562  ent_poi Delete();
563  }
564 }
565 
566 // sets all zombies not chasing the player to ignore the poi that is going to be created
567 // enemy stays set as the player they were chasing for a few moments in to the jump
569 {
570  self endon( "death" );
571  self endon( "disconnect" );
572 
573  zombies = GetAiTeamArray( level.zombie_team );
574 
575  players = GetPlayers();
576  valid_players = 0;
577  for( p = 0; p < players.size; p++ )
578  {
579  if ( ‪zm_utility::is_player_valid( players[p] ) )
580  {
581  valid_players++;
582  }
583  }
584 
585  for( i = 0; i < zombies.size; i++ )
586  {
587  ignore_poi = false;
588 
589  if( !isdefined( zombies[i] ) )
590  {
591  continue;
592  }
593 
594  enemy = zombies[i].favoriteenemy;
595 
596  if( isdefined( enemy ) )
597  {
598  if ( players.size > 1 && valid_players > 1 )
599  {
600  if ( enemy != self || ( isdefined( enemy.jump_pad_previous ) && enemy.jump_pad_previous == enemy.jump_pad_current ) )
601  {
602  ignore_poi = true;
603  }
604  }
605  }
606 
607  if ( ‪IS_TRUE( ignore_poi ) )
608  {
609  zombies[i] thread ‪zm_utility::add_poi_to_ignore_list( ent_poi );
610  }
611  else
612  {
613  zombies[i].ignore_cleanup_mgr = true;
614  zombies[i]._pad_follow = 1;
615  zombies[i] thread ‪stop_chasing_the_sky( ent_poi );
616  }
617  }
618 }
619 
620 // makes sure the poi is removed from the enemies ignore list
622 {
623  zombies = GetAiTeamArray( level.zombie_team );
624 
625  for( i = 0; i < zombies.size; i++ )
626  {
627  if( isdefined( zombies[i] ) )
628  {
629  if( ‪IS_TRUE( zombies[i]._pad_follow ) )
630  {
631  zombies[i]._pad_follow = 0;
632  zombies[i] notify( "stop_chasing_the_sky" );
633  zombies[i].ignore_cleanup_mgr = false;
634  }
635 
636  if( isdefined( ent_poi ) )
637  {
638  zombies[i] thread ‪zm_utility::remove_poi_from_ignore_list( ent_poi );
639  }
640  }
641  }
642 }
643 
644 // If a zombie is chasing a guy jumping around and comes close to another player then they should break off and attack
645 // the closer player
646 // the favoriteenemy is usually the enemy from the start, but when the player is far from the zombie the zombie drops them as
647 // their .enemy, so for this check we need to see if the player getting close is not the .favoriteenemy
648 function ‪stop_chasing_the_sky( ent_poi )
649 {
650  self endon( "death" );
651  self endon( "stop_chasing_the_sky" );
652 
653  while( ‪IS_TRUE( self._pad_follow ) )
654  {
655  if ( isdefined( self.favoriteenemy ) )
656  {
657  players = getplayers();
658  for ( i = 0; i < players.size; i++ )
659  {
660  if ( ‪zm_utility::is_player_valid( players[i] ) && players[i] != self.favoriteenemy )
661  {
662  if ( Distance2DSquared( players[i].origin, self.origin ) < 100 * 100 )
663  {
665  return;
666  }
667  }
668  }
669  }
670 
671  wait( 0.1 );
672  }
673 
674  //wait( 0.5 ); // allow the zombies time to get close while the next pad warms up
675 
676  self._pad_follow = 0;
677  self.ignore_cleanup_mgr = false;
678  self notify( "stop_chasing_the_sky" );
679 
680 }
681 
682 // Runs any special player behavior wanted while the player is touching the pad trigger
683 function ‪jump_pad_player_overrides( st_behavior, int_clean )
684 {
685  if( !isdefined( st_behavior ) || !IsString( st_behavior ) )
686  {
687  return;
688  }
689 
690  if( !isdefined( int_clean ) ) //int_clean decides if the behavior is applied or removed, not defining it means you want to set the behavior
691  {
692  int_clean = 0;
693  }
694 
695  switch( st_behavior )
696  {
697  case "no_sprint":
698 
699  if( !int_clean )
700  {
701  //self AllowSprint( int_clean );
702  }
703  else
704  {
705  //self AllowSprint( int_clean );
706  }
707  break;
708 
709  default:
710 
711  if( isdefined( level._jump_pad_level_behavior ) )
712  {
713  self [[ level._jump_pad_level_behavior ]]( st_behavior, int_clean );
714  }
715  else
716  {
717  // nothing happens
718  }
719 
720  break;
721  }
722 }
‪jump_pad_player_overrides
‪function jump_pad_player_overrides(st_behavior, int_clean)
Definition: _zm_jump_pad.gsc:683
‪failsafe_pad_poi_clean
‪function failsafe_pad_poi_clean(ent_trig, ent_poi)
Definition: _zm_jump_pad.gsc:545
‪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
‪jump_pad_player_variables
‪function jump_pad_player_variables()
Definition: _zm_jump_pad.gsc:67
‪get_array
‪function get_array(kvp_value, kvp_key="targetname")
Definition: struct.csc:34
‪jump_pad_start
‪function jump_pad_start(ent_player, endon_condition)
Definition: _zm_jump_pad.gsc:121
‪jump_pad_enemy_follow_or_ignore
‪function jump_pad_enemy_follow_or_ignore(ent_poi)
Definition: _zm_jump_pad.gsc:568
‪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
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪is_player_valid
‪function is_player_valid(player, checkIgnoreMeFlag, ignore_laststand_players)
Definition: skeleton.gsc:256
‪disconnect_failsafe_pad_poi_clean
‪function disconnect_failsafe_pad_poi_clean()
Definition: _zm_jump_pad.gsc:526
‪script_flag_wait
‪function script_flag_wait()
Definition: flag_shared.gsc:394
‪stop_chasing_the_sky
‪function stop_chasing_the_sky(ent_poi)
Definition: _zm_jump_pad.gsc:648
‪jump_pad_ignore_poi_cleanup
‪function jump_pad_ignore_poi_cleanup(ent_poi)
Definition: _zm_jump_pad.gsc:621
‪jump_pad_think
‪function jump_pad_think()
Definition: _zm_jump_pad.gsc:74
‪script_wait
‪function script_wait(called_from_spawner=false)
Definition: util_shared.gsc:1930
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪__init__
‪function __init__()
Definition: _zm_jump_pad.gsc:31
‪init
‪function init()
Definition: struct.csc:1
‪remove_poi_from_ignore_list
‪function remove_poi_from_ignore_list(poi)
Definition: _zm_utility.gsc:1335
‪jump_pad_move
‪function jump_pad_move(vec_direction, flt_time, struct_poi, trigger)
Definition: _zm_jump_pad.gsc:402
‪function_thread
‪function function_thread(ent, on_enter_payload, on_exit_payload)
Definition: trigger_shared.csc:6
‪jump_pad_init
‪function jump_pad_init()
Definition: _zm_jump_pad.gsc:37
‪jump_pad_cancel
‪function jump_pad_cancel(ent_player)
Definition: _zm_jump_pad.gsc:371
‪create_and_play_dialog
‪function create_and_play_dialog(category, subcategory, force_variant)
Definition: _zm_audio.gsc:603
‪delayed_jump_pad_start
‪function delayed_jump_pad_start(who)
Definition: _zm_jump_pad.gsc:111
‪add_poi_to_ignore_list
‪function add_poi_to_ignore_list(poi)
Definition: _zm_utility.gsc:1350
‪on_connect
‪function on_connect()
Definition: _arena.gsc:20
‪name
‪class GroundFx name
‪deactivate_zombie_point_of_interest
‪function deactivate_zombie_point_of_interest(dont_remove)
Definition: _zm_utility.gsc:1030
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265