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_spawner.gsc
Jbleezy 747751bc0b Melee weapons: add held weapon
Combat Knife: add model from BO2 MP
Add melee wallbuy HUD icons to all maps
Fix level.item_meat_name being undefined
2023-12-22 03:26:12 -08:00

506 lines
11 KiB
Plaintext

#include maps\mp\zombies\_zm_spawner;
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
zombie_damage(mod, hit_location, hit_origin, player, amount, team)
{
if (is_magic_bullet_shield_enabled(self))
{
return;
}
player.use_weapon_type = mod;
if (isDefined(self.marked_for_death))
{
return;
}
if (!isDefined(player))
{
return;
}
if (isDefined(hit_origin))
{
self.damagehit_origin = hit_origin;
}
else
{
self.damagehit_origin = player getweaponmuzzlepoint();
}
if (self maps\mp\zombies\_zm_spawner::check_zombie_damage_callbacks(mod, hit_location, hit_origin, player, amount))
{
return;
}
else if (self maps\mp\zombies\_zm_spawner::zombie_flame_damage(mod, player))
{
if (self maps\mp\zombies\_zm_spawner::zombie_give_flame_damage_points())
{
player maps\mp\zombies\_zm_score::player_add_points("damage", mod, hit_location, self.isdog, team);
}
}
else if (maps\mp\zombies\_zm_spawner::player_using_hi_score_weapon(player))
{
damage_type = "damage";
}
else
{
damage_type = "damage_light";
}
if (!is_true(self.no_damage_points))
{
player maps\mp\zombies\_zm_score::player_add_points(damage_type, mod, hit_location, self.isdog, team, self.damageweapon);
}
if (isDefined(self.zombie_damage_fx_func))
{
self [[self.zombie_damage_fx_func]](mod, hit_location, hit_origin, player);
}
if (is_placeable_mine(self.damageweapon))
{
damage = level.round_number * 100;
if (level.scr_zm_ui_gametype == "zgrief")
{
damage = 2000;
}
max_damage = 9000;
if (damage > max_damage)
{
damage = max_damage;
}
if (isDefined(self.zombie_damage_claymore_func))
{
self [[self.zombie_damage_claymore_func]](mod, hit_location, hit_origin, player);
}
else if (isDefined(player) && isalive(player))
{
self dodamage(damage, self.origin, player, self, hit_location, mod, 0, self.damageweapon);
}
else
{
self dodamage(damage, self.origin, undefined, self, hit_location, mod, 0, self.damageweapon);
}
}
else if (mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH")
{
damage = level.round_number * 25;
if (level.scr_zm_ui_gametype == "zgrief")
{
damage = 500;
}
max_damage = 1500;
if (damage > max_damage)
{
damage = max_damage;
}
if (isDefined(player) && isalive(player))
{
player.grenade_multiattack_count++;
player.grenade_multiattack_ent = self;
self dodamage(damage, self.origin, player, self, hit_location, "MOD_GRENADE_SPLASH", 0, self.damageweapon);
}
else
{
self dodamage(damage, self.origin, undefined, self, hit_location, "MOD_GRENADE_SPLASH", 0, self.damageweapon);
}
}
else if (mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" || mod == "MOD_EXPLOSIVE")
{
damage = level.round_number * 50;
if (level.scr_zm_ui_gametype == "zgrief")
{
damage = 1000;
}
max_damage = 3000;
if (damage > max_damage)
{
damage = max_damage;
}
if (isDefined(player) && isalive(player))
{
self dodamage(damage, self.origin, player, self, hit_location, "MOD_PROJECTILE_SPLASH", 0, self.damageweapon);
}
else
{
self dodamage(damage, self.origin, undefined, self, hit_location, "MOD_PROJECTILE_SPLASH", 0, self.damageweapon);
}
}
if (isDefined(self.a.gib_ref) && self.a.gib_ref == "no_legs" && isalive(self))
{
if (isDefined(player))
{
rand = randomintrange(0, 100);
if (rand < 10)
{
player maps\mp\zombies\_zm_audio::create_and_play_dialog("general", "crawl_spawn");
}
}
}
else if (isDefined(self.a.gib_ref))
{
if (self.a.gib_ref == "right_arm" || self.a.gib_ref == "left_arm")
{
if (self.has_legs && isalive(self))
{
if (isDefined(player))
{
rand = randomintrange(0, 100);
if (rand < 7)
{
player maps\mp\zombies\_zm_audio::create_and_play_dialog("general", "shoot_arm");
}
}
}
}
}
self thread maps\mp\zombies\_zm_powerups::check_for_instakill(player, mod, hit_location);
}
zombie_gib_on_damage()
{
while (true)
{
self waittill("damage", amount, attacker, direction_vec, point, type, tagname, modelname, partname, weaponname);
if (!isdefined(self))
return;
if (!self zombie_should_gib(amount, attacker, type))
continue;
if (self head_should_gib(attacker, type, point) && type != "MOD_BURNED")
{
self zombie_head_gib(attacker, type);
continue;
}
if (!self.gibbed)
{
if (self maps\mp\animscripts\zm_utility::damagelocationisany("head", "helmet", "neck"))
continue;
refs = [];
switch (self.damagelocation)
{
case "torso_upper":
case "torso_lower":
refs[refs.size] = "guts";
refs[refs.size] = "right_arm";
break;
case "right_hand":
case "right_arm_upper":
case "right_arm_lower":
refs[refs.size] = "right_arm";
break;
case "left_hand":
case "left_arm_upper":
case "left_arm_lower":
refs[refs.size] = "left_arm";
break;
case "right_leg_upper":
case "right_leg_lower":
case "right_foot":
if (self.health <= 0)
{
refs[refs.size] = "right_leg";
refs[refs.size] = "right_leg";
refs[refs.size] = "right_leg";
refs[refs.size] = "no_legs";
}
break;
case "left_leg_upper":
case "left_leg_lower":
case "left_foot":
if (self.health <= 0)
{
refs[refs.size] = "left_leg";
refs[refs.size] = "left_leg";
refs[refs.size] = "left_leg";
refs[refs.size] = "no_legs";
}
break;
default:
if (self.damagelocation == "none")
{
if (type == "MOD_GRENADE" || type == "MOD_GRENADE_SPLASH" || type == "MOD_PROJECTILE" || type == "MOD_PROJECTILE_SPLASH")
{
refs = self derive_damage_refs(point);
break;
}
}
else
{
refs[refs.size] = "guts";
refs[refs.size] = "right_arm";
refs[refs.size] = "left_arm";
refs[refs.size] = "right_leg";
refs[refs.size] = "left_leg";
refs[refs.size] = "no_legs";
break;
}
}
if (isdefined(level.custom_derive_damage_refs))
refs = self [[level.custom_derive_damage_refs]](refs, point, weaponname);
if (refs.size)
{
self.a.gib_ref = maps\mp\animscripts\zm_death::get_random(refs);
if ((self.a.gib_ref == "no_legs" || self.a.gib_ref == "right_leg" || self.a.gib_ref == "left_leg") && self.health > 0)
{
self.has_legs = 0;
self allowedstances("crouch");
self setphysparams(15, 0, 24);
self allowpitchangle(1);
self setpitchorient();
health = self.health;
health *= 0.1;
self thread maps\mp\animscripts\zm_run::needsdelayedupdate();
if (level.scr_zm_ui_gametype == "zgrief")
{
self thread bleedout_watcher();
}
if (isdefined(self.crawl_anim_override))
self [[self.crawl_anim_override]]();
}
}
if (self.health > 0)
{
self thread maps\mp\animscripts\zm_death::do_gib();
if (isdefined(level.gib_on_damage))
self thread [[level.gib_on_damage]]();
}
}
}
}
bleedout_watcher()
{
self endon("death");
self thread melee_watcher();
self.bleedout_time = getTime();
health = self.health;
while (1)
{
if (health > self.health)
{
health = self.health;
self.bleedout_time = getTime();
}
if (getTime() - self.bleedout_time > 30000)
{
level.zombie_total++;
self.no_powerups = 1;
self dodamage(self.health + 100, self.origin);
return;
}
wait 0.05;
}
}
melee_watcher()
{
self endon("death");
while (1)
{
self waittill("melee_anim");
self.bleedout_time = getTime();
}
}
head_should_gib(attacker, type, point)
{
if (!is_mature())
{
return 0;
}
if (self.head_gibbed)
{
return 0;
}
if (!isDefined(attacker) || !isplayer(attacker))
{
return 0;
}
weapon = attacker getcurrentweapon();
if (type != "MOD_RIFLE_BULLET" && type != "MOD_PISTOL_BULLET")
{
if (type == "MOD_GRENADE" || type == "MOD_GRENADE_SPLASH")
{
if ((distance(point, self gettagorigin("j_head")) > 55) || (self.health > 0))
{
return 0;
}
else
{
return 1;
}
}
else if (type == "MOD_PROJECTILE")
{
if ((distance(point, self gettagorigin("j_head")) > 10) || (self.health > 0))
{
return 0;
}
else
{
return 1;
}
}
else if (weaponclass(weapon) != "spread")
{
return 0;
}
}
if (!self maps\mp\animscripts\zm_utility::damagelocationisany("head", "helmet", "neck"))
{
return 0;
}
if (weapon == "none" || weapon == level.start_weapon || weaponisgasweapon(self.weapon))
{
return 0;
}
self zombie_hat_gib(attacker, type);
if (self.health > 0)
{
return 0;
}
return 1;
}
zombie_death_animscript()
{
team = undefined;
recalc_zombie_array();
if ( isdefined( self._race_team ) )
team = self._race_team;
self reset_attack_spot();
if ( self check_zombie_death_animscript_callbacks() )
return false;
if ( isdefined( level.zombie_death_animscript_override ) )
self [[ level.zombie_death_animscript_override ]]();
if ( self.has_legs && isdefined( self.a.gib_ref ) && self.a.gib_ref == "no_legs" )
self.deathanim = "zm_death";
self.grenadeammo = 0;
if ( isdefined( self.nuked ) )
{
if ( zombie_can_drop_powerups( self ) )
{
if ( isdefined( self.in_the_ground ) && self.in_the_ground == 1 )
{
trace = bullettrace( self.origin + vectorscale( ( 0, 0, 1 ), 100.0 ), self.origin + vectorscale( ( 0, 0, -1 ), 100.0 ), 0, undefined );
origin = trace["position"];
level thread zombie_delay_powerup_drop( origin );
}
else
{
trace = groundtrace( self.origin + vectorscale( ( 0, 0, 1 ), 5.0 ), self.origin + vectorscale( ( 0, 0, -1 ), 300.0 ), 0, undefined );
origin = trace["position"];
level thread zombie_delay_powerup_drop( self.origin );
}
}
}
else
level zombie_death_points( self.origin, self.damagemod, self.damagelocation, self.attacker, self, team );
if ( isdefined( self.attacker ) && isai( self.attacker ) )
self.attacker notify( "killed", self );
if ( "rottweil72_upgraded_zm" == self.damageweapon && "MOD_RIFLE_BULLET" == self.damagemod )
self thread dragons_breath_flame_death_fx();
if ( issubstr( self.damageweapon, "tazer_knuckles_zm" ) && "MOD_MELEE" == self.damagemod )
{
self.is_on_fire = 0;
self notify( "stop_flame_damage" );
}
if ( self.damagemod == "MOD_BURNED" )
self thread maps\mp\animscripts\zm_death::flame_death_fx();
if ( self.damagemod == "MOD_GRENADE" || self.damagemod == "MOD_GRENADE_SPLASH" )
level notify( "zombie_grenade_death", self.origin );
return false;
}
zombie_can_drop_powerups(zombie)
{
if (!flag("zombie_drop_powerups"))
return false;
if (isdefined(zombie.no_powerups) && zombie.no_powerups)
return false;
return true;
}
zombie_complete_emerging_into_playable_area()
{
if (self.animname == "zombie" && is_true(self.has_legs))
{
self setphysparams(15, 0, 60);
}
self.completed_emerging_into_playable_area = 1;
self notify("completed_emerging_into_playable_area");
self.no_powerups = 0;
self thread zombie_free_cam_allowed();
}