aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells
diff options
context:
space:
mode:
authorDDuarte <dnpd.dd@gmail.com>2014-10-19 00:23:18 +0100
committerDDuarte <dnpd.dd@gmail.com>2014-10-19 00:23:18 +0100
commit98f98fa17fde4a1294b3e9227973ce5df70fbd6b (patch)
tree911710fb74f5b3665c8c88a0608969f2d9c2fbf4 /src/server/game/Spells
parent8936723291985d1759a4903901c7a29cc54fdcbf (diff)
parenteb68b116271780f36d34e432cd6f2e9ad12d2b54 (diff)
Merge remote-tracking branch 'origin/4.3.4' into 6.x
Diffstat (limited to 'src/server/game/Spells')
-rw-r--r--src/server/game/Spells/Spell.cpp34
-rw-r--r--src/server/game/Spells/Spell.h4
-rw-r--r--src/server/game/Spells/SpellEffects.cpp4
-rw-r--r--src/server/game/Spells/SpellInfo.cpp5
4 files changed, 41 insertions, 6 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 3d0955f5d97..81b7198b2e8 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -113,8 +113,6 @@ SpellCastTargets::SpellCastTargets() : m_elevation(0), m_speed(0), m_strTarget()
m_objectTarget = NULL;
m_itemTarget = NULL;
- m_objectTargetGUID.Clear();
- m_itemTargetGUID.Clear();
m_itemTargetEntry = 0;
m_targetMask = 0;
@@ -212,6 +210,28 @@ void SpellCastTargets::Write(ByteBuffer& data)
data << m_strTarget;
}
+ObjectGuid SpellCastTargets::GetOrigUnitTargetGUID() const
+{
+ switch (m_origObjectTargetGUID.GetHigh())
+ {
+ case HIGHGUID_PLAYER:
+ case HIGHGUID_VEHICLE:
+ case HIGHGUID_UNIT:
+ case HIGHGUID_PET:
+ return m_origObjectTargetGUID;
+ default:
+ return ObjectGuid();
+ }
+}
+
+void SpellCastTargets::SetOrigUnitTarget(Unit* target)
+{
+ if (!target)
+ return;
+
+ m_origObjectTargetGUID = target->GetGUID();
+}
+
ObjectGuid SpellCastTargets::GetUnitTargetGUID() const
{
if (m_objectTargetGUID.IsUnit())
@@ -638,6 +658,7 @@ Spell::~Spell()
void Spell::InitExplicitTargets(SpellCastTargets const& targets)
{
m_targets = targets;
+ m_targets.SetOrigUnitTarget(m_targets.GetUnitTarget());
// this function tries to correct spell explicit targets for spell
// client doesn't send explicit targets correctly sometimes - we need to fix such spells serverside
// this also makes sure that we correctly send explicit targets to client (removes redundant data)
@@ -3411,8 +3432,13 @@ void Spell::_handle_finish_phase()
HandleHolyPower(m_caster->m_movedPlayer);
}
- if (m_caster->m_extraAttacks && GetSpellInfo()->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
- m_caster->HandleProcExtraAttackFor(m_caster->GetVictim());
+ if (m_caster->m_extraAttacks && m_spellInfo->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
+ {
+ if (Unit* victim = ObjectAccessor::FindUnit(m_targets.GetOrigUnitTargetGUID()))
+ m_caster->HandleProcExtraAttackFor(victim);
+ else
+ m_caster->m_extraAttacks = 0;
+ }
/// @todo trigger proc phase finish here
}
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 9fc3deaef99..65fe51b37e3 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -109,6 +109,9 @@ class SpellCastTargets
void SetTargetFlag(SpellCastTargetFlags flag) { m_targetMask |= flag; }
+ ObjectGuid GetOrigUnitTargetGUID() const;
+ void SetOrigUnitTarget(Unit* target);
+
ObjectGuid GetUnitTargetGUID() const;
Unit* GetUnitTarget() const;
void SetUnitTarget(Unit* target);
@@ -174,6 +177,7 @@ class SpellCastTargets
Item* m_itemTarget;
// object GUID/etc, can be used always
+ ObjectGuid m_origObjectTargetGUID;
ObjectGuid m_objectTargetGUID;
ObjectGuid m_itemTargetGUID;
uint32 m_itemTargetEntry;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 9724765007a..e3c06da3874 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -4276,7 +4276,7 @@ void Spell::EffectAddExtraAttacks(SpellEffIndex effIndex)
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
return;
- if (!unitTarget || !unitTarget->IsAlive() || !unitTarget->GetVictim())
+ if (!unitTarget || !unitTarget->IsAlive())
return;
if (unitTarget->m_extraAttacks)
@@ -4284,7 +4284,7 @@ void Spell::EffectAddExtraAttacks(SpellEffIndex effIndex)
unitTarget->m_extraAttacks = damage;
- ExecuteLogEffectExtraAttacks(effIndex, unitTarget->GetVictim(), damage);
+ ExecuteLogEffectExtraAttacks(effIndex, unitTarget, damage);
}
void Spell::EffectParry(SpellEffIndex /*effIndex*/)
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 49e84d26d60..62d5763d6e2 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -1911,6 +1911,11 @@ bool SpellInfo::CheckTargetCreatureType(Unit const* target) const
else
return true;
}
+
+ // if target is magnet (i.e Grounding Totem) the check is skipped
+ if (target->IsMagnet())
+ return true;
+
uint32 creatureType = target->GetCreatureTypeMask();
return !TargetCreatureType || !creatureType || (creatureType & TargetCreatureType);
}