1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-10 07:08:06 -05:00
Files
BO2-Reimagined/scripts/zm/replaced/zm_tomb_capture_zones.gsc

407 lines
16 KiB
Plaintext

#include maps\mp\zm_tomb_capture_zones;
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_score;
#include maps\mp\zombies\_zm_laststand;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\animscripts\zm_death;
#include maps\mp\zm_tomb_utility;
#include maps\mp\zombies\_zm_magicbox;
#include maps\mp\zm_tomb_vo;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zm_tomb_capture_zones_ffotd;
#include maps\mp\zombies\_zm_spawner;
#include maps\mp\zombies\_zm_perks;
#include maps\mp\zombies\_zm_unitrigger;
#include maps\mp\zombies\_zm_ai_basic;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\zombies\_zm_challenges;
#include maps\mp\zombies\_zm_magicbox_tomb;
#include maps\mp\zombies\_zm_powerups;
setup_capture_zones()
{
spawner_capture_zombie = getent( "capture_zombie_spawner", "targetname" );
spawner_capture_zombie add_spawn_function( scripts\zm\replaced\zm_tomb_utility::capture_zombie_spawn_init );
a_s_generator = getstructarray( "s_generator", "targetname" );
registerclientfield( "world", "packapunch_anim", 14000, 3, "int" );
registerclientfield( "actor", "zone_capture_zombie", 14000, 1, "int" );
registerclientfield( "scriptmover", "zone_capture_emergence_hole", 14000, 1, "int" );
registerclientfield( "world", "zc_change_progress_bar_color", 14000, 1, "int" );
registerclientfield( "world", "zone_capture_hud_all_generators_captured", 14000, 1, "int" );
registerclientfield( "world", "zone_capture_perk_machine_smoke_fx_always_on", 14000, 1, "int" );
registerclientfield( "world", "pap_monolith_ring_shake", 14000, 1, "int" );
foreach ( struct in a_s_generator )
{
registerclientfield( "world", struct.script_noteworthy, 14000, 7, "float" );
registerclientfield( "world", "state_" + struct.script_noteworthy, 14000, 3, "int" );
registerclientfield( "world", "zone_capture_hud_generator_" + struct.script_int, 14000, 2, "int" );
registerclientfield( "world", "zone_capture_monolith_crystal_" + struct.script_int, 14000, 1, "int" );
registerclientfield( "world", "zone_capture_perk_machine_smoke_fx_" + struct.script_int, 14000, 1, "int" );
}
flag_wait( "start_zombie_round_logic" );
level.magic_box_zbarrier_state_func = ::set_magic_box_zbarrier_state;
level.custom_perk_validation = ::check_perk_machine_valid;
level thread track_max_player_zombie_points();
foreach ( s_generator in a_s_generator )
s_generator thread init_capture_zone();
register_elements_powered_by_zone_capture_generators();
setup_perk_machines_not_controlled_by_zone_capture();
pack_a_punch_init();
level thread recapture_round_tracker();
level.zone_capture.recapture_zombies = [];
level.zone_capture.last_zone_captured = undefined;
level.zone_capture.spawn_func_capture_zombie = ::init_capture_zombie;
level.zone_capture.spawn_func_recapture_zombie = ::init_recapture_zombie;
maps\mp\zombies\_zm_spawner::register_zombie_death_event_callback( ::recapture_zombie_death_func );
level.custom_derive_damage_refs = ::zone_capture_gib_think;
setup_inaccessible_zombie_attack_points();
level thread quick_revive_game_type_watcher();
level thread quick_revive_solo_leave_watcher();
level thread all_zones_captured_vo();
flag_set( "capture_zones_init_done" );
level setclientfield( "zone_capture_perk_machine_smoke_fx_always_on", 1 );
maps\mp\zm_tomb_capture_zones_ffotd::capture_zone_init_end();
}
init_capture_zone()
{
assert( isdefined( self.script_noteworthy ), "capture zone struct is missing script_noteworthy KVP! This is required for init_capture_zone()" );
if ( !isdefined( level.zone_capture ) )
level.zone_capture = spawnstruct();
if ( !isdefined( level.zone_capture.zones ) )
level.zone_capture.zones = [];
assert( !isdefined( level.zone_capture.zones[self.script_noteworthy] ), "init_capture_zone() attempting to initialize an existing zone with name '" + self.script_noteworthy + "'" );
self.n_current_progress = 0;
self.n_last_progress = 0;
self setup_generator_unitrigger();
self.str_zone = get_zone_from_position( self.origin, 1 );
self.sndent = spawn( "script_origin", self.origin );
assert( isdefined( self.script_int ), "script_int KVP is required by init_capture_zone() to identify the objective index, but it's missing on zone '" + self.script_noteworthy + "'" );
self ent_flag_init( "attacked_by_recapture_zombies" );
self ent_flag_init( "current_recapture_target_zone" );
self ent_flag_init( "player_controlled" );
self ent_flag_init( "zone_contested" );
self ent_flag_init( "zone_initialized" );
level.zone_capture.zones[self.script_noteworthy] = self;
self set_zombie_controlled_area( 1 );
self setup_zombie_attack_points();
self ent_flag_set( "zone_initialized" );
self thread wait_for_capture_trigger();
}
wait_for_capture_trigger()
{
while ( true )
{
self waittill( "start_generator_capture", e_player );
if ( !flag( "zone_capture_in_progress" ) )
{
flag_set( "zone_capture_in_progress" );
self.purchaser = e_player;
self.generator_cost = get_generator_capture_start_cost();
e_player minus_to_player_score( self.generator_cost );
e_player delay_thread( 2.5, ::create_and_play_dialog, "zone_capture", "capture_started" );
self maps\mp\zm_tomb_capture_zones_ffotd::capture_event_start();
self thread monitor_capture_zombies();
self thread activate_capture_zone();
self ent_flag_wait( "zone_contested" );
capture_event_handle_ai_limit();
self ent_flag_waitopen( "zone_contested" );
self maps\mp\zm_tomb_capture_zones_ffotd::capture_event_end();
wait 1;
self.purchaser = undefined;
}
else
{
flag_wait( "zone_capture_in_progress" );
flag_waitopen( "zone_capture_in_progress" );
}
capture_event_handle_ai_limit();
if ( self ent_flag( "player_controlled" ) )
self ent_flag_waitopen( "player_controlled" );
}
}
activate_capture_zone( b_show_emergence_holes = 1 )
{
if ( !flag( "recapture_event_in_progress" ) )
self thread generator_initiated_vo();
self.a_emergence_hole_structs = getstructarray( self.target, "targetname" );
self show_emergence_holes( b_show_emergence_holes );
if ( flag( "recapture_event_in_progress" ) && self ent_flag( "current_recapture_target_zone" ) )
{
flag_wait_any( "generator_under_attack", "recapture_zombies_cleared" );
if ( flag( "recapture_zombies_cleared" ) )
return;
}
self capture_progress_think();
self destroy_emergence_holes();
}
capture_progress_think()
{
self init_capture_progress();
self clear_zone_objective_index();
self show_zone_capture_objective( 1 );
self get_zone_objective_index();
while ( self ent_flag( "zone_contested" ) )
{
a_players = get_players();
a_players_in_capture_zone = self get_players_in_capture_zone();
foreach ( player in a_players )
{
if ( isinarray( a_players_in_capture_zone, player ) )
{
if ( !flag( "recapture_event_in_progress" ) || !self ent_flag( "current_recapture_target_zone" ) )
objective_setplayerusing( self.n_objective_index, player );
continue;
}
if ( is_player_valid( player ) )
objective_clearplayerusing( self.n_objective_index, player );
}
self.n_last_progress = self.n_current_progress;
self.n_current_progress += self get_progress_rate( a_players_in_capture_zone.size, a_players.size );
if ( self.n_last_progress != self.n_current_progress )
{
self.n_current_progress = clamp( self.n_current_progress, 0, 100 );
objective_setprogress( self.n_objective_index, self.n_current_progress / 100 );
self zone_capture_sound_state_think();
level setclientfield( self.script_noteworthy, self.n_current_progress / 100 );
self generator_set_state();
if ( !flag( "recapture_event_in_progress" ) || !self ent_flag( "attacked_by_recapture_zombies" ) )
{
b_set_color_to_white = a_players_in_capture_zone.size > 0;
if ( !flag( "recapture_event_in_progress" ) && self ent_flag( "current_recapture_target_zone" ) )
b_set_color_to_white = 1;
level setclientfield( "zc_change_progress_bar_color", b_set_color_to_white );
}
update_objective_on_momentum_change();
if ( self.n_current_progress == 0 || self.n_current_progress == 100 && !self ent_flag( "attacked_by_recapture_zombies" ) )
self ent_flag_clear( "zone_contested" );
}
show_zone_capture_debug_info();
wait 0.1;
}
self ent_flag_clear( "attacked_by_recapture_zombies" );
self handle_generator_capture();
self clear_all_zombie_attack_points_in_zone();
}
handle_generator_capture()
{
level setclientfield( "zc_change_progress_bar_color", 0 );
self show_zone_capture_objective( 0 );
if ( self.n_current_progress == 100 )
{
self players_capture_zone();
self kill_all_capture_zombies();
}
else if ( self.n_current_progress == 0 )
{
if ( self ent_flag( "player_controlled" ) )
{
self.sndent stoploopsound( 0.25 );
self thread generator_deactivated_vo();
self.is_playing_audio = 0;
foreach ( player in get_players() )
{
player maps\mp\zombies\_zm_stats::increment_client_stat( "tomb_generator_lost", 0 );
player maps\mp\zombies\_zm_stats::increment_player_stat( "tomb_generator_lost" );
}
}
self set_zombie_controlled_area();
if ( flag( "recapture_event_in_progress" ) && get_captured_zone_count() > 0 )
{
}
else
self kill_all_capture_zombies();
}
if ( get_contested_zone_count() == 0 )
flag_clear( "zone_capture_in_progress" );
}
players_capture_zone()
{
self.sndent playsound( "zmb_capturezone_success" );
self.sndent stoploopsound( 0.25 );
reward_players_in_capture_zone();
wait_network_frame();
if ( !flag( "recapture_event_in_progress" ) && !self ent_flag( "player_controlled" ) )
self thread zone_capture_complete_vo();
self set_player_controlled_area();
wait_network_frame();
playfx( level._effect["capture_complete"], self.origin );
level thread sndplaygeneratormusicstinger();
}
reward_players_in_capture_zone()
{
b_challenge_exists = maps\mp\zombies\_zm_challenges::challenge_exists( "zc_zone_captures" );
if ( !self ent_flag( "player_controlled" ) )
{
foreach ( player in get_players_in_capture_zone() )
{
if ( isdefined( self.purchaser ) && self.purchaser == player )
self refund_generator_cost_if_player_captured_it( player );
player notify( "completed_zone_capture" );
player maps\mp\zombies\_zm_score::player_add_points( "bonus_points_powerup", 200 );
if ( b_challenge_exists )
player maps\mp\zombies\_zm_challenges::increment_stat( "zc_zone_captures" );
player maps\mp\zombies\_zm_stats::increment_client_stat( "tomb_generator_captured", 0 );
player maps\mp\zombies\_zm_stats::increment_player_stat( "tomb_generator_captured" );
}
}
}
recapture_zombie_death_func()
{
if ( isdefined( self.is_recapture_zombie ) && self.is_recapture_zombie )
{
level.recapture_zombies_killed++;
if ( isdefined( self.attacker ) && isplayer( self.attacker ) && level.recapture_zombies_killed == get_recapture_zombies_needed() )
{
self.attacker thread delay_thread( 2, ::create_and_play_dialog, "zone_capture", "recapture_prevented" );
foreach ( player in get_players() )
{
player maps\mp\zombies\_zm_stats::increment_client_stat( "tomb_generator_defended", 0 );
player maps\mp\zombies\_zm_stats::increment_player_stat( "tomb_generator_defended" );
}
}
if ( level.recapture_zombies_killed == get_recapture_zombies_needed() && is_true( level.b_is_first_generator_attack ) )
self drop_max_ammo_at_death_location();
}
}
recapture_round_tracker()
{
n_next_recapture_round = 10;
while ( true )
{
level waittill_any( "between_round_over", "force_recapture_start" );
if ( level.round_number >= n_next_recapture_round && !flag( "zone_capture_in_progress" ) && get_captured_zone_count() >= get_player_controlled_zone_count_for_recapture() )
{
n_next_recapture_round = level.round_number + randomintrange( 3, 6 );
level thread recapture_round_start();
}
}
}
recapture_round_start()
{
flag_set( "recapture_event_in_progress" );
flag_clear( "recapture_zombies_cleared" );
flag_clear( "generator_under_attack" );
level.recapture_zombies_killed = 0;
level.b_is_first_generator_attack = 1;
s_recapture_target_zone = undefined;
capture_event_handle_ai_limit();
recapture_round_audio_starts();
while ( !flag( "recapture_zombies_cleared" ) && get_captured_zone_count() > 0 )
{
s_recapture_target_zone = get_recapture_zone( s_recapture_target_zone );
level.zone_capture.recapture_target = s_recapture_target_zone.script_noteworthy;
s_recapture_target_zone maps\mp\zm_tomb_capture_zones_ffotd::recapture_event_start();
if ( level.b_is_first_generator_attack )
s_recapture_target_zone thread monitor_recapture_zombies();
set_recapture_zombie_attack_target( s_recapture_target_zone );
s_recapture_target_zone thread generator_under_attack_warnings();
s_recapture_target_zone ent_flag_set( "current_recapture_target_zone" );
s_recapture_target_zone thread hide_zone_objective_while_recapture_group_runs_to_next_generator( level.b_is_first_generator_attack );
s_recapture_target_zone activate_capture_zone( level.b_is_first_generator_attack );
s_recapture_target_zone ent_flag_clear( "attacked_by_recapture_zombies" );
s_recapture_target_zone ent_flag_clear( "current_recapture_target_zone" );
if ( level.b_is_first_generator_attack && !s_recapture_target_zone ent_flag( "player_controlled" ) )
delay_thread( 3, ::broadcast_vo_category_to_team, "recapture_started" );
level.b_is_first_generator_attack = 0;
s_recapture_target_zone maps\mp\zm_tomb_capture_zones_ffotd::recapture_event_end();
wait 0.05;
}
//if ( s_recapture_target_zone.n_current_progress == 0 || s_recapture_target_zone.n_current_progress == 100 )
// s_recapture_target_zone handle_generator_capture();
capture_event_handle_ai_limit();
kill_all_recapture_zombies();
recapture_round_audio_ends();
flag_clear( "recapture_event_in_progress" );
flag_clear( "generator_under_attack" );
}
magic_box_stub_update_prompt( player )
{
self setcursorhint( "HINT_NOICON" );
if ( !self trigger_visible_to_player( player ) )
return false;
self.stub.hint_parm1 = undefined;
if ( isdefined( self.stub.trigger_target.grab_weapon_hint ) && self.stub.trigger_target.grab_weapon_hint )
self.stub.hint_string = &"ZOMBIE_TRADE_WEAPON";
else if ( !level.zone_capture.zones[self.stub.zone] ent_flag( "player_controlled" ) )
{
self.stub.hint_string = &"ZM_TOMB_ZC";
return false;
}
else
{
self.stub.hint_parm1 = self.stub.trigger_target.zombie_cost;
self.stub.hint_string = get_hint_string( self, "default_treasure_chest" );
}
return true;
}