diff --git a/README.md b/README.md index 53c7f3b3..c2070b69 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ * Changed health regeneration rate to 100 health per second (previously fully restored health in 0.5 seconds) * Fall damage no longer increases when max health is increased * Removed blur when getting damaged +* Removed shellshock when getting damaged from grenades * No longer killed when landing on top of another player * Ignored by enemies for 1 second after being revived * Weapon is no longer switched after reviving if player switched weapons during revive diff --git a/scripts/zm/_zm_reimagined.gsc b/scripts/zm/_zm_reimagined.gsc index 6bbb0e30..e7b7f9fb 100644 --- a/scripts/zm/_zm_reimagined.gsc +++ b/scripts/zm/_zm_reimagined.gsc @@ -188,6 +188,7 @@ post_all_players_spawned() level.playersuicideallowed = undefined; level.disable_free_perks_before_power = undefined; level.custom_random_perk_weights = undefined; + level.callbackplayerdamage = scripts/zm/replaced/_zm::callback_playerdamage; level.etrap_damage = maps/mp/zombies/_zm::ai_zombie_health( 255 ); level.slipgun_damage = maps/mp/zombies/_zm::ai_zombie_health( 255 ); level.tombstone_spawn_func = ::tombstone_spawn; diff --git a/scripts/zm/replaced/_zm.gsc b/scripts/zm/replaced/_zm.gsc index 06e1051e..4abcc9a9 100644 --- a/scripts/zm/replaced/_zm.gsc +++ b/scripts/zm/replaced/_zm.gsc @@ -160,6 +160,79 @@ actor_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, return int( final_damage ); } +callback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ) +{ + if ( isDefined( eattacker ) && isplayer( eattacker ) && eattacker.sessionteam == self.sessionteam && !eattacker hasperk( "specialty_noname" ) && isDefined( self.is_zombie ) && !self.is_zombie ) + { + self maps/mp/zombies/_zm::process_friendly_fire_callbacks( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + if ( self != eattacker ) + { + return; + } + else if ( smeansofdeath != "MOD_GRENADE_SPLASH" && smeansofdeath != "MOD_GRENADE" && smeansofdeath != "MOD_EXPLOSIVE" && smeansofdeath != "MOD_PROJECTILE" && smeansofdeath != "MOD_PROJECTILE_SPLASH" && smeansofdeath != "MOD_BURNED" && smeansofdeath != "MOD_SUICIDE" ) + { + return; + } + } + if ( is_true( level.pers_upgrade_insta_kill ) ) + { + self maps/mp/zombies/_zm_pers_upgrades_functions::pers_insta_kill_melee_swipe( smeansofdeath, eattacker ); + } + if ( isDefined( self.overrideplayerdamage ) ) + { + idamage = self [[ self.overrideplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + } + else if ( isDefined( level.overrideplayerdamage ) ) + { + idamage = self [[ level.overrideplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); + } + if ( is_true( self.magic_bullet_shield ) ) + { + maxhealth = self.maxhealth; + self.health += idamage; + self.maxhealth = maxhealth; + } + if ( isDefined( self.divetoprone ) && self.divetoprone == 1 ) + { + if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) + { + dist = distance2d( vpoint, self.origin ); + if ( dist > 32 ) + { + dot_product = vectordot( anglesToForward( self.angles ), vdir ); + if ( dot_product > 0 ) + { + idamage = int( idamage * 0.5 ); + } + } + } + } + if ( isDefined( level.prevent_player_damage ) ) + { + if ( self [[ level.prevent_player_damage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) ) + { + return; + } + } + idflags |= level.idflags_no_knockback; + if ( idamage > 0 && shitloc == "riotshield" ) + { + shitloc = "torso_upper"; + } + + // remove grenade shellshock + if(smeansofdeath == "MOD_GRENADE") + { + smeansofdeath = "MOD_PROJECTILE"; + } + else if(smeansofdeath == "MOD_GRENADE_SPLASH") + { + smeansofdeath = "MOD_PROJECTILE_SPLASH"; + } + + self maps/mp/zombies/_zm::finishplayerdamagewrapper( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); +} + getfreespawnpoint( spawnpoints, player ) { if ( !isDefined( spawnpoints ) )