mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-28 11:37:51 -05:00
680 lines
15 KiB
Plaintext
680 lines
15 KiB
Plaintext
#include maps/mp/zombies/_zm_zonemgr;
|
|
#include maps/mp/zombies/_zm_audio;
|
|
#include maps/mp/zombies/_zm_sidequests;
|
|
#include maps/mp/_ambientpackage;
|
|
#include maps/mp/zm_alcatraz_utility;
|
|
#include maps/mp/zombies/_zm_utility;
|
|
#include maps/mp/_utility;
|
|
#include common_scripts/utility;
|
|
|
|
main()
|
|
{
|
|
level.sndzombieentcontext = 1;
|
|
if ( is_classic() )
|
|
{
|
|
thread sndmusicegg();
|
|
thread sndstingersetup();
|
|
onplayerconnect_callback( ::sndtrackers );
|
|
}
|
|
}
|
|
|
|
sndtrackers()
|
|
{
|
|
self thread sndbackgroundmustracker();
|
|
}
|
|
|
|
sndstingersetup()
|
|
{
|
|
level.sndmusicstingerevent = ::sndplaystinger;
|
|
level.sndstinger = spawnstruct();
|
|
level.sndstinger.ent = spawn( "script_origin", ( 0, 0, 0 ) );
|
|
level.sndstinger.queue = 0;
|
|
level.sndstinger.isplaying = 0;
|
|
level.sndstinger.states = [];
|
|
level.sndroundwait = 1;
|
|
flag_wait( "start_zombie_round_logic" );
|
|
level sndstingersetupstates();
|
|
level thread sndstingerroundwait();
|
|
level thread sndboardmonitor();
|
|
level thread locationstingerwait();
|
|
}
|
|
|
|
sndstingersetupstates()
|
|
{
|
|
createstingerstate( "door_open", "mus_event_group_03", 2,5, "ignore" );
|
|
createstingerstate( "boards_gone", "mus_event_group_02", 0,5, "ignore" );
|
|
createstingerstate( "zone_tunnels_center", "mus_event_location_tunnels", 0,75, "queue" );
|
|
createstingerstate( "zone_stables", "mus_event_location_stables", 0,75, "queue" );
|
|
createstingerstate( "zone_underground_courthouse", "mus_event_location_courthouse", 0,75, "queue" );
|
|
createstingerstate( "zone_underground_bar", "mus_event_location_bar", 0,75, "queue" );
|
|
createstingerstate( "zone_toy_store", "mus_event_location_toystore", 0,75, "queue" );
|
|
createstingerstate( "zone_underground_jail", "mus_event_location_jail", 0,75, "queue" );
|
|
createstingerstate( "zone_general_store", "mus_event_location_genstore", 0,75, "queue" );
|
|
createstingerstate( "zone_morgue", "mus_event_location_morgue", 0,75, "queue" );
|
|
createstingerstate( "zone_church_main", "mus_event_location_church", 0,75, "queue" );
|
|
createstingerstate( "zone_mansion_lawn", "mus_event_location_mansionlawn", 0,75, "queue" );
|
|
createstingerstate( "zone_mansion", "mus_event_location_mansion", 0,75, "queue" );
|
|
createstingerstate( "zone_maze", "mus_event_location_maze", 0,75, "queue" );
|
|
createstingerstate( "zone_maze_staircase", "mus_event_location_mazeend", 0,75, "queue" );
|
|
createstingerstate( "zone_candy_store", "mus_event_location_candystore", 0,75, "queue" );
|
|
createstingerstate( "zone_street_lighteast", "mus_event_location_street_east", 0,75, "queue" );
|
|
createstingerstate( "zone_street_lightwest", "mus_event_location_street_west", 0,75, "queue" );
|
|
createstingerstate( "zone_start_lower", "mus_event_location_diamondmine", 0,75, "queue" );
|
|
createstingerstate( "sloth_escape", "mus_event_sloth_breakout", 0, "reject" );
|
|
createstingerstate( "poweron", "mus_event_poweron", 0, "reject" );
|
|
createstingerstate( "sidequest_1", "mus_sidequest_0", 0, "reject" );
|
|
createstingerstate( "sidequest_2", "mus_sidequest_1", 0, "reject" );
|
|
createstingerstate( "sidequest_3", "mus_sidequest_2", 0, "reject" );
|
|
createstingerstate( "sidequest_4", "mus_sidequest_3", 0, "reject" );
|
|
createstingerstate( "sidequest_5", "mus_sidequest_4", 0, "reject" );
|
|
createstingerstate( "sidequest_6", "mus_sidequest_5", 0, "reject" );
|
|
createstingerstate( "sidequest_7", "mus_sidequest_6", 0, "reject" );
|
|
createstingerstate( "sidequest_8", "mus_sidequest_7", 0, "reject" );
|
|
}
|
|
|
|
createstingerstate( state, alias, prewait, interrupt )
|
|
{
|
|
s = level.sndstinger;
|
|
if ( !isDefined( s.states[ state ] ) )
|
|
{
|
|
s.states[ state ] = spawnstruct();
|
|
s.states[ state ].alias = alias;
|
|
s.states[ state ].prewait = prewait;
|
|
s.states[ state ].interrupt = interrupt;
|
|
}
|
|
}
|
|
|
|
sndboardmonitor()
|
|
{
|
|
while ( 1 )
|
|
{
|
|
level waittill( "last_board_torn", barrier_origin );
|
|
players = getplayers();
|
|
_a110 = players;
|
|
_k110 = getFirstArrayKey( _a110 );
|
|
while ( isDefined( _k110 ) )
|
|
{
|
|
player = _a110[ _k110 ];
|
|
if ( distancesquared( player.origin, barrier_origin ) <= 22500 )
|
|
{
|
|
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "boards_gone" );
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
_k110 = getNextArrayKey( _a110, _k110 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
locationstingerwait( zone_name, type )
|
|
{
|
|
array = sndlocationsarray();
|
|
sndnorepeats = 3;
|
|
numcut = 0;
|
|
level.sndlastzone = undefined;
|
|
level.sndlocationplayed = 0;
|
|
level thread sndlocationbetweenroundswait();
|
|
for ( ;; )
|
|
{
|
|
while ( 1 )
|
|
{
|
|
level waittill( "newzoneActive", activezone );
|
|
wait 0,1;
|
|
while ( !sndlocationshouldplay( array, activezone ) )
|
|
{
|
|
continue;
|
|
}
|
|
if ( is_true( level.sndroundwait ) )
|
|
{
|
|
}
|
|
}
|
|
else while ( is_true( level.sndstinger.isplaying ) )
|
|
{
|
|
level thread sndlocationqueue( activezone );
|
|
}
|
|
level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( activezone );
|
|
level.sndlocationplayed = 1;
|
|
array = sndcurrentlocationarray( array, activezone, numcut, sndnorepeats );
|
|
level.sndlastzone = activezone;
|
|
if ( numcut >= sndnorepeats )
|
|
{
|
|
numcut = 0;
|
|
}
|
|
else
|
|
{
|
|
numcut++;
|
|
}
|
|
level waittill( "between_round_over" );
|
|
while ( is_true( level.sndroundwait ) )
|
|
{
|
|
wait 0,1;
|
|
}
|
|
level.sndlocationplayed = 0;
|
|
}
|
|
}
|
|
|
|
sndlocationsarray()
|
|
{
|
|
array = [];
|
|
array[ 0 ] = "zone_tunnels_center";
|
|
array[ 1 ] = "zone_church_main";
|
|
array[ 2 ] = "zone_mansion";
|
|
array[ 3 ] = "zone_maze";
|
|
array[ 4 ] = "zone_maze_staircase";
|
|
array[ 5 ] = "zone_street_lightwest";
|
|
array[ 6 ] = "zone_toy_store";
|
|
array[ 7 ] = "zone_candy_store";
|
|
array[ 8 ] = "zone_underground_courthouse";
|
|
array[ 9 ] = "zone_start_lower";
|
|
return array;
|
|
}
|
|
|
|
sndlocationshouldplay( array, activezone )
|
|
{
|
|
shouldplay = 0;
|
|
if ( activezone == "zone_start_lower" && !flag( "fountain_transport_active" ) )
|
|
{
|
|
return shouldplay;
|
|
}
|
|
if ( is_true( level.music_override ) )
|
|
{
|
|
return shouldplay;
|
|
}
|
|
_a197 = array;
|
|
_k197 = getFirstArrayKey( _a197 );
|
|
while ( isDefined( _k197 ) )
|
|
{
|
|
place = _a197[ _k197 ];
|
|
if ( place == activezone )
|
|
{
|
|
shouldplay = 1;
|
|
}
|
|
_k197 = getNextArrayKey( _a197, _k197 );
|
|
}
|
|
if ( shouldplay == 0 )
|
|
{
|
|
return shouldplay;
|
|
}
|
|
playersinlocal = 0;
|
|
players = getplayers();
|
|
_a208 = players;
|
|
_k208 = getFirstArrayKey( _a208 );
|
|
while ( isDefined( _k208 ) )
|
|
{
|
|
player = _a208[ _k208 ];
|
|
if ( player maps/mp/zombies/_zm_zonemgr::is_player_in_zone( activezone ) )
|
|
{
|
|
if ( !is_true( player.afterlife ) )
|
|
{
|
|
playersinlocal++;
|
|
}
|
|
}
|
|
_k208 = getNextArrayKey( _a208, _k208 );
|
|
}
|
|
if ( playersinlocal >= 1 )
|
|
{
|
|
shouldplay = 1;
|
|
}
|
|
else
|
|
{
|
|
shouldplay = 0;
|
|
}
|
|
return shouldplay;
|
|
}
|
|
|
|
sndcurrentlocationarray( current_array, activezone, numcut, max_num_removed )
|
|
{
|
|
if ( numcut >= max_num_removed )
|
|
{
|
|
current_array = sndlocationsarray();
|
|
}
|
|
_a231 = current_array;
|
|
_k231 = getFirstArrayKey( _a231 );
|
|
while ( isDefined( _k231 ) )
|
|
{
|
|
place = _a231[ _k231 ];
|
|
if ( place == activezone )
|
|
{
|
|
arrayremovevalue( current_array, place );
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
_k231 = getNextArrayKey( _a231, _k231 );
|
|
}
|
|
}
|
|
return current_array;
|
|
}
|
|
|
|
sndlocationbetweenrounds()
|
|
{
|
|
level endon( "newzoneActive" );
|
|
activezones = maps/mp/zombies/_zm_zonemgr::get_active_zone_names();
|
|
_a248 = activezones;
|
|
_k248 = getFirstArrayKey( _a248 );
|
|
while ( isDefined( _k248 ) )
|
|
{
|
|
zone = _a248[ _k248 ];
|
|
if ( isDefined( level.sndlastzone ) && zone == level.sndlastzone )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
players = getplayers();
|
|
_a254 = players;
|
|
_k254 = getFirstArrayKey( _a254 );
|
|
while ( isDefined( _k254 ) )
|
|
{
|
|
player = _a254[ _k254 ];
|
|
if ( is_true( player.afterlife ) )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
if ( player maps/mp/zombies/_zm_zonemgr::is_player_in_zone( zone ) )
|
|
{
|
|
wait 0,1;
|
|
level notify( "newzoneActive" );
|
|
return;
|
|
}
|
|
}
|
|
_k254 = getNextArrayKey( _a254, _k254 );
|
|
}
|
|
}
|
|
_k248 = getNextArrayKey( _a248, _k248 );
|
|
}
|
|
}
|
|
|
|
sndlocationbetweenroundswait()
|
|
{
|
|
while ( is_true( level.sndroundwait ) )
|
|
{
|
|
wait 0,1;
|
|
}
|
|
while ( 1 )
|
|
{
|
|
level thread sndlocationbetweenrounds();
|
|
level waittill( "between_round_over" );
|
|
while ( is_true( level.sndroundwait ) )
|
|
{
|
|
wait 0,1;
|
|
}
|
|
}
|
|
}
|
|
|
|
sndlocationqueue( zone )
|
|
{
|
|
level endon( "newzoneActive" );
|
|
while ( is_true( level.sndstinger.isplaying ) )
|
|
{
|
|
wait 0,5;
|
|
}
|
|
level notify( "newzoneActive" );
|
|
}
|
|
|
|
sndplaystinger( state, player )
|
|
{
|
|
s = level.sndstinger;
|
|
if ( !isDefined( s.states[ state ] ) )
|
|
{
|
|
return;
|
|
}
|
|
interrupt = s.states[ state ].interrupt == "ignore";
|
|
if ( !is_true( s.isplaying ) || is_true( interrupt ) )
|
|
{
|
|
if ( interrupt )
|
|
{
|
|
wait s.states[ state ].prewait;
|
|
playstinger( state, player, 1 );
|
|
}
|
|
else if ( !level.sndroundwait )
|
|
{
|
|
s.isplaying = 1;
|
|
wait s.states[ state ].prewait;
|
|
playstinger( state, player, 0 );
|
|
level notify( "sndStingerDone" );
|
|
s.isplaying = 0;
|
|
}
|
|
else
|
|
{
|
|
if ( s.states[ state ].interrupt == "queue" )
|
|
{
|
|
level thread sndqueuestinger( state, player );
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
if ( s.states[ state ].interrupt == "queue" )
|
|
{
|
|
level thread sndqueuestinger( state, player );
|
|
}
|
|
}
|
|
|
|
playstinger( state, player, ignore )
|
|
{
|
|
s = level.sndstinger;
|
|
if ( !isDefined( s.states[ state ] ) )
|
|
{
|
|
return;
|
|
}
|
|
if ( is_true( level.music_override ) )
|
|
{
|
|
return;
|
|
}
|
|
if ( is_true( ignore ) )
|
|
{
|
|
if ( isDefined( player ) )
|
|
{
|
|
player playsoundtoplayer( s.states[ state ].alias, player );
|
|
}
|
|
else
|
|
{
|
|
s.ent playsound( s.states[ state ].alias );
|
|
s.ent thread playstingerstop();
|
|
}
|
|
}
|
|
else if ( isDefined( player ) )
|
|
{
|
|
player playsoundtoplayer( s.states[ state ].alias, player );
|
|
wait 8;
|
|
}
|
|
else
|
|
{
|
|
s.ent playsoundwithnotify( s.states[ state ].alias, "sndStingerDone" );
|
|
s.ent thread playstingerstop();
|
|
s.ent waittill( "sndStingerDone" );
|
|
}
|
|
}
|
|
|
|
sndqueuestinger( state, player )
|
|
{
|
|
s = level.sndstinger;
|
|
if ( is_true( s.queue ) )
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
s.queue = 1;
|
|
while ( 1 )
|
|
{
|
|
if ( is_true( level.sndroundwait ) || is_true( s.isplaying ) )
|
|
{
|
|
wait 0,5;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
level thread sndplaystinger( state, player );
|
|
s.queue = 0;
|
|
}
|
|
}
|
|
|
|
sndstingerroundwait()
|
|
{
|
|
wait 25;
|
|
level.sndroundwait = 0;
|
|
while ( 1 )
|
|
{
|
|
level waittill( "end_of_round" );
|
|
level thread sndstingerroundwait_start();
|
|
}
|
|
}
|
|
|
|
sndstingerroundwait_start()
|
|
{
|
|
level.sndroundwait = 1;
|
|
wait 0,05;
|
|
level thread sndstingerroundwait_end();
|
|
}
|
|
|
|
sndstingerroundwait_end()
|
|
{
|
|
level endon( "end_of_round" );
|
|
level waittill( "between_round_over" );
|
|
wait 28;
|
|
level.sndroundwait = 0;
|
|
}
|
|
|
|
playstingerstop()
|
|
{
|
|
self endon( "sndStingerDone" );
|
|
level endon( "sndStingerDone" );
|
|
level waittill( "end_of_round" );
|
|
wait 2;
|
|
self stopsounds();
|
|
}
|
|
|
|
sndbackgroundmustracker()
|
|
{
|
|
self endon( "disconnect" );
|
|
self.prevzone = "null";
|
|
self.prevcase = 99;
|
|
while ( 1 )
|
|
{
|
|
level waittill( "newzoneActive", activezone );
|
|
if ( self.prevzone != activezone )
|
|
{
|
|
if ( self maps/mp/zombies/_zm_zonemgr::is_player_in_zone( activezone ) )
|
|
{
|
|
self.prevzone = activezone;
|
|
switch( activezone )
|
|
{
|
|
case "zone_start":
|
|
case "zone_start_lower":
|
|
if ( self.prevcase != 0 )
|
|
{
|
|
self setclientfieldtoplayer( "sndBackgroundMus", 0 );
|
|
self.prevcase = 0;
|
|
}
|
|
break;
|
|
break;
|
|
case "zone_mansion":
|
|
case "zone_mansion_backyard":
|
|
case "zone_mansion_lawn":
|
|
case "zone_maze":
|
|
case "zone_maze_staircase":
|
|
if ( self.prevcase != 2 )
|
|
{
|
|
self setclientfieldtoplayer( "sndBackgroundMus", 2 );
|
|
self.prevcase = 2;
|
|
}
|
|
break;
|
|
break;
|
|
default:
|
|
if ( self.prevcase != 1 )
|
|
{
|
|
self setclientfieldtoplayer( "sndBackgroundMus", 1 );
|
|
self.prevcase = 1;
|
|
}
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sndshoulditplay( activezone )
|
|
{
|
|
if ( self.prevzone == activezone )
|
|
{
|
|
return 0;
|
|
}
|
|
if ( !self maps/mp/zombies/_zm_zonemgr::is_player_in_zone( activezone ) )
|
|
{
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
sndlastlifesetup()
|
|
{
|
|
flag_wait( "start_zombie_round_logic" );
|
|
level thread sndlastlife_multi();
|
|
}
|
|
|
|
sndlastlife_multi()
|
|
{
|
|
level endon( "end_of_round" );
|
|
level thread sndlastlife_multi_reset();
|
|
sndplayersdead = 0;
|
|
while ( 1 )
|
|
{
|
|
level waittill( "bleed_out" );
|
|
sndplayersdead++;
|
|
players = getplayers();
|
|
if ( ( players.size - sndplayersdead ) <= 1 )
|
|
{
|
|
last_alive = sndlastlife_multi_getlastplayer();
|
|
level thread maps/mp/zombies/_zm_audio::change_zombie_music( "last_life" );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
sndlastlife_multi_getlastplayer()
|
|
{
|
|
level endon( "end_of_round" );
|
|
wait 0,5;
|
|
players = getplayers();
|
|
_a572 = players;
|
|
_k572 = getFirstArrayKey( _a572 );
|
|
while ( isDefined( _k572 ) )
|
|
{
|
|
dude = _a572[ _k572 ];
|
|
if ( dude.sessionstate == "spectator" )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
return dude;
|
|
}
|
|
_k572 = getNextArrayKey( _a572, _k572 );
|
|
}
|
|
}
|
|
|
|
sndlastlife_multi_reset()
|
|
{
|
|
level waittill( "end_of_round" );
|
|
level thread sndlastlife_multi();
|
|
}
|
|
|
|
sndmusicegg()
|
|
{
|
|
origins = [];
|
|
origins[ 0 ] = ( -1215,63, -499,975, 291,89 );
|
|
origins[ 1 ] = ( 552,009, -342,824, 27,3921 );
|
|
origins[ 2 ] = ( 2827,28, 306,468, 92,783 );
|
|
level.meteor_counter = 0;
|
|
level.music_override = 0;
|
|
i = 0;
|
|
while ( i < origins.size )
|
|
{
|
|
level thread sndmusicegg_wait( origins[ i ] );
|
|
i++;
|
|
}
|
|
}
|
|
|
|
sndmusicegg_wait( bottle_origin )
|
|
{
|
|
temp_ent = spawn( "script_origin", bottle_origin );
|
|
temp_ent playloopsound( "zmb_meteor_loop" );
|
|
temp_ent thread maps/mp/zombies/_zm_sidequests::fake_use( "main_music_egg_hit", ::sndmusicegg_override );
|
|
temp_ent waittill( "main_music_egg_hit", player );
|
|
temp_ent stoploopsound( 1 );
|
|
player playsound( "zmb_meteor_activate" );
|
|
level.meteor_counter += 1;
|
|
if ( level.meteor_counter == 3 )
|
|
{
|
|
level thread sndmuseggplay( temp_ent, "mus_zmb_secret_song", 363 );
|
|
level thread easter_egg_song_vo( player );
|
|
}
|
|
else
|
|
{
|
|
wait 1,5;
|
|
temp_ent delete();
|
|
}
|
|
}
|
|
|
|
sndmusicegg_override()
|
|
{
|
|
if ( is_true( level.music_override ) )
|
|
{
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
sndmuseggplay( ent, alias, time )
|
|
{
|
|
level.music_override = 1;
|
|
wait 1;
|
|
ent playsound( alias );
|
|
level setclientfield( "mus_zmb_egg_snapshot_loop", 1 );
|
|
level thread sndeggmusicwait( time );
|
|
level waittill_either( "end_game", "sndSongDone" );
|
|
ent stopsounds();
|
|
level setclientfield( "mus_zmb_egg_snapshot_loop", 0 );
|
|
wait 0,05;
|
|
ent delete();
|
|
level.music_override = 0;
|
|
}
|
|
|
|
sndeggmusicwait( time )
|
|
{
|
|
level endon( "end_game" );
|
|
wait time;
|
|
level notify( "sndSongDone" );
|
|
}
|
|
|
|
sndmusicquestendgame( alias, length )
|
|
{
|
|
while ( is_true( level.music_override ) )
|
|
{
|
|
wait 1;
|
|
}
|
|
level.music_override = 1;
|
|
level setclientfield( "mus_zmb_egg_snapshot_loop", 1 );
|
|
ent = spawn( "script_origin", ( 0, 0, 0 ) );
|
|
ent playsound( alias );
|
|
wait length;
|
|
level setclientfield( "mus_zmb_egg_snapshot_loop", 0 );
|
|
level.music_override = 0;
|
|
wait 0,05;
|
|
ent delete();
|
|
wait 1;
|
|
level thread sndendgamemusicredux( alias, length );
|
|
}
|
|
|
|
easter_egg_song_vo( player )
|
|
{
|
|
if ( isalive( player ) )
|
|
{
|
|
player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "quest", "find_secret" );
|
|
}
|
|
}
|
|
|
|
sndendgamemusicredux( alias, length )
|
|
{
|
|
m_endgame_machine = getstruct( "sq_endgame_machine", "targetname" );
|
|
temp_ent = spawn( "script_origin", m_endgame_machine.origin );
|
|
temp_ent thread maps/mp/zombies/_zm_sidequests::fake_use( "main_music_egg_hit", ::sndmusicegg_override );
|
|
temp_ent playloopsound( "zmb_meteor_loop" );
|
|
temp_ent waittill( "main_music_egg_hit", player );
|
|
temp_ent stoploopsound( 1 );
|
|
level.music_override = 1;
|
|
temp_ent playsound( "zmb_endgame_mach_button" );
|
|
level setclientfield( "mus_zmb_egg_snapshot_loop", 1 );
|
|
temp_ent playsound( alias );
|
|
wait length;
|
|
level setclientfield( "mus_zmb_egg_snapshot_loop", 0 );
|
|
level.music_override = 0;
|
|
wait 0,05;
|
|
temp_ent delete();
|
|
}
|