mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-10 18:57:58 -05:00
1172 lines
32 KiB
Plaintext
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;
|
|
}
|