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