diff --git a/scripts/globals/ability.lua b/scripts/globals/ability.lua index 05f6cb8bf43..192b00eea51 100644 --- a/scripts/globals/ability.lua +++ b/scripts/globals/ability.lua @@ -4,7 +4,7 @@ xi = xi or {} xi.ability = xi.ability or {} -xi.ability.adjustDamage = function(dmg, mob, skill, target, skilltype, skillparam, shadowbehav) -- seems to only be used for Wyvern breaths and chi blast +xi.ability.adjustDamage = function(dmg, attacker, skill, target, skilltype, skillparam, shadowbehav) -- seems to only be used for Wyvern breaths and chi blast -- physical attack missed, skip rest local msg = skill:getMsg() if @@ -89,7 +89,7 @@ xi.ability.adjustDamage = function(dmg, mob, skill, target, skilltype, skillpara if dmg > 0 then target:wakeUp() - target:updateEnmityFromDamage(mob, dmg) + target:updateEnmityFromDamage(attacker, dmg) end return dmg diff --git a/scripts/globals/job_utils/monk.lua b/scripts/globals/job_utils/monk.lua index 4fccfc1218a..a5b3617534e 100644 --- a/scripts/globals/job_utils/monk.lua +++ b/scripts/globals/job_utils/monk.lua @@ -83,7 +83,7 @@ xi.job_utils.monk.useChiBlast = function(player, target, ability) local dmg = math.floor(player:getStat(xi.mod.MND) * (0.5 + (math.random() / 2))) * multiplier - dmg = xi.ability.adjustDamage(dmg, target, ability, target, xi.attackType.BREATH, nil, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) + dmg = xi.ability.adjustDamage(dmg, player, ability, target, xi.attackType.BREATH, nil, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) target:takeDamage(dmg, player, xi.attackType.BREATH, xi.damageType.ELEMENTAL) target:updateClaim(player) player:delStatusEffect(xi.effect.BOOST) diff --git a/src/map/enmity_container.cpp b/src/map/enmity_container.cpp index 06a4645a317..4b4b967c65c 100644 --- a/src/map/enmity_container.cpp +++ b/src/map/enmity_container.cpp @@ -392,17 +392,27 @@ void CEnmityContainer::SetVE(CBattleEntity* PEntity, const int32 amount) void CEnmityContainer::UpdateEnmityFromDamage(CBattleEntity* PEntity, int32 Damage) { TracyZoneScoped; - Damage = (Damage < 1 ? 1 : Damage); - int16 damageMod = battleutils::GetEnmityModDamage(m_EnmityHolder->GetMLevel()); - int32 CE = (int32)(80.f / damageMod * Damage); - int32 VE = (int32)(240.f / damageMod * Damage); + if (PEntity && m_EnmityHolder) + { + // Don't add enmity to yourself + if (m_EnmityHolder->id == PEntity->id) + { + return; + } - UpdateEnmity(PEntity, CE, VE); + Damage = (Damage < 1 ? 1 : Damage); + int16 damageMod = battleutils::GetEnmityModDamage(m_EnmityHolder->GetMLevel()); - if (m_EnmityHolder && m_EnmityHolder->m_HiPCLvl < PEntity->GetMLevel()) - { - m_EnmityHolder->m_HiPCLvl = PEntity->GetMLevel(); + int32 CE = (int32)(80.f / damageMod * Damage); + int32 VE = (int32)(240.f / damageMod * Damage); + + UpdateEnmity(PEntity, CE, VE); + + if (m_EnmityHolder->m_HiPCLvl < PEntity->GetMLevel()) + { + m_EnmityHolder->m_HiPCLvl = PEntity->GetMLevel(); + } } } diff --git a/src/map/lua/lua_baseentity.cpp b/src/map/lua/lua_baseentity.cpp index f7dcbe811de..35dde18df8b 100644 --- a/src/map/lua/lua_baseentity.cpp +++ b/src/map/lua/lua_baseentity.cpp @@ -12879,6 +12879,12 @@ void CLuaBaseEntity::updateEnmityFromDamage(CLuaBaseEntity* PEntity, int32 damag { auto* PBaseMob = static_cast(m_PBaseEntity); + if (m_PBaseEntity->id == PEntity->getID()) + { + ShowWarning(fmt::format("updateEnmityFromDamage(): Attempting to add enmity from damage to self ({}, {})!", PEntity->getName(), PEntity->getID())); + return; + } + // This is a mob attacking a target and losing enmity from doing damage if (m_PBaseEntity->objtype == TYPE_PC || m_PBaseEntity->objtype == TYPE_PET || (m_PBaseEntity->objtype == TYPE_MOB && PBaseMob->isCharmed)) {