aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
authorQAston <none@none>2010-07-29 19:48:40 +0200
committerQAston <none@none>2010-07-29 19:48:40 +0200
commitc44b601ac78c429c7e4800c50b19c257dae0aefb (patch)
treee3b1543c226ca4b4cea24ca6293a79efc66ec8af /src/server/game/Spells/Spell.cpp
parentade1bbdd62f980e7c1284f4f39dbd7f1fbf98860 (diff)
*Allow some spell effects to target units not in caster's map - fixes SPELL_EFFECT_SUMMON_PLAYER
--HG-- branch : trunk
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rw-r--r--src/server/game/Spells/Spell.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index f8cbfd76ad2..2ad41fc4610 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1052,11 +1052,34 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
target->processed = true; // Target checked in apply effects procedure
// Get mask of effects for target
- uint32 mask = target->effectMask;
+ uint8 mask = target->effectMask;
Unit* unit = m_caster->GetGUID() == target->targetGUID ? m_caster : ObjectAccessor::GetUnit(*m_caster,target->targetGUID);
if (!unit)
+ {
+ uint8 farMask = 0;
+ // create far target mask
+ for(uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ {
+ if (IsFarUnitTargetEffect(m_spellInfo->Effect[i]))
+ if ((1<<i) & mask)
+ farMask |= (1<<i);
+ }
+ if (!farMask)
+ return;
+ // find unit in world
+ unit = ObjectAccessor::FindUnit(target->targetGUID);
+ if (!unit)
+ return;
+ // do far effects on the unit
+ // can't use default call because of threading, do stuff as fast as possible
+ for(uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ {
+ if (farMask & (1<<i))
+ HandleEffects(unit,NULL,NULL,i);
+ }
return;
+ }
if (unit->isAlive() != target->alive)
return;