1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-10 07:08:06 -05:00
Files
BO2-Reimagined/scripts/zm/replaced/zm_highrise_classic.gsc

426 lines
14 KiB
Plaintext

#include maps\mp\zm_highrise_classic;
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
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 );
elev_bldg3b = getent( "elevator_bldg3b_body", "targetname" );
elev_bldg3b.origin += vectorscale( ( 0, 0, 1 ), 8.0 );
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 = scripts\zm\replaced\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_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, 1, 0 ), 90.0 ), 0.35, 0, 0 );
offsetdw = vectorscale( ( 1, 1, 1 ), 3.0 );
if ( isdefined( trigger.worldgun.worldgundw ) )
worldgundw rotateto( self.angles + angles_offset + vectorscale( ( 0, 1, 0 ), 90.0 ), 0.35, 0, 0 );
elapsed_time_counter = 0;
while ( isdefined( worldgun ) && elapsed_time_counter < 0.5 )
{
worldgun.origin = ( worldgun.origin[0], worldgun.origin[1], pap_machine.origin[2] + offset );
if ( isdefined( worldgundw ) )
worldgundw.origin = ( worldgundw.origin[0], worldgundw.origin[1], pap_machine.origin[2] + offset + offsetdw[2] );
elapsed_time_counter += 0.05;
wait 0.05;
}
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;
}
}
squashed_death_init( kill_if_falling )
{
while ( true )
{
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 );
}
else if ( isai( who ) )
{
if ( is_true( who.in_the_ceiling ) || !is_true( who.completed_emerging_into_playable_area ) )
continue;
playfx( level._effect["zomb_gib"], who.origin );
if ( isdefined( who.is_leaper ) && who.is_leaper )
{
who maps\mp\zombies\_zm_ai_leaper::leaper_cleanup();
who dodamage( who.health + 100, who.origin );
}
else
{
who delete();
}
who.insta_killed = 1;
}
}
}
}
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.solo_lives_given ) && self.solo_lives_given < 3 )
{
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--;
}
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;
}
}
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 thread escape_pod_state_run();
escape_pod_trigger thread escape_pod_walk_on_off( escape_pod );
while ( true )
{
escape_pod setanim( level.escape_elevator_idle );
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;
level thread escape_pod_wait_for_players_inside( escape_pod, escape_pod_trigger );
flag_set( "escape_pod_needs_reset" );
level waittill( "reset_escape_pod" );
flag_clear( "escape_pod_needs_reset" );
level notify( "escape_pod_falling_begin" );
players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside();
foreach ( player in players_in_escape_pod )
{
player.riding_escape_pod = 1;
player allowjump( 0 );
}
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_wait_for_players_inside( escape_pod, escape_pod_trigger )
{
level endon( "reset_escape_pod" );
while ( true )
{
players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside();
if ( players_in_escape_pod.size == 0 )
{
escape_pod.escape_pod_state = 1;
wait 0.05;
continue;
}
players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside();
if ( players_in_escape_pod.size > 0 )
{
escape_pod.escape_pod_state = 2;
escape_pod thread escape_pod_tell_fx();
wait 3;
players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside();
if ( players_in_escape_pod.size > 0 )
break;
}
wait 0.05;
}
level notify( "reset_escape_pod" );
}
escape_pod_get_all_alive_players_inside()
{
players = get_players();
players_in_escape_pod = [];
foreach ( player in players )
{
if ( player.sessionstate != "spectator" )
{
if ( player istouching( self ) )
players_in_escape_pod[players_in_escape_pod.size] = player;
}
}
return players_in_escape_pod;
}