1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-07 21:59:49 -05:00
BO2-Reimagined/scripts/zm/replaced/zm_highrise_classic.gsc
2024-01-25 20:05:11 -08:00

447 lines
13 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;
}
turn_off_whoswho()
{
self setclientfieldtoplayer("clientfield_whos_who_filter", 0);
}