mirror of
https://github.com/JezuzLizard/BO2-Reimagined.git
synced 2025-06-07 21:59:49 -05:00
347 lines
7.4 KiB
Plaintext
347 lines
7.4 KiB
Plaintext
#include maps\mp\zombies\_zm_weap_emp_bomb;
|
|
#include maps\mp\_utility;
|
|
#include common_scripts\utility;
|
|
#include maps\mp\zombies\_zm_utility;
|
|
|
|
init()
|
|
{
|
|
if (!emp_bomb_exists())
|
|
return;
|
|
|
|
set_zombie_var("emp_stun_range", 512);
|
|
set_zombie_var("emp_stun_time", 12);
|
|
set_zombie_var("emp_perk_off_range", 512);
|
|
set_zombie_var("emp_perk_off_time", 60);
|
|
precacheshellshock("flashbang");
|
|
|
|
level thread onplayerconnect();
|
|
level._equipment_emp_destroy_fx = loadfx("weapon/emp/fx_emp_explosion_equip");
|
|
}
|
|
|
|
emp_detonate(grenade)
|
|
{
|
|
grenade_owner = undefined;
|
|
|
|
if (isDefined(grenade.owner))
|
|
{
|
|
grenade_owner = grenade.owner;
|
|
}
|
|
|
|
grenade waittill("explode", origin);
|
|
|
|
emp_radius = level.zombie_vars["emp_stun_range"];
|
|
emp_time = level.zombie_vars["emp_perk_off_time"];
|
|
|
|
if (!isDefined(origin))
|
|
{
|
|
return;
|
|
}
|
|
|
|
level notify("emp_detonate", origin, emp_radius);
|
|
self thread emp_detonate_zombies(origin, emp_radius, grenade_owner);
|
|
|
|
if (isDefined(level.custom_emp_detonate))
|
|
{
|
|
thread [[level.custom_emp_detonate]](origin);
|
|
}
|
|
|
|
if (isDefined(grenade_owner))
|
|
{
|
|
grenade_owner thread destroyequipment(origin, emp_radius);
|
|
}
|
|
|
|
emp_players(origin, emp_radius, grenade_owner);
|
|
disabled_list = maps\mp\zombies\_zm_power::change_power_in_radius(-1, origin, emp_radius);
|
|
|
|
wait emp_time;
|
|
|
|
maps\mp\zombies\_zm_power::revert_power_to_list(1, origin, emp_radius, disabled_list);
|
|
}
|
|
|
|
emp_detonate_zombies(origin, radius, owner)
|
|
{
|
|
zombies = get_array_of_closest(origin, getaispeciesarray(level.zombie_team, "all"), undefined, undefined, radius);
|
|
|
|
if (!isdefined(zombies))
|
|
return;
|
|
|
|
for (i = 0; i < zombies.size; i++)
|
|
{
|
|
if (!isdefined(zombies[i]) || isdefined(zombies[i].ignore_inert) && zombies[i].ignore_inert)
|
|
continue;
|
|
|
|
if (is_true(zombies[i].in_the_ground))
|
|
continue;
|
|
|
|
zombies[i].becoming_inert = 1;
|
|
}
|
|
|
|
stunned = 0;
|
|
|
|
for (i = 0; i < zombies.size; i++)
|
|
{
|
|
if (!isdefined(zombies[i]) || isdefined(zombies[i].ignore_inert) && zombies[i].ignore_inert)
|
|
continue;
|
|
|
|
if (is_true(zombies[i].in_the_ground))
|
|
continue;
|
|
|
|
stunned++;
|
|
zombies[i] thread stun_zombie();
|
|
wait 0.05;
|
|
}
|
|
|
|
if (stunned >= 10 && isdefined(owner))
|
|
owner notify("the_lights_of_their_eyes");
|
|
}
|
|
|
|
destroyequipment(origin, radius)
|
|
{
|
|
grenades = getentarray("grenade", "classname");
|
|
rsquared = radius * radius;
|
|
|
|
for (i = 0; i < grenades.size; i++)
|
|
{
|
|
item = grenades[i];
|
|
|
|
if (distancesquared(origin, item.origin) > rsquared)
|
|
continue;
|
|
|
|
if (!isdefined(item.name))
|
|
continue;
|
|
|
|
if (!is_offhand_weapon(item.name))
|
|
continue;
|
|
|
|
watcher = item.owner getwatcherforweapon(item.name);
|
|
|
|
if (!isdefined(watcher))
|
|
continue;
|
|
|
|
watcher thread waitanddetonate(item, 0.0, self, "emp_grenade_zm");
|
|
}
|
|
|
|
equipment = maps\mp\zombies\_zm_equipment::get_destructible_equipment_list();
|
|
|
|
for (i = 0; i < equipment.size; i++)
|
|
{
|
|
item = equipment[i];
|
|
|
|
if (!isdefined(item))
|
|
continue;
|
|
|
|
if (distancesquared(origin, item.origin) > rsquared)
|
|
continue;
|
|
|
|
waitanddamage(item, 1505);
|
|
}
|
|
}
|
|
|
|
waitanddamage(object, damage)
|
|
{
|
|
object endon("death");
|
|
object endon("hacked");
|
|
object.stun_fx = 1;
|
|
|
|
if (isdefined(level._equipment_emp_destroy_fx))
|
|
playfx(level._equipment_emp_destroy_fx, object.origin + vectorscale((0, 0, 1), 5.0), (0, randomfloat(360), 0));
|
|
|
|
delay = 1.1;
|
|
|
|
if (delay)
|
|
wait(delay);
|
|
|
|
object thread scripts\zm\replaced\_zm_equipment::item_damage(damage);
|
|
}
|
|
|
|
emp_players(origin, radius, owner)
|
|
{
|
|
rsquared = radius * radius;
|
|
players = get_players();
|
|
|
|
foreach (player in players)
|
|
{
|
|
if (distancesquared(origin, player.origin) < rsquared)
|
|
{
|
|
if (is_player_valid(player) || player maps\mp\zombies\_zm_laststand::player_is_in_laststand())
|
|
{
|
|
time = level.zombie_vars["emp_stun_time"];
|
|
player shellshock("flashbang", 1);
|
|
player thread player_perk_pause_and_unpause_all_perks(time, owner);
|
|
player thread player_emp_fx(time);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
player_emp_fx(time)
|
|
{
|
|
self notify("player_emp_fx");
|
|
self endon("player_emp_fx");
|
|
self endon("disconnect");
|
|
self endon("player_perk_pause_timeout");
|
|
|
|
wait_time = 2.5;
|
|
|
|
for (i = 0; i < time; i += wait_time)
|
|
{
|
|
playfxontag(level._effect["elec_torso"], self, "J_SpineLower");
|
|
|
|
wait wait_time;
|
|
}
|
|
}
|
|
|
|
player_perk_pause_and_unpause_all_perks(time, owner)
|
|
{
|
|
self notify("player_perk_pause_and_unpause_all_perks");
|
|
self endon("player_perk_pause_and_unpause_all_perks");
|
|
self endon("disconnect");
|
|
|
|
if (self.team != owner.team)
|
|
{
|
|
self.last_emped_by = spawnStruct();
|
|
self.last_emped_by.attacker = owner;
|
|
|
|
self.player_damage_callback_score_only = 1;
|
|
self [[level._game_module_player_damage_callback]](owner, owner, 0, 0, "MOD_GRENADE_SPLASH", "emp_grenade_zm");
|
|
self.player_damage_callback_score_only = undefined;
|
|
}
|
|
else
|
|
{
|
|
self.last_emped_by = undefined;
|
|
}
|
|
|
|
self player_perk_pause_all_perks();
|
|
self thread player_perk_pause_all_perks_acquired(time);
|
|
|
|
self waittill_any_or_timeout(time, "spawned_player", "bled_out", "player_suicide");
|
|
|
|
self player_perk_unpause_all_perks();
|
|
|
|
self.last_emped_by = undefined;
|
|
}
|
|
|
|
player_perk_pause_all_perks_acquired(time)
|
|
{
|
|
self endon("player_perk_pause_timeout");
|
|
self endon("player_perk_pause_and_unpause_all_perks");
|
|
self endon("disconnect");
|
|
|
|
while (1)
|
|
{
|
|
self waittill("perk_acquired");
|
|
|
|
wait 0.1;
|
|
|
|
self player_perk_pause_all_perks();
|
|
}
|
|
}
|
|
|
|
player_perk_pause_all_perks()
|
|
{
|
|
vending_triggers = getentarray("zombie_vending", "targetname");
|
|
|
|
foreach (trigger in vending_triggers)
|
|
{
|
|
self player_perk_pause(trigger.script_noteworthy);
|
|
}
|
|
}
|
|
|
|
player_perk_unpause_all_perks()
|
|
{
|
|
self notify("player_perk_pause_timeout");
|
|
|
|
vending_triggers = getentarray("zombie_vending", "targetname");
|
|
|
|
foreach (trigger in vending_triggers)
|
|
{
|
|
self player_perk_unpause(trigger.script_noteworthy);
|
|
}
|
|
|
|
self.disabled_perks = [];
|
|
}
|
|
|
|
player_perk_pause(perk)
|
|
{
|
|
if (perk == "Pack_A_Punch" || perk == "specialty_weapupgrade")
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!isDefined(self.disabled_perks))
|
|
{
|
|
self.disabled_perks = [];
|
|
}
|
|
|
|
if (!is_true(self.disabled_perks[perk]) && self hasperk(perk))
|
|
{
|
|
self.disabled_perks[perk] = 1;
|
|
}
|
|
|
|
if (self.disabled_perks[perk])
|
|
{
|
|
self unsetperk(perk);
|
|
self maps\mp\zombies\_zm_perks::set_perk_clientfield(perk, 2);
|
|
|
|
if (perk == "specialty_armorvest" || perk == "specialty_armorvest_upgrade")
|
|
{
|
|
self setmaxhealth(self.premaxhealth);
|
|
|
|
if (self.health > self.maxhealth)
|
|
{
|
|
self.health = self.maxhealth;
|
|
}
|
|
}
|
|
|
|
if (perk == "specialty_additionalprimaryweapon" || perk == "specialty_additionalprimaryweapon_upgrade")
|
|
{
|
|
self maps\mp\zombies\_zm::take_additionalprimaryweapon();
|
|
}
|
|
|
|
if (issubstr(perk, "specialty_scavenger"))
|
|
{
|
|
self.hasperkspecialtytombstone = undefined;
|
|
}
|
|
|
|
if (isDefined(level._custom_perks[perk]) && isDefined(level._custom_perks[perk].player_thread_take))
|
|
{
|
|
self thread [[level._custom_perks[perk].player_thread_take]]();
|
|
}
|
|
}
|
|
|
|
self notify("perk_lost");
|
|
}
|
|
|
|
player_perk_unpause(perk)
|
|
{
|
|
if (!isDefined(perk))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (perk == "Pack_A_Punch")
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (isDefined(self.disabled_perks) && is_true(self.disabled_perks[perk]))
|
|
{
|
|
self.disabled_perks[perk] = undefined;
|
|
self maps\mp\zombies\_zm_perks::set_perk_clientfield(perk, 1);
|
|
self setperk(perk);
|
|
|
|
if (issubstr(perk, "specialty_scavenger"))
|
|
{
|
|
self.hasperkspecialtytombstone = 1;
|
|
}
|
|
|
|
self maps\mp\zombies\_zm_perks::perk_set_max_health_if_jugg(perk, 0, 0);
|
|
|
|
if (isDefined(level._custom_perks[perk]) && isDefined(level._custom_perks[perk].player_thread_give))
|
|
{
|
|
self thread [[level._custom_perks[perk].player_thread_give]]();
|
|
}
|
|
}
|
|
|
|
self notify("perk_acquired");
|
|
} |