1 #using scripts\codescripts\struct;
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;
12 #insert scripts\shared\shared.gsh;
13 #insert scripts\shared\version.gsh;
15 #using scripts\shared\ai\zombie_utility;
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;
24 #precache( "model", "collision_wall_128x128x10" );
26 #precache( "triggerstring", "ZOMBIE_POWER_UP_TPAD" );
27 #precache( "triggerstring", "ZOMBIE_INACTIVE_TPAD" );
28 #precache( "triggerstring", "ZOMBIE_LINK_TPAD" );
35 level.dog_melee_range = 130;
39 level.active_links = 0;
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;
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";
68 trig = GetEnt(
"trigger_teleport_pad_" + i,
"targetname");
69 if ( IsDefined(trig) )
71 level.teleporter_pad_trig[i] = trig;
84 level.no_dog_clip =
true;
86 packapunch_see = getent(
"packapunch_see",
"targetname" );
87 if(isdefined( packapunch_see ) )
92 level.teleport_ae_funcs = [];
94 if( !IsSplitscreen() )
112 collision =
Spawn(
"script_model", (-56, 467, 157));
113 collision setmodel(
"collision_wall_128x128x10");
114 collision.angles = (0, 0, 0);
117 door = getent(
"pack_door",
"targetname" );
118 door movez( -50, 0.05, 0 );
123 door movez( 50, 1.5, 0 );
124 door playsound(
"evt_packa_door_1" );
132 door movez( -35, 1.5, 1 );
133 door playsound(
"evt_packa_door_2" );
139 door movez( -25, 1.5, 1 );
140 door playsound(
"evt_packa_door_2" );
146 door movez( -60, 1.5, 1 );
147 door playsound(
"evt_packa_door_2" );
151 clip = getentarray(
"pack_door_clip",
"targetname" );
152 for ( i = 0; i < clip.size; i++ )
154 clip[i] connectpaths();
164 for ( i = 0; i < level.teleporter_pad_trig.size; i++ )
167 level.teleporter_pad_trig[i] sethintstring( &
"ZOMBIE_TELEPORT_COOLDOWN" );
171 level.is_cooldown =
true;
172 wait( level.teleport_cooldown );
173 level.is_cooldown =
false;
175 for ( i = 0; i < level.teleporter_pad_trig.size; i++ )
177 if ( level.teleporter_pad_trig[i].teleport_active )
179 level.teleporter_pad_trig[i] sethintstring( &
"ZOMBIE_TELEPORT_TO_CORE" );
183 level.teleporter_pad_trig[i] sethintstring( &
"ZOMBIE_LINK_TPAD" );
194 tele_help = getent(
"tele_help_" + index,
"targetname" );
195 if(isdefined( tele_help ) )
203 level.teleport[index] =
"waiting";
205 trigger = level.teleporter_pad_trig[ index ];
207 trigger setcursorhint(
"HINT_NOICON" );
208 trigger sethintstring( &
"ZOMBIE_NEED_POWER" );
212 trigger sethintstring( &
"ZOMBIE_POWER_UP_TPAD" );
213 trigger.teleport_active =
false;
215 if ( isdefined( trigger ) )
219 trigger waittill(
"trigger" );
221 if ( level.active_links < 3 )
223 trigger_core = getent(
"trigger_teleport_core",
"targetname" );
228 for ( i=0; i<level.teleporter_pad_trig.size; i++ )
232 level.teleport[index] =
"timer_on";
239 while ( level.teleport[index] ==
"timer_on" )
245 if ( level.teleport[index] ==
"active" )
262 for ( i=0; i<level.teleporter_pad_trig.size; i++ )
270 if ( level.is_cooldown )
273 trigger sethintstring( &
"ZOMBIE_TELEPORT_COOLDOWN" );
275 trigger.teleport_active =
true;
289 self endon(
"stop_countdown" );
293 if ( level.active_timer < 0 )
295 level.active_timer = index;
305 players = GetPlayers();
306 for( i = 0; i < players.size; i++ )
312 if ( level.active_timer == index )
314 level.active_timer = -1;
318 level.teleport[index] =
"timer_off";
326 self endon(
"stop_countdown" );
329 clock_sound =
spawn (
"script_origin", (0,0,0));
338 play = (count == 20 || count == 15 || count <= 10);
348 level notify (
"stop_countdown");
355 self playloopsound (
"evt_clock_tick_1sec");
356 level waittill (
"stop_countdown");
358 if( isdefined( level.musicSystem.currentState ) && level.musicSystem.currentState ==
"timer" )
361 music::setmusicstate(
"none");
364 self stoploopsound(0);
374 self setcursorhint(
"HINT_NOICON" );
375 self.teleport_active =
true;
381 self waittill(
"trigger", user );
385 for ( i = 0; i < level.teleporter_pad_trig.size; i++ )
403 time_since_last_teleport = GetTime() - level.teleport_time;
426 wait( level.teleport_delay );
429 self notify(
"fx_done" );
435 if ( level.is_cooldown ==
false )
442 ss =
struct::get(
"teleporter_powerup",
"targetname" );
443 if ( IsDefined( ss ) )
449 if ( time_since_last_teleport < 60000 && level.active_links == 3 && level.round_number > 20 )
456 level.teleport_time = GetTime();
464 players = GetPlayers();
466 for ( i = 0; i < players.size; i++ )
468 if ( isdefined( players[i] ) )
470 self SetInvisibleToPlayer( players[i],
enable );
483 dist = Distance2D( player.origin,
self.origin );
484 dist_touching = radius * scale_factor;
486 if ( dist < dist_touching )
500 #define ZM_TRAP_ELECTRIC_MAX 1.25
504 players = GetPlayers();
505 for ( i = 0; i < players.size; i++ )
507 if ( isdefined( players[i] ) )
524 players = GetPlayers();
529 players_touching = [];
533 prone_offset = (0, 0, 49);
534 crouch_offset = (0, 0, 20);
535 stand_offset = (0, 0, 0);
538 for ( i = 0; i < 4; i++ )
540 core_pos[i] = getent(
"origin_teleport_player_" + i,
"targetname" );
542 image_room[i] = getent(
"teleport_room_" + i,
"targetname" );
544 if ( isdefined( players[i] ) )
550 players_touching[player_idx] = i;
553 if ( isdefined( image_room[i] ) )
557 players[i] disableOffhandWeapons();
558 players[i] disableweapons();
559 if( players[i] getstance() ==
"prone" )
561 desired_origin = image_room[i].origin + prone_offset;
563 else if( players[i] getstance() ==
"crouch" )
565 desired_origin = image_room[i].origin + crouch_offset;
569 desired_origin = image_room[i].origin + stand_offset;
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 );
579 if( IsDefined( players[i] ) )
582 players[i].teleport_origin.angles = image_room[i].angles;
592 core = GetEnt(
"trigger_teleport_core",
"targetname" );
596 for ( i = 0; i < players.size; i++ )
598 if ( isdefined( players[i] ) )
600 for ( j = 0; j < 4; j++ )
604 dist = Distance2D( core_pos[j].origin, players[i].origin );
605 if ( dist < player_radius )
618 for ( i = 0; i < players_touching.size; i++ )
620 player_idx = players_touching[i];
621 player = players[player_idx];
623 if ( !IsDefined( player ) )
631 while ( occupied[slot] && start < 4 )
640 occupied[slot] =
true;
641 pos_name =
"origin_teleport_player_" + slot;
642 teleport_core_pos = getent( pos_name,
"targetname" );
646 assert( IsDefined( player.teleport_origin ) );
647 player.teleport_origin
delete();
648 player.teleport_origin = undefined;
651 player enableweapons();
652 player enableoffhandweapons();
653 player setorigin( core_pos[slot].origin );
654 player setplayerangles( core_pos[slot].angles );
655 player FreezeControls(
false );
658 vox_rand = randomintrange(1,100);
683 self setcursorhint(
"HINT_NOICON" );
690 self sethintstring( &
"ZOMBIE_NEED_POWER" );
694 self sethintstring( &
"ZOMBIE_LINK_TPAD" );
696 else if ( level.active_links == 0 )
698 self sethintstring( &
"ZOMBIE_INACTIVE_TPAD" );
702 self sethintstring(
"" );
714 trigger = getent(
"trigger_teleport_core",
"targetname" );
715 if ( isdefined( trigger ) )
726 trigger waittill(
"trigger" );
729 for ( i = 0; i < level.teleport.size; i++ )
731 if ( isdefined( level.teleport[i] ) )
733 if ( level.teleport[i] ==
"timer_on" )
735 level.teleport[i] =
"active";
736 level.active_links++;
737 level
flag::set(
"teleporter_pad_link_"+level.active_links );
748 if ( level.active_links == 3 )
754 Earthquake( 0.3, 2.0, trigger.origin, 3700 );
758 pad =
"trigger_teleport_pad_" + i;
759 trigger_pad = getent( pad,
"targetname" );
762 level.active_timer = -1;
775 self notify(
"stop_countdown" );
776 level notify (
"stop_countdown");
777 players = GetPlayers();
779 for( i = 0; i < players.size; i++ )
781 players[i] notify(
"stop_countdown" );
791 if ( isdefined( level.teleport ) )
793 for ( i = 0; i < level.teleport.size; i++ )
795 if ( isdefined( level.teleport[i] ) )
797 if ( level.teleport[i] ==
"timer_on" )
810 self endon(
"fx_done" );
814 players = GetPlayers();
818 for ( i = 0; i < players.size; i++ )
820 if ( isdefined( players[i] ) )
835 zombies = getaispeciesarray( level.zombie_team );
839 for (i = 0; i < zombies.size; i++)
841 wait (randomfloatrange(0.2, 0.3));
842 if( !IsDefined( zombies[i] ) )
852 if( !( zombies[i].isdog ) )
857 zombies[i] dodamage( 10000, zombies[i].origin );
858 playsoundatposition(
"nuked", zombies[i].origin );
864 if( !isdefined( location ))
870 players = GetPlayers();
871 for (i = 0; i < players.size; i++)
873 if (distance (players[i].origin, location.origin) < 64)
875 switch ( tele_vo_type )
891 if(!isdefined( pre_wait ))
901 level endon(
"tele_help_end" );
905 self waittill(
"trigger", who);
910 level notify(
"tele_help_end" );
913 while(IsDefined (who) && (who) IsTouching (
self))
924 if( !level
flag::get(
"teleporter_pad_link_3" ) )
926 self waittill(
"trigger", who);
937 targ =
struct::get(
"pad_"+index+
"_wire" ,
"targetname");
938 if ( !IsDefined( targ ) )
943 while(isDefined(targ))
945 if(isDefined(targ.target))
962 if( GetDvarString(
"factoryAftereffectOverride" ) ==
"-1" )
964 self thread [[ level.teleport_ae_funcs[RandomInt(level.teleport_ae_funcs.size)] ]]();
968 self thread [[ level.teleport_ae_funcs[int(GetDvarString(
"factoryAftereffectOverride" ))] ]]();
974 self shellshock(
"explosion", 4 );
979 self shellshock(
"electrocution", 4 );
1011 while( !level
flag::get(
"teleporter_pad_link_3" ) )
1013 rand = randomintrange(4,16);
1014 self playsound(
"evt_packa_door_hitch" );
1022 collision =
Spawn(
"script_model", (-106, -2294, 216));
1023 collision setmodel(
"collision_wall_128x128x10");
1024 collision.angles = (0, 37.2, 0);
1028 collision =
Spawn(
"script_model", (-1208, -439, 363));
1029 collision setmodel(
"collision_wall_128x128x10");
1030 collision.angles = (0, 0, 0);