aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorQAston <none@none>2010-08-29 03:38:21 +0200
committerQAston <none@none>2010-08-29 03:38:21 +0200
commit2d877bbbfd0babec91011d472870e230a314d512 (patch)
treefc76003bdef66fed41f9d63cefc9de03a05f40d4 /src/server/game/Entities
parentf67441b863ae449c2e9e7fab767531e7637d6753 (diff)
*Allow damage shield hits to miss.
*Send overkill on damage shield hit. *Correct data order for execute log of power take effects. --HG-- branch : trunk
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp73
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
2 files changed, 38 insertions, 36 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);