aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells
diff options
context:
space:
mode:
authorDDuarte <dnpd.dd@gmail.com>2014-10-19 00:18:06 +0100
committerDDuarte <dnpd.dd@gmail.com>2014-10-19 00:18:06 +0100
commit5bf55eacfdf7cfd0036bf51e78a2f04f9b55feb0 (patch)
tree9653ff7011d0b370c1360e09590c09ebec4f7e9a /src/server/game/Spells
parente07d3ebe4e6d2d797cb77ba65fb52efbef3462d9 (diff)
parent15a9c6729ee274044b2ba78f8b9ad3c167c94bd1 (diff)
Merge remote-tracking branch 'origin/3.3.5' into 4.3.4
Conflicts: sql/base/auth_database.sql src/server/game/Instances/InstanceScript.h src/server/scripts/Northrend/isle_of_conquest.cpp src/server/shared/Database/Implementation/LoginDatabase.cpp src/server/shared/Database/Implementation/LoginDatabase.h
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 b68b6dfbc04..6f800c4ed13 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);
}