#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(); }