diff options
| author | Shauren <shauren.trinity@gmail.com> | 2019-02-16 18:58:55 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2019-02-16 18:58:55 +0100 |
| commit | 8d57b32938b285db07deb1125b1c62e27deba4f1 (patch) | |
| tree | d139e13373fbf83b53f2360673bb075e604644b7 /src | |
| parent | cc0f20f73d25af90300a24768adc2a55f1dfcf91 (diff) | |
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
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
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); |
