aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp73
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp8
-rw-r--r--src/server/game/Spells/Spell.cpp4
-rw-r--r--src/server/game/Spells/SpellEffects.cpp1
5 files changed, 43 insertions, 44 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index e559b7738e0..65d10d94e44 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -1400,13 +1400,8 @@ void Unit::CalculateMeleeDamage(Unit *pVictim, uint32 damage, CalcDamageInfo *da
void Unit::DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
{
- if (!damageInfo)
- return;
Unit *pVictim = damageInfo->target;
- if (!pVictim)
- return;
-
if (!pVictim->isAlive() || pVictim->hasUnitState(UNIT_STAT_UNATTACKABLE) || (pVictim->GetTypeId() == TYPEID_UNIT && pVictim->ToCreature()->IsInEvadeMode()))
return;
@@ -1492,43 +1487,39 @@ void Unit::DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
// Do effect if any damage done to target
if (damageInfo->damage)
{
- // victim's damage shield
- std::set<AuraEffect*> alreadyDone;
- uint32 removedAuras = pVictim->m_removedAurasCount;
AuraEffectList const& vDamageShields = pVictim->GetAuraEffectsByType(SPELL_AURA_DAMAGE_SHIELD);
- for (AuraEffectList::const_iterator i = vDamageShields.begin(), next = vDamageShields.begin(); i != vDamageShields.end(); i = next)
+ for (AuraEffectList::const_iterator dmgShieldItr = vDamageShields.begin(); dmgShieldItr != vDamageShields.end(); ++dmgShieldItr)
{
- ++next;
- if (alreadyDone.find(*i) == alreadyDone.end())
- {
- alreadyDone.insert(*i);
- uint32 damage=(*i)->GetAmount();
- SpellEntry const *i_spellProto = (*i)->GetSpellProto();
- //Calculate absorb resist ??? no data in opcode for this possibly unable to absorb or resist?
- //uint32 absorb;
- //uint32 resist;
- //CalcAbsorbResist(pVictim, SpellSchools(spellProto->School), SPELL_DIRECT_DAMAGE, damage, &absorb, &resist);
- //damage-=absorb + resist;
+ SpellEntry const *i_spellProto = (*dmgShieldItr)->GetSpellProto();
+ // Damage shield can be resisted...
+ if (SpellMissInfo missInfo = pVictim->SpellHitResult(this, i_spellProto ,false))
+ {
+ pVictim->SendSpellMiss(this, i_spellProto->Id, missInfo);
+ continue;
+ }
+ // ...or immuned
+ if (IsImmunedToDamage(i_spellProto))
+ {
+ pVictim->SendSpellDamageImmune(this, i_spellProto->Id);
+ continue;
+ }
- pVictim->DealDamageMods(this,damage,NULL);
+ uint32 damage = (*dmgShieldItr)->GetAmount();
- WorldPacket data(SMSG_SPELLDAMAGESHIELD,(8+8+4+4+4+4));
- data << uint64(pVictim->GetGUID());
- data << uint64(GetGUID());
- data << uint32(i_spellProto->Id);
- data << uint32(damage); // Damage
- data << uint32(0); // Overkill
- data << uint32(i_spellProto->SchoolMask);
- pVictim->SendMessageToSet(&data, true);
+ // No Unit::CalcAbsorbResist here - opcode doesn't send that data - this damage is probably not affected by that
+ pVictim->DealDamageMods(this,damage,NULL);
- pVictim->DealDamage(this, damage, 0, SPELL_DIRECT_DAMAGE, GetSpellSchoolMask(i_spellProto), i_spellProto, true);
+ WorldPacket data(SMSG_SPELLDAMAGESHIELD,(8+8+4+4+4+4));
+ data << uint64(pVictim->GetGUID());
+ data << uint64(GetGUID());
+ data << uint32(i_spellProto->Id);
+ data << uint32(damage); // Damage
+ int32 overkill = damage - GetHealth();
+ data << uint32(overkill > 0 ? overkill : 0); // Overkill
+ data << uint32(i_spellProto->SchoolMask);
+ pVictim->SendMessageToSet(&data, true);
- if (pVictim->m_removedAurasCount > removedAuras)
- {
- removedAuras = pVictim->m_removedAurasCount;
- next = vDamageShields.begin();
- }
- }
+ pVictim->DealDamage(this, damage, 0, SPELL_DIRECT_DAMAGE, GetSpellSchoolMask(i_spellProto), i_spellProto, true);
}
}
}
@@ -5223,6 +5214,16 @@ void Unit::SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
SendMessageToSet(&data, true);
}
+void Unit::SendSpellDamageImmune(Unit * target, uint32 spellId)
+{
+ WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8+8+4+1);
+ data << uint64(GetGUID());
+ data << uint64(target->GetGUID());
+ data << uint32(spellId);
+ data << uint8(0); // bool - log format: 0-default, 1-debug
+ SendMessageToSet(&data,true);
+}
+
void Unit::SendAttackStateUpdate(CalcDamageInfo *damageInfo)
{
sLog.outDebug("WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 623aa0e4a93..b5af7a62253 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1443,6 +1443,7 @@ class Unit : public WorldObject
void SendSpellNonMeleeDamageLog(Unit *target,uint32 SpellID, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit = false);
void SendPeriodicAuraLog(SpellPeriodicAuraLogInfo *pInfo);
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo);
+ void SendSpellDamageImmune(Unit *target, uint32 spellId);
void NearTeleportTo(float x, float y, float z, float orientation, bool casting = false);
virtual bool SetPosition(float x, float y, float z, float ang, bool teleport = false);
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 8adc7f83744..2fc836c76ca 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -1238,12 +1238,8 @@ bool AuraEffect::IsPeriodicTickCrit(Unit * target, Unit const * caster) const
void AuraEffect::SendTickImmune(Unit * target, Unit *caster) const
{
- WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8+8+4+1);
- data << uint64(caster ? caster->GetGUID() : target->GetGUID());
- data << uint64(target->GetGUID());
- data << uint32(m_spellProto->Id);
- data << uint8(1);
- target->SendMessageToSet(&data,true);
+ if (caster)
+ caster->SendSpellDamageImmune(target, m_spellProto->Id);
}
void AuraEffect::PeriodicTick(Unit * target, Unit * caster) const
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 18006c55ab2..457bc1e019b 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -4153,8 +4153,8 @@ void Spell::ExecuteLogEffectTakeTargetPower(uint8 effIndex, Unit * target, uint3
{
InitEffectExecuteData(effIndex);
m_effectExecuteData[effIndex]->append(target->GetPackGUID());
- *m_effectExecuteData[effIndex] << uint32(powerType);
*m_effectExecuteData[effIndex] << uint32(powerTaken);
+ *m_effectExecuteData[effIndex] << uint32(powerType);
*m_effectExecuteData[effIndex] << float(gainMultiplier);
}
@@ -4176,7 +4176,7 @@ void Spell::ExecuteLogEffectDurabilityDamage(uint8 effIndex, Unit * victim, uint
{
InitEffectExecuteData(effIndex);
m_effectExecuteData[effIndex]->append(victim->GetPackGUID());
- *m_effectExecuteData[effIndex] << uint32(itemslot);
+ *m_effectExecuteData[effIndex] << uint32(m_spellInfo->Id);
*m_effectExecuteData[effIndex] << uint32(damage);
}
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 0100fd7a6f9..c022309c85a 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2585,6 +2585,7 @@ void Spell::EffectHealthLeech(SpellEffIndex effIndex)
float healMultiplier = SpellMgr::CalculateSpellEffectValueMultiplier(m_spellInfo, effIndex, m_originalCaster, this);
int32 newDamage = int32(damage * healMultiplier);
+ newDamage = std::min(int32(unitTarget->GetHealth()), newDamage);
m_damage += newDamage;
if (m_caster->isAlive())