mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-10 10:47:58 -05:00
1601 lines
42 KiB
Plaintext
1601 lines
42 KiB
Plaintext
#include maps/mp/zombies/_zm_unitrigger;
|
|
#include maps/mp/zombies/_zm_buildables;
|
|
#include maps/mp/zombies/_zm_powerups;
|
|
#include maps/mp/zombies/_zm_weapons;
|
|
#include maps/mp/zombies/_zm_zonemgr;
|
|
#include maps/mp/zombies/_zm_stats;
|
|
#include maps/mp/gametypes_zm/_globallogic_score;
|
|
#include maps/mp/zombies/_zm_spawner;
|
|
#include maps/mp/zm_transit_utility;
|
|
#include maps/mp/zombies/_zm_sidequests;
|
|
#include maps/mp/zombies/_zm_utility;
|
|
#include maps/mp/_utility;
|
|
#include common_scripts/utility;
|
|
|
|
init()
|
|
{
|
|
if ( level.createfx_enabled )
|
|
{
|
|
return;
|
|
}
|
|
if ( isDefined( level.gamedifficulty ) && level.gamedifficulty == 0 )
|
|
{
|
|
level thread sq_easy_cleanup();
|
|
return;
|
|
}
|
|
level.sq_volume = getent( "sq_common_area", "targetname" );
|
|
level.sq_clip = getent( "sq_common_clip", "targetname" );
|
|
register_map_navcard( "navcard_held_zm_transit", "navcard_held_zm_buried" );
|
|
if ( isDefined( level.sq_clip ) )
|
|
{
|
|
level.sq_clip connectpaths();
|
|
level.sq_clip trigger_off();
|
|
}
|
|
maps/mp/zombies/_zm_spawner::register_zombie_death_event_callback( ::sq_zombie_death_event_response );
|
|
declare_sidequest( "sq", ::init_sidequest, ::sidequest_logic, ::complete_sidequest, ::generic_stage_start, ::generic_stage_complete );
|
|
init_sidequest_vo();
|
|
precache_sidequest_assets();
|
|
level thread survivor_vox();
|
|
level thread avogadro_is_near_tower();
|
|
level thread avogadro_far_from_tower();
|
|
level thread avogadro_stab_watch();
|
|
level thread init_navcard();
|
|
level thread init_navcomputer();
|
|
level.buildable_built_custom_func = ::builable_built_custom_func;
|
|
level thread richtofen_sidequest_power_state();
|
|
}
|
|
|
|
sq_easy_cleanup()
|
|
{
|
|
computer_buildable_trig = getent( "sq_common_buildable_trigger", "targetname" );
|
|
computer_buildable_trig delete();
|
|
sq_buildables = getentarray( "buildable_sq_common", "targetname" );
|
|
_a64 = sq_buildables;
|
|
_k64 = getFirstArrayKey( _a64 );
|
|
while ( isDefined( _k64 ) )
|
|
{
|
|
item = _a64[ _k64 ];
|
|
item delete();
|
|
_k64 = getNextArrayKey( _a64, _k64 );
|
|
}
|
|
}
|
|
|
|
init_player_sidequest_stats()
|
|
{
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_transit_started", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_transit_maxis_reset", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_transit_rich_reset", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_transit_rich_stage_1", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_transit_rich_stage_2", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_transit_rich_stage_3", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_transit_rich_complete", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_transit_maxis_stage_1", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_transit_maxis_stage_2", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_transit_maxis_stage_3", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_transit_maxis_complete", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_transit_last_completed", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "navcard_held_zm_transit", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "navcard_held_zm_highrise", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "navcard_held_zm_buried", 0 );
|
|
self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "navcard_applied_zm_transit", 0 );
|
|
}
|
|
|
|
init_sidequest_vo()
|
|
{
|
|
level.power_station_zones = [];
|
|
level.power_station_zones[ level.power_station_zones.size ] = "zone_trans_6";
|
|
level.power_station_zones[ level.power_station_zones.size ] = "zone_amb_cornfield";
|
|
level.power_station_zones[ level.power_station_zones.size ] = "zone_trans_7";
|
|
level.power_station_zones[ level.power_station_zones.size ] = "zone_pow_ext1";
|
|
level.power_station_zones[ level.power_station_zones.size ] = "zone_prr";
|
|
level.power_station_zones[ level.power_station_zones.size ] = "zone_pcr";
|
|
level.power_station_zones[ level.power_station_zones.size ] = "zone_pow_warehouse";
|
|
}
|
|
|
|
init_sidequest()
|
|
{
|
|
players = get_players();
|
|
}
|
|
|
|
start_transit_sidequest()
|
|
{
|
|
if ( level.gamedifficulty == 0 )
|
|
{
|
|
return;
|
|
}
|
|
sidequest_start( "sq" );
|
|
}
|
|
|
|
sidequest_logic()
|
|
{
|
|
level thread sidequest_main();
|
|
wait_for_buildable( "sq_common" );
|
|
if ( isDefined( level.navcomputer_spawned ) && !level.navcomputer_spawned )
|
|
{
|
|
update_sidequest_stats( "sq_transit_started" );
|
|
}
|
|
level thread navcomputer_waitfor_navcard();
|
|
if ( flag( "power_on" ) )
|
|
{
|
|
level thread richtofensay( "vox_zmba_sidequest_jet_terminal_0" );
|
|
}
|
|
hint_said = 0;
|
|
while ( !hint_said )
|
|
{
|
|
level waittill( "maxi_terminal_vox" );
|
|
if ( flag( "power_on" ) )
|
|
{
|
|
hint_said = 1;
|
|
}
|
|
wait 0,05;
|
|
}
|
|
maxissay( "vox_maxi_turbine_terminal_0", ( 11360, 8489, -576 ) );
|
|
}
|
|
|
|
complete_sidequest()
|
|
{
|
|
}
|
|
|
|
sidequest_main()
|
|
{
|
|
sidequest_init_tracker();
|
|
flag_wait( "start_zombie_round_logic" );
|
|
level.maxcompleted = 0;
|
|
level.richcompleted = 0;
|
|
players = get_players();
|
|
_a180 = players;
|
|
_k180 = getFirstArrayKey( _a180 );
|
|
while ( isDefined( _k180 ) )
|
|
{
|
|
player = _a180[ _k180 ];
|
|
player.transit_sq_started = 1;
|
|
lastcompleted = player maps/mp/zombies/_zm_stats::get_global_stat( "sq_transit_last_completed" );
|
|
if ( lastcompleted == 1 )
|
|
{
|
|
level.richcompleted = 1;
|
|
}
|
|
else
|
|
{
|
|
if ( lastcompleted == 2 )
|
|
{
|
|
level.maxcompleted = 1;
|
|
}
|
|
}
|
|
_k180 = getNextArrayKey( _a180, _k180 );
|
|
}
|
|
if ( level.richcompleted )
|
|
{
|
|
clientnotify( "sqrc" );
|
|
wait 1;
|
|
}
|
|
if ( level.maxcompleted )
|
|
{
|
|
clientnotify( "sqmc" );
|
|
wait 1;
|
|
}
|
|
if ( level.richcompleted && level.maxcompleted )
|
|
{
|
|
clientnotify( "sqkl" );
|
|
return;
|
|
}
|
|
while ( 1 )
|
|
{
|
|
level thread maxis_sidequest();
|
|
flag_wait( "power_on" );
|
|
if ( isDefined( level.maxcompleted ) && !level.maxcompleted )
|
|
{
|
|
update_sidequest_stats( "sq_transit_maxis_reset" );
|
|
}
|
|
if ( isDefined( level.maxis_sq_intro_said ) && !level.maxis_sq_intro_said && isDefined( level.maxcompleted ) && !level.maxcompleted )
|
|
{
|
|
wait 2;
|
|
level.maxis_sq_intro_said = 1;
|
|
level thread maxissay( "vox_maxi_power_on_0", ( 12072, 8496, -704 ), undefined, undefined, 1 );
|
|
}
|
|
level thread richtofen_sidequest();
|
|
flag_waitopen( "power_on" );
|
|
if ( isDefined( level.richcompleted ) && !level.richcompleted )
|
|
{
|
|
update_sidequest_stats( "sq_transit_rich_reset" );
|
|
}
|
|
}
|
|
}
|
|
|
|
sidequest_init_tracker()
|
|
{
|
|
level.sq_progress = [];
|
|
level.sq_progress = [];
|
|
level.sq_progress[ "maxis" ] = [];
|
|
level.sq_progress[ "maxis" ][ "A_turbine_1" ] = 0;
|
|
level.sq_progress[ "maxis" ][ "A_turbine_2" ] = 0;
|
|
level.sq_progress[ "maxis" ][ "A_complete" ] = 0;
|
|
level.sq_progress[ "maxis" ][ "B_complete" ] = 0;
|
|
level.sq_progress[ "maxis" ][ "C_turbine_1" ] = 0;
|
|
level.sq_progress[ "maxis" ][ "C_screecher_1" ] = 0;
|
|
level.sq_progress[ "maxis" ][ "C_turbine_2" ] = 0;
|
|
level.sq_progress[ "maxis" ][ "C_screecher_2" ] = 0;
|
|
level.sq_progress[ "maxis" ][ "C_complete" ] = 0;
|
|
level.sq_progress[ "maxis" ][ "FINISHED" ] = 0;
|
|
level.sq_progress[ "rich" ] = [];
|
|
level.sq_progress[ "rich" ][ "A_jetgun_built" ] = 0;
|
|
level.sq_progress[ "rich" ][ "A_jetgun_tower" ] = 0;
|
|
level.sq_progress[ "rich" ][ "A_complete" ] = 0;
|
|
level.sq_progress[ "rich" ][ "B_zombies_tower" ] = 0;
|
|
level.sq_progress[ "rich" ][ "B_complete" ] = 0;
|
|
level.sq_progress[ "rich" ][ "C_screecher_light" ] = 0;
|
|
level.sq_progress[ "rich" ][ "C_complete" ] = 0;
|
|
level.sq_progress[ "rich" ][ "FINISHED" ] = 0;
|
|
/#
|
|
if ( getDvarInt( #"113D490F" ) > 0 )
|
|
{
|
|
level thread sidequest_debug_tracker();
|
|
#/
|
|
}
|
|
}
|
|
|
|
sidequest_debug_tracker()
|
|
{
|
|
/#
|
|
arraymainkeys = getarraykeys( level.sq_progress );
|
|
index = 0;
|
|
x = 0;
|
|
while ( x < arraymainkeys.size )
|
|
{
|
|
arraysubkeys = getarraykeys( level.sq_progress[ arraymainkeys[ x ] ] );
|
|
_a289 = arraysubkeys;
|
|
_k289 = getFirstArrayKey( _a289 );
|
|
while ( isDefined( _k289 ) )
|
|
{
|
|
key = _a289[ _k289 ];
|
|
hudelem = newhudelem();
|
|
hudelem.alignx = "left";
|
|
hudelem.location = 0;
|
|
hudelem.foreground = 1;
|
|
hudelem.fontscale = 1,1;
|
|
hudelem.sort = 20 - index;
|
|
hudelem.alpha = 1;
|
|
hudelem.x = 0;
|
|
hudelem.y = 60 + ( index * 15 );
|
|
hudelem thread sidequest_debug_tracker_update( arraymainkeys[ x ], key );
|
|
index++;
|
|
_k289 = getNextArrayKey( _a289, _k289 );
|
|
}
|
|
x++;
|
|
#/
|
|
}
|
|
}
|
|
|
|
sidequest_debug_tracker_update( mainkey, subkey )
|
|
{
|
|
/#
|
|
while ( 1 )
|
|
{
|
|
value = level.sq_progress[ mainkey ][ subkey ];
|
|
str = ( mainkey + " -- " ) + subkey + ": ";
|
|
if ( isDefined( value ) && !isint( value ) && isDefined( value.classname ) )
|
|
{
|
|
self settext( str + "[X]" );
|
|
}
|
|
else
|
|
{
|
|
if ( isDefined( value ) )
|
|
{
|
|
if ( !isint( value ) && !isDefined( value.classname ) && isDefined( value.targetname ) && value.targetname == "screecher_escape" )
|
|
{
|
|
self settext( str + "[X]" );
|
|
}
|
|
else
|
|
{
|
|
self settext( str + value );
|
|
}
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
self settext( str + "0" );
|
|
}
|
|
}
|
|
wait 1;
|
|
#/
|
|
}
|
|
}
|
|
|
|
generic_stage_start()
|
|
{
|
|
level._stage_active = 1;
|
|
}
|
|
|
|
generic_stage_complete()
|
|
{
|
|
level._stage_active = 0;
|
|
}
|
|
|
|
maxis_sidequest()
|
|
{
|
|
level endon( "power_on" );
|
|
if ( flag( "power_on" ) || isDefined( level.maxcompleted ) && level.maxcompleted )
|
|
{
|
|
return;
|
|
}
|
|
update_sidequest_stats( "sq_transit_maxis_stage_1" );
|
|
level thread maxis_sidequest_a();
|
|
level thread maxis_sidequest_b();
|
|
level thread maxis_sidequest_c();
|
|
level thread avogadro_stunned_vo();
|
|
}
|
|
|
|
turbine_power_watcher( player )
|
|
{
|
|
level endon( "end_avogadro_turbines" );
|
|
self endon( "death" );
|
|
self.powered = undefined;
|
|
turbine_failed_vo = undefined;
|
|
while ( isDefined( self ) )
|
|
{
|
|
wait 2;
|
|
if ( is_true( player.turbine_power_is_on ) && !is_true( player.turbine_emped ) )
|
|
{
|
|
self.powered = 1;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if ( is_true( player.turbine_emped ) || !is_true( player.turbine_power_is_on ) )
|
|
{
|
|
wait 2;
|
|
self.powered = 0;
|
|
if ( !isDefined( turbine_failed_vo ) )
|
|
{
|
|
level thread maxissay( "vox_maxi_turbines_out_0", self.origin );
|
|
turbine_failed_vo = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
maxis_sidequest_a()
|
|
{
|
|
level endon( "power_on" );
|
|
if ( isDefined( level.sq_progress[ "maxis" ][ "B_complete" ] ) && !level.sq_progress[ "maxis" ][ "B_complete" ] )
|
|
{
|
|
level.sq_progress[ "maxis" ][ "A_complete" ] = 0;
|
|
}
|
|
while ( 1 )
|
|
{
|
|
players = get_players();
|
|
_a423 = players;
|
|
_k423 = getFirstArrayKey( _a423 );
|
|
while ( isDefined( _k423 ) )
|
|
{
|
|
player = _a423[ _k423 ];
|
|
if ( isDefined( player.buildableturbine ) && player.buildableturbine istouching( level.sq_volume ) )
|
|
{
|
|
level notify( "maxi_terminal_vox" );
|
|
player.buildableturbine thread turbine_watch_cleanup();
|
|
if ( !isDefined( level.sq_progress[ "maxis" ][ "A_turbine_1" ] ) )
|
|
{
|
|
level.sq_progress[ "maxis" ][ "A_turbine_1" ] = player.buildableturbine;
|
|
level.sq_progress[ "maxis" ][ "A_turbine_1" ] thread turbine_power_watcher( player );
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if ( !isDefined( level.sq_progress[ "maxis" ][ "A_turbine_2" ] ) )
|
|
{
|
|
level.sq_progress[ "maxis" ][ "A_turbine_2" ] = player.buildableturbine;
|
|
level.sq_progress[ "maxis" ][ "A_turbine_2" ] thread turbine_power_watcher( player );
|
|
}
|
|
}
|
|
}
|
|
_k423 = getNextArrayKey( _a423, _k423 );
|
|
}
|
|
if ( get_how_many_progressed_from( "maxis", "A_turbine_1", "A_turbine_2" ) == 1 )
|
|
{
|
|
level thread maxissay( "vox_maxi_turbine_1tower_0", ( 7737, -416, -142 ) );
|
|
}
|
|
if ( get_how_many_progressed_from( "maxis", "A_turbine_1", "A_turbine_2" ) == 2 )
|
|
{
|
|
if ( avogadro_at_tower() )
|
|
{
|
|
level thread maxissay( "vox_maxi_turbine_2tower_avo_0", ( 7737, -416, -142 ) );
|
|
}
|
|
else
|
|
{
|
|
level thread maxissay( "vox_maxi_turbine_2tower_0", ( 7737, -416, -142 ) );
|
|
}
|
|
update_sidequest_stats( "sq_transit_maxis_stage_2" );
|
|
level thread maxis_sidequest_complete_check( "A_complete" );
|
|
}
|
|
level waittill_either( "turbine_deployed", "equip_turbine_zm_cleaned_up" );
|
|
if ( !level.sq_progress[ "maxis" ][ "B_complete" ] )
|
|
{
|
|
level.sq_progress[ "maxis" ][ "A_complete" ] = 0;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
maxis_sidequest_b()
|
|
{
|
|
level endon( "power_on" );
|
|
while ( 1 )
|
|
{
|
|
level waittill( "stun_avogadro", avogadro );
|
|
if ( isDefined( level.sq_progress[ "maxis" ][ "A_turbine_1" ] ) && is_true( level.sq_progress[ "maxis" ][ "A_turbine_1" ].powered ) && isDefined( level.sq_progress[ "maxis" ][ "A_turbine_2" ] ) && is_true( level.sq_progress[ "maxis" ][ "A_turbine_2" ].powered ) )
|
|
{
|
|
if ( isDefined( avogadro ) && avogadro istouching( level.sq_volume ) )
|
|
{
|
|
level notify( "end_avogadro_turbines" );
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
level notify( "maxis_stage_b" );
|
|
level thread maxissay( "vox_maxi_avogadro_emp_0", ( 7737, -416, -142 ) );
|
|
update_sidequest_stats( "sq_transit_maxis_stage_3" );
|
|
player = get_players();
|
|
player[ 0 ] setclientfield( "sq_tower_sparks", 1 );
|
|
player[ 0 ] setclientfield( "screecher_maxis_lights", 1 );
|
|
level thread maxis_sidequest_complete_check( "B_complete" );
|
|
}
|
|
|
|
maxis_sidequest_c()
|
|
{
|
|
flag_wait( "power_on" );
|
|
flag_waitopen( "power_on" );
|
|
level endon( "power_on" );
|
|
level.sq_progress[ "maxis" ][ "C_complete" ] = 0;
|
|
turbine_1_talked = 0;
|
|
turbine_2_talked = 0;
|
|
screech_zones = getstructarray( "screecher_escape", "targetname" );
|
|
while ( 1 )
|
|
{
|
|
if ( !isDefined( level.sq_progress[ "maxis" ][ "C_turbine_1" ] ) )
|
|
{
|
|
}
|
|
if ( !isDefined( level.sq_progress[ "maxis" ][ "C_turbine_2" ] ) )
|
|
{
|
|
}
|
|
players = get_players();
|
|
_a548 = players;
|
|
_k548 = getFirstArrayKey( _a548 );
|
|
while ( isDefined( _k548 ) )
|
|
{
|
|
player = _a548[ _k548 ];
|
|
while ( isDefined( player.buildableturbine ) )
|
|
{
|
|
x = 0;
|
|
while ( x < screech_zones.size )
|
|
{
|
|
zone = screech_zones[ x ];
|
|
if ( distancesquared( player.buildableturbine.origin, zone.origin ) < ( zone.radius * zone.radius ) )
|
|
{
|
|
player.buildableturbine thread turbine_watch_cleanup();
|
|
if ( !isDefined( level.sq_progress[ "maxis" ][ "C_turbine_1" ] ) )
|
|
{
|
|
if ( !isDefined( level.sq_progress[ "maxis" ][ "C_screecher_2" ] ) || zone != level.sq_progress[ "maxis" ][ "C_screecher_2" ] )
|
|
{
|
|
level.sq_progress[ "maxis" ][ "C_turbine_1" ] = player.buildableturbine;
|
|
level.sq_progress[ "maxis" ][ "C_screecher_1" ] = zone;
|
|
}
|
|
x++;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if ( !isDefined( level.sq_progress[ "maxis" ][ "C_turbine_2" ] ) )
|
|
{
|
|
if ( !isDefined( level.sq_progress[ "maxis" ][ "C_screecher_1" ] ) || zone != level.sq_progress[ "maxis" ][ "C_screecher_1" ] )
|
|
{
|
|
level.sq_progress[ "maxis" ][ "C_turbine_2" ] = player.buildableturbine;
|
|
level.sq_progress[ "maxis" ][ "C_screecher_2" ] = zone;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
x++;
|
|
}
|
|
}
|
|
_k548 = getNextArrayKey( _a548, _k548 );
|
|
}
|
|
if ( get_how_many_progressed_from( "maxis", "C_turbine_1", "C_turbine_2" ) == 1 )
|
|
{
|
|
zone = undefined;
|
|
if ( isDefined( level.sq_progress[ "maxis" ][ "C_turbine_1" ] ) )
|
|
{
|
|
zone = level.sq_progress[ "maxis" ][ "C_screecher_1" ];
|
|
}
|
|
else
|
|
{
|
|
zone = level.sq_progress[ "maxis" ][ "C_screecher_2" ];
|
|
}
|
|
if ( isDefined( zone ) && !turbine_1_talked )
|
|
{
|
|
turbine_1_talked = 1;
|
|
level thread maxissay( "vox_maxi_turbine_1light_0", zone.origin );
|
|
}
|
|
}
|
|
if ( get_how_many_progressed_from( "maxis", "C_turbine_1", "C_turbine_2" ) == 2 )
|
|
{
|
|
zone = undefined;
|
|
if ( isDefined( level.sq_progress[ "maxis" ][ "C_turbine_1" ] ) )
|
|
{
|
|
zone = level.sq_progress[ "maxis" ][ "C_screecher_1" ];
|
|
}
|
|
else
|
|
{
|
|
zone = level.sq_progress[ "maxis" ][ "C_screecher_2" ];
|
|
}
|
|
if ( isDefined( zone ) )
|
|
{
|
|
if ( level.sq_progress[ "maxis" ][ "B_complete" ] && level.sq_progress[ "maxis" ][ "A_complete" ] )
|
|
{
|
|
if ( !turbine_2_talked )
|
|
{
|
|
level thread maxissay( "vox_maxi_turbine_2light_on_0", zone.origin );
|
|
turbine_2_talked = 1;
|
|
}
|
|
player = get_players();
|
|
player[ 0 ] setclientfield( "screecher_maxis_lights", 0 );
|
|
level maxis_sidequest_complete_check( "C_complete" );
|
|
return;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
level thread maxissay( "vox_maxi_turbine_2light_off_0", zone.origin );
|
|
}
|
|
}
|
|
}
|
|
level waittill_either( "turbine_deployed", "equip_turbine_zm_cleaned_up" );
|
|
level.sq_progress[ "maxis" ][ "C_complete" ] = 0;
|
|
}
|
|
}
|
|
|
|
maxis_sidequest_complete_check( nowcomplete )
|
|
{
|
|
level.sq_progress[ "maxis" ][ nowcomplete ] = 1;
|
|
if ( level.sq_progress[ "maxis" ][ "A_complete" ] && level.sq_progress[ "maxis" ][ "B_complete" ] && level.sq_progress[ "maxis" ][ "C_complete" ] )
|
|
{
|
|
level maxis_sidequest_complete();
|
|
}
|
|
}
|
|
|
|
maxis_sidequest_complete()
|
|
{
|
|
turbinescriptnoteworthy1 = undefined;
|
|
turbinescriptnoteworthy2 = undefined;
|
|
if ( isDefined( level.sq_progress[ "maxis" ][ "C_screecher_1" ] ) && isDefined( level.sq_progress[ "maxis" ][ "C_screecher_1" ].script_noteworthy ) )
|
|
{
|
|
turbinescriptnoteworthy1 = level.sq_progress[ "maxis" ][ "C_screecher_1" ].script_noteworthy;
|
|
}
|
|
if ( isDefined( level.sq_progress[ "maxis" ][ "C_screecher_2" ] ) && isDefined( level.sq_progress[ "maxis" ][ "C_screecher_2" ].script_noteworthy ) )
|
|
{
|
|
turbinescriptnoteworthy2 = level.sq_progress[ "maxis" ][ "C_screecher_2" ].script_noteworthy;
|
|
}
|
|
update_sidequest_stats( "sq_transit_maxis_complete" );
|
|
level sidequest_complete( "maxis" );
|
|
level.sq_progress[ "maxis" ][ "FINISHED" ] = 1;
|
|
level.maxcompleted = 1;
|
|
clientnotify( "sq_kfx" );
|
|
if ( isDefined( level.richcompleted ) && level.richcompleted )
|
|
{
|
|
level clientnotify( "sq_krt" );
|
|
}
|
|
wait 1;
|
|
clientnotify( "sqm" );
|
|
wait 1;
|
|
level set_screecher_zone_origin( turbinescriptnoteworthy1 );
|
|
wait 1;
|
|
clientnotify( "sq_max" );
|
|
wait 1;
|
|
level set_screecher_zone_origin( turbinescriptnoteworthy2 );
|
|
wait 1;
|
|
clientnotify( "sq_max" );
|
|
level thread droppowerup( "maxis" );
|
|
}
|
|
|
|
richtofen_sidequest()
|
|
{
|
|
level endon( "power_turned_off" );
|
|
if ( !flag( "power_on" ) || isDefined( level.richcompleted ) && level.richcompleted )
|
|
{
|
|
return;
|
|
}
|
|
if ( isDefined( level.richtofen_sq_intro_said ) && !level.richtofen_sq_intro_said )
|
|
{
|
|
level thread wait_for_richtoffen_intro();
|
|
}
|
|
update_sidequest_stats( "sq_transit_rich_stage_1" );
|
|
level thread richtofen_sidequest_a();
|
|
level thread richtofen_sidequest_b();
|
|
level thread richtofen_sidequest_c();
|
|
}
|
|
|
|
richtofen_sidequest_power_state()
|
|
{
|
|
flag_wait( "power_on" );
|
|
while ( 1 )
|
|
{
|
|
flag_waitopen( "power_on" );
|
|
level notify( "power_turned_off" );
|
|
level notify( "power_off" );
|
|
level thread maxissay( "vox_maxi_power_off_0", ( 12072, 8496, -704 ), undefined, undefined, 1 );
|
|
wait 7;
|
|
level thread richtofensay( "vox_zmba_sidequest_power_off_0", undefined, 1, 15 );
|
|
flag_wait( "power_on" );
|
|
level thread richtofensay( "vox_zmba_sidequest_emp_off_0", undefined, 1, 15 );
|
|
wait 7;
|
|
level thread maxissay( "vox_maxi_emp_off_0", ( 12072, 8496, -704 ), undefined, undefined, 1 );
|
|
}
|
|
}
|
|
|
|
richtofen_sidequest_a()
|
|
{
|
|
level endon( "power_off" );
|
|
level.sq_progress[ "rich" ][ "A_jetgun_built" ] = 0;
|
|
level.sq_progress[ "rich" ][ "A_jetgun_tower" ] = 0;
|
|
level.sq_progress[ "rich" ][ "A_complete" ] = 0;
|
|
ric_fail_out = undefined;
|
|
ric_fail_heat = undefined;
|
|
if ( isDefined( level.buildables_built[ "jetgun_zm" ] ) && !level.buildables_built[ "jetgun_zm" ] )
|
|
{
|
|
wait_for_buildable( "jetgun_zm" );
|
|
}
|
|
level.sq_progress[ "rich" ][ "A_jetgun_built" ] = 1;
|
|
while ( 1 )
|
|
{
|
|
level.sq_volume waittill( "trigger", who );
|
|
if ( isplayer( who ) && isalive( who ) && who getcurrentweapon() == "jetgun_zm" || !isDefined( who.jetgun_heatval ) && who.jetgun_heatval < 1 )
|
|
{
|
|
who thread left_sq_area_watcher( level.sq_volume );
|
|
notifystring = who waittill_any_return( "disconnect", "weapon_change", "death", "player_downed", "jetgun_overheated", "left_sg_area" );
|
|
if ( notifystring == "jetgun_overheated" && isDefined( who ) && who istouching( level.sq_volume ) )
|
|
{
|
|
self.checking_jetgun_fire = 0;
|
|
break;
|
|
}
|
|
else if ( !isDefined( ric_fail_out ) )
|
|
{
|
|
ric_fail_out = 1;
|
|
level thread richtofensay( "vox_zmba_sidequest_jet_low_0", undefined, 0, 10 );
|
|
}
|
|
self.checking_jetgun_fire = 0;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if ( isplayer( who ) && isalive( who ) && who getcurrentweapon() == "jetgun_zm" && isDefined( who.jetgun_heatval ) && who.jetgun_heatval > 1 )
|
|
{
|
|
if ( !isDefined( ric_fail_heat ) )
|
|
{
|
|
ric_fail_heat = 1;
|
|
level thread richtofensay( "vox_zmba_sidequest_jet_low_0", undefined, 0, 10 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
level thread richtofensay( "vox_zmba_sidequest_jet_empty_0", undefined, 0, 16 );
|
|
player = get_players();
|
|
player[ 0 ] setclientfield( "screecher_sq_lights", 1 );
|
|
update_sidequest_stats( "sq_transit_rich_stage_2" );
|
|
level thread richtofen_sidequest_complete_check( "A_complete" );
|
|
level.sq_progress[ "rich" ][ "A_jetgun_tower" ] = 1;
|
|
}
|
|
|
|
left_sq_area_watcher( volume )
|
|
{
|
|
while ( self istouching( volume ) )
|
|
{
|
|
wait 0,5;
|
|
}
|
|
self notify( "left_sg_area" );
|
|
}
|
|
|
|
richtofen_sidequest_b()
|
|
{
|
|
level endon( "power_off" );
|
|
level.sq_progress[ "rich" ][ "B_zombies_tower" ] = 25;
|
|
level thread lure_zombies_to_tower_hint();
|
|
while ( level.sq_progress[ "rich" ][ "B_zombies_tower" ] > 0 )
|
|
{
|
|
level waittill( "zombie_died_in_sq_volume" );
|
|
while ( !level.sq_progress[ "rich" ][ "A_complete" ] )
|
|
{
|
|
level thread richtofensay( "vox_zmba_sidequest_blow_mag_0" );
|
|
}
|
|
level.sq_progress[ "rich" ][ "B_zombies_tower" ]--;
|
|
|
|
if ( level.sq_progress[ "rich" ][ "B_zombies_tower" ] > 0 )
|
|
{
|
|
}
|
|
}
|
|
level thread richtofensay( "vox_zmba_sidequest_blow_nomag_0" );
|
|
update_sidequest_stats( "sq_transit_rich_stage_3" );
|
|
level notify( "sq_stage_3complete" );
|
|
level thread richtofen_sidequest_complete_check( "B_complete" );
|
|
}
|
|
|
|
lure_zombies_to_tower_hint()
|
|
{
|
|
level endon( "power_on" );
|
|
level endon( "sq_stage_3complete" );
|
|
zombie_train = 0;
|
|
lure_distance = 722500;
|
|
while ( !zombie_train )
|
|
{
|
|
zombies = getaiarray();
|
|
counter = 0;
|
|
_a881 = zombies;
|
|
_k881 = getFirstArrayKey( _a881 );
|
|
while ( isDefined( _k881 ) )
|
|
{
|
|
zombie = _a881[ _k881 ];
|
|
if ( distancesquared( zombie.origin, level.sq_volume.origin ) < lure_distance )
|
|
{
|
|
counter++;
|
|
}
|
|
_k881 = getNextArrayKey( _a881, _k881 );
|
|
}
|
|
if ( counter >= 5 )
|
|
{
|
|
zombie_train = 1;
|
|
}
|
|
wait 3;
|
|
}
|
|
level thread richtofensay( "vox_zmba_sidequest_zom_lure_0" );
|
|
}
|
|
|
|
richtofen_sidequest_c()
|
|
{
|
|
level endon( "power_off" );
|
|
level endon( "richtofen_sq_complete" );
|
|
screech_zones = getstructarray( "screecher_escape", "targetname" );
|
|
level thread screecher_light_hint();
|
|
level thread screecher_light_on_sq();
|
|
level.sq_richtofen_c_screecher_lights = [];
|
|
while ( 1 )
|
|
{
|
|
level waittill( "safety_light_power_off", screecher_zone );
|
|
while ( !level.sq_progress[ "rich" ][ "A_complete" ] || !level.sq_progress[ "rich" ][ "B_complete" ] )
|
|
{
|
|
level thread richtofensay( "vox_zmba_sidequest_emp_nomag_0" );
|
|
}
|
|
level.sq_richtofen_c_screecher_lights[ level.sq_richtofen_c_screecher_lights.size ] = screecher_zone;
|
|
level.sq_progress[ "rich" ][ "C_screecher_light" ]++;
|
|
if ( level.sq_progress[ "rich" ][ "C_screecher_light" ] >= 4 )
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if ( isDefined( level.checking_for_richtofen_c_failure ) && !level.checking_for_richtofen_c_failure )
|
|
{
|
|
level thread check_for_richtofen_c_failure();
|
|
}
|
|
}
|
|
}
|
|
level thread richtofensay( "vox_zmba_sidequest_4emp_mag_0" );
|
|
level notify( "richtofen_c_complete" );
|
|
player = get_players();
|
|
player[ 0 ] setclientfield( "screecher_sq_lights", 0 );
|
|
level thread richtofen_sidequest_complete_check( "C_complete" );
|
|
}
|
|
|
|
check_for_richtofen_c_failure()
|
|
{
|
|
if ( isDefined( level.checking_for_richtofen_c_failure ) && !level.checking_for_richtofen_c_failure )
|
|
{
|
|
level.checking_for_richtofen_c_failure = 1;
|
|
wait 5;
|
|
if ( level.sq_progress[ "rich" ][ "C_screecher_light" ] < 4 )
|
|
{
|
|
level thread richtofensay( "vox_zmba_sidequest_3emp_mag_0" );
|
|
level.sq_progress[ "rich" ][ "C_screecher_light" ] = 0;
|
|
}
|
|
level.checking_for_richtofen_c_failure = 0;
|
|
}
|
|
}
|
|
|
|
screecher_light_on_sq()
|
|
{
|
|
while ( 1 )
|
|
{
|
|
level waittill( "safety_light_power_on", screecher_zone );
|
|
arrayremovevalue( level.sq_richtofen_c_screecher_lights, screecher_zone );
|
|
if ( level.sq_progress[ "rich" ][ "C_screecher_light" ] > 0 )
|
|
{
|
|
level.sq_progress[ "rich" ][ "C_screecher_light" ]--;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
richtofen_sidequest_complete_check( nowcomplete )
|
|
{
|
|
level.sq_progress[ "rich" ][ nowcomplete ] = 1;
|
|
if ( level.sq_progress[ "rich" ][ "A_complete" ] && level.sq_progress[ "rich" ][ "B_complete" ] && level.sq_progress[ "rich" ][ "C_complete" ] )
|
|
{
|
|
level thread richtofen_sidequest_complete();
|
|
}
|
|
}
|
|
|
|
richtofen_sidequest_complete()
|
|
{
|
|
update_sidequest_stats( "sq_transit_rich_complete" );
|
|
level thread sidequest_complete( "richtofen" );
|
|
level.sq_progress[ "rich" ][ "FINISHED" ] = 1;
|
|
level.richcompleted = 1;
|
|
clientnotify( "sq_kfx" );
|
|
if ( isDefined( level.maxcompleted ) && level.maxcompleted )
|
|
{
|
|
level clientnotify( "sq_kmt" );
|
|
}
|
|
wait 1;
|
|
clientnotify( "sqr" );
|
|
_a1007 = level.sq_richtofen_c_screecher_lights;
|
|
_k1007 = getFirstArrayKey( _a1007 );
|
|
while ( isDefined( _k1007 ) )
|
|
{
|
|
zone = _a1007[ _k1007 ];
|
|
level set_screecher_zone_origin( zone.target.script_noteworthy );
|
|
wait 1;
|
|
clientnotify( "sq_rich" );
|
|
wait 1;
|
|
_k1007 = getNextArrayKey( _a1007, _k1007 );
|
|
}
|
|
level thread droppowerup( "richtofen" );
|
|
}
|
|
|
|
set_screecher_zone_origin( script_noteworthy )
|
|
{
|
|
if ( !isDefined( script_noteworthy ) )
|
|
{
|
|
return;
|
|
}
|
|
switch( script_noteworthy )
|
|
{
|
|
case "cornfield":
|
|
clientnotify( "zsc" );
|
|
break;
|
|
case "diner":
|
|
clientnotify( "zsd" );
|
|
break;
|
|
case "forest":
|
|
clientnotify( "zsf" );
|
|
break;
|
|
case "busdepot":
|
|
clientnotify( "zsb" );
|
|
break;
|
|
case "bridgedepot":
|
|
clientnotify( "zsbd" );
|
|
break;
|
|
case "townbridge":
|
|
clientnotify( "zsbt" );
|
|
break;
|
|
case "huntershack":
|
|
clientnotify( "zsh" );
|
|
break;
|
|
case "powerstation":
|
|
clientnotify( "zsp" );
|
|
break;
|
|
}
|
|
}
|
|
|
|
turbine_watch_cleanup()
|
|
{
|
|
if ( isDefined( self.turbine_watch_cleanup ) && self.turbine_watch_cleanup )
|
|
{
|
|
return;
|
|
}
|
|
self.turbine_watch_cleanup = 1;
|
|
self waittill( "death" );
|
|
level notify( "equip_turbine_zm_cleaned_up" );
|
|
}
|
|
|
|
get_how_many_progressed_from( story, a, b )
|
|
{
|
|
if ( isDefined( level.sq_progress[ story ][ a ] ) || !isDefined( level.sq_progress[ story ][ b ] ) && !isDefined( level.sq_progress[ story ][ a ] ) && isDefined( level.sq_progress[ story ][ b ] ) )
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
if ( isDefined( level.sq_progress[ story ][ a ] ) && isDefined( level.sq_progress[ story ][ b ] ) )
|
|
{
|
|
return 2;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
sq_zombie_death_event_response()
|
|
{
|
|
if ( distancesquared( self.origin, level.sq_volume.origin ) < 176400 && isDefined( self.damagemod ) )
|
|
{
|
|
mod = self.damagemod;
|
|
if ( mod != "MOD_GRENADE" && mod != "MOD_GRENADE_SPLASH" && mod != "MOD_EXPLOSIVE" && mod != "MOD_EXPLOSIVE_SPLASH" || mod == "MOD_PROJECTILE" && mod == "MOD_PROJECTILE_SPLASH" )
|
|
{
|
|
level notify( "zombie_died_in_sq_volume" );
|
|
}
|
|
}
|
|
}
|
|
|
|
update_sidequest_stats( stat_name )
|
|
{
|
|
maxis_complete = 0;
|
|
rich_complete = 0;
|
|
started = 0;
|
|
if ( stat_name == "sq_transit_maxis_complete" )
|
|
{
|
|
maxis_complete = 1;
|
|
}
|
|
else
|
|
{
|
|
if ( stat_name == "sq_transit_rich_complete" )
|
|
{
|
|
rich_complete = 1;
|
|
}
|
|
}
|
|
players = get_players();
|
|
_a1124 = players;
|
|
_k1124 = getFirstArrayKey( _a1124 );
|
|
while ( isDefined( _k1124 ) )
|
|
{
|
|
player = _a1124[ _k1124 ];
|
|
if ( stat_name == "sq_transit_started" )
|
|
{
|
|
player.transit_sq_started = 1;
|
|
}
|
|
else if ( stat_name == "navcard_applied_zm_transit" )
|
|
{
|
|
player maps/mp/zombies/_zm_stats::set_global_stat( level.navcard_needed, 0 );
|
|
thread sq_refresh_player_navcard_hud();
|
|
}
|
|
else
|
|
{
|
|
if ( isDefined( player.transit_sq_started ) && !player.transit_sq_started )
|
|
{
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( rich_complete )
|
|
{
|
|
player maps/mp/zombies/_zm_stats::set_global_stat( "sq_transit_last_completed", 1 );
|
|
incrementcounter( "global_zm_total_rich_sq_complete_transit", 1 );
|
|
}
|
|
else
|
|
{
|
|
if ( maxis_complete )
|
|
{
|
|
player maps/mp/zombies/_zm_stats::set_global_stat( "sq_transit_last_completed", 2 );
|
|
incrementcounter( "global_zm_total_max_sq_complete_transit", 1 );
|
|
}
|
|
}
|
|
player maps/mp/zombies/_zm_stats::increment_client_stat( stat_name, 0 );
|
|
}
|
|
_k1124 = getNextArrayKey( _a1124, _k1124 );
|
|
}
|
|
if ( rich_complete || maxis_complete )
|
|
{
|
|
level notify( "transit_sidequest_achieved" );
|
|
}
|
|
}
|
|
|
|
richtofensay( vox_line, intro, ignore_power_state, time )
|
|
{
|
|
level endon( "end_game" );
|
|
level endon( "intermission" );
|
|
if ( isDefined( level.intermission ) && level.intermission )
|
|
{
|
|
return;
|
|
}
|
|
if ( isDefined( level.richcompleted ) && level.richcompleted )
|
|
{
|
|
return;
|
|
}
|
|
level endon( "richtofen_c_complete" );
|
|
if ( !isDefined( time ) )
|
|
{
|
|
time = 45;
|
|
}
|
|
while ( isDefined( level.richtofen_talking_to_samuel ) || level.richtofen_talking_to_samuel && isDefined( level.richtofen_sq_intro_said ) && !level.richtofen_sq_intro_said )
|
|
{
|
|
wait 1;
|
|
}
|
|
if ( isDefined( level.rich_sq_player ) && is_player_valid( level.rich_sq_player ) )
|
|
{
|
|
/#
|
|
iprintlnbold( "Richtoffen Says: " + vox_line );
|
|
#/
|
|
if ( flag( "power_on" ) && !flag( "switches_on" ) && isDefined( ignore_power_state ) && !ignore_power_state )
|
|
{
|
|
return;
|
|
}
|
|
level.rich_sq_player playsoundtoplayer( vox_line, level.rich_sq_player );
|
|
if ( isDefined( level.richtofen_talking_to_samuel ) && !level.richtofen_talking_to_samuel )
|
|
{
|
|
level thread richtofen_talking( time );
|
|
}
|
|
}
|
|
}
|
|
|
|
richtofen_talking( time )
|
|
{
|
|
level.rich_sq_player.dontspeak = 1;
|
|
level.richtofen_talking_to_samuel = 1;
|
|
wait time;
|
|
level.richtofen_talking_to_samuel = 0;
|
|
if ( isDefined( level.rich_sq_player ) )
|
|
{
|
|
level.rich_sq_player.dontspeak = 0;
|
|
}
|
|
}
|
|
|
|
maxissay( line, org, playonent, playonenttag, ignore_power_state )
|
|
{
|
|
level endon( "end_game" );
|
|
level endon( "intermission" );
|
|
if ( isDefined( level.intermission ) && level.intermission )
|
|
{
|
|
return;
|
|
}
|
|
if ( isDefined( level.maxcompleted ) && level.maxcompleted )
|
|
{
|
|
return;
|
|
}
|
|
if ( !flag( "power_on" ) && flag( "switches_on" ) && isDefined( ignore_power_state ) && !ignore_power_state )
|
|
{
|
|
return;
|
|
}
|
|
while ( isDefined( level.maxis_talking ) && level.maxis_talking )
|
|
{
|
|
wait 0,05;
|
|
}
|
|
level.maxis_talking = 1;
|
|
/#
|
|
iprintlnbold( "Maxis Says: " + line );
|
|
#/
|
|
if ( isDefined( playonent ) )
|
|
{
|
|
playonent playsoundontag( line, playonenttag );
|
|
}
|
|
else
|
|
{
|
|
playsoundatposition( line, org );
|
|
}
|
|
wait 10;
|
|
level.maxis_talking = 0;
|
|
}
|
|
|
|
wait_for_richtoffen_intro()
|
|
{
|
|
level endon( "intermission" );
|
|
power_occupied = 1;
|
|
while ( power_occupied )
|
|
{
|
|
inzone = 0;
|
|
_a1274 = level.power_station_zones;
|
|
_k1274 = getFirstArrayKey( _a1274 );
|
|
while ( isDefined( _k1274 ) )
|
|
{
|
|
zone = _a1274[ _k1274 ];
|
|
if ( isDefined( maps/mp/zombies/_zm_zonemgr::player_in_zone( zone ) ) && maps/mp/zombies/_zm_zonemgr::player_in_zone( zone ) )
|
|
{
|
|
inzone = 1;
|
|
}
|
|
_k1274 = getNextArrayKey( _a1274, _k1274 );
|
|
}
|
|
if ( !inzone )
|
|
{
|
|
power_occupied = 0;
|
|
}
|
|
wait 0,1;
|
|
}
|
|
wait 5;
|
|
if ( !isDefined( level.rich_sq_player ) || !flag( "power_on" ) && !flag( "switches_on" ) )
|
|
{
|
|
return;
|
|
}
|
|
if ( isDefined( level.intermission ) && level.intermission )
|
|
{
|
|
return;
|
|
}
|
|
level.rich_sq_player playsoundtoplayer( "vox_zmba_sidequest_power_on_0", level.rich_sq_player );
|
|
richtofen_talking( 45 );
|
|
level.richtofen_sq_intro_said = 1;
|
|
}
|
|
|
|
survivor_vox()
|
|
{
|
|
initiated = 0;
|
|
while ( !initiated )
|
|
{
|
|
players = get_players();
|
|
_a1314 = players;
|
|
_k1314 = getFirstArrayKey( _a1314 );
|
|
while ( isDefined( _k1314 ) )
|
|
{
|
|
player = _a1314[ _k1314 ];
|
|
if ( distance2dsquared( player.origin, ( 8000, -6656, 160 ) ) < 1225 )
|
|
{
|
|
if ( player usebuttonpressed() )
|
|
{
|
|
playsoundatposition( "zmb_zombie_arc", ( 8000, -6656, 160 ) );
|
|
start_time = getTime();
|
|
end_time = start_time + 5000;
|
|
while ( player usebuttonpressed() && distance2dsquared( player.origin, ( 8000, -6656, 160 ) ) < 1225 && is_player_valid( player ) )
|
|
{
|
|
if ( getTime() > end_time )
|
|
{
|
|
initiated = 1;
|
|
}
|
|
wait 0,05;
|
|
}
|
|
playsoundatposition( "zmb_buildable_piece_add", ( 8000, -6656, 160 ) );
|
|
}
|
|
}
|
|
_k1314 = getNextArrayKey( _a1314, _k1314 );
|
|
}
|
|
wait 1;
|
|
}
|
|
playsoundatposition( "zmb_weap_wall", ( 8000, -6656, 160 ) );
|
|
i = -1;
|
|
while ( 1 )
|
|
{
|
|
players = get_players();
|
|
_a1343 = players;
|
|
_k1343 = getFirstArrayKey( _a1343 );
|
|
while ( isDefined( _k1343 ) )
|
|
{
|
|
player = _a1343[ _k1343 ];
|
|
if ( distance2dsquared( player.origin, ( 8000, -6656, 160 ) ) < 1225 )
|
|
{
|
|
if ( player usebuttonpressed() && is_player_valid( player ) )
|
|
{
|
|
if ( flag( "power_on" ) )
|
|
{
|
|
if ( i == -1 || i > 4 )
|
|
{
|
|
playsoundatposition( "vox_maxi_tv_distress_0", ( 8000, -6656, 160 ) );
|
|
i++;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if ( i < 4 )
|
|
{
|
|
playsoundatposition( level.survivor_vox[ i ], ( 8000, -6656, 160 ) );
|
|
}
|
|
}
|
|
i++;
|
|
}
|
|
wait 60;
|
|
}
|
|
}
|
|
_k1343 = getNextArrayKey( _a1343, _k1343 );
|
|
}
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
builable_built_custom_func( buildable )
|
|
{
|
|
if ( buildable.buildable_name == "jetgun_zm" )
|
|
{
|
|
if ( flag( "power_on" ) || flag( "switches_on" ) )
|
|
{
|
|
level thread richtofensay( "vox_zmba_sidequest_jet_complete_0" );
|
|
level.sq_jetgun_built = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
screecher_light_hint()
|
|
{
|
|
level endon( "power_off" );
|
|
level endon( "richtofen_c_complete" );
|
|
while ( !level.sq_progress[ "rich" ][ "A_jetgun_tower" ] )
|
|
{
|
|
wait 1;
|
|
}
|
|
screech_zones = getstructarray( "screecher_escape", "targetname" );
|
|
dist = 122500;
|
|
while ( 1 )
|
|
{
|
|
count = 0;
|
|
players = get_players();
|
|
_a1399 = players;
|
|
_k1399 = getFirstArrayKey( _a1399 );
|
|
while ( isDefined( _k1399 ) )
|
|
{
|
|
player = _a1399[ _k1399 ];
|
|
_a1401 = screech_zones;
|
|
_k1401 = getFirstArrayKey( _a1401 );
|
|
while ( isDefined( _k1401 ) )
|
|
{
|
|
zone = _a1401[ _k1401 ];
|
|
if ( distancesquared( player.origin, zone.origin ) < dist )
|
|
{
|
|
if ( player maps/mp/zombies/_zm_weapons::has_weapon_or_upgrade( "emp_grenade_zm" ) )
|
|
{
|
|
count++;
|
|
}
|
|
}
|
|
_k1401 = getNextArrayKey( _a1401, _k1401 );
|
|
}
|
|
_k1399 = getNextArrayKey( _a1399, _k1399 );
|
|
}
|
|
if ( count >= players.size )
|
|
{
|
|
richtofensay( "vox_zmba_sidequest_near_light_0" );
|
|
return;
|
|
}
|
|
wait 2;
|
|
}
|
|
}
|
|
|
|
maxi_near_corn_hint()
|
|
{
|
|
level endon( "power_on" );
|
|
say_hint = 0;
|
|
while ( !say_hint )
|
|
{
|
|
players = get_players();
|
|
_a1430 = players;
|
|
_k1430 = getFirstArrayKey( _a1430 );
|
|
while ( isDefined( _k1430 ) )
|
|
{
|
|
player = _a1430[ _k1430 ];
|
|
if ( !player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_amb_cornfield" ) )
|
|
{
|
|
}
|
|
else if ( isDefined( player.buildableturbine ) && isDefined( player.buildableturbine.equipment_can_move ) && player.buildableturbine.equipment_can_move && isDefined( player.isonbus ) && player.isonbus )
|
|
{
|
|
say_hint = 1;
|
|
}
|
|
else
|
|
{
|
|
if ( isDefined( player.buildableturbine ) && isDefined( player.isonbus ) && player.isonbus )
|
|
{
|
|
say_hint = 1;
|
|
}
|
|
}
|
|
_k1430 = getNextArrayKey( _a1430, _k1430 );
|
|
}
|
|
wait 2;
|
|
}
|
|
level thread maxissay( "vox_maxi_near_corn_0", undefined, level.automaton, "J_neck" );
|
|
}
|
|
|
|
avogadro_far_from_tower()
|
|
{
|
|
if ( isDefined( level.maxcompleted ) && level.maxcompleted )
|
|
{
|
|
return;
|
|
}
|
|
level waittill( "power_on" );
|
|
level endon( "power_on" );
|
|
say_hint = 0;
|
|
while ( !say_hint )
|
|
{
|
|
players = get_players();
|
|
_a1466 = players;
|
|
_k1466 = getFirstArrayKey( _a1466 );
|
|
while ( isDefined( _k1466 ) )
|
|
{
|
|
player = _a1466[ _k1466 ];
|
|
if ( isDefined( player.isonbus ) && !player.isonbus )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
if ( !avogadro_near_tower() && player maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_amb_cornfield" ) )
|
|
{
|
|
say_hint = 1;
|
|
}
|
|
}
|
|
_k1466 = getNextArrayKey( _a1466, _k1466 );
|
|
}
|
|
wait 1;
|
|
}
|
|
level thread maxissay( "vox_maxi_avogadro_far_0", undefined, level.automaton, "J_neck" );
|
|
}
|
|
|
|
avogadro_near_tower()
|
|
{
|
|
if ( isDefined( level.avogadro ) && level.avogadro maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_amb_cornfield" ) )
|
|
{
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
avogadro_stab_watch()
|
|
{
|
|
if ( isDefined( level.maxcompleted ) && level.maxcompleted )
|
|
{
|
|
return;
|
|
}
|
|
level waittill( "avogadro_stabbed", avogadro );
|
|
if ( !flag( "power_on" ) )
|
|
{
|
|
level thread maxissay( "vox_maxi_avogadro_stab_0", avogadro.origin );
|
|
}
|
|
}
|
|
|
|
avogadro_is_near_tower()
|
|
{
|
|
if ( isDefined( level.maxcompleted ) && level.maxcompleted )
|
|
{
|
|
return;
|
|
}
|
|
level waittill( "power_on" );
|
|
level endon( "power_on" );
|
|
say_hint = 0;
|
|
while ( !say_hint )
|
|
{
|
|
if ( avogadro_near_tower() )
|
|
{
|
|
say_hint = 1;
|
|
}
|
|
wait 1;
|
|
}
|
|
level thread maxissay( "vox_maxi_avogadro_near_0", ( 7737, -416, -142 ) );
|
|
}
|
|
|
|
avogadro_at_tower()
|
|
{
|
|
if ( isDefined( level.avogadro ) && level.avogadro istouching( level.sq_volume ) )
|
|
{
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
droppowerup( story )
|
|
{
|
|
center_struct = getstruct( "sq_common_tower_fx", "targetname" );
|
|
trace = bullettrace( center_struct.origin, center_struct.origin - vectorScale( ( 0, 0, 0 ), 999999 ), 0, undefined );
|
|
poweruporigin = trace[ "position" ] + vectorScale( ( 0, 0, 0 ), 25 );
|
|
mintime = 240;
|
|
maxtime = 720;
|
|
while ( 1 )
|
|
{
|
|
trail = spawn( "script_model", center_struct.origin );
|
|
trail setmodel( "tag_origin" );
|
|
wait 0,5;
|
|
playfxontag( level._effect[ story + "_sparks" ], trail, "tag_origin" );
|
|
trail moveto( poweruporigin, 10 );
|
|
trail waittill( "movedone" );
|
|
level thread droppoweruptemptation( story, poweruporigin );
|
|
wait 1;
|
|
trail delete();
|
|
wait randomintrange( mintime, maxtime );
|
|
}
|
|
}
|
|
|
|
droppoweruptemptation( story, origin )
|
|
{
|
|
powerup = spawn( "script_model", origin );
|
|
powerup endon( "powerup_grabbed" );
|
|
powerup endon( "powerup_timedout" );
|
|
temptation_array = array( "insta_kill", "nuke", "double_points", "carpenter" );
|
|
temptation_index = 0;
|
|
first_time = 1;
|
|
rotation = 0;
|
|
temptation_array = array_randomize( temptation_array );
|
|
while ( isDefined( powerup ) )
|
|
{
|
|
powerup maps/mp/zombies/_zm_powerups::powerup_setup( temptation_array[ temptation_index ] );
|
|
if ( first_time )
|
|
{
|
|
powerup thread maps/mp/zombies/_zm_powerups::powerup_timeout();
|
|
powerup thread maps/mp/zombies/_zm_powerups::powerup_wobble();
|
|
powerup thread maps/mp/zombies/_zm_powerups::powerup_grab();
|
|
first_time = 0;
|
|
}
|
|
if ( rotation == 0 )
|
|
{
|
|
wait 15;
|
|
rotation++;
|
|
temptation_index++;
|
|
continue;
|
|
}
|
|
else if ( rotation == 1 )
|
|
{
|
|
wait 7,5;
|
|
rotation++;
|
|
temptation_index++;
|
|
continue;
|
|
}
|
|
else if ( rotation == 2 )
|
|
{
|
|
wait 2,5;
|
|
rotation++;
|
|
temptation_index++;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
wait 1,5;
|
|
rotation++;
|
|
}
|
|
temptation_index++;
|
|
if ( temptation_index >= temptation_array.size )
|
|
{
|
|
temptation_index = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
init_navcard()
|
|
{
|
|
flag_wait( "start_zombie_round_logic" );
|
|
spawn_card = 1;
|
|
players = get_players();
|
|
_a1634 = players;
|
|
_k1634 = getFirstArrayKey( _a1634 );
|
|
while ( isDefined( _k1634 ) )
|
|
{
|
|
player = _a1634[ _k1634 ];
|
|
has_card = does_player_have_map_navcard( player );
|
|
if ( has_card )
|
|
{
|
|
player.navcard_grabbed = level.map_navcard;
|
|
spawn_card = 0;
|
|
}
|
|
_k1634 = getNextArrayKey( _a1634, _k1634 );
|
|
}
|
|
thread sq_refresh_player_navcard_hud();
|
|
if ( !spawn_card )
|
|
{
|
|
return;
|
|
}
|
|
model = "p6_zm_keycard";
|
|
org = ( -6245, 5479,5, -55,35 );
|
|
angles = ( 0, 0, 0 );
|
|
maps/mp/zombies/_zm_utility::place_navcard( model, level.map_navcard, org, angles );
|
|
}
|
|
|
|
init_navcomputer()
|
|
{
|
|
flag_wait( "start_zombie_round_logic" );
|
|
spawn_navcomputer = 1;
|
|
players = get_players();
|
|
_a1664 = players;
|
|
_k1664 = getFirstArrayKey( _a1664 );
|
|
while ( isDefined( _k1664 ) )
|
|
{
|
|
player = _a1664[ _k1664 ];
|
|
built_comptuer = player maps/mp/zombies/_zm_stats::get_global_stat( "sq_transit_started" );
|
|
if ( !built_comptuer )
|
|
{
|
|
spawn_navcomputer = 0;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
_k1664 = getNextArrayKey( _a1664, _k1664 );
|
|
}
|
|
}
|
|
if ( !spawn_navcomputer )
|
|
{
|
|
return;
|
|
}
|
|
level.navcomputer_spawned = 1;
|
|
get_players()[ 0 ] maps/mp/zombies/_zm_buildables::player_finish_buildable( level.sq_buildable.buildablezone );
|
|
while ( isDefined( level.sq_buildable ) && isDefined( level.sq_buildable.model ) )
|
|
{
|
|
buildable = level.sq_buildable.buildablezone;
|
|
i = 0;
|
|
while ( i < buildable.pieces.size )
|
|
{
|
|
if ( isDefined( buildable.pieces[ i ].model ) )
|
|
{
|
|
buildable.pieces[ i ].model delete();
|
|
maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( buildable.pieces[ i ].unitrigger );
|
|
}
|
|
if ( isDefined( buildable.pieces[ i ].part_name ) )
|
|
{
|
|
buildable.stub.model notsolid();
|
|
buildable.stub.model show();
|
|
buildable.stub.model showpart( buildable.pieces[ i ].part_name );
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
level thread navcomputer_waitfor_navcard();
|
|
}
|
|
|
|
navcomputer_waitfor_navcard()
|
|
{
|
|
computer_buildable_trig = getent( "sq_common_buildable_trigger", "targetname" );
|
|
trig_pos = getstruct( "sq_common_key", "targetname" );
|
|
navcomputer_use_trig = spawn( "trigger_radius_use", trig_pos.origin, 0, 48, 48 );
|
|
navcomputer_use_trig setcursorhint( "HINT_NOICON" );
|
|
navcomputer_use_trig sethintstring( &"ZOMBIE_NAVCARD_USE" );
|
|
navcomputer_use_trig triggerignoreteam();
|
|
while ( 1 )
|
|
{
|
|
navcomputer_use_trig waittill( "trigger", who );
|
|
if ( isplayer( who ) && is_player_valid( who ) )
|
|
{
|
|
if ( does_player_have_correct_navcard( who ) )
|
|
{
|
|
navcomputer_use_trig sethintstring( &"ZOMBIE_NAVCARD_SUCCESS" );
|
|
who playsound( "zmb_sq_navcard_success" );
|
|
update_sidequest_stats( "navcard_applied_zm_transit" );
|
|
return;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
navcomputer_use_trig sethintstring( &"ZOMBIE_NAVCARD_FAIL" );
|
|
wait 1;
|
|
navcomputer_use_trig sethintstring( &"ZOMBIE_NAVCARD_USE" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
avogadro_stunned_vo()
|
|
{
|
|
level endon( "maxis_stage_b" );
|
|
while ( 1 )
|
|
{
|
|
level waittill( "stun_avogadro", avogadro );
|
|
if ( avogadro maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_prr" ) )
|
|
{
|
|
level thread maxissay( "vox_maxi_avogadro_stab_0", ( 12072, 8496, -704 ) );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
sq_refresh_player_navcard_hud()
|
|
{
|
|
if ( !isDefined( level.navcards ) )
|
|
{
|
|
return;
|
|
}
|
|
players = get_players();
|
|
_a1759 = players;
|
|
_k1759 = getFirstArrayKey( _a1759 );
|
|
while ( isDefined( _k1759 ) )
|
|
{
|
|
player = _a1759[ _k1759 ];
|
|
navcard_bits = 0;
|
|
i = 0;
|
|
while ( i < level.navcards.size )
|
|
{
|
|
hasit = player maps/mp/zombies/_zm_stats::get_global_stat( level.navcards[ i ] );
|
|
if ( isDefined( player.navcard_grabbed ) && player.navcard_grabbed == level.navcards[ i ] )
|
|
{
|
|
hasit = 1;
|
|
}
|
|
if ( hasit )
|
|
{
|
|
navcard_bits += 1 << i;
|
|
}
|
|
i++;
|
|
}
|
|
wait_network_frame();
|
|
player setclientfield( "navcard_held", 0 );
|
|
if ( navcard_bits > 0 )
|
|
{
|
|
wait_network_frame();
|
|
player setclientfield( "navcard_held", navcard_bits );
|
|
}
|
|
_k1759 = getNextArrayKey( _a1759, _k1759 );
|
|
}
|
|
}
|