1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-10 15:17:57 -05:00
Files
BO2-Reimagined/scripts/zm/replaced/zm_prison_sq_final.gsc

441 lines
14 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();
players = get_players();
foreach ( player in players )
{
if ( is_player_valid( player ) )
{
player thread scripts\zm\replaced\_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("freeze_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();
}