Files
Recompilable-gscs-for-BO2-z…/zm_highrise_patch/maps/mp/zm_highrise_classic.gsc

1172 lines
32 KiB
Plaintext

#include maps/mp/zm_highrise_utility;
#include maps/mp/zombies/_zm_zonemgr;
#include maps/mp/zombies/_zm_laststand;
#include maps/mp/zombies/_zm_ai_leaper;
#include maps/mp/zombies/_zm_magicbox;
#include maps/mp/zm_highrise_elevators;
#include maps/mp/zm_highrise_classic;
#include maps/mp/zombies/_zm_buildables;
#include maps/mp/zombies/_zm_game_module;
#include maps/mp/gametypes_zm/_zm_gametype;
#include maps/mp/zm_highrise_buildables;
#include maps/mp/zombies/_zm_chugabud;
#include maps/mp/gametypes_zm/_hud_util;
#include maps/mp/gametypes_zm/_hud;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
#using_animtree( "zombie_escape_elevator" );
precache()
{
precacheshader( "overlay_low_health_splat" );
precacheshellshock( "elevator_crash" );
maps/mp/zombies/_zm_chugabud::chugabug_precache();
maps/mp/zm_highrise_buildables::include_buildables();
maps/mp/zm_highrise_buildables::init_buildables();
maps/mp/zm_highrise_sq::init();
maps/mp/zombies/_zm_equip_springpad::init( &"ZM_HIGHRISE_EQUIP_SPRINGPAD_PICKUP_HINT_STRING", &"ZM_HIGHRISE_EQUIP_SPRINGPAD_HOWTO" );
level._zombiemode_post_respawn_callback = ::highrise_post_respawn_callback;
onplayerconnect_callback( ::highrise_player_connect_callback );
}
main()
{
level.buildables_built[ "pap" ] = 1;
level.custom_pap_move_in = ::highrise_pap_move_in;
level.custom_pap_move_out = ::highrise_pap_move_out;
flag_init( "perks_ready" );
maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "rooftop" );
maps/mp/zombies/_zm_game_module::set_current_game_module( level.game_module_standard_index );
level thread maps/mp/zombies/_zm_buildables::think_buildables();
level.calc_closest_player_using_paths = 1;
level.validate_enemy_path_length = ::highrise_validate_enemy_path_length;
level thread maps/mp/zm_highrise_classic::init_escape_pod();
level thread maps/mp/zm_highrise_elevators::init_elevators();
temp_clips = getentarray( "elevator_delete", "targetname" );
if ( isDefined( temp_clips ) && temp_clips.size > 0 )
{
array_thread( temp_clips, ::self_delete );
}
level thread maps/mp/zm_highrise_elevators::init_elevator( "1b" );
level thread maps/mp/zm_highrise_elevators::init_elevator( "1c", 1 );
level thread maps/mp/zm_highrise_elevators::init_elevator( "1d" );
if ( randomint( 100 ) > 50 )
{
level thread maps/mp/zm_highrise_elevators::init_elevator( "3", 1, -1264 );
level thread maps/mp/zm_highrise_elevators::init_elevator( "3b", 2 );
}
else
{
level thread maps/mp/zm_highrise_elevators::init_elevator( "3", 2 );
level thread maps/mp/zm_highrise_elevators::init_elevator( "3b", 1, -1264 );
}
level thread maps/mp/zm_highrise_elevators::init_elevator( "3c", 3 );
level thread maps/mp/zm_highrise_elevators::init_elevator( "3d", 1 );
flag_wait( "initial_blackscreen_passed" );
level thread escape_pod();
level._chugabug_reject_corpse_override_func = ::highrise_chugabud_reject_corpse_func;
level._chugabud_reject_node_override_func = ::highrise_chugabud_reject_node_func;
level._chugabud_post_respawn_override_func = ::highrise_chugabud_post_respawn_func;
level.insta_kill_triggers = getentarray( "instant_death", "targetname" );
array_thread( level.insta_kill_triggers, ::squashed_death_init, 0 );
e_trigger = getent( "instant_death_escape_pod_shaft", "targetname" );
if ( isDefined( e_trigger ) )
{
e_trigger thread squashed_death_init( 1 );
e_trigger thread escape_pod_death_trigger_think();
level.insta_kill_triggers[ level.insta_kill_triggers.size ] = e_trigger;
}
exploder( 9 );
exploder( 10 );
flag_wait( "start_zombie_round_logic" );
level thread maps/mp/zm_highrise_elevators::random_elevator_perks();
level thread maps/mp/zm_highrise_elevators::faller_location_logic();
level.custom_faller_entrance_logic = ::maps/mp/zm_highrise_elevators::watch_for_elevator_during_faller_spawn;
setdvar( "zombiemode_path_minz_bias", 13 );
level.check_valid_poi = ::check_valid_poi;
level thread maps/mp/zm_highrise_elevators::shouldsuppressgibs();
}
highrise_validate_enemy_path_length( player )
{
max_dist = 1296;
d = distancesquared( self.origin, player.origin );
if ( d <= max_dist )
{
return 1;
}
return 0;
}
highrise_player_connect_callback()
{
self setperk( "specialty_fastmantle" );
self thread end_game_turn_off_whoswho();
}
end_game_turn_off_whoswho()
{
self endon( "disconnect" );
level waittill( "end_game" );
self thread turn_off_whoswho();
}
highrise_post_respawn_callback()
{
self setperk( "specialty_fastmantle" );
self thread turn_off_whoswho();
}
turn_off_whoswho()
{
self endon( "disconnect" );
self setclientfieldtoplayer( "clientfield_whos_who_filter", 1 );
wait_network_frame();
wait_network_frame();
self setclientfieldtoplayer( "clientfield_whos_who_filter", 0 );
}
highrise_pap_move_in( trigger, origin_offset, angles_offset )
{
level endon( "Pack_A_Punch_off" );
trigger endon( "pap_player_disconnected" );
pap_machine = trigger.perk_machine;
worldgun = trigger.worldgun;
worldgundw = trigger.worldgun.worldgundw;
offset = origin_offset[ 2 ];
trigger.worldgun rotateto( self.angles + angles_offset + vectorScale( ( 0, 0, 1 ), 90 ), 0,35, 0, 0 );
offsetdw = vectorScale( ( 0, 0, 1 ), 3 );
if ( isDefined( trigger.worldgun.worldgundw ) )
{
worldgundw rotateto( self.angles + angles_offset + vectorScale( ( 0, 0, 1 ), 90 ), 0,35, 0, 0 );
}
wait 0,5;
move_vec = ( ( ( self.origin + origin_offset ) - worldgun.origin ) * 0,05 ) / 0,5;
elapsed_time_counter = 0;
while ( isDefined( worldgun ) && elapsed_time_counter < 0,5 )
{
worldgun.origin = ( worldgun.origin[ 0 ] + move_vec[ 0 ], worldgun.origin[ 1 ] + move_vec[ 1 ], pap_machine.origin[ 2 ] + offset );
if ( isDefined( worldgundw ) )
{
worldgundw.origin = ( worldgundw.origin[ 0 ] + move_vec[ 0 ], worldgundw.origin[ 1 ] + move_vec[ 1 ], pap_machine.origin[ 2 ] + offset + offsetdw[ 2 ] );
}
elapsed_time_counter += 0,05;
wait 0,05;
}
}
highrise_pap_move_out( trigger, origin_offset, interact_offset )
{
level endon( "Pack_A_Punch_off" );
trigger endon( "pap_player_disconnected" );
pap_machine = trigger.perk_machine;
worldgun = trigger.worldgun;
worldgundw = trigger.worldgun.worldgundw;
offset = origin_offset[ 2 ];
offsetdw = vectorScale( ( 0, 0, 1 ), 3 );
move_vec = ( ( interact_offset - origin_offset ) * 0,05 ) / 0,5;
elapsed_time_counter = 0;
while ( isDefined( worldgun ) && elapsed_time_counter < 0,5 )
{
worldgun.origin = ( worldgun.origin[ 0 ] + move_vec[ 0 ], worldgun.origin[ 1 ] + move_vec[ 1 ], pap_machine.origin[ 2 ] + offset );
if ( isDefined( worldgundw ) )
{
worldgundw.origin = ( worldgundw.origin[ 0 ] + move_vec[ 0 ], worldgundw.origin[ 1 ] + move_vec[ 1 ], pap_machine.origin[ 2 ] + offset + offsetdw[ 2 ] );
}
elapsed_time_counter += 0,05;
wait 0,05;
}
move_vec = ( ( origin_offset - interact_offset ) * 0,05 ) / level.packapunch_timeout;
elapsed_time_counter = 0;
while ( isDefined( worldgun ) && elapsed_time_counter < level.packapunch_timeout )
{
worldgun.origin = ( worldgun.origin[ 0 ] + move_vec[ 0 ], worldgun.origin[ 1 ] + move_vec[ 1 ], pap_machine.origin[ 2 ] + offset );
if ( isDefined( worldgundw ) )
{
worldgundw.origin = ( worldgundw.origin[ 0 ] + move_vec[ 0 ], worldgundw.origin[ 1 ] + move_vec[ 1 ], pap_machine.origin[ 2 ] + offset + offsetdw[ 2 ] );
}
elapsed_time_counter += 0,05;
wait 0,05;
}
}
escape_pod_death_trigger_think()
{
self endon( "death" );
while ( 1 )
{
level waittill( "escape_pod_falling_begin" );
self trigger_off();
level waittill( "escape_pod_falling_complete" );
self trigger_on();
level waittill( "escape_pod_moving_back_to_start_position" );
self trigger_off();
level waittill( "escape_pod_returns_to_start_location" );
self trigger_on();
}
}
zm_treasure_chest_init()
{
chest1 = getstruct( "start_chest", "script_noteworthy" );
level.chests = [];
level.chests[ level.chests.size ] = chest1;
maps/mp/zombies/_zm_magicbox::treasure_chest_init( "start_chest" );
}
squashed_death_init( kill_if_falling )
{
while ( 1 )
{
self waittill( "trigger", who );
if ( isDefined( who.insta_killed ) && !who.insta_killed )
{
if ( isplayer( who ) )
{
who thread elevator_black_screen_squash_check();
who thread insta_kill_player( 1, kill_if_falling );
break;
}
else if ( isai( who ) )
{
while ( is_true( who.in_the_ceiling ) )
{
continue;
}
who dodamage( who.health + 100, who.origin );
who.insta_killed = 1;
if ( isDefined( who.has_been_damaged_by_player ) && !who.has_been_damaged_by_player )
{
if ( isDefined( who.is_leaper ) && who.is_leaper )
{
who thread maps/mp/zombies/_zm_ai_leaper::leaper_cleanup();
break;
}
else
{
level.zombie_total++;
}
}
}
}
}
}
elevator_black_screen_squash_check()
{
if ( !self hasperk( "specialty_finalstand" ) )
{
return;
}
while ( isDefined( level.elevators ) )
{
_a385 = level.elevators;
_k385 = getFirstArrayKey( _a385 );
while ( isDefined( _k385 ) )
{
elevator = _a385[ _k385 ];
if ( isDefined( elevator.body.trig ) )
{
if ( self istouching( elevator.body.trig ) )
{
if ( isDefined( self.fade_to_black_time ) )
{
time = getTime();
dt = ( time - self.fade_to_black_time ) / 1000;
if ( abs( dt ) < 10 )
{
return;
}
}
start_wait = 0;
black_screen_wait = 3,8;
fade_in_time = 0,2;
fade_out_time = 0,01;
self thread fadetoblackforxsec( start_wait, black_screen_wait, fade_in_time, fade_out_time );
self.fade_to_black_time = getTime();
return 1;
}
}
_k385 = getNextArrayKey( _a385, _k385 );
}
}
}
insta_kill_player( perks_can_respawn_player, kill_if_falling )
{
self endon( "disconnect" );
if ( isDefined( perks_can_respawn_player ) && perks_can_respawn_player == 0 )
{
if ( self hasperk( "specialty_quickrevive" ) )
{
self unsetperk( "specialty_quickrevive" );
}
if ( self hasperk( "specialty_finalstand" ) )
{
self unsetperk( "specialty_finalstand" );
}
}
self maps/mp/zombies/_zm_buildables::player_return_piece_to_original_spawn();
if ( isDefined( self.insta_killed ) && self.insta_killed )
{
return;
}
if ( isDefined( self.ignore_insta_kill ) )
{
self.disable_chugabud_corpse = 1;
return;
}
if ( self hasperk( "specialty_finalstand" ) )
{
self.ignore_insta_kill = 1;
self.disable_chugabud_corpse = 1;
self dodamage( self.health + 1000, ( 0, 0, 1 ) );
return;
}
if ( !isDefined( kill_if_falling ) || kill_if_falling == 0 )
{
if ( !self isonground() )
{
return;
}
}
if ( is_player_killable( self ) )
{
self.insta_killed = 1;
in_last_stand = 0;
self notify( "chugabud_effects_cleanup" );
if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
{
in_last_stand = 1;
}
self thread blood_splat();
if ( getnumconnectedplayers() == 1 )
{
if ( isDefined( self.lives ) && self.lives > 0 )
{
self.waiting_to_revive = 1;
points = getstruct( "zone_green_start", "script_noteworthy" );
spawn_points = getstructarray( points.target, "targetname" );
point = spawn_points[ 0 ];
if ( in_last_stand == 0 )
{
self dodamage( self.health + 1000, ( 0, 0, 1 ) );
}
wait 0,5;
self freezecontrols( 1 );
wait 0,25;
self setorigin( point.origin + vectorScale( ( 0, 0, 1 ), 20 ) );
self.angles = point.angles;
if ( in_last_stand )
{
flag_set( "instant_revive" );
self.stopflashingbadlytime = getTime() + 1000;
wait_network_frame();
flag_clear( "instant_revive" );
}
else
{
self thread maps/mp/zombies/_zm_laststand::auto_revive( self );
self.waiting_to_revive = 0;
self.solo_respawn = 0;
self.lives = 0;
}
self freezecontrols( 0 );
self.insta_killed = 0;
}
else
{
self dodamage( self.health + 1000, ( 0, 0, 1 ) );
}
}
else
{
self dodamage( self.health + 1000, ( 0, 0, 1 ) );
wait_network_frame();
self.bleedout_time = 0;
}
self.insta_killed = 0;
}
}
highrise_chugabud_reject_corpse_func( v_corpse_position )
{
reject = 0;
if ( isDefined( level.elevator_volumes ) )
{
scr_org = spawn( "script_origin", v_corpse_position );
_a563 = level.elevator_volumes;
_k563 = getFirstArrayKey( _a563 );
while ( isDefined( _k563 ) )
{
volume = _a563[ _k563 ];
if ( scr_org istouching( volume ) )
{
reject = 1;
break;
}
else
{
_k563 = getNextArrayKey( _a563, _k563 );
}
}
scr_org delete();
}
return reject;
}
highrise_chugabud_reject_node_func( v_corpse_pos, nd_node )
{
reject = 0;
skip_elevator_volume_check = 0;
scr_org = spawn( "script_origin", nd_node.origin );
player_zone = maps/mp/zombies/_zm_zonemgr::get_player_zone();
if ( isDefined( player_zone ) )
{
if ( player_zone == "zone_orange_elevator_shaft_middle_1" || player_zone == "zone_orange_elevator_shaft_middle_2" )
{
skip_elevator_volume_check = 1;
}
}
if ( !isDefined( level.chugabud_info_volume1 ) )
{
level.chugabud_info_volume1 = getent( "zone_orange_level1_whos_who_info_volume", "targetname" );
}
scr_org.origin = v_corpse_pos;
if ( scr_org istouching( level.chugabud_info_volume1 ) )
{
scr_org.origin = nd_node.origin;
if ( !scr_org istouching( level.chugabud_info_volume1 ) )
{
reject = 1;
}
}
if ( !reject )
{
if ( !isDefined( level.chugabud_info_volume2 ) )
{
level.chugabud_info_volume2 = getent( "whos_who_slide_info_volume", "targetname" );
}
scr_org.origin = v_corpse_pos;
if ( scr_org istouching( level.chugabud_info_volume2 ) )
{
n_node_corpse = getnode( "whos_who_slide_corpse_respawn_position", "targetname" );
maps/mp/zombies/_zm_chugabud::force_corpse_respawn_position( n_node_corpse.origin );
}
}
while ( !reject )
{
while ( !skip_elevator_volume_check )
{
scr_org.origin = nd_node.origin;
while ( isDefined( level.elevator_volumes ) )
{
_a665 = level.elevator_volumes;
_k665 = getFirstArrayKey( _a665 );
while ( isDefined( _k665 ) )
{
volume = _a665[ _k665 ];
if ( scr_org istouching( volume ) )
{
reject = 1;
break;
}
else
{
_k665 = getNextArrayKey( _a665, _k665 );
}
}
}
}
}
scr_org delete();
return reject;
}
highrise_chugabud_post_respawn_func( v_new_player_position )
{
scr_org = spawn( "script_origin", v_new_player_position );
e_corpse = self.e_chugabud_corpse;
if ( isDefined( e_corpse ) )
{
corpse_zone = maps/mp/zombies/_zm_zonemgr::get_zone_from_position( e_corpse.origin );
if ( isDefined( corpse_zone ) || corpse_zone == "zone_orange_elevator_shaft_middle_2" && corpse_zone == "zone_orange_elevator_shaft_middle_1" )
{
if ( !isDefined( level.elevator_shaft_middle_2_respawn_nodes ) )
{
level.elevator_shaft_middle_2_respawn_nodes = getnodearray( "orange_elevator_middle_2_player_respawn_loc", "targetname" );
level.elevator_shaft_middle_2_respawn_nodes_index = 0;
}
nd_node = level.elevator_shaft_middle_2_respawn_nodes[ level.elevator_shaft_middle_2_respawn_nodes_index ];
level.elevator_shaft_middle_2_respawn_nodes_index++;
if ( level.elevator_shaft_middle_2_respawn_nodes_index >= level.elevator_shaft_middle_2_respawn_nodes.size )
{
level.elevator_shaft_middle_2_respawn_nodes_index = 0;
}
maps/mp/zombies/_zm_chugabud::force_player_respawn_position( nd_node.origin );
}
}
e_corpse = self.e_chugabud_corpse;
if ( isDefined( e_corpse ) )
{
a_escape_pod_ents = [];
a_escape_pod_ents[ a_escape_pod_ents.size ] = getent( "escape_pod_trigger", "targetname" );
a_escape_pod_ents[ a_escape_pod_ents.size ] = getent( "zone_green_escape_pod", "targetname" );
scr_org.origin = e_corpse.origin;
touching = 0;
i = 0;
while ( i < a_escape_pod_ents.size )
{
e_ent = a_escape_pod_ents[ i ];
if ( scr_org istouching( e_ent ) )
{
touching = 1;
break;
}
else
{
i++;
}
}
if ( touching )
{
scr_org.origin = v_new_player_position;
touching = 0;
i = 0;
while ( i < a_escape_pod_ents.size )
{
e_ent = a_escape_pod_ents[ i ];
if ( scr_org istouching( e_ent ) )
{
touching = 1;
break;
}
else
{
i++;
}
}
if ( !touching )
{
if ( v_new_player_position[ 2 ] > 3300 )
{
if ( !isDefined( level.escape_pod_corpse_respawn_nodes ) )
{
level.escape_pod_corpse_respawn_nodes = getnodearray( "escape_pod_corpse_respawn_loc", "targetname" );
level.escape_pod_corpse_respawn_node_index = 0;
}
nd_node = level.escape_pod_corpse_respawn_nodes[ level.escape_pod_corpse_respawn_node_index ];
level.escape_pod_corpse_respawn_node_index++;
if ( level.escape_pod_corpse_respawn_node_index >= level.escape_pod_corpse_respawn_nodes.size )
{
level.escape_pod_corpse_respawn_node_index = 0;
}
maps/mp/zombies/_zm_chugabud::force_corpse_respawn_position( nd_node.origin );
if ( isDefined( self.riding_escape_pod ) )
{
self.riding_escape_pod = undefined;
}
}
}
}
}
scr_org delete();
}
blood_splat()
{
earthquake( 0,3, 3, self.origin, 128 );
if ( isDefined( self.blood_splats_overlay ) )
{
return;
}
self.blood_splats_overlay = newclienthudelem( self );
self.blood_splats_overlay setshader( "overlay_low_health_splat", 640, 480 );
self.blood_splats_overlay.x = 0;
self.blood_splats_overlay.y = 0;
self.blood_splats_overlay.splatter = 1;
self.blood_splats_overlay.alignx = "left";
self.blood_splats_overlay.aligny = "top";
self.blood_splats_overlay.sort = 1;
self.blood_splats_overlay.foreground = 0;
self.blood_splats_overlay.horzalign = "fullscreen";
self.blood_splats_overlay.vertalign = "fullscreen";
self.blood_splats_overlay.alpha = 1;
wait 3;
self.blood_splats_overlay fadeovertime( 1 );
self.blood_splats_overlay.alpha = 0;
wait 1;
self.blood_splats_overlay destroy();
}
is_player_killable( player, checkignoremeflag )
{
if ( !isDefined( player ) )
{
return 0;
}
if ( !isalive( player ) )
{
return 0;
}
if ( !isplayer( player ) )
{
return 0;
}
if ( player.sessionstate == "spectator" )
{
return 0;
}
if ( player.sessionstate == "intermission" )
{
return 0;
}
if ( isDefined( self.intermission ) && self.intermission )
{
return 0;
}
if ( isDefined( checkignoremeflag ) && player.ignoreme )
{
return 0;
}
return 1;
}
init_escape_elevators_animtree()
{
scriptmodelsuseanimtree( -1 );
}
escapeelevatoruseanimtree()
{
self useanimtree( -1 );
}
init_escape_pod()
{
flag_init( "escape_pod_needs_reset" );
level thread init_escape_elevators_anims();
/#
adddebugcommand( "devgui_cmd "Zombies:1/Highrise:15/Escape Pod:2/Reset To Top:1" "set zombie_devgui_hrescapepodreset 1" \n" );
level thread watch_escapepod_devgui();
#/
}
init_escape_elevators_anims()
{
level.escape_elevator_1_state = %v_zombie_elevator_escape_player1_loop;
level.escape_elevator_2_state = %v_zombie_elevator_escape_player2_loop;
level.escape_elevator_3_state = %v_zombie_elevator_escape_player3_loop;
level.escape_elevator_4_state = %v_zombie_elevator_escape_player4_loop;
level.escape_elevator_5_state = %v_zombie_elevator_escape_player4_cablebreak;
level.escape_elevator_prestine_idle_state = %fxanim_zm_highrise_elevator_prestine_idle_anim;
level.escape_elevator_prestine_drop_state = %fxanim_zm_highrise_elevator_prestine_drop_anim;
level.escape_elevator_prestine_impact_state = %fxanim_zm_highrise_elevator_prestine_impact_anim;
level.escape_elevator_damage_idle_state = %fxanim_zm_highrise_elevator_damage_idle_anim;
level.escape_elevator_damage_drop_state = %fxanim_zm_highrise_elevator_damage_drop_anim;
level.escape_elevator_damage_impact_state = %fxanim_zm_highrise_elevator_damage_impact_anim;
level.escape_elevator_idle = level.escape_elevator_prestine_idle_state;
level.escape_elevator_drop = level.escape_elevator_prestine_drop_state;
level.escape_elevator_impact = level.escape_elevator_prestine_impact_state;
}
escape_pod()
{
escape_pod = getent( "elevator_bldg1a_body", "targetname" );
escape_pod setmovingplatformenabled( 1 );
escape_pod escapeelevatoruseanimtree();
escape_pod_trigger = getent( "escape_pod_trigger", "targetname" );
escape_pod.is_elevator = 1;
escape_pod._post_host_migration_thread = ::maps/mp/zm_highrise_elevators::escape_pod_host_migration_respawn_check;
if ( !isDefined( escape_pod_trigger ) )
{
return;
}
escape_pod.home_origin = escape_pod.origin;
escape_pod.link_start = [];
escape_pod.link_end = [];
escape_pod_blocker_door = getent( "elevator_bldg1a_body_door_clip", "targetname" );
number_of_times_used = 0;
used_at_least_once = 0;
escape_pod setanim( level.escape_elevator_1_state );
escape_pod setclientfield( "clientfield_escape_pod_light_fx", 1 );
escape_pod_trigger thread escape_pod_walk_on_off( escape_pod );
while ( 1 )
{
escape_pod setanim( level.escape_elevator_idle );
flag_clear( "escape_pod_needs_reset" );
if ( isDefined( escape_pod_blocker_door ) )
{
escape_pod escape_pod_linknodes( "escape_pod_door_l_node" );
escape_pod escape_pod_linknodes( "escape_pod_door_r_node" );
escape_pod_blocker_door unlink();
escape_pod_blocker_door thread trigger_off();
}
if ( is_true( used_at_least_once ) )
{
wait 3;
}
escape_pod thread escape_pod_state_run();
while ( 1 )
{
players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside();
while ( players_in_escape_pod == 0 )
{
escape_pod.escape_pod_state = 1;
wait 0,05;
}
all_players_touching = escape_pod_trigger escape_pod_are_all_alive_players_ready();
players_total = escape_pod_trigger escape_pod_get_all_alive_players();
players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside();
if ( players_in_escape_pod > 0 )
{
escape_pod.escape_pod_state = 2;
}
if ( all_players_touching )
{
escape_pod thread escape_pod_tell_fx();
wait 3;
all_players_still_touching = escape_pod_trigger escape_pod_are_all_alive_players_ready();
if ( all_players_still_touching )
{
break;
}
}
else
{
wait 0,05;
}
}
level notify( "escape_pod_falling_begin" );
players = get_players();
_a1053 = players;
_k1053 = getFirstArrayKey( _a1053 );
while ( isDefined( _k1053 ) )
{
player = _a1053[ _k1053 ];
player.riding_escape_pod = 1;
player allowjump( 0 );
_k1053 = getNextArrayKey( _a1053, _k1053 );
}
if ( isDefined( escape_pod_blocker_door ) )
{
escape_pod_blocker_door trigger_on();
escape_pod_blocker_door linkto( escape_pod );
escape_pod escape_pod_unlinknodes( "escape_pod_door_l_node" );
escape_pod escape_pod_unlinknodes( "escape_pod_door_r_node" );
}
escape_pod.escape_pod_state = 5;
escape_pod thread escape_pod_shake();
wait ( getanimlength( level.escape_elevator_5_state ) - 0,05 );
escape_pod setanim( level.escape_elevator_drop );
escape_pod setclientfield( "clientfield_escape_pod_light_fx", 0 );
escape_pod setclientfield( "clientfield_escape_pod_sparks_fx", 1 );
escape_pod thread escape_pod_move();
escape_pod thread escape_pod_rotate();
escape_pod waittill( "reached_destination" );
number_of_times_used++;
escape_pod thread impact_animate();
if ( number_of_times_used == 1 )
{
level.escape_elevator_idle = level.escape_elevator_damage_idle_state;
level.escape_elevator_drop = level.escape_elevator_damage_drop_state;
level.escape_elevator_impact = level.escape_elevator_damage_impact_state;
}
level notify( "escape_pod_falling_complete" );
if ( isDefined( escape_pod_blocker_door ) )
{
escape_pod_blocker_door unlink();
escape_pod_blocker_door trigger_off();
escape_pod escape_pod_linknodes( "escape_pod_door_l_node" );
escape_pod escape_pod_linknodes( "escape_pod_door_r_node" );
}
escape_pod setclientfield( "clientfield_escape_pod_sparks_fx", 0 );
escape_pod setclientfield( "clientfield_escape_pod_impact_fx", 1 );
escape_pod setclientfield( "clientfield_escape_pod_light_fx", 1 );
flag_set( "escape_pod_needs_reset" );
level waittill( "reset_escape_pod" );
flag_clear( "escape_pod_needs_reset" );
escape_pod setclientfield( "clientfield_escape_pod_impact_fx", 0 );
escape_pod thread escape_pod_breaking_rotate();
wait 6;
escape_pod playsound( "zmb_elevator_run_start" );
escape_pod playloopsound( "zmb_elevator_run", 1 );
level notify( "escape_pod_moving_back_to_start_position" );
if ( isDefined( escape_pod_blocker_door ) )
{
escape_pod_blocker_door trigger_on();
escape_pod_blocker_door linkto( escape_pod );
escape_pod escape_pod_unlinknodes( "escape_pod_door_l_node" );
escape_pod escape_pod_unlinknodes( "escape_pod_door_r_node" );
}
escape_pod moveto( escape_pod.home_origin, 3, 0,1, 0,1 );
escape_pod waittill( "movedone" );
escape_pod stoploopsound( 1 );
escape_pod playsound( "zmb_esc_pod_crash" );
escape_pod playsound( "zmb_elevator_run_stop" );
escape_pod playsound( "zmb_elevator_ding" );
escape_pod thread reset_impact_animate();
used_at_least_once = 1;
}
}
escape_pod_walk_on_off( escape_pod )
{
while ( 1 )
{
self waittill( "trigger", who );
if ( isplayer( who ) )
{
if ( !is_true( who.in_escape_pod_trigger ) )
{
self thread escape_pod_walk_on_off_watch( who, escape_pod );
}
}
}
}
escape_pod_walk_on_off_watch( who, escape_pod )
{
who endon( "disconnect" );
who.in_escape_pod_trigger = 1;
playsoundatposition( "zmb_esc_pod_bump", escape_pod.origin + vectorScale( ( 0, 0, 1 ), 15 ) );
while ( who istouching( self ) )
{
wait 1;
}
playsoundatposition( "zmb_esc_pod_bump", escape_pod.origin + vectorScale( ( 0, 0, 1 ), 15 ) );
who.in_escape_pod_trigger = 0;
}
reset_impact_animate()
{
self setanim( level.escape_elevator_prestine_impact_state );
wait getanimlength( level.escape_elevator_prestine_impact_state );
level notify( "escape_pod_returns_to_start_location" );
}
impact_animate()
{
self setanim( level.escape_elevator_impact );
wait getanimlength( level.escape_elevator_impact );
self setanim( level.escape_elevator_idle );
}
escape_pod_state( set, wait_for_current_end )
{
if ( isDefined( self.state ) && self.state == set )
{
return;
}
if ( is_true( wait_for_current_end ) )
{
self waittill( "done" );
}
self.state = set;
switch( set )
{
case 1:
self.state_anim = level.escape_elevator_1_state;
break;
case 2:
self.state_anim = level.escape_elevator_2_state;
break;
case 3:
self.state_anim = level.escape_elevator_3_state;
break;
case 4:
self.state_anim = level.escape_elevator_4_state;
break;
case 5:
self.state_anim = level.escape_elevator_5_state;
break;
}
self setanim( self.state_anim );
}
escape_pod_state_run()
{
while ( 1 )
{
while ( !isDefined( self.escape_pod_state ) )
{
wait 0,05;
}
while ( isDefined( self.state ) && self.state == 1 && self.state == self.escape_pod_state )
{
wait 0,05;
}
self.state = self.escape_pod_state;
shouldwait = 1;
switch( self.state )
{
case 1:
self.state_anim = level.escape_elevator_1_state;
shouldwait = 0;
break;
case 2:
self.state_anim = level.escape_elevator_2_state;
break;
case 3:
self.state_anim = level.escape_elevator_3_state;
break;
case 4:
self.state_anim = level.escape_elevator_4_state;
break;
case 5:
self.state_anim = level.escape_elevator_5_state;
break;
}
self setanim( self.state_anim );
if ( shouldwait )
{
wait ( getanimlength( self.state_anim ) - 0,05 );
continue;
}
else
{
wait 0,05;
}
}
}
escape_pod_tell_fx()
{
self setclientfield( "clientfield_escape_pod_tell_fx", 1 );
wait 3;
self setclientfield( "clientfield_escape_pod_tell_fx", 0 );
}
escape_pod_get_all_alive_players()
{
players = get_players();
players_alive = 0;
_a1318 = players;
_k1318 = getFirstArrayKey( _a1318 );
while ( isDefined( _k1318 ) )
{
player = _a1318[ _k1318 ];
if ( player.sessionstate != "spectator" )
{
players_alive++;
}
_k1318 = getNextArrayKey( _a1318, _k1318 );
}
return players_alive;
}
escape_pod_get_all_alive_players_inside()
{
players = get_players();
players_in_escape_pod = 0;
_a1335 = players;
_k1335 = getFirstArrayKey( _a1335 );
while ( isDefined( _k1335 ) )
{
player = _a1335[ _k1335 ];
if ( player.sessionstate != "spectator" )
{
if ( player istouching( self ) )
{
players_in_escape_pod++;
}
}
_k1335 = getNextArrayKey( _a1335, _k1335 );
}
return players_in_escape_pod;
}
escape_pod_breaking_rotate()
{
rolls = array( -3, 6, -6, 3 );
time = 0,74;
accel = 0,1;
deccel = 0,1;
_a1358 = rolls;
_k1358 = getFirstArrayKey( _a1358 );
while ( isDefined( _k1358 ) )
{
roll = _a1358[ _k1358 ];
self rotateroll( roll, time, accel, deccel );
self playsound( "zmb_esc_pod_bump" );
self waittill( "rotatedone" );
_k1358 = getNextArrayKey( _a1358, _k1358 );
}
}
escape_pod_rotate()
{
rolls = array( -3, 11, -8, 9, -13, 15, -13, 5, -9, 10, -4 );
time = 0,21;
accel = 0,1;
deccel = 0,1;
_a1375 = rolls;
_k1375 = getFirstArrayKey( _a1375 );
while ( isDefined( _k1375 ) )
{
roll = _a1375[ _k1375 ];
self rotateroll( roll, time, accel, deccel );
self waittill( "rotatedone" );
_k1375 = getNextArrayKey( _a1375, _k1375 );
}
}
escape_pod_move()
{
shock_radius = 117,6;
destination_struct = getstruct( self.target, "targetname" );
level notify( "free_fall" );
self playsound( "zmb_esc_pod_break" );
self moveto( destination_struct.origin, 3, 0,1, 0,1 );
self waittill( "movedone" );
self playsound( "zmb_esc_pod_crash" );
earthquake( 0,3, 1,5, self.origin, 256 );
self notify( "reached_destination" );
players = get_players();
_a1398 = players;
_k1398 = getFirstArrayKey( _a1398 );
while ( isDefined( _k1398 ) )
{
player = _a1398[ _k1398 ];
if ( !is_true( player.riding_escape_pod ) )
{
}
else
{
player.riding_escape_pod = 0;
player allowstand( 0 );
player allowcrouch( 0 );
player setstance( "prone" );
player shellshock( "elevator_crash", 4,5 );
player allowjump( 1 );
player allowstand( 1 );
player allowcrouch( 1 );
}
_k1398 = getNextArrayKey( _a1398, _k1398 );
}
}
escape_pod_shake()
{
self endon( "reached_destination" );
duration = randomfloatrange( 0,5, 1,5 );
wait_time = randomfloatrange( 1,5, 2,5 );
while ( 1 )
{
wait wait_time;
earthquake( 0,2, duration, self.origin, 1024 );
}
}
escape_pod_linknodes( node_name )
{
start_node = getnode( node_name, "targetname" );
while ( isDefined( start_node ) )
{
start_node.links = [];
near_nodes = getnodesinradiussorted( start_node.origin, 128, 0, 64, "pathnodes" );
links = 0;
_a1445 = near_nodes;
_k1445 = getFirstArrayKey( _a1445 );
while ( isDefined( _k1445 ) )
{
node = _a1445[ _k1445 ];
if ( !isDefined( node.target ) )
{
self.link_start[ self.link_start.size ] = start_node;
self.link_end[ self.link_end.size ] = node;
maps/mp/zm_highrise_utility::highrise_link_nodes( start_node, node );
maps/mp/zm_highrise_utility::highrise_link_nodes( node, start_node );
start_node.links[ start_node.links.size ] = node;
links++;
if ( links == 2 )
{
return;
}
}
else
{
_k1445 = getNextArrayKey( _a1445, _k1445 );
}
}
}
}
escape_pod_unlinknodes( node_name )
{
start_node = getnode( node_name, "targetname" );
while ( isDefined( start_node ) && isDefined( start_node.links ) )
{
linked_nodes = start_node.links;
_a1476 = linked_nodes;
_k1476 = getFirstArrayKey( _a1476 );
while ( isDefined( _k1476 ) )
{
node = _a1476[ _k1476 ];
if ( !isDefined( node.target ) )
{
maps/mp/zm_highrise_utility::highrise_unlink_nodes( start_node, node );
maps/mp/zm_highrise_utility::highrise_unlink_nodes( node, start_node );
}
_k1476 = getNextArrayKey( _a1476, _k1476 );
}
}
}
escape_pod_are_all_alive_players_ready()
{
players = get_players();
players_in_escape_pod = 0;
players_alive = 0;
_a1506 = players;
_k1506 = getFirstArrayKey( _a1506 );
while ( isDefined( _k1506 ) )
{
player = _a1506[ _k1506 ];
if ( player.sessionstate != "spectator" )
{
players_alive++;
if ( player istouching( self ) )
{
players_in_escape_pod++;
}
}
_k1506 = getNextArrayKey( _a1506, _k1506 );
}
return players_alive == players_in_escape_pod;
}
watch_escapepod_devgui()
{
/#
while ( 1 )
{
resetcmd = getDvar( "zombie_devgui_hrescapepodreset" );
if ( isDefined( resetcmd ) && resetcmd != "" )
{
level notify( "reset_escape_pod" );
setdvar( "zombie_devgui_hrescapepodreset", "" );
}
wait 1;
#/
}
}
check_valid_poi( valid )
{
_a1545 = level.elevator_volumes;
_k1545 = getFirstArrayKey( _a1545 );
while ( isDefined( _k1545 ) )
{
volume = _a1545[ _k1545 ];
if ( self istouching( volume ) )
{
return 0;
}
_k1545 = getNextArrayKey( _a1545, _k1545 );
}
return valid;
}