mirror of
https://github.com/JezuzLizard/BO2-Reimagined.git
synced 2025-06-07 21:59:49 -05:00
447 lines
13 KiB
Plaintext
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);
|
|
} |