Advertisement
Guest User

Untitled

a guest
Sep 7th, 2016
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.76 KB | None | 0 0
  1. // Keep in mind this file is just a copy of nazi_zombie_factory_teleporter.gsc. It has .been adapted for general use (isDefined checks and so on)
  2. #include maps\ugx_modder_help;
  3.  
  4. #include common_scripts\utility;
  5. #include maps\_utility;
  6. #include maps\_zombiemode_utility;
  7.  
  8. #include maps\dlc3_code;
  9.  
  10. //-------------------------------------------------------------------------------
  11. // setup and kick off think functions
  12. //-------------------------------------------------------------------------------
  13. teleporter_init()
  14. {
  15. level.teleport = [];
  16. level.active_links = 0;
  17. level.countdown = 0;
  18.  
  19. level.teleport_delay = 2;
  20. level.teleport_cost = 1500;
  21. level.teleport_cooldown = 5;
  22. level.is_cooldown = false;
  23. level.active_timer = -1;
  24. level.teleport_time = 0;
  25.  
  26. flag_init( "teleporter_pad_link_1" );
  27. flag_init( "teleporter_pad_link_2" );
  28. flag_init( "teleporter_pad_link_3" );
  29.  
  30. wait_for_all_players();
  31.  
  32. // Get the Pad triggers
  33. for ( i=0; i<3; i++ )
  34. {
  35. trig = GetEnt( "trigger_teleport_pad_" + i, "targetname");
  36. if ( IsDefined(trig) )
  37. {
  38. level.teleporter_pad_trig[i] = trig;
  39. }
  40. }
  41.  
  42. thread teleport_pad_think( 0 );
  43. thread teleport_pad_think( 1 );
  44. thread teleport_pad_think( 2 );
  45. thread teleport_core_think();
  46.  
  47. thread start_black_room_fx();
  48. thread init_pack_door();
  49.  
  50. SetDvar( "factoryAftereffectOverride", "-1" );
  51.  
  52. packapunch_see = getent( "packapunch_see", "targetname" );
  53. if(isdefined( packapunch_see ) )
  54. {
  55. packapunch_see thread play_packa_see_vox();
  56. }
  57.  
  58. level.teleport_ae_funcs = [];
  59.  
  60. if( !IsSplitscreen() )
  61. {
  62. level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_fov;
  63. }
  64. level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_shellshock;
  65. level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_shellshock_electric;
  66. level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_bw_vision;
  67. level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_red_vision;
  68. level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_flashy_vision;
  69. level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_flare_vision;
  70. }
  71.  
  72. //-------------------------------------------------------------------------------
  73. // sets up up the pack a punch door
  74. //-------------------------------------------------------------------------------
  75. init_pack_door()
  76. {
  77. door = getent( "pack_door", "targetname" );
  78. if(modderHelp( door, "Missing Pack a Punch door with Targetname KVP 'pack_door'." )) return;
  79. door movez( -50, 0.05, 0 );
  80. wait(1.0);
  81.  
  82. flag_wait( "all_players_connected" );
  83.  
  84. door movez( 50, 1.5, 0 );
  85. door playsound( "packa_door_1" );
  86.  
  87. // Open slightly the first two times
  88. flag_wait( "teleporter_pad_link_1" );
  89. door movez( -35, 1.5, 1 );
  90. door playsound( "packa_door_2" );
  91. door thread packa_door_reminder();
  92. wait(2);
  93.  
  94. // Second link
  95. flag_wait( "teleporter_pad_link_2" );
  96. door movez( -25, 1.5, 1 );
  97. door playsound( "packa_door_2" );
  98. wait(2);
  99.  
  100. // Final Link
  101. flag_wait( "teleporter_pad_link_3" );
  102.  
  103. door movez( -60, 1.5, 1 );
  104. door playsound( "packa_door_2" );
  105.  
  106. clip = getentarray( "pack_door_clip", "targetname" );
  107. for ( i = 0; i < clip.size; i++ )
  108. {
  109. clip[i] connectpaths();
  110. clip[i] delete();
  111. }
  112. }
  113.  
  114. //-------------------------------------------------------------------------------
  115. // handles activating and deactivating pads for cool down
  116. //-------------------------------------------------------------------------------
  117. pad_manager()
  118. {
  119. for ( i = 0; i < level.teleporter_pad_trig.size; i++ )
  120. {
  121. // shut off the pads
  122. level.teleporter_pad_trig[i] sethintstring( &"ZOMBIE_TELEPORT_COOLDOWN" );
  123. level.teleporter_pad_trig[i] teleport_trigger_invisible( false );
  124. }
  125.  
  126. level.is_cooldown = true;
  127. wait( level.teleport_cooldown );
  128. level.is_cooldown = false;
  129.  
  130. for ( i = 0; i < level.teleporter_pad_trig.size; i++ )
  131. {
  132. if ( level.teleporter_pad_trig[i].teleport_active )
  133. {
  134. level.teleporter_pad_trig[i] sethintstring( &"ZOMBIE_TELEPORT_TO_CORE" );
  135. }
  136. else
  137. {
  138. level.teleporter_pad_trig[i] sethintstring( &"ZOMBIE_LINK_TPAD" );
  139. }
  140. // level.teleporter_pad_trig[i] teleport_trigger_invisible( false );
  141. }
  142. }
  143.  
  144. //-------------------------------------------------------------------------------
  145. // staggers the black room fx
  146. //-------------------------------------------------------------------------------
  147. start_black_room_fx()
  148. {
  149. for ( i = 901; i <= 904; i++ )
  150. {
  151. wait( 1 );
  152. exploder( i );
  153. }
  154. }
  155.  
  156. //-------------------------------------------------------------------------------
  157. // handles turning on the pad and waiting for link
  158. //-------------------------------------------------------------------------------
  159. teleport_pad_think( index )
  160. {
  161. if(!isDefined(level.teleporter_pad_trig)) return; //UGX - no teleporters on map, stop
  162. if(!isDefined(level.teleporter_pad_trig[index])) return; // UGX - teleporter doesn't exist, stop
  163.  
  164. tele_help = getent( "tele_help_" + index, "targetname" );
  165. if(isdefined( tele_help ) )
  166. {
  167. tele_help thread play_tele_help_vox();
  168. }
  169.  
  170. active = false;
  171.  
  172. // init the pad
  173. level.teleport[index] = "waiting";
  174.  
  175. trigger = level.teleporter_pad_trig[ index ];
  176.  
  177. trigger setcursorhint( "HINT_NOICON" );
  178. trigger sethintstring( &"ZOMBIE_FLAMES_UNAVAILABLE" );
  179.  
  180. flag_wait( "electricity_on" );
  181.  
  182. trigger sethintstring( &"ZOMBIE_POWER_UP_TPAD" );
  183. trigger.teleport_active = false;
  184.  
  185. if ( isdefined( trigger ) )
  186. {
  187. while ( !active )
  188. {
  189. trigger waittill( "trigger" );
  190.  
  191. if ( level.active_links < 3 )
  192. {
  193. trigger_core = getent( "trigger_teleport_core", "targetname" );
  194. }
  195.  
  196. // when one starts the others disabled
  197. for ( i=0; i<level.teleporter_pad_trig.size; i++ )
  198. {
  199. level.teleporter_pad_trig[ i ] teleport_trigger_invisible( true );
  200. }
  201. level.teleport[index] = "timer_on";
  202.  
  203. // start the countdown back to the core
  204. trigger thread teleport_pad_countdown( index, 30 );
  205. teleporter_vo( "countdown", trigger );
  206.  
  207. // wait for the countdown
  208. while ( level.teleport[index] == "timer_on" )
  209. {
  210. wait( .05 );
  211. }
  212.  
  213. // core was activated in time
  214. if ( level.teleport[index] == "active" )
  215. {
  216. active = true;
  217. ClientNotify( "pw" + index ); // pad wire #
  218.  
  219. //AUDIO
  220. ClientNotify( "tp" + index ); // Teleporter #
  221.  
  222. // MM - Auto teleport the first time
  223. teleporter_wire_wait( index );
  224.  
  225. // trigger teleport_trigger_invisible( true );
  226. trigger thread player_teleporting( index );
  227. }
  228. else
  229. {
  230. // Reenable triggers
  231. for ( i=0; i<level.teleporter_pad_trig.size; i++ )
  232. {
  233. level.teleporter_pad_trig[ i ] teleport_trigger_invisible( false );
  234. }
  235. }
  236. wait( .05 );
  237. }
  238.  
  239. if ( level.is_cooldown )
  240. {
  241. // shut off the pads
  242. trigger sethintstring( &"ZOMBIE_TELEPORT_COOLDOWN" );
  243. trigger teleport_trigger_invisible( false );
  244. trigger.teleport_active = true;
  245. }
  246. else
  247. {
  248. trigger thread teleport_pad_active_think( index );
  249. }
  250. }
  251. }
  252.  
  253. //-------------------------------------------------------------------------------
  254. // updates the teleport pad timer
  255. //-------------------------------------------------------------------------------
  256. teleport_pad_countdown( index, time )
  257. {
  258. self endon( "stop_countdown" );
  259.  
  260. // iprintlnbold( &"ZOMBIE_START_TPAD" );
  261.  
  262. if ( level.active_timer < 0 )
  263. {
  264. level.active_timer = index;
  265. }
  266.  
  267. level.countdown++;
  268.  
  269. //AUDIO
  270. ClientNotify( "pac" + index );
  271. ClientNotify( "TRf" ); // Teleporter receiver map light flash
  272.  
  273. // start timer for all players
  274. // Add a second for VO sync
  275. players = get_players();
  276. for( i = 0; i < players.size; i++ )
  277. {
  278. players[i] thread maps\_zombiemode_timer::start_timer( time+1, "stop_countdown" );
  279. }
  280. wait( time+1 );
  281.  
  282. if ( level.active_timer == index )
  283. {
  284. level.active_timer = -1;
  285. }
  286.  
  287. // ran out of time to activate teleporter
  288. level.teleport[index] = "timer_off";
  289. // iprintlnbold( "out of time" );
  290. ClientNotify( "TRs" ); // Stop flashing the receiver map light
  291.  
  292. level.countdown--;
  293. }
  294.  
  295. //-------------------------------------------------------------------------------
  296. // handles teleporting players when triggered
  297. //-------------------------------------------------------------------------------
  298. teleport_pad_active_think( index )
  299. {
  300. // self endon( "player_teleported" );
  301.  
  302. // link established, can be used to teleport
  303. self setcursorhint( "HINT_NOICON" );
  304. self.teleport_active = true;
  305.  
  306. user = undefined;
  307.  
  308. // self sethintstring( &"ZOMBIE_TELEPORT_TO_CORE" );
  309. // self teleport_trigger_invisible( false );
  310.  
  311. while ( 1 )
  312. {
  313. self waittill( "trigger", user );
  314.  
  315. if ( is_player_valid( user ) && user.score >= level.teleport_cost && !level.is_cooldown )
  316. {
  317. for ( i = 0; i < level.teleporter_pad_trig.size; i++ )
  318. {
  319. level.teleporter_pad_trig[i] teleport_trigger_invisible( true );
  320. }
  321.  
  322. user maps\_zombiemode_score::minus_to_player_score( level.teleport_cost );
  323.  
  324. // Non-threaded so the trigger doesn't activate before the cooldown
  325. self player_teleporting( index );
  326. }
  327. }
  328. }
  329.  
  330. //-------------------------------------------------------------------------------
  331. // handles moving the players and fx, etc...moved out so it can be threaded
  332. //-------------------------------------------------------------------------------
  333. player_teleporting( index )
  334. {
  335. time_since_last_teleport = GetTime() - level.teleport_time;
  336.  
  337. // begin the teleport
  338. // add 3rd person fx
  339. teleport_pad_start_exploder( index );
  340.  
  341. // play startup fx at the core
  342. exploder( 105 );
  343.  
  344. //AUDIO
  345. ClientNotify( "tpw" + index );
  346.  
  347. // start fps fx
  348. self thread teleport_pad_player_fx( level.teleport_delay );
  349.  
  350. //AUDIO
  351. self thread teleport_2d_audio();
  352.  
  353. // Activate the TP zombie kill effect
  354. self thread teleport_nuke( 20, 300); // Max 20 zombies and range 300
  355.  
  356. // wait a bit
  357. wait( level.teleport_delay );
  358.  
  359. // end fps fx
  360. self notify( "fx_done" );
  361.  
  362. // add 3rd person beam fx
  363. teleport_pad_end_exploder( index );
  364.  
  365. // teleport the players
  366. self teleport_players();
  367.  
  368. //AUDIO
  369. ClientNotify( "tpc" + index );
  370.  
  371. // only need this if it's not cooling down
  372. if ( level.is_cooldown == false )
  373. {
  374. thread pad_manager();
  375. }
  376.  
  377. // Now spawn a powerup goodie after a few seconds
  378. wait( 2.0 );
  379. ss = getstruct( "teleporter_powerup", "targetname" );
  380. if ( IsDefined( ss ) )
  381. {
  382. ss thread maps\_zombiemode_powerups::special_powerup_drop(ss.origin);
  383. }
  384. else
  385. {
  386. modderHelp( undefined, "Missing struct with Targetname KVP 'teleporter_powerup'." );
  387. }
  388.  
  389. // Special for teleporting too much. The Dogs attack!
  390. if ( time_since_last_teleport < 60000 && level.active_links == 3 && level.round_number > 20 )
  391. {
  392. dog_spawners = GetEntArray( "special_dog_spawner", "targetname" );
  393. if( modderHelp( dog_spawners, "Missing power up dog with Targetname KVP 'special_dog_spawner'." ) )
  394. {
  395. maps\_zombiemode_dogs::special_dog_spawn( undefined, 4 );
  396. }
  397. //iprintlnbold( "Samantha Sez: No Powerup For You!" );
  398. thread play_sound_2d( "sam_nospawn" );
  399. }
  400. level.teleport_time = GetTime();
  401. }
  402.  
  403. //-------------------------------------------------------------------------------
  404. // pad fx for the start of the teleport
  405. //-------------------------------------------------------------------------------
  406. teleport_pad_start_exploder( index )
  407. {
  408. switch ( index )
  409. {
  410. case 0:
  411. exploder( 202 );
  412. break;
  413.  
  414. case 1:
  415. exploder( 302 );
  416. break;
  417.  
  418. case 2:
  419. exploder( 402 );
  420. break;
  421. }
  422. }
  423.  
  424. //-------------------------------------------------------------------------------
  425. // pad fx for the end of the teleport
  426. //-------------------------------------------------------------------------------
  427. teleport_pad_end_exploder( index )
  428. {
  429. switch ( index )
  430. {
  431. case 0:
  432. exploder( 201 );
  433. break;
  434.  
  435. case 1:
  436. exploder( 301 );
  437. break;
  438.  
  439. case 2:
  440. exploder( 401 );
  441. break;
  442. }
  443. }
  444.  
  445. //-------------------------------------------------------------------------------
  446. // used to enable / disable the pad use trigger for players
  447. //-------------------------------------------------------------------------------
  448. teleport_trigger_invisible( enable )
  449. {
  450. players = getplayers();
  451.  
  452. for ( i = 0; i < players.size; i++ )
  453. {
  454. if ( isdefined( players[i] ) )
  455. {
  456. self SetInvisibleToPlayer( players[i], enable );
  457. }
  458. }
  459. }
  460.  
  461. //-------------------------------------------------------------------------------
  462. // checks if player is within radius of the teleport pad
  463. //-------------------------------------------------------------------------------
  464. player_is_near_pad( player )
  465. {
  466. radius = 88;
  467. scale_factor = 2;
  468.  
  469. dist = Distance2D( player.origin, self.origin );
  470. dist_touching = radius * scale_factor;
  471.  
  472. if ( dist < dist_touching )
  473. {
  474. return true;
  475. }
  476.  
  477. return false;
  478. }
  479.  
  480.  
  481. //-------------------------------------------------------------------------------
  482. // this is the 1st person effect seen when touching the teleport pad
  483. //-------------------------------------------------------------------------------
  484. teleport_pad_player_fx( delay )
  485. {
  486. self endon( "fx_done" );
  487.  
  488. while ( 1 )
  489. {
  490. players = getplayers();
  491. for ( i = 0; i < players.size; i++ )
  492. {
  493. if ( isdefined( players[i] ) )
  494. {
  495. if ( self player_is_near_pad( players[i] ) )
  496. {
  497. players[i] SetTransported( delay );
  498. }
  499. else
  500. {
  501. players[i] SetTransported( 0 );
  502. }
  503. }
  504. }
  505. wait ( .05 );
  506. }
  507. }
  508.  
  509. //-------------------------------------------------------------------------------
  510. // send players back to the core
  511. //-------------------------------------------------------------------------------
  512. teleport_players()
  513. {
  514. player_radius = 16;
  515.  
  516. players = getplayers();
  517.  
  518. core_pos = [];
  519. occupied = [];
  520. image_room = [];
  521. players_touching = []; // the players that will actually be teleported
  522.  
  523. player_idx = 0;
  524.  
  525. prone_offset = (0, 0, 49);
  526. crouch_offset = (0, 0, 20);
  527. stand_offset = (0, 0, 0);
  528.  
  529. // send players to a black room to flash images for a few seconds
  530. for ( i = 0; i < 4; i++ )
  531. {
  532. core_pos[i] = getent( "origin_teleport_player_" + i, "targetname" );
  533. modderHelp( core_pos[i], "Missing teleport destination script origin with Targetname KVP 'origin_teleport_player_" + i + "'." );
  534. occupied[i] = false;
  535. image_room[i] = getent( "teleport_room_" + i, "targetname" );
  536. modderHelp( image_room[i], "Missing teleport room script origin with Targetname KVP 'teleport_room_" + i + "'." );
  537.  
  538. if ( isdefined( players[i] ) )
  539. {
  540. players[i] settransported( 0 );
  541.  
  542. if ( self player_is_near_pad( players[i] ) )
  543. {
  544. players_touching[player_idx] = i;
  545. player_idx++;
  546.  
  547. if ( isdefined( image_room[i] ) && !players[i] maps\_laststand::player_is_in_laststand() )
  548. {
  549. players[i] disableOffhandWeapons();
  550. players[i] disableweapons();
  551. if( players[i] getstance() == "prone" )
  552. {
  553. desired_origin = image_room[i].origin + prone_offset;
  554. }
  555. else if( players[i] getstance() == "crouch" )
  556. {
  557. desired_origin = image_room[i].origin + crouch_offset;
  558. }
  559. else
  560. {
  561. desired_origin = image_room[i].origin + stand_offset;
  562. }
  563.  
  564. players[i].teleport_origin = spawn( "script_origin", players[i].origin );
  565. players[i].teleport_origin.angles = players[i].angles;
  566. players[i] linkto( players[i].teleport_origin );
  567. players[i].teleport_origin.origin = desired_origin;
  568. players[i] FreezeControls( true );
  569. wait_network_frame();
  570.  
  571. if( IsDefined( players[i] ) )
  572. {
  573. setClientSysState( "levelNotify", "black_box_start", players[i] );
  574. players[i].teleport_origin.angles = image_room[i].angles;
  575. }
  576. }
  577. }
  578. }
  579. }
  580.  
  581. wait( 2 );
  582.  
  583. // Nuke anything at the core
  584. core = GetEnt( "trigger_teleport_core", "targetname" );
  585. modderHelp( core, "Missing mainframe trigger with Targetname KVP 'trigger_teleport_core'." );
  586. core thread teleport_nuke( undefined, 300); // Max any zombies at the pad range 300
  587.  
  588. // check if any players are standing on top of core teleport positions
  589. for ( i = 0; i < players.size; i++ )
  590. {
  591. if ( isdefined( players[i] ) )
  592. {
  593. for ( j = 0; j < 4; j++ )
  594. {
  595. if ( !occupied[j] )
  596. {
  597. dist = Distance2D( core_pos[j].origin, players[i].origin );
  598. if ( dist < player_radius )
  599. {
  600. occupied[j] = true;
  601. }
  602. }
  603. }
  604. setClientSysState( "levelNotify", "black_box_end", players[i] );
  605. }
  606. }
  607.  
  608. wait_network_frame();
  609.  
  610. // move players to the core
  611. for ( i = 0; i < players_touching.size; i++ )
  612. {
  613. player_idx = players_touching[i];
  614. player = players[player_idx];
  615.  
  616. if ( !IsDefined( player ) )
  617. {
  618. continue;
  619. }
  620.  
  621. // find a free space at the core
  622. slot = i;
  623. start = 0;
  624. while ( occupied[slot] && start < 4 )
  625. {
  626. start++;
  627. slot++;
  628. if ( slot >= 4 )
  629. {
  630. slot = 0;
  631. }
  632. }
  633. occupied[slot] = true;
  634. pos_name = "origin_teleport_player_" + slot;
  635. teleport_core_pos = getent( pos_name, "targetname" );
  636. modderHelp( teleport_core_pos, "Missing teleport core position with Targetname KVP " + pos_name + "." );
  637.  
  638. player unlink();
  639.  
  640. assert( IsDefined( player.teleport_origin ) );
  641. player.teleport_origin delete();
  642. player.teleport_origin = undefined;
  643.  
  644. player enableweapons();
  645. player enableoffhandweapons();
  646. player setorigin( core_pos[slot].origin );
  647. player setplayerangles( core_pos[slot].angles );
  648. player FreezeControls( false );
  649. player thread teleport_aftereffects();
  650.  
  651. vox_rand = randomintrange(1,100); //RARE: Sets up rare post-teleport line
  652.  
  653. if( vox_rand <= 2 )
  654. {
  655. //player teleporter_vo( "vox_tele_sick_rare" );
  656. //iprintlnbold( "Hey, this is the random teleport sickness line!" );
  657. }
  658. else
  659. {
  660. player teleporter_vo( "vox_tele_sick" );
  661. }
  662.  
  663. player achievement_notify( "DLC3_ZOMBIE_FIVE_TELEPORTS" );
  664. }
  665.  
  666. // play beam fx at the core
  667. exploder( 106 );
  668. }
  669.  
  670. //-------------------------------------------------------------------------------
  671. // updates the hint string when countdown is started and expired
  672. //-------------------------------------------------------------------------------
  673. teleport_core_hint_update()
  674. {
  675. self setcursorhint( "HINT_NOICON" );
  676.  
  677. while ( 1 )
  678. {
  679. // can't use teleporters until power is on
  680. if ( !flag( "electricity_on" ) )
  681. {
  682. self sethintstring( &"ZOMBIE_FLAMES_UNAVAILABLE" );
  683. }
  684. else if ( teleport_pads_are_active() )
  685. {
  686. self sethintstring( &"ZOMBIE_LINK_TPAD" );
  687. }
  688. else if ( level.active_links == 0 )
  689. {
  690. self sethintstring( &"ZOMBIE_INACTIVE_TPAD" );
  691. }
  692. else
  693. {
  694. self sethintstring( "" );
  695. }
  696.  
  697. wait( .05 );
  698. }
  699. }
  700.  
  701. //-------------------------------------------------------------------------------
  702. // establishes the link between teleporter pads and the core
  703. //-------------------------------------------------------------------------------
  704. teleport_core_think()
  705. {
  706. trigger = getent( "trigger_teleport_core", "targetname" );
  707. if ( isdefined( trigger ) )
  708. {
  709. trigger thread teleport_core_hint_update();
  710.  
  711. // disable teleporters to power is turned on
  712. flag_wait( "electricity_on" );
  713.  
  714. while ( 1 )
  715. {
  716. if ( teleport_pads_are_active() )
  717. {
  718. trigger waittill( "trigger" );
  719.  
  720. // trigger teleport_trigger_invisible( true );
  721.  
  722. // iprintlnbold( &"ZOMBIE_LINK_ACTIVE" );
  723.  
  724. // link the activated pads
  725. for ( i = 0; i < level.teleport.size; i++ )
  726. {
  727. if ( isdefined( level.teleport[i] ) )
  728. {
  729. if ( level.teleport[i] == "timer_on" )
  730. {
  731. level.teleport[i] = "active";
  732. level.active_links++;
  733. flag_set( "teleporter_pad_link_"+level.active_links );
  734.  
  735. //AUDIO
  736. ClientNotify( "scd" + i );
  737.  
  738. teleport_core_start_exploder( i );
  739.  
  740. // check for all teleporters active
  741. if ( level.active_links == 3 )
  742. {
  743. exploder( 101 );
  744. ClientNotify( "pap1" ); // Pack-A-Punch door on
  745. teleporter_vo( "linkall", trigger );
  746. if( level.round_number <= 7 )
  747. {
  748. achievement_notify( "DLC3_ZOMBIE_FAST_LINK" );
  749. }
  750. Earthquake( 0.3, 2.0, trigger.origin, 3700 );
  751. }
  752.  
  753. // stop the countdown for the teleport pad
  754. pad = "trigger_teleport_pad_" + i;
  755. trigger_pad = getent( pad, "targetname" );
  756. trigger_pad stop_countdown();
  757. ClientNotify( "TRs" ); // Stop flashing the receiver map light
  758. level.active_timer = -1;
  759. }
  760. }
  761. }
  762. }
  763.  
  764. wait( .05 );
  765. }
  766. }
  767. else
  768. {
  769. modderHelp( undefined, "Missing mainframe trigger with Targetname KVP 'trigger_teleport_core'." );
  770. }
  771. }
  772.  
  773. stop_countdown()
  774. {
  775. self notify( "stop_countdown" );
  776. players = get_players();
  777.  
  778. for( i = 0; i < players.size; i++ )
  779. {
  780. players[i] notify( "stop_countdown" );
  781. }
  782. }
  783.  
  784. //-------------------------------------------------------------------------------
  785. // checks if any of the teleporter pads are counting down
  786. //-------------------------------------------------------------------------------
  787. teleport_pads_are_active()
  788. {
  789. // have any pads started?
  790. if ( isdefined( level.teleport ) )
  791. {
  792. for ( i = 0; i < level.teleport.size; i++ )
  793. {
  794. if ( isdefined( level.teleport[i] ) )
  795. {
  796. if ( level.teleport[i] == "timer_on" )
  797. {
  798. return true;
  799. }
  800. }
  801. }
  802. }
  803.  
  804. return false;
  805. }
  806.  
  807. //-------------------------------------------------------------------------------
  808. // starts the exploder for the teleport pad fx
  809. //-------------------------------------------------------------------------------
  810. teleport_core_start_exploder( index )
  811. {
  812. switch ( index )
  813. {
  814. case 0:
  815. exploder( 102 );
  816. break;
  817.  
  818. case 1:
  819. exploder( 103 );
  820. break;
  821.  
  822. case 2:
  823. exploder( 104 );
  824. break;
  825. }
  826. }
  827.  
  828. teleport_2d_audio()
  829. {
  830. self endon( "fx_done" );
  831.  
  832. while ( 1 )
  833. {
  834. players = getplayers();
  835.  
  836. wait(1.7);
  837.  
  838. for ( i = 0; i < players.size; i++ )
  839. {
  840. if ( isdefined( players[i] ) )
  841. {
  842. if ( self player_is_near_pad( players[i] ) )
  843. {
  844. setClientSysState("levelNotify", "t2d", players[i]);
  845. }
  846. }
  847. }
  848. }
  849. }
  850.  
  851.  
  852. // kill anything near the pad
  853. teleport_nuke( max_zombies, range )
  854. {
  855. zombies = getaispeciesarray("axis");
  856.  
  857. zombies = get_array_of_closest( self.origin, zombies, undefined, max_zombies, range );
  858.  
  859. for (i = 0; i < zombies.size; i++)
  860. {
  861. wait (randomfloatrange(0.2, 0.3));
  862. if( !IsDefined( zombies[i] ) )
  863. {
  864. continue;
  865. }
  866.  
  867. if( is_magic_bullet_shield_enabled( zombies[i] ) )
  868. {
  869. continue;
  870. }
  871.  
  872. if( !( zombies[i] enemy_is_dog() ) )
  873. {
  874. zombies[i] maps\_zombiemode_spawner::zombie_head_gib();
  875. }
  876.  
  877. zombies[i] dodamage( 10000, zombies[i].origin );
  878. playsoundatposition( "nuked", zombies[i].origin );
  879. }
  880. }
  881.  
  882. teleporter_vo( tele_vo_type, location )
  883. {
  884. if( !isdefined( location ))
  885. {
  886. self thread teleporter_vo_play( tele_vo_type, 2 );
  887. }
  888. else
  889. {
  890. players = get_players();
  891. for (i = 0; i < players.size; i++)
  892. {
  893. if (distance (players[i].origin, location.origin) < 64)
  894. {
  895. switch ( tele_vo_type )
  896. {
  897. case "linkall":
  898. players[i] thread teleporter_vo_play( "vox_tele_linkall" );
  899. break;
  900. case "countdown":
  901. players[i] thread teleporter_vo_play( "vox_tele_count", 3 );
  902. break;
  903. }
  904. }
  905. }
  906. }
  907. }
  908.  
  909. teleporter_vo_play( vox_type, pre_wait )
  910. {
  911. if(!isdefined( pre_wait ))
  912. {
  913. pre_wait = 0;
  914. }
  915. index = maps\_zombiemode_weapons::get_player_index(self);
  916. plr = "plr_" + index + "_";
  917. wait(pre_wait);
  918. self create_and_play_dialog( plr, vox_type, 0.25 );
  919. }
  920.  
  921. play_tele_help_vox()
  922. {
  923. level endon( "tele_help_end" );
  924.  
  925. while(1)
  926. {
  927. self waittill("trigger", who);
  928.  
  929. if( flag( "electricity_on" ) )
  930. {
  931. who thread teleporter_vo_play( "vox_tele_help" );
  932. level notify( "tele_help_end" );
  933. }
  934.  
  935. while(IsDefined (who) && (who) IsTouching (self))
  936. {
  937. wait(0.1);
  938. }
  939. }
  940. }
  941.  
  942. play_packa_see_vox()
  943. {
  944. wait(10);
  945.  
  946. if( !flag( "teleporter_pad_link_3" ) )
  947. {
  948. self waittill("trigger", who);
  949. who thread teleporter_vo_play( "vox_perk_packa_see" );
  950. }
  951. }
  952.  
  953.  
  954. //
  955. // This should match the perk_wire_fx_client function
  956. // waits for the effect to travel along the wire
  957. teleporter_wire_wait( index )
  958. {
  959. targ = getstruct( "pad_"+index+"_wire" ,"targetname");
  960. if ( !IsDefined( targ ) )
  961. {
  962. return;
  963. }
  964.  
  965. while(isDefined(targ))
  966. {
  967. if(isDefined(targ.target))
  968. {
  969. target = getstruct(targ.target,"targetname");
  970. wait( 0.1 );
  971.  
  972. targ = target;
  973. }
  974. else
  975. {
  976. break;
  977. }
  978. }
  979. }
  980.  
  981. // Teleporter Aftereffects
  982. teleport_aftereffects()
  983. {
  984. if( GetDvar( "factoryAftereffectOverride" ) == "-1" )
  985. {
  986. self thread [[ level.teleport_ae_funcs[RandomInt(level.teleport_ae_funcs.size)] ]]();
  987. }
  988. else
  989. {
  990. self thread [[ level.teleport_ae_funcs[int(GetDvar( "factoryAftereffectOverride" ))] ]]();
  991. }
  992. }
  993.  
  994. teleport_aftereffect_shellshock()
  995. {
  996. println( "*** Explosion Aftereffect***\n" );
  997. self shellshock( "explosion", 4 );
  998. }
  999.  
  1000. teleport_aftereffect_shellshock_electric()
  1001. {
  1002. println( "***Electric Aftereffect***\n" );
  1003. self shellshock( "electrocution", 4 );
  1004. }
  1005.  
  1006. // tae indicates to Clientscripts that a teleporter aftereffect should start
  1007.  
  1008. teleport_aftereffect_fov()
  1009. {
  1010. setClientSysState( "levelNotify", "tae", self );
  1011. }
  1012.  
  1013. teleport_aftereffect_bw_vision( localClientNum )
  1014. {
  1015. setClientSysState( "levelNotify", "tae", self );
  1016. }
  1017.  
  1018. teleport_aftereffect_red_vision( localClientNum )
  1019. {
  1020. setClientSysState( "levelNotify", "tae", self );
  1021. }
  1022.  
  1023. teleport_aftereffect_flashy_vision( localClientNum )
  1024. {
  1025. setClientSysState( "levelNotify", "tae", self );
  1026. }
  1027.  
  1028. teleport_aftereffect_flare_vision( localClientNum )
  1029. {
  1030. setClientSysState( "levelNotify", "tae", self );
  1031. }
  1032.  
  1033. packa_door_reminder()
  1034. {
  1035. while( !flag( "teleporter_pad_link_3" ) )
  1036. {
  1037. rand = randomintrange(4,16);
  1038. self playsound( "packa_door_hitch" );
  1039. wait(rand);
  1040. }
  1041. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement