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_ai_screecher.gsc
Jbleezy 4c7b0f53c7 Bouncing Betty: replace Claymore on Origins
Claymore: increase explosion radius
Move certain vars to not exceed canonical string table limit
2024-02-09 18:39:06 -08:00

330 lines
7.5 KiB
Plaintext

#include maps\mp\zombies\_zm_ai_screecher;
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\_visionset_mgr;
#include maps\mp\animscripts\zm_shared;
#include maps\mp\zombies\_zm_spawner;
#include maps\mp\gametypes_zm\_hud_util;
#include maps\mp\zombies\_zm_laststand;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zombies\_zm_stats;
screecher_spawning_logic()
{
level endon("intermission");
if (level.intermission)
return;
if (level.screecher_spawners.size < 1)
{
return;
}
while (true)
{
while (!isdefined(level.zombie_screecher_locations) || level.zombie_screecher_locations.size <= 0)
wait 0.1;
while (getdvarint("scr_screecher_ignore_player"))
wait 0.1;
if (!flag("spawn_zombies"))
flag_wait("spawn_zombies");
valid_players_in_screecher_zone = 0;
valid_players = [];
while (valid_players_in_screecher_zone <= level.zombie_screecher_count)
{
players = getplayers();
valid_players_in_screecher_zone = 0;
for (p = 0; p < players.size; p++)
{
if (is_player_valid(players[p]) && player_in_screecher_zone(players[p]) && !isdefined(players[p].screecher))
{
valid_players_in_screecher_zone++;
valid_players[valid_players.size] = players[p];
}
}
wait 0.1;
}
if (!isdefined(level.zombie_screecher_locations) || level.zombie_screecher_locations.size <= 0)
continue;
valid_players = array_randomize(valid_players);
spawn_points = get_array_of_closest(valid_players[0].origin, level.zombie_screecher_locations);
spawn_point = undefined;
if (!isdefined(spawn_points) || spawn_points.size == 0)
{
wait 0.1;
continue;
}
if (!isdefined(level.last_spawn))
{
level.last_spawn_index = 0;
level.last_spawn = [];
level.last_spawn[level.last_spawn_index] = spawn_points[0];
level.last_spawn_index = 1;
spawn_point = spawn_points[0];
}
else
{
foreach (point in spawn_points)
{
if (point == level.last_spawn[0])
continue;
if (isdefined(level.last_spawn[1]) && point == level.last_spawn[1])
continue;
spawn_point = point;
level.last_spawn[level.last_spawn_index] = spawn_point;
level.last_spawn_index++;
if (level.last_spawn_index > 1)
level.last_spawn_index = 0;
break;
}
}
if (!isdefined(spawn_point))
spawn_point = spawn_points[0];
if (isdefined(level.screecher_spawners))
{
spawner = random(level.screecher_spawners);
ai = spawn_zombie(spawner, spawner.targetname, spawn_point);
}
if (isdefined(ai))
{
ai.spawn_point = spawn_point;
level.zombie_screecher_count++;
}
wait 5;
}
}
screecher_attacking()
{
player = self.favoriteenemy;
if (!isdefined(player))
{
self thread screecher_detach(player);
return;
}
if (screecher_should_runaway(player))
{
self thread screecher_detach(player);
player thread do_player_general_vox("general", "screecher_jumpoff");
return;
}
if (self.attack_time < gettime())
{
scratch_score = 5;
players = get_players();
self.screecher_score = self.screecher_score + scratch_score;
killed_player = self screecher_check_score();
if (player.health > 0 && !(isdefined(killed_player) && killed_player))
{
self.attack_delay = self.attack_delay_base + randomint(self.attack_delay_offset);
self.attack_time = gettime() + self.attack_delay;
self thread claw_fx(player, self.attack_delay * 0.001);
self playsound("zmb_vocals_screecher_attack");
player playsoundtoplayer("zmb_screecher_scratch", player);
player thread do_player_general_vox("general", "screecher_attack");
players = get_players();
}
}
}
screecher_melee_damage(player)
{
melee_score = 0;
if (player hasweapon("tazer_knuckles_zm"))
{
melee_score = 30;
}
else if (player hasweapon("bowie_knife_zm"))
{
melee_score = 15;
}
else
{
melee_score = 10;
}
if (self.screecher_score > 0)
{
if (melee_score > self.screecher_score)
{
self.screecher_score = 0;
}
else
{
self.screecher_score -= melee_score;
}
}
if (self.screecher_score <= 0)
{
self.player_score += melee_score;
}
self playsound("zmb_vocals_screecher_pain");
if (level.zombie_vars[player.team]["zombie_insta_kill"])
self.player_score = 30;
else
player thread do_player_general_vox("general", "screecher_cut");
self screecher_check_score();
}
screecher_detach(player)
{
self endon("death");
self.state = "detached";
if (!isdefined(self.linked_ent))
return;
if (isdefined(player))
{
player clientnotify("scrEnd");
player allowprone(1);
player takeweapon("screecher_arms_zm");
// if ( !getdvarint( _hash_E7EF8EB7 ) )
player stoppoisoning();
if (!player maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !(isdefined(player.intermission) && player.intermission))
player decrement_is_drinking();
if (isdefined(player.screecher_weapon) && player.screecher_weapon != "none" && is_player_valid(player) && !is_equipment_that_blocks_purchase(player.screecher_weapon))
player switchtoweapon(player.screecher_weapon);
else if (!player maps\mp\zombies\_zm_laststand::player_is_in_laststand())
{
primaryweapons = player getweaponslistprimaries();
if (isdefined(primaryweapons) && primaryweapons.size > 0)
player switchtoweapon(primaryweapons[0]);
}
player.screecher_weapon = undefined;
}
self unlink();
self setclientfield("render_third_person", 0);
if (isdefined(self.linked_ent))
{
self.linked_ent.screecher = undefined;
self.linked_ent setmovespeedscale(1);
self.linked_ent = undefined;
}
self.green_light = player.green_light;
self animcustom(::screecher_jump_down);
self waittill("jump_down_done");
maps\mp\_visionset_mgr::vsmgr_deactivate("overlay", "zm_ai_screecher_blur", player);
self animmode("normal");
self.ignoreall = 1;
self setplayercollision(1);
if (isdefined(level.screecher_should_burrow))
{
if (self [[level.screecher_should_burrow]]())
{
return;
}
}
self thread screecher_runaway();
}
screecher_cleanup()
{
self waittill("death", attacker);
if (isdefined(attacker) && isplayer(attacker))
{
if (isdefined(self.damagelocation) && isdefined(self.damagemod))
level thread maps\mp\zombies\_zm_audio::player_zombie_kill_vox(self.damagelocation, attacker, self.damagemod, self);
}
if (isdefined(self.loopsoundent))
{
self.loopsoundent delete();
self.loopsoundent = undefined;
}
player = self.linked_ent;
if (isdefined(player))
{
player playsound("zmb_vocals_screecher_death");
player setmovespeedscale(1);
maps\mp\_visionset_mgr::vsmgr_deactivate("overlay", "zm_ai_screecher_blur", player);
if (isdefined(player.screecher_weapon))
{
player clientnotify("scrEnd");
player allowprone(1);
player takeweapon("screecher_arms_zm");
// if ( !getdvarint( _hash_E7EF8EB7 ) )
player stoppoisoning();
if (!player maps\mp\zombies\_zm_laststand::player_is_in_laststand() && !(isdefined(player.intermission) && player.intermission))
player decrement_is_drinking();
if (player.screecher_weapon != "none" && is_player_valid(player))
player switchtoweapon(player.screecher_weapon);
else
{
primaryweapons = player getweaponslistprimaries();
if (isdefined(primaryweapons) && primaryweapons.size > 0)
player switchtoweapon(primaryweapons[0]);
}
player.screecher_weapon = undefined;
}
}
if (isdefined(self.claw_fx))
self.claw_fx destroy();
if (isdefined(self.anchor))
self.anchor delete();
if (isdefined(level.screecher_cleanup))
self [[level.screecher_cleanup]]();
if (level.zombie_screecher_count > 0)
{
level.zombie_screecher_count--;
}
}