#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; } } }