mirror of
https://github.com/JezuzLizard/BO2-Reimagined.git
synced 2025-06-10 15:17:57 -05:00
440 lines
16 KiB
Plaintext
440 lines
16 KiB
Plaintext
#include maps\mp\zm_alcatraz_sq;
|
|
#include common_scripts\utility;
|
|
#include maps\mp\_utility;
|
|
#include maps\_utility;
|
|
#include maps\_vehicle;
|
|
#include maps\mp\zombies\_zm_afterlife;
|
|
#include maps\mp\zombies\_zm_utility;
|
|
#include maps\mp\zombies\_zm_craftables;
|
|
#include maps\mp\zombies\_zm_sidequests;
|
|
#include maps\mp\zm_alcatraz_utility;
|
|
#include maps\mp\gametypes_zm\_hud_util;
|
|
#include maps\mp\gametypes_zm\_hud;
|
|
#include maps\mp\zm_prison_sq_final;
|
|
#include maps\mp\zm_alcatraz_sq_vo;
|
|
#include maps\mp\zombies\_zm_equipment;
|
|
#include maps\mp\zombies\_zm_unitrigger;
|
|
#include maps\mp\zm_alcatraz_sq_nixie;
|
|
#include maps\mp\zombies\_zm_audio;
|
|
#include maps\mp\zombies\_zm_ai_brutus;
|
|
#include maps\mp\animscripts\shared;
|
|
#include maps\mp\zombies\_zm_ai_basic;
|
|
#include maps\mp\zombies\_zm_laststand;
|
|
#include maps\mp\zombies\_zm_clone;
|
|
|
|
start_alcatraz_sidequest()
|
|
{
|
|
init();
|
|
onplayerconnect_callback( ::player_disconnect_watcher );
|
|
onplayerconnect_callback( ::player_death_watcher );
|
|
flag_wait( "start_zombie_round_logic" );
|
|
|
|
level.n_quest_iteration_count = 1;
|
|
level.n_plane_fuel_count = 5;
|
|
level.n_plane_pieces_found = 0;
|
|
level.final_flight_players = [];
|
|
level.final_flight_activated = 0;
|
|
level.characters_in_nml = [];
|
|
level.someone_has_visited_nml = 0;
|
|
level.custom_game_over_hud_elem = maps\mp\zm_prison_sq_final::custom_game_over_hud_elem;
|
|
prevent_theater_mode_spoilers();
|
|
setup_key_doors();
|
|
setup_puzzle_piece_glint();
|
|
setup_puzzles();
|
|
setup_quest_triggers();
|
|
flag_set( "docks_gates_remain_open" );
|
|
|
|
if ( isdefined( level.gamedifficulty ) && level.gamedifficulty != 0 )
|
|
maps\mp\zm_prison_sq_final::final_flight_setup();
|
|
|
|
level thread warden_fence_hotjoin_handler();
|
|
|
|
if ( isdefined( level.host_migration_listener_custom_func ) )
|
|
level thread [[ level.host_migration_listener_custom_func ]]();
|
|
else
|
|
level thread host_migration_listener();
|
|
|
|
if ( isdefined( level.manage_electric_chairs_custom_func ) )
|
|
level thread [[ level.manage_electric_chairs_custom_func ]]();
|
|
else
|
|
level thread manage_electric_chairs();
|
|
|
|
if ( isdefined( level.plane_flight_thread_custom_func ) )
|
|
level thread [[ level.plane_flight_thread_custom_func ]]();
|
|
else
|
|
level thread plane_flight_thread();
|
|
|
|
if ( isdefined( level.track_quest_status_thread_custom_func ) )
|
|
level thread [[ level.track_quest_status_thread_custom_func ]]();
|
|
else
|
|
level thread track_quest_status_thread();
|
|
|
|
maps\mp\zm_alcatraz_sq_vo::opening_vo();
|
|
}
|
|
|
|
dryer_zombies_thread()
|
|
{
|
|
n_zombie_count_min = 20;
|
|
e_shower_zone = getent( "cellblock_shower", "targetname" );
|
|
flag_wait( "dryer_cycle_active" );
|
|
|
|
if ( level.zombie_total < n_zombie_count_min )
|
|
level.zombie_total = n_zombie_count_min;
|
|
|
|
while ( flag( "dryer_cycle_active" ) )
|
|
{
|
|
a_zombies_in_shower = [];
|
|
a_zombies_in_shower = get_zombies_touching_volume( "axis", "cellblock_shower", undefined );
|
|
|
|
if ( a_zombies_in_shower.size < n_zombie_count_min )
|
|
{
|
|
e_zombie = get_farthest_available_zombie( e_shower_zone );
|
|
|
|
if ( isdefined( e_zombie ) && !isinarray( a_zombies_in_shower, e_zombie ) )
|
|
{
|
|
e_zombie notify( "zapped" );
|
|
e_zombie thread dryer_teleports_zombie();
|
|
}
|
|
}
|
|
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
track_quest_status_thread()
|
|
{
|
|
while ( true )
|
|
{
|
|
while ( level.characters_in_nml.size == 0 )
|
|
wait 1;
|
|
|
|
while ( level.characters_in_nml.size > 0 )
|
|
wait 1;
|
|
|
|
if ( flag( "plane_trip_to_nml_successful" ) )
|
|
{
|
|
bestow_quest_rewards();
|
|
flag_clear( "plane_trip_to_nml_successful" );
|
|
}
|
|
|
|
level notify( "bridge_empty" );
|
|
|
|
if ( level.n_quest_iteration_count == 2 )
|
|
vo_play_four_part_conversation( level.four_part_convos["alcatraz_return_alt" + randomintrange( 0, 2 )] );
|
|
|
|
prep_for_new_quest();
|
|
t_plane_fly = getent( "plane_fly_trigger", "targetname" );
|
|
t_plane_fly sethintstring( &"ZM_PRISON_PLANE_BEGIN_TAKEOFF" );
|
|
t_plane_fly trigger_on();
|
|
}
|
|
}
|
|
|
|
prep_for_new_quest()
|
|
{
|
|
for ( i = 1; i < 4; i++ )
|
|
{
|
|
str_trigger_targetname = "trigger_electric_chair_" + i;
|
|
t_electric_chair = getent( str_trigger_targetname, "targetname" );
|
|
t_electric_chair sethintstring( &"ZM_PRISON_ELECTRIC_CHAIR_ACTIVATE" );
|
|
t_electric_chair trigger_on();
|
|
}
|
|
|
|
for ( i = 1; i < 5; i++ )
|
|
{
|
|
m_electric_chair = getent( "electric_chair_" + i, "targetname" );
|
|
m_electric_chair notify( "bridge_empty" );
|
|
}
|
|
|
|
m_plane_craftable = getent( "plane_craftable", "targetname" );
|
|
m_plane_craftable show();
|
|
playfxontag( level._effect["fx_alcatraz_plane_apear"], m_plane_craftable, "tag_origin" );
|
|
veh_plane_flyable = getent( "plane_flyable", "targetname" );
|
|
veh_plane_flyable attachpath( getvehiclenode( "zombie_plane_underground", "targetname" ) );
|
|
vo_play_four_part_conversation( level.four_part_convos["alcatraz_return_quest_reset"] );
|
|
flag_clear( "plane_is_away" );
|
|
}
|
|
|
|
plane_boarding_thread()
|
|
{
|
|
self endon( "death_or_disconnect" );
|
|
flag_set( "plane_is_away" );
|
|
self thread player_disconnect_watcher();
|
|
self thread player_death_watcher();
|
|
|
|
flag_set( "plane_boarded" );
|
|
self setclientfieldtoplayer( "effects_escape_flight", 1 );
|
|
level.brutus_respawn_after_despawn = 0;
|
|
a_nml_teleport_targets = [];
|
|
|
|
for ( i = 1; i < 6; i++ )
|
|
a_nml_teleport_targets[i - 1] = getstruct( "nml_telepoint_" + i, "targetname" );
|
|
|
|
level.characters_in_nml[level.characters_in_nml.size] = self.character_name;
|
|
self.on_a_plane = 1;
|
|
level.someone_has_visited_nml = 1;
|
|
self.n_passenger_index = level.characters_in_nml.size;
|
|
m_plane_craftable = getent( "plane_craftable", "targetname" );
|
|
m_plane_about_to_crash = getent( "plane_about_to_crash", "targetname" );
|
|
veh_plane_flyable = getent( "plane_flyable", "targetname" );
|
|
t_plane_fly = getent( "plane_fly_trigger", "targetname" );
|
|
t_plane_fly sethintstring( &"ZM_PRISON_PLANE_BOARD" );
|
|
self enableinvulnerability();
|
|
self playerlinktodelta( m_plane_craftable, "tag_player_crouched_" + ( self.n_passenger_index + 1 ) );
|
|
self allowstand( 0 );
|
|
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 );
|
|
self playerlinktodelta( veh_plane_flyable, "tag_player_crouched_" + ( self.n_passenger_index + 1 ) );
|
|
self setclientfieldtoplayer( "effects_escape_flight", 2 );
|
|
flag_wait( "plane_approach_bridge" );
|
|
self thread snddelayedimp();
|
|
self setclientfieldtoplayer( "effects_escape_flight", 3 );
|
|
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", 4 );
|
|
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 );
|
|
self forcegrenadethrow();
|
|
str_current_weapon = self getcurrentweapon();
|
|
self giveweapon( "falling_hands_zm" );
|
|
self switchtoweaponimmediate( "falling_hands_zm" );
|
|
self setweaponammoclip( "falling_hands_zm", 0 );
|
|
players = getplayers();
|
|
|
|
foreach ( player in players )
|
|
{
|
|
if ( player != self )
|
|
player setinvisibletoplayer( self );
|
|
}
|
|
|
|
flag_wait( "plane_crashed" );
|
|
self setclientfieldtoplayer( "effects_escape_flight", 5 );
|
|
self takeweapon( "falling_hands_zm" );
|
|
|
|
if ( isdefined( str_current_weapon ) && str_current_weapon != "none" )
|
|
self switchtoweaponimmediate( str_current_weapon );
|
|
|
|
self thread fadetoblackforxsec( 0, 2, 0, 0.5, "black" );
|
|
self thread snddelayedmusic();
|
|
self unlink();
|
|
self allowstand( 1 );
|
|
self setstance( "stand" );
|
|
players = getplayers();
|
|
|
|
foreach ( player in players )
|
|
{
|
|
if ( player != self )
|
|
player setvisibletoplayer( self );
|
|
}
|
|
|
|
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.dontspeak = 0;
|
|
self setclientfieldtoplayer( "isspeaking", 0 );
|
|
self notify( "player_at_bridge" );
|
|
wait( n_shellshock_duration );
|
|
self disableinvulnerability();
|
|
self.on_a_plane = 0;
|
|
|
|
if ( level.characters_in_nml.size == 1 )
|
|
self thread vo_bridge_soliloquy();
|
|
else if ( level.characters_in_nml.size == 4 )
|
|
level thread vo_bridge_four_part_convo();
|
|
|
|
self playsoundtoplayer( "zmb_ggb_swarm_start", self );
|
|
flag_set( "spawn_zombies" );
|
|
level.brutus_respawn_after_despawn = 1;
|
|
character_name = level.characters_in_nml[randomintrange( 0, level.characters_in_nml.size )];
|
|
players = getplayers();
|
|
|
|
foreach ( player in players )
|
|
{
|
|
if ( isdefined( player ) && player.character_name == character_name )
|
|
player thread do_player_general_vox( "quest", "zombie_arrive_gg", undefined, 100 );
|
|
}
|
|
}
|
|
|
|
plane_flight_thread()
|
|
{
|
|
while ( true )
|
|
{
|
|
m_plane_about_to_crash = getent( "plane_about_to_crash", "targetname" );
|
|
m_plane_craftable = getent( "plane_craftable", "targetname" );
|
|
t_plane_fly = getent( "plane_fly_trigger", "targetname" );
|
|
veh_plane_flyable = getent( "plane_flyable", "targetname" );
|
|
m_plane_about_to_crash ghost();
|
|
flag_wait( "plane_boarded" );
|
|
level clientnotify( "sndPB" );
|
|
|
|
if ( !( isdefined( level.music_override ) && level.music_override ) )
|
|
t_plane_fly playloopsound( "mus_event_plane_countdown_loop", 0.25 );
|
|
|
|
for ( i = 10; i > 0; i-- )
|
|
{
|
|
veh_plane_flyable playsound( "zmb_plane_countdown_tick" );
|
|
wait 1;
|
|
}
|
|
|
|
t_plane_fly stoploopsound( 2 );
|
|
exploder( 10000 );
|
|
veh_plane_flyable attachpath( getvehiclenode( "zombie_plane_flight_path", "targetname" ) );
|
|
veh_plane_flyable startpath();
|
|
flag_set( "plane_departed" );
|
|
t_plane_fly trigger_off();
|
|
m_plane_craftable ghost();
|
|
veh_plane_flyable setvisibletoall();
|
|
level setclientfield( "fog_stage", 1 );
|
|
playfxontag( level._effect["fx_alcatraz_plane_trail"], veh_plane_flyable, "tag_origin" );
|
|
wait 2;
|
|
playfxontag( level._effect["fx_alcatraz_plane_trail_fast"], veh_plane_flyable, "tag_origin" );
|
|
wait 3;
|
|
exploder( 10001 );
|
|
wait 4;
|
|
playfxontag( level._effect["fx_alcatraz_flight_lightning"], veh_plane_flyable, "tag_origin" );
|
|
level setclientfield( "scripted_lightning_flash", 1 );
|
|
wait 1;
|
|
flag_set( "plane_approach_bridge" );
|
|
stop_exploder( 10001 );
|
|
level setclientfield( "fog_stage", 2 );
|
|
veh_plane_flyable attachpath( getvehiclenode( "zombie_plane_bridge_approach", "targetname" ) );
|
|
veh_plane_flyable startpath();
|
|
wait 6;
|
|
playfxontag( level._effect["fx_alcatraz_flight_lightning"], veh_plane_flyable, "tag_origin" );
|
|
level setclientfield( "scripted_lightning_flash", 1 );
|
|
|
|
veh_plane_flyable waittill( "reached_end_node" );
|
|
|
|
flag_set( "plane_zapped" );
|
|
level setclientfield( "fog_stage", 3 );
|
|
veh_plane_flyable setinvisibletoall();
|
|
n_crash_duration = 2.25;
|
|
nd_plane_about_to_crash_1 = getstruct( "plane_about_to_crash_point_1", "targetname" );
|
|
m_plane_about_to_crash.origin = nd_plane_about_to_crash_1.origin;
|
|
nd_plane_about_to_crash_2 = getstruct( "plane_about_to_crash_point_2", "targetname" );
|
|
m_plane_about_to_crash moveto( nd_plane_about_to_crash_2.origin, n_crash_duration );
|
|
m_plane_about_to_crash thread spin_while_falling();
|
|
stop_exploder( 10000 );
|
|
|
|
m_plane_about_to_crash waittill( "movedone" );
|
|
|
|
flag_set( "plane_crashed" );
|
|
wait 2;
|
|
level setclientfield( "scripted_lightning_flash", 1 );
|
|
m_plane_about_to_crash.origin += vectorscale( ( 0, 0, -1 ), 2048.0 );
|
|
wait 4;
|
|
veh_plane_flyable setvisibletoall();
|
|
veh_plane_flyable play_fx( "fx_alcatraz_plane_fire_trail", veh_plane_flyable.origin, veh_plane_flyable.angles, "reached_end_node", 1, "tag_origin", undefined );
|
|
veh_plane_flyable attachpath( getvehiclenode( "zombie_plane_bridge_flyby", "targetname" ) );
|
|
veh_plane_flyable startpath();
|
|
veh_plane_flyable thread sndpc();
|
|
|
|
veh_plane_flyable waittill( "reached_end_node" );
|
|
|
|
veh_plane_flyable setinvisibletoall();
|
|
|
|
if ( !level.final_flight_activated )
|
|
{
|
|
if ( isdefined( level.brutus_on_the_bridge_custom_func ) )
|
|
level thread [[ level.brutus_on_the_bridge_custom_func ]]();
|
|
else
|
|
level thread brutus_on_the_bridge();
|
|
}
|
|
|
|
flag_clear( "plane_boarded" );
|
|
flag_clear( "plane_departed" );
|
|
flag_clear( "plane_approach_bridge" );
|
|
flag_clear( "plane_zapped" );
|
|
flag_clear( "plane_crashed" );
|
|
}
|
|
}
|
|
|
|
manage_electric_chairs()
|
|
{
|
|
level notify( "manage_electric_chairs" );
|
|
level endon( "manage_electric_chairs" );
|
|
|
|
while ( true )
|
|
{
|
|
flag_wait( "plane_approach_bridge" );
|
|
|
|
for ( i = 1; i < 5; i++ )
|
|
{
|
|
str_trigger_targetname = "trigger_electric_chair_" + i;
|
|
t_electric_chair = getent( str_trigger_targetname, "targetname" );
|
|
|
|
if ( isdefined( level.electric_chair_trigger_thread_custom_func ) )
|
|
t_electric_chair thread [[ level.electric_chair_trigger_thread_custom_func ]]( i );
|
|
else
|
|
t_electric_chair thread electric_chair_trigger_thread( i );
|
|
|
|
t_electric_chair setcursorhint( "HINT_NOICON" );
|
|
t_electric_chair sethintstring( &"ZM_PRISON_ELECTRIC_CHAIR_ACTIVATE" );
|
|
t_electric_chair usetriggerrequirelookat();
|
|
}
|
|
|
|
if ( level.final_flight_activated )
|
|
{
|
|
level.revive_trigger_should_ignore_sight_checks = maps\mp\zm_prison_sq_final::revive_trigger_should_ignore_sight_checks;
|
|
|
|
for ( j = 0; j < level.final_flight_players.size; j++ )
|
|
{
|
|
m_electric_chair = getent( "electric_chair_" + ( j + 1 ), "targetname" );
|
|
corpse = level.final_flight_players[j].e_afterlife_corpse;
|
|
corpse linkto( m_electric_chair, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
corpse maps\mp\zombies\_zm_clone::clone_animate( "chair" );
|
|
wait 1;
|
|
corpse.revivetrigger unlink();
|
|
corpse.revivetrigger.origin = m_electric_chair.origin + ( 64, 0, 32 );
|
|
}
|
|
|
|
for ( j = 1; j < 5; j++ )
|
|
{
|
|
str_trigger_targetname = "trigger_electric_chair_" + j;
|
|
t_electric_chair = getent( str_trigger_targetname, "targetname" );
|
|
t_electric_chair trigger_off();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for ( i = 1; i < 5; i++ )
|
|
{
|
|
m_electric_chair = getent( "electric_chair_" + i, "targetname" );
|
|
m_electric_chair hide();
|
|
str_trigger_targetname = "trigger_electric_chair_" + i;
|
|
t_electric_chair = getent( str_trigger_targetname, "targetname" );
|
|
t_electric_chair trigger_off();
|
|
}
|
|
|
|
flag_wait( "plane_crashed" );
|
|
exploder( 666 );
|
|
|
|
for ( i = 1; i < 5; i++ )
|
|
{
|
|
m_electric_chair = getent( "electric_chair_" + i, "targetname" );
|
|
m_electric_chair show();
|
|
m_electric_chair thread snddelayedchairaudio( i );
|
|
str_trigger_targetname = "trigger_electric_chair_" + i;
|
|
t_electric_chair = getent( str_trigger_targetname, "targetname" );
|
|
t_electric_chair trigger_on();
|
|
}
|
|
|
|
wait 3;
|
|
electric_chair_vo();
|
|
}
|
|
|
|
flag_waitopen( "plane_approach_bridge" );
|
|
}
|
|
} |