1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-07 21:59:49 -05:00
BO2-Reimagined/scripts/zm/replaced/zm_alcatraz_traps.gsc
2023-12-16 21:11:47 -08:00

426 lines
10 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;
}
}
}