1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-10 15:17:57 -05:00
Files
BO2-Reimagined/scripts/zm/replaced/zm_alcatraz_traps.gsc

426 lines
13 KiB
Plaintext

#include maps\mp\zm_alcatraz_traps;
#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\animscripts\zm_death;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\zombies\_zm_ai_brutus;
init_fan_trap_trigs()
{
trap_trigs = getentarray( "fan_trap_use_trigger", "targetname" );
array_thread( trap_trigs, ::fan_trap_think );
init_fan_fxanim( "wardens_office" );
}
fan_trap_think()
{
triggers = getentarray( self.targetname, "targetname" );
self.cost = 1000;
self.in_use = 0;
self.is_available = 1;
self.has_been_used = 0;
self.zombie_dmg_trig = getent( self.target, "targetname" );
self.zombie_dmg_trig.script_string = self.script_string;
self.zombie_dmg_trig.in_use = 0;
self.rumble_trig = getent( "fan_trap_rumble", "targetname" );
light_name = self get_trap_light_name();
zapper_light_red( light_name );
self sethintstring( &"ZM_PRISON_FAN_TRAP_UNAVAILABLE" );
flag_wait( "activate_warden_office" );
zapper_light_green( light_name );
self hint_string( &"ZM_PRISON_FAN_TRAP", self.cost );
while ( true )
{
self waittill( "trigger", who );
if ( who in_revive_trigger() )
continue;
if ( !isdefined( self.is_available ) )
continue;
if ( is_player_valid( who ) )
{
if ( who.score >= self.cost )
{
if ( !self.zombie_dmg_trig.in_use )
{
if ( !self.has_been_used )
{
self.has_been_used = 1;
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "trap" );
who do_player_general_vox( "general", "discover_trap" );
}
else
who do_player_general_vox( "general", "start_trap" );
array_thread( triggers, ::hint_string, &"ZOMBIE_TRAP_ACTIVE" );
self.zombie_dmg_trig.in_use = 1;
self.zombie_dmg_trig.active = 1;
self playsound( "zmb_trap_activate" );
self thread fan_trap_move_switch( self );
self waittill( "switch_activated" );
who minus_to_player_score( self.cost );
level.trapped_track["fan"] = 1;
level notify( "trap_activated" );
who maps\mp\zombies\_zm_stats::increment_client_stat( "prison_fan_trap_used", 0 );
self.zombie_dmg_trig setvisibletoall();
self thread activate_fan_trap();
self.zombie_dmg_trig waittill( "trap_finished_" + self.script_string );
clientnotify( self.script_string + "off" );
self.zombie_dmg_trig notify( "fan_trap_finished" );
self.zombie_dmg_trig.active = 0;
self.zombie_dmg_trig setinvisibletoall();
array_thread( triggers, ::hint_string, &"ZOMBIE_TRAP_COOLDOWN" );
wait 25;
self playsound( "zmb_trap_available" );
self notify( "available" );
self.zombie_dmg_trig.in_use = 0;
array_thread( triggers, ::hint_string, &"ZM_PRISON_FAN_TRAP", self.cost );
}
}
}
}
}
init_acid_trap_trigs()
{
trap_trigs = getentarray( "acid_trap_trigger", "targetname" );
array_thread( trap_trigs, ::acid_trap_think );
level thread acid_trap_host_migration_listener();
}
acid_trap_think()
{
triggers = getentarray( self.targetname, "targetname" );
self.is_available = 1;
self.has_been_used = 0;
self.cost = 1000;
self.in_use = 0;
self.zombie_dmg_trig = getent( self.target, "targetname" );
self.zombie_dmg_trig.in_use = 0;
light_name = self get_trap_light_name();
zapper_light_red( light_name );
self sethintstring( &"ZM_PRISON_ACID_TRAP_UNAVAILABLE" );
flag_wait_any( "activate_cafeteria", "activate_infirmary" );
zapper_light_green( light_name );
self hint_string( &"ZM_PRISON_ACID_TRAP", self.cost );
while ( true )
{
self waittill( "trigger", who );
if ( who in_revive_trigger() )
continue;
if ( !isdefined( self.is_available ) )
continue;
if ( is_player_valid( who ) )
{
if ( who.score >= self.cost )
{
if ( !self.zombie_dmg_trig.in_use )
{
if ( !self.has_been_used )
{
self.has_been_used = 1;
level thread maps\mp\zombies\_zm_audio::sndmusicstingerevent( "trap" );
who do_player_general_vox( "general", "discover_trap" );
}
else
who do_player_general_vox( "general", "start_trap" );
array_thread( triggers, ::hint_string, &"ZOMBIE_TRAP_ACTIVE" );
self.zombie_dmg_trig.in_use = 1;
self.zombie_dmg_trig.active = 1;
self playsound( "zmb_trap_activate" );
self thread acid_trap_move_switch( self );
self waittill( "switch_activated" );
who minus_to_player_score( self.cost );
level.trapped_track["acid"] = 1;
level notify( "trap_activated" );
who maps\mp\zombies\_zm_stats::increment_client_stat( "prison_acid_trap_used", 0 );
self thread activate_acid_trap();
self.zombie_dmg_trig waittill( "acid_trap_fx_done" );
clientnotify( self.script_string + "off" );
if ( isdefined( self.fx_org ) )
self.fx_org delete();
if ( isdefined( self.zapper_fx_org ) )
self.zapper_fx_org delete();
if ( isdefined( self.zapper_fx_switch_org ) )
self.zapper_fx_switch_org delete();
self.zombie_dmg_trig notify( "acid_trap_finished" );
self.zombie_dmg_trig.active = 0;
array_thread( triggers, ::hint_string, &"ZOMBIE_TRAP_COOLDOWN" );
wait 25;
self playsound( "zmb_trap_available" );
self notify( "available" );
self.zombie_dmg_trig.in_use = 0;
array_thread( triggers, ::hint_string, &"ZM_PRISON_ACID_TRAP", self.cost );
}
}
}
}
}
zombie_acid_damage()
{
self endon( "death" );
self setclientfield( "acid_trap_death_fx", 1 );
if ( !isdefined( self.is_brutus ) )
{
self.a.gib_ref = random( array( "right_arm", "left_arm", "head", "right_leg", "left_leg", "no_legs" ) );
self thread maps\mp\animscripts\zm_death::do_gib();
}
self dodamage( self.health + 1000, self.origin );
}
player_acid_damage( t_damage )
{
self endon( "death" );
self endon( "disconnect" );
t_damage endon( "acid_trap_finished" );
if ( !isdefined( self.is_in_acid ) && !self player_is_in_laststand() )
{
self.is_in_acid = 1;
self thread player_acid_damage_cooldown();
self dodamage( self.maxhealth / 2, self.origin, t_damage, t_damage, "none", "MOD_UNKNOWN", 0, "none" );
wait 1.5;
}
}
player_acid_damage_cooldown()
{
self endon( "disconnect" );
wait 1.5;
if ( isdefined( self ) )
self.is_in_acid = undefined;
}
tower_trap_trigger_think()
{
self.range_trigger = getent( self.target, "targetname" );
self.upgrade_trigger = getent( self.script_string, "script_noteworthy" );
self.cost = 1000;
light_name = self get_trap_light_name();
zapper_light_green( light_name );
self.is_available = 1;
self.in_use = 0;
self.has_been_used = 0;
self.sndtowerent = spawn( "script_origin", ( -21, 5584, 356 ) );
self tower_trap_weapon();
self.upgrade_trigger.cost = 1000;
self.upgrade_trigger.in_use = 0;
self.upgrade_trigger.is_available = 1;
if (is_gametype_active("zclassic"))
{
self thread tower_upgrade_trigger_think();
}
while ( true )
{
self hint_string( &"ZM_PRISON_TOWER_TRAP", self.cost );
self waittill( "trigger", who );
if ( who in_revive_trigger() )
continue;
if ( !isdefined( self.is_available ) )
continue;
if ( is_player_valid( who ) )
{
if ( who.score >= self.cost )
{
if ( !self.in_use )
{
if ( !self.has_been_used )
{
self.has_been_used = 1;
who do_player_general_vox( "general", "discover_trap" );
}
else
who do_player_general_vox( "general", "start_trap" );
self hint_string( &"ZOMBIE_TRAP_ACTIVE" );
self.in_use = 1;
self.active = 1;
play_sound_at_pos( "purchase", who.origin );
self thread tower_trap_move_switch( self );
self playsound( "zmb_trap_activate" );
self waittill( "switch_activated" );
who minus_to_player_score( self.cost );
level.trapped_track["tower"] = 1;
level notify( "trap_activated" );
who maps\mp\zombies\_zm_stats::increment_client_stat( "prison_sniper_tower_used", 0 );
self.sndtowerent playsound( "zmb_trap_tower_start" );
self.sndtowerent playloopsound( "zmb_trap_tower_loop", 1 );
self thread activate_tower_trap();
self thread tower_trap_timer();
self waittill( "tower_trap_off" );
self.sndtowerent stoploopsound( 1 );
self.sndtowerent playsound( "zmb_trap_tower_end" );
self.active = 0;
self sethintstring( &"ZOMBIE_TRAP_COOLDOWN" );
zapper_light_red( light_name );
wait 25;
self playsound( "zmb_trap_available" );
self notify( "available" );
self.in_use = 0;
}
}
}
}
}
tower_upgrade_trigger_think()
{
while (1)
{
level thread open_tower_trap_upgrade_panel();
level waittill( self.upgrade_trigger.script_string );
self.upgrade_trigger.in_use = 1;
self.upgrade_trigger.is_available = 0;
level.trapped_track["tower_upgrade"] = 1;
level notify( "tower_trap_upgraded" );
level notify( "close_tower_trap_upgrade_panel" );
self upgrade_tower_trap_weapon();
level waittill( "end_of_round" );
self tower_trap_weapon();
self.upgrade_trigger notify( "afterlife_interact_reset" );
self.upgrade_trigger notify( "available" );
self.upgrade_trigger.in_use = 0;
self.upgrade_trigger.is_available = 1;
}
}
tower_trap_weapon()
{
self.weapon_name = "tower_trap_zm";
self.tag_to_target = "J_Head";
self.trap_reload_time = 0.75;
}
activate_tower_trap()
{
self endon( "tower_trap_off" );
while ( true )
{
zombies = getaiarray( level.zombie_team );
if (is_gametype_active("zgrief"))
{
zombies = arraycombine(zombies, get_players(), 1, 0);
}
zombies_sorted = [];
foreach ( zombie in zombies )
{
if ( zombie istouching( self.range_trigger ) )
{
zombies_sorted[zombies_sorted.size] = zombie;
}
}
if ( zombies_sorted.size <= 0 )
{
wait 0.05;
continue;
}
self tower_trap_fires( zombies_sorted );
}
}
tower_trap_fires( a_zombies )
{
if ( isdefined( level.custom_tower_trap_fires_func ) )
{
self thread [[ level.custom_tower_trap_fires_func ]]( a_zombies );
return;
}
if ( a_zombies.size <= 0 )
{
return;
}
self endon( "tower_trap_off" );
e_org = getstruct( self.range_trigger.target, "targetname" );
while ( 1 )
{
if ( a_zombies.size <= 0 )
{
wait 0.05;
return;
}
n_index = randomintrange( 0, a_zombies.size );
e_target = a_zombies[n_index];
if ( !isalive( e_target ) )
{
arrayremovevalue( a_zombies, e_target, 0 );
continue;
}
if ( isplayer( e_target ) && e_target maps\mp\zombies\_zm_laststand::player_is_in_laststand() )
{
arrayremovevalue( a_zombies, e_target, 0 );
continue;
}
v_zombietarget = e_target gettagorigin( self.tag_to_target );
if ( sighttracepassed( e_org.origin, v_zombietarget, 1, undefined ) )
{
magicbullet( self.weapon_name, e_org.origin, v_zombietarget );
wait( self.trap_reload_time );
return;
}
else
{
arrayremovevalue( a_zombies, e_target, 0 );
continue;
}
}
}