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_weap_staff_lightning.gsc
2023-12-16 20:01:17 -08:00

182 lines
4.1 KiB
Plaintext

#include maps\mp\zombies\_zm_weap_staff_lightning;
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_net;
#include maps\mp\zm_tomb_utility;
#include maps\mp\zombies\_zm_spawner;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zombies\_zm_powerups;
#include maps\mp\zombies\_zm_score;
#include maps\mp\animscripts\shared;
staff_lightning_ball_kill_zombies(e_attacker)
{
self endon("death");
self endon("stop_killing");
while (true)
{
a_zombies = staff_lightning_get_valid_targets(e_attacker, self.origin);
if (isdefined(a_zombies))
{
foreach (zombie in a_zombies)
{
if (staff_lightning_is_target_valid(zombie))
{
e_attacker thread staff_lightning_arc_fx(self, zombie);
wait 0.2;
}
}
}
wait 0.05;
}
}
staff_lightning_get_valid_targets(player, v_source)
{
player endon("disconnect");
a_enemies = [];
a_zombies = getaiarray(level.zombie_team);
a_zombies = get_array_of_closest(v_source, a_zombies, undefined, undefined, self.n_range);
if (isdefined(a_zombies))
{
foreach (ai_zombie in a_zombies)
{
if (staff_lightning_is_target_valid(ai_zombie))
a_enemies[a_enemies.size] = ai_zombie;
}
}
return a_enemies;
}
staff_lightning_is_target_valid(ai_zombie)
{
if (!isdefined(ai_zombie))
return false;
if (is_true(ai_zombie.is_being_zapped))
return false;
return true;
}
staff_lightning_arc_fx(e_source, ai_zombie)
{
self endon("disconnect");
if (!isdefined(ai_zombie))
return;
if (!bullet_trace_throttled(e_source.origin, ai_zombie.origin + vectorscale((0, 0, 1), 20.0), ai_zombie))
{
return;
}
if (isdefined(e_source) && isdefined(ai_zombie) && isalive(ai_zombie))
{
if (is_true(ai_zombie.is_mechz))
{
level thread staff_lightning_ball_damage_over_time_mechz(e_source, ai_zombie, self);
}
else
{
level thread staff_lightning_ball_damage_over_time(e_source, ai_zombie, self);
}
}
}
staff_lightning_ball_damage_over_time(e_source, e_target, e_attacker)
{
e_attacker endon("disconnect");
e_target setclientfield("lightning_impact_fx", 1);
e_target thread maps\mp\zombies\_zm_audio::do_zombies_playvocals("electrocute", e_target.animname);
n_range_sq = e_source.n_range * e_source.n_range;
e_target.is_being_zapped = 1;
e_target setclientfield("lightning_arc_fx", 1);
wait 0.5;
if (isdefined(e_source))
{
if (!isdefined(e_source.n_damage_per_sec))
e_source.n_damage_per_sec = get_lightning_ball_damage_per_sec(e_attacker.chargeshotlevel);
n_damage_per_pulse = e_source.n_damage_per_sec * 1.0;
}
while (isdefined(e_source) && isalive(e_target))
{
e_target thread stun_zombie();
wait 1.0;
if (!isdefined(e_source) || !isalive(e_target))
break;
n_dist_sq = distancesquared(e_source.origin, e_target.origin);
if (n_dist_sq > n_range_sq)
break;
if (isalive(e_target) && isdefined(e_source))
{
e_target thread zombie_shock_eyes();
e_target thread staff_lightning_kill_zombie(e_attacker, e_source.str_weapon);
break;
}
}
if (isdefined(e_target))
{
e_target.is_being_zapped = 0;
e_target setclientfield("lightning_arc_fx", 0);
}
}
staff_lightning_ball_damage_over_time_mechz(e_source, e_target, e_attacker)
{
e_attacker endon("disconnect");
n_range_sq = e_source.n_range * e_source.n_range;
e_target.is_being_zapped = 1;
wait 0.5;
if (isdefined(e_source))
{
if (!isdefined(e_source.n_damage_per_sec))
e_source.n_damage_per_sec = get_lightning_ball_damage_per_sec(e_attacker.chargeshotlevel);
n_damage_per_pulse = e_source.n_damage_per_sec * 1.0;
}
while (isdefined(e_source) && isalive(e_target))
{
wait 1.0;
if (!isdefined(e_source) || !isalive(e_target))
break;
n_dist_sq = distancesquared(e_source.origin, e_target.origin);
if (n_dist_sq > n_range_sq)
break;
if (isalive(e_target) && isdefined(e_source))
{
e_target do_damage_network_safe(e_attacker, e_source.n_damage_per_sec, e_source.str_weapon, "MOD_RIFLE_BULLET");
break;
}
}
if (isdefined(e_target))
{
e_target.is_being_zapped = 0;
}
}
get_lightning_ball_damage_per_sec(n_charge)
{
return 2500;
}