‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
zm_giant_teleporter.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\exploder_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\music_shared;
8 #using scripts\shared\system_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\_zm_powerups;
18 #using scripts\zm\_zm_audio;
19 #using scripts\zm\_zm_score;
20 #using scripts\zm\_zm_timer;
21 #using scripts\zm\_zm_utility;
22 #using scripts\zm\zm_giant;
23 
24 #precache( "model", "collision_wall_128x128x10" );
25 
26 #precache( "triggerstring", "ZOMBIE_POWER_UP_TPAD" );
27 #precache( "triggerstring", "ZOMBIE_INACTIVE_TPAD" );
28 #precache( "triggerstring", "ZOMBIE_LINK_TPAD" );
29 
30 ‪REGISTER_SYSTEM_EX( "zm_giant_teleporter", &‪__init__, &‪__main__, undefined )
31 
32 function ‪__init__()
33 {
34  // DCS: added to fix non-attacking dogs.
35  level.dog_melee_range = 130;
36  level thread ‪dog_blocker_clip();
37 
38  level.teleport = [];
39  level.active_links = 0;
40  level.countdown = 0;
41 
42  level.teleport_delay = 2;
43  level.teleport_cost = 1500;
44  level.teleport_cooldown = 5;
45  level.is_cooldown = false;
46  level.active_timer = -1;
47  level.teleport_time = 0;
48 
49  // use this array to convert a teleport_pad index to a, b, or c
50  level.teleport_pad_names = [];
51  level.teleport_pad_names[0] = "a";
52  level.teleport_pad_names[1] = "c";
53  level.teleport_pad_names[2] = "b";
54 
55  level ‪flag::init( "teleporter_pad_link_1" );
56  level ‪flag::init( "teleporter_pad_link_2" );
57  level ‪flag::init( "teleporter_pad_link_3" );
58 
59  ‪visionset_mgr::register_info( "overlay", "zm_factory_teleport", ‪VERSION_SHIP, 61, 1, true );
60 }
61 
62 
63 function ‪__main__()
64 {
65  // Get the Pad triggers
66  for ( i=0; i<3; i++ )
67  {
68  trig = GetEnt( "trigger_teleport_pad_" + i, "targetname");
69  if ( IsDefined(trig) )
70  {
71  level.teleporter_pad_trig[i] = trig;
72  }
73  }
74 
75  level thread ‪teleport_pad_think( 0 );
76  level thread ‪teleport_pad_think( 1 );
77  level thread ‪teleport_pad_think( 2 );
78  level thread ‪teleport_core_think();
79 
80  level thread ‪init_pack_door();
81 
82  //mp_downhill_fx::SetDvar( "factoryAftereffectOverride", "-1" );
83  //SetSavedDvar( "zombiemode_path_minz_bias", 13 );
84  level.no_dog_clip = true;
85 
86  packapunch_see = getent( "packapunch_see", "targetname" );
87  if(isdefined( packapunch_see ) )
88  {
89  packapunch_see thread ‪play_packa_see_vox();
90  }
91 
92  level.teleport_ae_funcs = [];
93 
94  if( !IsSplitscreen() )
95  {
96  level.teleport_ae_funcs[level.teleport_ae_funcs.size] = &‪zm_giant_teleporter::teleport_aftereffect_fov;
97  }
98  level.teleport_ae_funcs[level.teleport_ae_funcs.size] = &‪zm_giant_teleporter::teleport_aftereffect_shellshock;
99  level.teleport_ae_funcs[level.teleport_ae_funcs.size] = &‪zm_giant_teleporter::teleport_aftereffect_shellshock_electric;
100  level.teleport_ae_funcs[level.teleport_ae_funcs.size] = &‪zm_giant_teleporter::teleport_aftereffect_bw_vision;
101  level.teleport_ae_funcs[level.teleport_ae_funcs.size] = &‪zm_giant_teleporter::teleport_aftereffect_red_vision;
102  level.teleport_ae_funcs[level.teleport_ae_funcs.size] = &‪zm_giant_teleporter::teleport_aftereffect_flashy_vision;
103  level.teleport_ae_funcs[level.teleport_ae_funcs.size] = &‪zm_giant_teleporter::teleport_aftereffect_flare_vision;
104 }
105 
106 //-------------------------------------------------------------------------------
107 // sets up up the pack a punch door
108 //-------------------------------------------------------------------------------
110 {
111  //DCS: create collision blocker till door in place at load.
112  collision = ‪Spawn("script_model", (-56, 467, 157));
113  collision setmodel("collision_wall_128x128x10");
114  collision.angles = (0, 0, 0);
115  collision Hide();
116 
117  door = getent( "pack_door", "targetname" );
118  door movez( -50, 0.05, 0 );
119  wait(1.0);
120 
121  level ‪flag::wait_till( "start_zombie_round_logic" );
122 
123  door movez( 50, 1.5, 0 );
124  door playsound( "evt_packa_door_1" );
125 
126  //DCS: waite for door to be in place then delete blocker.
127  wait(2);
128  collision Delete();
129 
130  // Open slightly the first two times
131  level ‪flag::wait_till( "teleporter_pad_link_1" );
132  door movez( -35, 1.5, 1 );
133  door playsound( "evt_packa_door_2" );
134  door thread ‪packa_door_reminder();
135  wait(2);
136 
137  // Second link
138  level ‪flag::wait_till( "teleporter_pad_link_2" );
139  door movez( -25, 1.5, 1 );
140  door playsound( "evt_packa_door_2" );
141  wait(2);
142 
143  // Final Link
144  level ‪flag::wait_till( "teleporter_pad_link_3" );
145 
146  door movez( -60, 1.5, 1 );
147  door playsound( "evt_packa_door_2" );
148 
149  //door rotateyaw( -90, 1.5, 1 );
150 
151  clip = getentarray( "pack_door_clip", "targetname" );
152  for ( i = 0; i < clip.size; i++ )
153  {
154  clip[i] connectpaths();
155  clip[i] delete();
156  }
157 }
158 
159 //-------------------------------------------------------------------------------
160 // handles activating and deactivating pads for cool down
161 //-------------------------------------------------------------------------------
162 function ‪pad_manager()
163 {
164  for ( i = 0; i < level.teleporter_pad_trig.size; i++ )
165  {
166  // shut off the pads
167  level.teleporter_pad_trig[i] sethintstring( &"ZOMBIE_TELEPORT_COOLDOWN" );
168  level.teleporter_pad_trig[i] ‪teleport_trigger_invisible( false );
169  }
170 
171  level.is_cooldown = true;
172  wait( level.teleport_cooldown );
173  level.is_cooldown = false;
174 
175  for ( i = 0; i < level.teleporter_pad_trig.size; i++ )
176  {
177  if ( level.teleporter_pad_trig[i].teleport_active )
178  {
179  level.teleporter_pad_trig[i] sethintstring( &"ZOMBIE_TELEPORT_TO_CORE" );
180  }
181  else
182  {
183  level.teleporter_pad_trig[i] sethintstring( &"ZOMBIE_LINK_TPAD" );
184  }
185 // level.teleporter_pad_trig[i] teleport_trigger_invisible( false );
186  }
187 }
188 
189 //-------------------------------------------------------------------------------
190 // handles turning on the pad and waiting for link
191 //-------------------------------------------------------------------------------
192 function ‪teleport_pad_think( index )
193 {
194  tele_help = getent( "tele_help_" + index, "targetname" );
195  if(isdefined( tele_help ) )
196  {
197  tele_help thread ‪play_tele_help_vox();
198  }
199 
200  active = false;
201 
202  // init the pad
203  level.teleport[index] = "waiting";
204 
205  trigger = level.teleporter_pad_trig[ index ];
206 
207  trigger setcursorhint( "HINT_NOICON" );
208  trigger sethintstring( &"ZOMBIE_NEED_POWER" );
209 
210  level ‪flag::wait_till( "power_on" );
211 
212  trigger sethintstring( &"ZOMBIE_POWER_UP_TPAD" );
213  trigger.teleport_active = false;
214 
215  if ( isdefined( trigger ) )
216  {
217  while ( !active )
218  {
219  trigger waittill( "trigger" );
220 
221  if ( level.active_links < 3 )
222  {
223  trigger_core = getent( "trigger_teleport_core", "targetname" );
224  trigger_core ‪teleport_trigger_invisible( false );
225  }
226 
227  // when one starts the others disabled
228  for ( i=0; i<level.teleporter_pad_trig.size; i++ )
229  {
230  level.teleporter_pad_trig[ i ] ‪teleport_trigger_invisible( true );
231  }
232  level.teleport[index] = "timer_on";
233 
234  // start the countdown back to the core
235  trigger thread ‪teleport_pad_countdown( index, 30 );
236  ‪teleporter_vo( "countdown", trigger );
237 
238  // wait for the countdown
239  while ( level.teleport[index] == "timer_on" )
240  {
241  wait( .05 );
242  }
243 
244  // core was activated in time
245  if ( level.teleport[index] == "active" )
246  {
247  active = true;
248  level ‪util::clientNotify( "pw" + index ); // pad wire #
249 
250  //AUDIO
251  level ‪util::clientNotify( "tp" + index ); // Teleporter #
252 
253  // MM - Auto teleport the first time
254  ‪teleporter_wire_wait( index );
255 
256 // trigger teleport_trigger_invisible( true );
257  trigger thread ‪player_teleporting( index );
258  }
259  else
260  {
261  // Reenable triggers
262  for ( i=0; i<level.teleporter_pad_trig.size; i++ )
263  {
264  level.teleporter_pad_trig[ i ] ‪teleport_trigger_invisible( false );
265  }
266  }
267  wait( .05 );
268  }
269 
270  if ( level.is_cooldown )
271  {
272  // shut off the pads
273  trigger sethintstring( &"ZOMBIE_TELEPORT_COOLDOWN" );
274  trigger ‪teleport_trigger_invisible( false );
275  trigger.teleport_active = true;
276  }
277  else
278  {
279  trigger thread ‪teleport_pad_active_think( index );
280  }
281  }
282 }
283 
284 //-------------------------------------------------------------------------------
285 // updates the teleport pad timer
286 //-------------------------------------------------------------------------------
287 function ‪teleport_pad_countdown( index, time )
288 {
289  self endon( "stop_countdown" );
290 
291 // iprintlnbold( &"WAW_ZOMBIE_START_TPAD" );
292 
293  if ( level.active_timer < 0 )
294  {
295  level.active_timer = index;
296  }
297 
298  level.countdown++;
299 
300  self thread ‪sndCountdown();
301  level ‪util::clientNotify( "TRf" ); // Teleporter receiver map light flash
302 
303  // start timer for all players
304  // Add a second for VO sync
305  players = GetPlayers();
306  for( i = 0; i < players.size; i++ )
307  {
308  players[i] thread ‪zm_timer::start_timer( time+1, "stop_countdown" );
309  }
310  wait( time+1 );
311 
312  if ( level.active_timer == index )
313  {
314  level.active_timer = -1;
315  }
316 
317  // ran out of time to activate teleporter
318  level.teleport[index] = "timer_off";
319 // iprintlnbold( "out of time" );
320  level ‪util::clientNotify( "TRs" ); // Stop flashing the receiver map light
321 
322  level.countdown--;
323 }
324 function ‪sndCountdown()
325 {
326  self endon( "stop_countdown" );
327 
328 
329  clock_sound = ‪spawn ("script_origin", (0,0,0));
330  clock_sound thread ‪clock_timer();
331 
332  level thread ‪zm_giant::sndPA_DoVox( "vox_maxis_teleporter_ultimatum_0" );
333 
334  count = 30;
335  num = 11;
336  while ( count > 0 )
337  {
338  ‪play = (count == 20 || count == 15 || count <= 10);
339  if ( ‪play )
340  {
341  level thread ‪zm_giant::sndPA_DoVox( "vox_maxis_teleporter_count_" + num, undefined, true );
342  num--;
343  }
344  //playsoundatposition( "evt_clock_tick_1sec", (0,0,0) ); Changed this to looped sound to avoid stuttering audio
345  wait( 1 );
346  count--;
347  }
348  level notify ("stop_countdown");
349 
350  level thread ‪zm_giant::sndPA_DoVox( "vox_maxis_teleporter_expired_0" );
351 }
352 function ‪clock_timer()
353 {
354  level ‪util::delay( 0, undefined, &‪zm_audio::sndMusicSystem_PlayState, "timer" );
355  self playloopsound ("evt_clock_tick_1sec");
356  level waittill ("stop_countdown");
357 
358  if( isdefined( level.musicSystem.currentState ) && level.musicSystem.currentState == "timer" )
359  {
361  music::setmusicstate("none");
362  }
363 
364  self stoploopsound(0);
365  self delete();
366 
367 }
368 //-------------------------------------------------------------------------------
369 // handles teleporting players when triggered
370 //-------------------------------------------------------------------------------
372 {
373  // link established, can be used to teleport
374  self setcursorhint( "HINT_NOICON" );
375  self.teleport_active = true;
376 
377  user = undefined;
378 
379  while ( 1 )
380  {
381  self waittill( "trigger", user );
382 
383  if ( ‪zm_utility::is_player_valid( user ) && user ‪zm_score::can_player_purchase( level.teleport_cost ) && !level.is_cooldown )
384  {
385  for ( i = 0; i < level.teleporter_pad_trig.size; i++ )
386  {
387  level.teleporter_pad_trig[i] ‪teleport_trigger_invisible( true );
388  }
389 
390  user ‪zm_score::minus_to_player_score( level.teleport_cost );
391 
392  // Non-threaded so the trigger doesn't activate before the cooldown
393  self ‪player_teleporting( index );
394  }
395  }
396 }
397 
398 //-------------------------------------------------------------------------------
399 // handles moving the players and fx, etc...moved out so it can be threaded
400 //-------------------------------------------------------------------------------
401 function ‪player_teleporting( index )
402 {
403  time_since_last_teleport = GetTime() - level.teleport_time;
404 
405  // begin the teleport
406  // add 3rd person fx
407  ‪exploder::exploder_duration( "teleporter_" + level.teleport_pad_names[index] + "_teleporting", 5.3 );
408 
409  // play startup fx at the core
410  ‪exploder::exploder_duration( "mainframe_warm_up", 4.8 );
411 
412  //AUDIO
413  level ‪util::clientNotify( "tpw" + index );
414  level thread ‪zm_giant::sndPA_DoVox( "vox_maxis_teleporter_success_0" );
415 
416  // start fps fx
417  self thread ‪teleport_pad_player_fx( level.teleport_delay );
418 
419  //AUDIO
420  self thread ‪teleport_2d_audio();
421 
422  // Activate the TP zombie kill effect
423  self thread ‪teleport_nuke( 20, 300); // Max 20 zombies and range 300
424 
425  // wait a bit
426  wait( level.teleport_delay );
427 
428  // end fps fx
429  self notify( "fx_done" );
430 
431  // teleport the players
432  self ‪teleport_players();
433 
434  // only need this if it's not cooling down
435  if ( level.is_cooldown == false )
436  {
437  thread ‪pad_manager();
438  }
439 
440  // Now spawn a powerup goodie after a few seconds
441  wait( 2.0 );
442  ss = ‪struct::get( "teleporter_powerup", "targetname" );
443  if ( IsDefined( ss ) )
444  {
445  ss thread ‪zm_powerups::special_powerup_drop(ss.origin);
446  }
447 
448  // Special for teleporting too much. The Dogs attack!
449  if ( time_since_last_teleport < 60000 && level.active_links == 3 && level.round_number > 20 )
450  {
451  //dog_spawners = GetEntArray( "special_dog_spawner", "targetname" );
452  //_zombiemode_ai_dogs::special_dog_spawn( undefined, 4 );
453  //iprintlnbold( "Samantha Sez: No Powerup For You!" );
454  thread ‪zm_utility::play_sound_2D( "vox_sam_nospawn" );
455  }
456  level.teleport_time = GetTime();
457 }
458 
459 //-------------------------------------------------------------------------------
460 // used to enable / disable the pad use trigger for players
461 //-------------------------------------------------------------------------------
463 {
464  players = GetPlayers();
465 
466  for ( i = 0; i < players.size; i++ )
467  {
468  if ( isdefined( players[i] ) )
469  {
470  self SetInvisibleToPlayer( players[i], ‪enable );
471  }
472  }
473 }
474 
475 //-------------------------------------------------------------------------------
476 // checks if player is within radius of the teleport pad
477 //-------------------------------------------------------------------------------
478 function ‪player_is_near_pad( player )
479 {
480  radius = 88;
481  scale_factor = 2;
482 
483  dist = Distance2D( player.origin, self.origin );
484  dist_touching = radius * scale_factor;
485 
486  if ( dist < dist_touching )
487  {
488  return true;
489  }
490 
491  return false;
492 }
493 
494 
495 //-------------------------------------------------------------------------------
496 // this is the 1st person effect seen when touching the teleport pad
497 //
498 // duration = time in seconds
499 //-------------------------------------------------------------------------------
500 #define ZM_TRAP_ELECTRIC_MAX 1.25
501 
502 function ‪teleport_pad_player_fx( duration )
503 {
504  players = GetPlayers();
505  for ( i = 0; i < players.size; i++ )
506  {
507  if ( isdefined( players[i] ) )
508  {
509  if ( self ‪player_is_near_pad( players[i] ) )
510  {
511  ‪visionset_mgr::activate( "overlay", "zm_trap_electric", players[i], ‪ZM_TRAP_ELECTRIC_MAX, ‪ZM_TRAP_ELECTRIC_MAX );
512  }
513  }
514  }
515 }
516 
517 //-------------------------------------------------------------------------------
518 // send players back to the core
519 //-------------------------------------------------------------------------------
521 {
522  player_radius = 16;
523 
524  players = GetPlayers();
525 
526  core_pos = [];
527  occupied = [];
528  image_room = [];
529  players_touching = []; // the players that will actually be teleported
530 
531  player_idx = 0;
532 
533  prone_offset = (0, 0, 49);
534  crouch_offset = (0, 0, 20);
535  stand_offset = (0, 0, 0);
536 
537  // send players to a black room to flash images for a few seconds
538  for ( i = 0; i < 4; i++ )
539  {
540  core_pos[i] = getent( "origin_teleport_player_" + i, "targetname" );
541  occupied[i] = false;
542  image_room[i] = getent( "teleport_room_" + i, "targetname" );
543 
544  if ( isdefined( players[i] ) )
545  {
546  // filter::SetTransported( players[i] );
547 
548  if ( self ‪player_is_near_pad( players[i] ) )
549  {
550  players_touching[player_idx] = i;
551  player_idx++;
552 
553  if ( isdefined( image_room[i] ) )
554  {
555  ‪visionset_mgr::deactivate( "overlay", "zm_trap_electric", players[i] );
556  ‪visionset_mgr::activate( "overlay", "zm_factory_teleport", players[i] ); // turn on the mid-teleport stargate effects
557  players[i] disableOffhandWeapons();
558  players[i] disableweapons();
559  if( players[i] getstance() == "prone" )
560  {
561  desired_origin = image_room[i].origin + prone_offset;
562  }
563  else if( players[i] getstance() == "crouch" )
564  {
565  desired_origin = image_room[i].origin + crouch_offset;
566  }
567  else
568  {
569  desired_origin = image_room[i].origin + stand_offset;
570  }
571 
572  players[i].teleport_origin = ‪Spawn( "script_origin", players[i].origin );
573  players[i].teleport_origin.angles = players[i].angles;
574  players[i] linkto( players[i].teleport_origin );
575  players[i].teleport_origin.origin = desired_origin;
576  players[i] FreezeControls( true );
578 
579  if( IsDefined( players[i] ) )
580  {
581  ‪util::setClientSysState( "levelNotify", "black_box_start", players[i] );
582  players[i].teleport_origin.angles = image_room[i].angles;
583  }
584  }
585  }
586  }
587  }
588 
589  wait( 2 );
590 
591  // Nuke anything at the core
592  core = GetEnt( "trigger_teleport_core", "targetname" );
593  core thread ‪teleport_nuke( undefined, 300); // Max any zombies at the pad range 300
594 
595  // check if any players are standing on top of core teleport positions
596  for ( i = 0; i < players.size; i++ )
597  {
598  if ( isdefined( players[i] ) )
599  {
600  for ( j = 0; j < 4; j++ )
601  {
602  if ( !occupied[j] )
603  {
604  dist = Distance2D( core_pos[j].origin, players[i].origin );
605  if ( dist < player_radius )
606  {
607  occupied[j] = true;
608  }
609  }
610  }
611  ‪util::setClientSysState( "levelNotify", "black_box_end", players[i] );
612  }
613  }
614 
616 
617  // move players to the core
618  for ( i = 0; i < players_touching.size; i++ )
619  {
620  player_idx = players_touching[i];
621  player = players[player_idx];
622 
623  if ( !IsDefined( player ) )
624  {
625  continue;
626  }
627 
628  // find a free space at the core
629  slot = i;
630  start = 0;
631  while ( occupied[slot] && start < 4 )
632  {
633  start++;
634  slot++;
635  if ( slot >= 4 )
636  {
637  slot = 0;
638  }
639  }
640  occupied[slot] = true;
641  pos_name = "origin_teleport_player_" + slot;
642  teleport_core_pos = getent( pos_name, "targetname" );
643 
644  player unlink();
645 
646  assert( IsDefined( player.teleport_origin ) );
647  player.teleport_origin delete();
648  player.teleport_origin = undefined;
649 
650  ‪visionset_mgr::deactivate( "overlay", "zm_factory_teleport", player ); // turn off the mid-teleport stargate effects
651  player enableweapons();
652  player enableoffhandweapons();
653  player setorigin( core_pos[slot].origin );
654  player setplayerangles( core_pos[slot].angles );
655  player FreezeControls( false );
656  player thread ‪teleport_aftereffects();
657 
658  vox_rand = randomintrange(1,100); //RARE: Sets up rare post-teleport line
659 
660  if( vox_rand <= 2 )
661  {
662  //player teleporter_vo( "vox_tele_sick_rare" );
663  //iprintlnbold( "Hey, this is the random teleport sickness line!" );
664  }
665  else
666  {
667  //player teleporter_vo( "vox_tele_sick" );
668  }
669 
670  //player achievement_notify( "DLC3_ZOMBIE_FIVE_TELEPORTS" );
671  }
672 
673  // play beam fx at the core
674  ‪exploder::exploder_duration( "mainframe_arrival", 1.7 );
675  ‪exploder::exploder_duration( "mainframe_steam", 14.6 );
676 }
677 
678 //-------------------------------------------------------------------------------
679 // updates the hint string when countdown is started and expired
680 //-------------------------------------------------------------------------------
682 {
683  self setcursorhint( "HINT_NOICON" );
684 
685  while ( 1 )
686  {
687  // can't use teleporters until power is on
688  if ( !level ‪flag::get( "power_on" ) )
689  {
690  self sethintstring( &"ZOMBIE_NEED_POWER" );
691  }
692  else if ( ‪teleport_pads_are_active() )
693  {
694  self sethintstring( &"ZOMBIE_LINK_TPAD" );
695  }
696  else if ( level.active_links == 0 )
697  {
698  self sethintstring( &"ZOMBIE_INACTIVE_TPAD" );
699  }
700  else
701  {
702  self sethintstring( "" );
703  }
704 
705  wait( .05 );
706  }
707 }
708 
709 //-------------------------------------------------------------------------------
710 // establishes the link between teleporter pads and the core
711 //-------------------------------------------------------------------------------
713 {
714  trigger = getent( "trigger_teleport_core", "targetname" );
715  if ( isdefined( trigger ) )
716  {
717  trigger thread ‪teleport_core_hint_update();
718 
719  // disable teleporters to power is turned on
720  level ‪flag::wait_till( "power_on" );
721 
722  while ( 1 )
723  {
725  {
726  trigger waittill( "trigger" );
727 
728  // link the activated pads
729  for ( i = 0; i < level.teleport.size; i++ )
730  {
731  if ( isdefined( level.teleport[i] ) )
732  {
733  if ( level.teleport[i] == "timer_on" )
734  {
735  level.teleport[i] = "active";
736  level.active_links++;
737  level ‪flag::set( "teleporter_pad_link_"+level.active_links );
738 
739  //AUDIO
740  level thread ‪zm_giant::sndPA_DoVox( "vox_maxis_teleporter_" + i + "active_0" );
741  level ‪util::delay( 10, undefined, &‪zm_audio::sndMusicSystem_PlayState, "teleporter_"+level.active_links );
742 
743  ‪exploder::exploder( "teleporter_" + level.teleport_pad_names[i] + "_linked" );
744  ‪exploder::exploder( "lgt_teleporter_" + level.teleport_pad_names[i] + "_linked" );
745  ‪exploder::exploder_duration( "mainframe_steam", 14.6 );
746 
747  // check for all teleporters active
748  if ( level.active_links == 3 )
749  {
750  ‪exploder::exploder_duration( "mainframe_link_all", 4.6 );
751  ‪exploder::exploder( "mainframe_ambient" );
752  level ‪util::clientNotify( "pap1" ); // Pack-A-Punch door on
753  ‪teleporter_vo( "linkall", trigger );
754  Earthquake( 0.3, 2.0, trigger.origin, 3700 );
755  }
756 
757  // stop the countdown for the teleport pad
758  pad = "trigger_teleport_pad_" + i;
759  trigger_pad = getent( pad, "targetname" );
760  trigger_pad ‪stop_countdown();
761  level ‪util::clientNotify( "TRs" ); // Stop flashing the receiver map light
762  level.active_timer = -1;
763  }
764  }
765  }
766  }
767 
768  wait( .05 );
769  }
770  }
771 }
772 
774 {
775  self notify( "stop_countdown" );
776  level notify ("stop_countdown"); //using this on the new loop timer
777  players = GetPlayers();
778 
779  for( i = 0; i < players.size; i++ )
780  {
781  players[i] notify( "stop_countdown" );
782  }
783 }
784 
785 //-------------------------------------------------------------------------------
786 // checks if any of the teleporter pads are counting down
787 //-------------------------------------------------------------------------------
789 {
790  // have any pads started?
791  if ( isdefined( level.teleport ) )
792  {
793  for ( i = 0; i < level.teleport.size; i++ )
794  {
795  if ( isdefined( level.teleport[i] ) )
796  {
797  if ( level.teleport[i] == "timer_on" )
798  {
799  return true;
800  }
801  }
802  }
803  }
804 
805  return false;
806 }
807 
809 {
810  self endon( "fx_done" );
811 
812  while ( 1 )
813  {
814  players = GetPlayers();
815 
816  wait(1.7);
817 
818  for ( i = 0; i < players.size; i++ )
819  {
820  if ( isdefined( players[i] ) )
821  {
822  if ( self ‪player_is_near_pad( players[i] ) )
823  {
824  ‪util::setClientSysState("levelNotify", "t2d", players[i]);
825  }
826  }
827  }
828  }
829 }
830 
831 
832 // kill anything near the pad
833 function ‪teleport_nuke( max_zombies, range )
834 {
835  zombies = getaispeciesarray( level.zombie_team );
836 
837  zombies = ‪util::get_array_of_closest( self.origin, zombies, undefined, max_zombies, range );
838 
839  for (i = 0; i < zombies.size; i++)
840  {
841  wait (randomfloatrange(0.2, 0.3));
842  if( !IsDefined( zombies[i] ) )
843  {
844  continue;
845  }
846 
848  {
849  continue;
850  }
851 
852  if( !( zombies[i].isdog ) )
853  {
855  }
856 
857  zombies[i] dodamage( 10000, zombies[i].origin );
858  playsoundatposition( "nuked", zombies[i].origin );
859  }
860 }
861 
862 function ‪teleporter_vo( tele_vo_type, location )
863 {
864  if( !isdefined( location ))
865  {
866  self thread ‪teleporter_vo_play( tele_vo_type, 2 );
867  }
868  else
869  {
870  players = GetPlayers();
871  for (i = 0; i < players.size; i++)
872  {
873  if (distance (players[i].origin, location.origin) < 64)
874  {
875  switch ( tele_vo_type )
876  {
877  case "linkall":
878  players[i] thread ‪teleporter_vo_play( "tele_linkall" );
879  break;
880  case "countdown":
881  players[i] thread ‪teleporter_vo_play( "tele_count", 3 );
882  break;
883  }
884  }
885  }
886  }
887 }
888 
889 function ‪teleporter_vo_play( vox_type, pre_wait )
890 {
891  if(!isdefined( pre_wait ))
892  {
893  pre_wait = 0;
894  }
895  wait(pre_wait);
896 // self _zm_audio::create_and_play_dialog( "level", vox_type );
897 }
898 
900 {
901  level endon( "tele_help_end" );
902 
903  while(1)
904  {
905  self waittill("trigger", who);
906 
907  if( level ‪flag::get( "power_on" ) )
908  {
909  who thread ‪teleporter_vo_play( "tele_help" );
910  level notify( "tele_help_end" );
911  }
912 
913  while(IsDefined (who) && (who) IsTouching (self))
914  {
915  wait(0.1);
916  }
917  }
918 }
919 
921 {
922  wait(10);
923 
924  if( !level ‪flag::get( "teleporter_pad_link_3" ) )
925  {
926  self waittill("trigger", who);
927  who thread ‪teleporter_vo_play( "perk_packa_see" );
928  }
929 }
930 
931 
932 //
933 // This should match the perk_wire_fx_client function
934 // waits for the effect to travel along the wire
935 function ‪teleporter_wire_wait( index )
936 {
937  targ = ‪struct::get( "pad_"+index+"_wire" ,"targetname");
938  if ( !IsDefined( targ ) )
939  {
940  return;
941  }
942 
943  while(isDefined(targ))
944  {
945  if(isDefined(targ.target))
946  {
947  target = ‪struct::get(targ.target,"targetname");
948  wait( 0.1 );
949 
950  targ = target;
951  }
952  else
953  {
954  break;
955  }
956  }
957 }
958 
959 // Teleporter Aftereffects
961 {
962  if( GetDvarString( "factoryAftereffectOverride" ) == "-1" )
963  {
964  self thread [[ level.teleport_ae_funcs[RandomInt(level.teleport_ae_funcs.size)] ]]();
965  }
966  else
967  {
968  self thread [[ level.teleport_ae_funcs[int(GetDvarString( "factoryAftereffectOverride" ))] ]]();
969  }
970 }
971 
973 {
974  self shellshock( "explosion", 4 );
975 }
976 
978 {
979  self shellshock( "electrocution", 4 );
980 }
981 
982 // tae indicates to Clientscripts that a teleporter aftereffect should start
983 
985 {
986  ‪util::setClientSysState( "levelNotify", "tae", self );
987 }
988 
989 function ‪teleport_aftereffect_bw_vision( localClientNum )
990 {
991  ‪util::setClientSysState( "levelNotify", "tae", self );
992 }
993 
994 function ‪teleport_aftereffect_red_vision( localClientNum )
995 {
996  ‪util::setClientSysState( "levelNotify", "tae", self );
997 }
998 
999 function ‪teleport_aftereffect_flashy_vision( localClientNum )
1000 {
1001  ‪util::setClientSysState( "levelNotify", "tae", self );
1002 }
1003 
1004 function ‪teleport_aftereffect_flare_vision( localClientNum )
1005 {
1006  ‪util::setClientSysState( "levelNotify", "tae", self );
1007 }
1008 
1010 {
1011  while( !level ‪flag::get( "teleporter_pad_link_3" ) )
1012  {
1013  rand = randomintrange(4,16);
1014  self playsound( "evt_packa_door_hitch" );
1015  wait(rand);
1016  }
1017 }
1018 
1020 {
1021  //DCS: create collision blocker for dog near revive.
1022  collision = ‪Spawn("script_model", (-106, -2294, 216));
1023  collision setmodel("collision_wall_128x128x10");
1024  collision.angles = (0, 37.2, 0);
1025  collision Hide();
1026 
1027  // adding clip for barricade glitch
1028  collision = ‪Spawn("script_model", (-1208, -439, 363));
1029  collision setmodel("collision_wall_128x128x10");
1030  collision.angles = (0, 0, 0);
1031  collision Hide();
1032 }
‪enable
‪function enable(handler)
Definition: _perplayer.gsc:54
‪teleport_aftereffect_fov
‪function teleport_aftereffect_fov()
Definition: zm_giant_teleporter.gsc:984
‪exploder
‪function exploder(exploder_id, n_localclientnumber)
Definition: exploder_shared.csc:297
‪sndCountdown
‪function sndCountdown()
Definition: zm_giant_teleporter.gsc:324
‪activate
‪function activate()
Definition: traps_shared.gsc:655
‪teleport_core_think
‪function teleport_core_think()
Definition: zm_giant_teleporter.gsc:712
‪teleporter_wire_wait
‪function teleporter_wire_wait(index)
Definition: zm_giant_teleporter.gsc:935
‪teleport_pad_active_think
‪function teleport_pad_active_think(index)
Definition: zm_giant_teleporter.gsc:371
‪play_tele_help_vox
‪function play_tele_help_vox()
Definition: zm_giant_teleporter.gsc:899
‪setClientSysState
‪function setClientSysState(sSysName, sSysState, player)
Definition: util_shared.gsc:1369
‪stop_countdown
‪function stop_countdown()
Definition: zm_giant_teleporter.gsc:773
‪teleport_nuke
‪function teleport_nuke(max_zombies, range)
Definition: zm_giant_teleporter.gsc:833
‪sndMusicSystem_StopAndFlush
‪function sndMusicSystem_StopAndFlush()
Definition: _zm_audio.gsc:1155
‪packa_door_reminder
‪function packa_door_reminder()
Definition: zm_giant_teleporter.gsc:1009
‪zombie_head_gib
‪function zombie_head_gib(attacker, means_of_death)
Definition: zombie_utility.gsc:2952
‪play
‪function play(animation, v_origin_or_ent, v_angles_or_tag, n_rate=1, n_blend_in=.2, n_blend_out=.2, n_lerp, b_link=false)
Definition: animation_shared.csc:44
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪teleport_aftereffect_shellshock_electric
‪function teleport_aftereffect_shellshock_electric()
Definition: zm_giant_teleporter.gsc:977
‪__main__
‪function __main__()
Definition: zm_giant_teleporter.gsc:63
‪teleport_aftereffects
‪function teleport_aftereffects()
Definition: zm_giant_teleporter.gsc:960
‪teleport_players
‪function teleport_players()
Definition: zm_giant_teleporter.gsc:520
‪teleport_aftereffect_bw_vision
‪function teleport_aftereffect_bw_vision(localClientNum)
Definition: zm_giant_teleporter.gsc:989
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪play_packa_see_vox
‪function play_packa_see_vox()
Definition: zm_giant_teleporter.gsc:920
‪pad_manager
‪function pad_manager()
Definition: zm_giant_teleporter.gsc:162
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪teleporter_vo_play
‪function teleporter_vo_play(vox_type, pre_wait)
Definition: zm_giant_teleporter.gsc:889
‪is_player_valid
‪function is_player_valid(player, checkIgnoreMeFlag, ignore_laststand_players)
Definition: skeleton.gsc:256
‪teleport_pad_countdown
‪function teleport_pad_countdown(index, time)
Definition: zm_giant_teleporter.gsc:287
‪teleporter_vo
‪function teleporter_vo(tele_vo_type, location)
Definition: zm_giant_teleporter.gsc:862
‪teleport_aftereffect_flashy_vision
‪function teleport_aftereffect_flashy_vision(localClientNum)
Definition: zm_giant_teleporter.gsc:999
‪clock_timer
‪function clock_timer()
Definition: zm_giant_teleporter.gsc:352
‪teleport_2d_audio
‪function teleport_2d_audio()
Definition: zm_giant_teleporter.gsc:808
‪player_teleporting
‪function player_teleporting(index)
Definition: zm_giant_teleporter.gsc:401
‪get_array_of_closest
‪function get_array_of_closest(org, array, excluders, max, maxdist)
Definition: util_shared.gsc:2943
‪teleport_aftereffect_red_vision
‪function teleport_aftereffect_red_vision(localClientNum)
Definition: zm_giant_teleporter.gsc:994
‪minus_to_player_score
‪function minus_to_player_score(points)
Definition: _zm_score.gsc:551
‪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
‪sndMusicSystem_PlayState
‪function sndMusicSystem_PlayState(state)
Definition: _zm_audio.gsc:1042
‪REGISTER_SYSTEM_EX
‪#define REGISTER_SYSTEM_EX(__sys, __func_init_preload, __func_init_postload, __reqs)
Definition: shared.gsh:209
‪start_timer
‪function start_timer(time, stop_notify)
Definition: _zm_timer.gsc:23
‪__init__
‪function __init__()
Definition: zm_giant_teleporter.gsc:32
‪ZM_TRAP_ELECTRIC_MAX
‪#define ZM_TRAP_ELECTRIC_MAX
Definition: zm_giant_teleporter.gsc:500
‪deactivate
‪function deactivate()
Definition: traps_shared.gsc:649
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪sndPA_DoVox
‪function sndPA_DoVox(alias, delay, nowait=false)
Definition: zm_giant.gsc:942
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪init_pack_door
‪function init_pack_door()
Definition: zm_giant_teleporter.gsc:109
‪register_info
‪function register_info(type, name, version, lerp_step_count)
Definition: visionset_mgr_shared.csc:334
‪init
‪function init()
Definition: struct.csc:1
‪teleport_aftereffect_shellshock
‪function teleport_aftereffect_shellshock()
Definition: zm_giant_teleporter.gsc:972
‪teleport_trigger_invisible
‪function teleport_trigger_invisible(enable)
Definition: zm_giant_teleporter.gsc:462
‪clientNotify
‪function clientNotify(event)
Definition: util_shared.gsc:1416
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪teleport_pad_think
‪function teleport_pad_think(index)
Definition: zm_giant_teleporter.gsc:192
‪dog_blocker_clip
‪function dog_blocker_clip()
Definition: zm_giant_teleporter.gsc:1019
‪teleport_core_hint_update
‪function teleport_core_hint_update()
Definition: zm_giant_teleporter.gsc:681
‪teleport_pad_player_fx
‪function teleport_pad_player_fx(duration)
Definition: zm_giant_teleporter.gsc:502
‪special_powerup_drop
‪function special_powerup_drop(drop_point)
Definition: _zm_powerups.gsc:720
‪teleport_aftereffect_flare_vision
‪function teleport_aftereffect_flare_vision(localClientNum)
Definition: zm_giant_teleporter.gsc:1004
‪teleport_pads_are_active
‪function teleport_pads_are_active()
Definition: zm_giant_teleporter.gsc:788
‪exploder_duration
‪function exploder_duration(name, duration)
Definition: exploder_shared.csc:660
‪is_magic_bullet_shield_enabled
‪function is_magic_bullet_shield_enabled(ent)
Definition: _zm_utility.gsc:3474
‪player_is_near_pad
‪function player_is_near_pad(player)
Definition: zm_giant_teleporter.gsc:478
‪play_sound_2D
‪function play_sound_2D(sound)
Definition: _zm_utility.gsc:3493