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_prison_sq_final.gsc
2024-06-07 15:48:11 -07:00

444 lines
12 KiB
Plaintext

#include maps\mp\zm_prison_sq_final;
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_net;
#include maps\mp\gametypes_zm\_hud_util;
#include maps\mp\gametypes_zm\_hud;
#include maps\mp\zm_alcatraz_utility;
#include maps\mp\zm_alcatraz_sq_nixie;
#include maps\mp\_visionset_mgr;
#include maps\mp\zombies\_zm_laststand;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zm_alcatraz_sq;
#include maps\mp\zombies\_zm_afterlife;
#include maps\mp\zombies\_zm_ai_brutus;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\zombies\_zm;
stage_one()
{
if (isdefined(level.gamedifficulty) && level.gamedifficulty == 0)
{
sq_final_easy_cleanup();
return;
}
precachemodel("p6_zm_al_audio_headset_icon");
flag_wait("quest_completed_thrice");
flag_wait("spoon_obtained");
flag_wait("warden_blundergat_obtained");
for (i = 1; i < 4; i++)
{
m_nixie_tube = getent("nixie_tube_" + i, "targetname");
m_nixie_tube thread nixie_tube_scramble_protected_effects(i);
}
level waittill_multiple("nixie_tube_trigger_1", "nixie_tube_trigger_2", "nixie_tube_trigger_3");
nixie_tube_off();
m_nixie_tube = getent("nixie_tube_1", "targetname");
m_nixie_tube playsoundwithnotify("vox_brutus_nixie_right_0", "scary_voice");
m_nixie_tube waittill("scary_voice");
wait 3;
level thread stage_two();
}
stage_two()
{
audio_logs = [];
audio_logs[0] = [];
audio_logs[0][0] = "vox_guar_tour_vo_1_0";
audio_logs[0][1] = "vox_guar_tour_vo_2_0";
audio_logs[0][2] = "vox_guar_tour_vo_3_0";
audio_logs[2] = [];
audio_logs[2][0] = "vox_guar_tour_vo_4_0";
audio_logs[3] = [];
audio_logs[3][0] = "vox_guar_tour_vo_5_0";
audio_logs[3][1] = "vox_guar_tour_vo_6_0";
audio_logs[4] = [];
audio_logs[4][0] = "vox_guar_tour_vo_7_0";
audio_logs[5] = [];
audio_logs[5][0] = "vox_guar_tour_vo_8_0";
audio_logs[6] = [];
audio_logs[6][0] = "vox_guar_tour_vo_9_0";
audio_logs[6][1] = "vox_guar_tour_vo_10_0";
play_sq_audio_log(0, audio_logs[0], 0);
for (i = 2; i <= 6; i++)
play_sq_audio_log(i, audio_logs[i], 1);
level.m_headphones delete();
t_plane_fly_afterlife = getent("plane_fly_afterlife_trigger", "script_noteworthy");
t_plane_fly_afterlife playsound("zmb_easteregg_laugh");
t_plane_fly_afterlife trigger_on();
level thread scripts\zm\reimagined\_zm_sq::sq_play_song();
players = get_players();
foreach (player in players)
{
if (is_player_valid(player))
{
player thread scripts\zm\reimagined\_zm_sq::sq_give_player_all_perks();
}
}
}
final_flight_trigger()
{
t_plane_fly = getent("plane_fly_trigger", "targetname");
self setcursorhint("HINT_NOICON");
self sethintstring("");
while (isdefined(self))
{
self waittill("trigger", e_triggerer);
if (isplayer(e_triggerer))
{
if (isdefined(level.custom_plane_validation))
{
valid = self [[level.custom_plane_validation]](e_triggerer);
if (!valid)
continue;
}
players = getplayers();
b_everyone_is_ready = 1;
foreach (player in players)
{
if (!isdefined(player) || player.sessionstate == "spectator" || player maps\mp\zombies\_zm_laststand::player_is_in_laststand())
b_everyone_is_ready = 0;
}
if (!b_everyone_is_ready)
continue;
if (flag("plane_is_away"))
continue;
flag_set("plane_is_away");
t_plane_fly trigger_off();
foreach (player in players)
{
if (isdefined(player))
{
player thread final_flight_player_thread();
}
}
return;
}
}
}
final_flight_player_thread()
{
self endon("death_or_disconnect");
self.on_a_plane = 1;
self.dontspeak = 1;
self setclientfieldtoplayer("isspeaking", 1);
if (!(isdefined(self.afterlife) && self.afterlife))
{
self.keep_perks = 1;
self afterlife_remove();
self.afterlife = 1;
self thread afterlife_laststand();
self waittill("player_fake_corpse_created");
}
self afterlife_infinite_mana(1);
level.final_flight_activated = 1;
level.final_flight_players[level.final_flight_players.size] = self;
a_nml_teleport_targets = [];
for (i = 1; i < 6; i++)
a_nml_teleport_targets[i - 1] = getstruct("nml_telepoint_" + i, "targetname");
self.n_passenger_index = level.final_flight_players.size;
a_players = [];
a_players = getplayers();
if (a_players.size == 1)
self.n_passenger_index = 1;
m_plane_craftable = getent("plane_craftable", "targetname");
m_plane_about_to_crash = getent("plane_about_to_crash", "targetname");
m_plane_about_to_crash ghost();
veh_plane_flyable = getent("plane_flyable", "targetname");
veh_plane_flyable show();
flag_set("plane_boarded");
t_plane_fly = getent("plane_fly_trigger", "targetname");
str_hint_string = "BOARD FINAL FLIGHT";
t_plane_fly sethintstring(str_hint_string);
self playerlinktodelta(m_plane_craftable, "tag_player_crouched_" + (self.n_passenger_index + 1));
self allowcrouch(1);
self allowstand(0);
self clientnotify("sndFFCON");
flag_wait("plane_departed");
level notify("sndStopBrutusLoop");
self clientnotify("sndPS");
self playsoundtoplayer("zmb_plane_takeoff", self);
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent("plane_takeoff", self);
m_plane_craftable ghost();
self playerlinktodelta(veh_plane_flyable, "tag_player_crouched_" + (self.n_passenger_index + 1));
self setclientfieldtoplayer("effects_escape_flight", 1);
flag_wait("plane_approach_bridge");
self thread maps\mp\zm_alcatraz_sq::snddelayedimp();
self setclientfieldtoplayer("effects_escape_flight", 2);
self unlink();
self playerlinktoabsolute(veh_plane_flyable, "tag_player_crouched_" + (self.n_passenger_index + 1));
flag_wait("plane_zapped");
flag_set("activate_player_zone_bridge");
self playsoundtoplayer("zmb_plane_fall", self);
self setclientfieldtoplayer("effects_escape_flight", 3);
self.dontspeak = 1;
self setclientfieldtoplayer("isspeaking", 1);
self playerlinktodelta(m_plane_about_to_crash, "tag_player_crouched_" + (self.n_passenger_index + 1), 1, 0, 0, 0, 0, 1);
flag_wait("plane_crashed");
self thread fadetoblackforxsec(0, 2, 0, 0.5, "black");
self unlink();
self allowstand(1);
self setstance("stand");
self allowcrouch(0);
flag_clear("spawn_zombies");
self setorigin(a_nml_teleport_targets[self.n_passenger_index].origin);
e_poi = getstruct("plane_crash_poi", "targetname");
vec_to_target = e_poi.origin - self.origin;
vec_to_target = vectortoangles(vec_to_target);
vec_to_target = (0, vec_to_target[1], 0);
self setplayerangles(vec_to_target);
n_shellshock_duration = 5;
self shellshock("explosion", n_shellshock_duration);
self.on_a_plane = 0;
stage_final();
}
stage_final()
{
level notify("stage_final");
level endon("stage_final");
b_everyone_alive = 0;
while (isdefined(b_everyone_alive) && !b_everyone_alive)
{
b_everyone_alive = 1;
a_players = getplayers();
foreach (player in a_players)
{
if (isdefined(player.afterlife) && player.afterlife)
{
b_everyone_alive = 0;
wait 0.05;
break;
}
}
}
level._should_skip_ignore_player_logic = ::final_showdown_zombie_logic;
flag_set("spawn_zombies");
array_func(getplayers(), maps\mp\zombies\_zm_afterlife::afterlife_remove);
p_weasel = undefined;
a_player_team = [];
a_players = getplayers();
foreach (player in a_players)
{
player.dontspeak = 1;
player setclientfieldtoplayer("isspeaking", 1);
if (player.character_name == "Arlington")
{
p_weasel = player;
continue;
}
a_player_team[a_player_team.size] = player;
}
if (isdefined(p_weasel) && a_player_team.size > 0)
{
level.longregentime = 1000000;
level.playerhealth_regularregendelay = 1000000;
p_weasel.team = level.zombie_team;
p_weasel.pers["team"] = level.zombie_team;
p_weasel.sessionteam = level.zombie_team;
p_weasel.maxhealth = a_player_team.size * 2000;
p_weasel.health = p_weasel.maxhealth;
foreach (player in a_player_team)
{
player.maxhealth = 2000;
player.health = player.maxhealth;
}
level thread final_showdown_track_weasel(p_weasel);
level thread final_showdown_track_team(a_player_team);
n_spawns_needed = 2;
for (i = n_spawns_needed; i > 0; i--)
maps\mp\zombies\_zm_ai_brutus::brutus_spawn_in_zone("zone_golden_gate_bridge", 1);
level thread final_battle_vo(p_weasel, a_player_team);
level notify("pop_goes_the_weasel_achieved");
level waittill("showdown_over");
}
else if (isdefined(p_weasel))
level.winner = "weasel";
else
level.winner = "team";
level clientnotify("sndSQF");
level.brutus_respawn_after_despawn = 0;
level thread clean_up_final_brutuses();
wait 2;
level notify("stop_timers");
if (level.winner == "weasel")
{
a_players = getplayers();
foreach (player in a_players)
{
player freezecontrols(1);
player maps\mp\zombies\_zm_stats::increment_client_stat("prison_ee_good_ending", 0);
player thread fadetoblackforxsec(0, 5, 0.5, 0, "white");
player create_ending_message(&"ZM_PRISON_GOOD");
player.client_hint.sort = 55;
player.client_hint.color = (0, 0, 0);
playsoundatposition("zmb_quest_final_white_good", (0, 0, 0));
level.sndgameovermusicoverride = "game_over_final_good";
}
level.custom_intermission = ::player_intermission_bridge;
}
else
{
a_players = getplayers();
foreach (player in a_players)
{
player freezecontrols(1);
player maps\mp\zombies\_zm_stats::increment_client_stat("prison_ee_bad_ending", 0);
player thread fadetoblackforxsec(0, 5, 0.5, 0, "white");
player create_ending_message(&"ZM_PRISON_BAD");
player.client_hint.sort = 55;
player.client_hint.color = (0, 0, 0);
playsoundatposition("zmb_quest_final_white_bad", (0, 0, 0));
level.sndgameovermusicoverride = "game_over_final_bad";
}
}
wait 5;
a_players = getplayers();
foreach (player in a_players)
{
if (isdefined(player.client_hint))
player thread destroy_tutorial_message();
if (isdefined(player.revivetrigger))
{
player thread revive_success(player, 0);
player cleanup_suicide_hud();
}
if (isdefined(player))
player ghost();
}
if (isdefined(p_weasel))
{
p_weasel.team = "allies";
p_weasel.pers["team"] = "allies";
p_weasel.sessionteam = "allies";
p_weasel ghost();
}
level notify("end_game");
}
final_battle_vo(p_weasel, a_player_team)
{
level endon("showdown_over");
wait 10;
a_players = arraycopy(a_player_team);
player = a_players[randomintrange(0, a_players.size)];
arrayremovevalue(a_players, player);
if (a_players.size > 0)
player_2 = a_players[randomintrange(0, a_players.size)];
if (isdefined(player))
player final_battle_reveal();
wait 3;
if (isdefined(p_weasel))
p_weasel playsoundontag("vox_plr_3_end_scenario_0", "J_Head");
wait 1;
foreach (player in a_player_team)
{
level thread final_showdown_create_icon(player, p_weasel);
level thread final_showdown_create_icon(p_weasel, player);
}
wait 10;
if (isdefined(player_2))
player_2 playsoundontag("vox_plr_" + player_2.characterindex + "_end_scenario_1", "J_Head");
else if (isdefined(player))
player playsoundontag("vox_plr_" + player.characterindex + "_end_scenario_1", "J_Head");
wait 4;
if (isdefined(p_weasel))
{
p_weasel playsoundontag("vox_plr_3_end_scenario_1", "J_Head");
p_weasel.dontspeak = 0;
p_weasel setclientfieldtoplayer("isspeaking", 0);
}
foreach (player in a_player_team)
{
player.dontspeak = 0;
player setclientfieldtoplayer("isspeaking", 0);
}
}
final_showdown_create_icon(player, enemy)
{
height_offset = 72;
waypoint_origin = spawn("script_model", enemy.origin + (0, 0, height_offset));
waypoint_origin setmodel("tag_origin");
waypoint_origin linkto(enemy);
hud_elem = newclienthudelem(player);
hud_elem.alpha = 1;
hud_elem.archived = 1;
hud_elem.hidewheninmenu = 1;
hud_elem.color = (1, 0, 0);
hud_elem setwaypoint(1, "waypoint_kill_red");
hud_elem settargetent(waypoint_origin);
waittill_any_ents(level, "showdown_over", enemy, "disconnect");
waypoint_origin delete();
hud_elem destroy();
}