From 8d57b32938b285db07deb1125b1c62e27deba4f1 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 16 Feb 2019 18:58:55 +0100 Subject: Core/Units: Prevent taking melee damage while dead and removed incorrect extra DealDamage call (including script hooks) for autoattacks done with a weapon that has only one damage type Closes #23033 --- src/server/game/Entities/Unit/Unit.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src/server/game') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 84d03de0120..77d7d629db6 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1356,7 +1356,12 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) { Unit* victim = damageInfo->Target; - if (!victim->IsAlive() || victim->HasUnitState(UNIT_STATE_IN_FLIGHT) || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks())) + auto canTakeMeleeDamage = [&]() + { + return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (victim->GetTypeId() != TYPEID_UNIT || !victim->ToCreature()->IsEvadingAttacks()); + }; + + if (!canTakeMeleeDamage()) return; // Hmmmm dont like this emotes client must by self do all animations @@ -1400,6 +1405,9 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { + if (!canTakeMeleeDamage() || (!damageInfo->Damages[i].Damage && !damageInfo->Damages[i].Absorb && !damageInfo->Damages[i].Resist)) + continue; + // Call default DealDamage CleanDamage cleanDamage(damageInfo->CleanDamage, damageInfo->Damages[i].Absorb, damageInfo->AttackType, damageInfo->HitOutCome); Unit::DealDamage(this, victim, damageInfo->Damages[i].Damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->Damages[i].DamageSchoolMask), nullptr, durabilityLoss); -- cgit v1.2.3