aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Globals/ObjectAccessor.cpp5
-rw-r--r--src/server/game/Globals/ObjectAccessor.h1
-rw-r--r--src/server/game/Maps/MapManager.cpp10
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h2
-rw-r--r--src/server/game/Spells/Spell.cpp25
-rw-r--r--src/server/game/Spells/SpellMgr.cpp2
-rw-r--r--src/server/game/Spells/SpellMgr.h10
7 files changed, 46 insertions, 9 deletions
diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp
index 8e2e476693e..6a6a9b07a89 100644
--- a/src/server/game/Globals/ObjectAccessor.cpp
+++ b/src/server/game/Globals/ObjectAccessor.cpp
@@ -165,6 +165,11 @@ Player* ObjectAccessor::FindPlayer(uint64 guid)
return GetObjectInWorld(guid, (Player*)NULL);
}
+Unit* ObjectAccessor::FindUnit(uint64 guid)
+{
+ return GetObjectInWorld(guid, (Unit*)NULL);
+}
+
Player* ObjectAccessor::FindPlayerByName(const char* name)
{
ACE_GUARD_RETURN(LockType, g, *HashMapHolder<Player>::GetLock(), NULL);
diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h
index b010254ae13..d35f5cd155b 100644
--- a/src/server/game/Globals/ObjectAccessor.h
+++ b/src/server/game/Globals/ObjectAccessor.h
@@ -179,6 +179,7 @@ class ObjectAccessor
// ACCESS LIKE THAT IS NOT THREAD SAFE
static Pet * FindPet(uint64);
static Player* FindPlayer(uint64);
+ static Unit* FindUnit(uint64);
Player* FindPlayerByName(const char* name);
// when using this, you must use the hashmapholder's lock
diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp
index 5e8a2803419..2278e73e626 100644
--- a/src/server/game/Maps/MapManager.cpp
+++ b/src/server/game/Maps/MapManager.cpp
@@ -272,15 +272,13 @@ void MapManager::Update(uint32 diff)
MapMapType::iterator iter = i_maps.begin();
for (; iter != i_maps.end(); ++iter)
{
- if (m_updater.activated())
+ if (m_updater.activated())
m_updater.schedule_update(*iter->second, i_timer.GetCurrent());
- else
- {
- iter->second->Update(i_timer.GetCurrent());
- }
+ else
+ iter->second->Update(i_timer.GetCurrent());
}
if (m_updater.activated())
- m_updater.wait();
+ m_updater.wait();
for (iter = i_maps.begin(); iter != i_maps.end(); ++iter)
iter->second->DelayedUpdate(i_timer.GetCurrent());
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 45069ecf561..971a26719e1 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -755,7 +755,7 @@ enum SpellEffects
SPELL_EFFECT_LEAP_BACK = 138,
SPELL_EFFECT_CLEAR_QUEST = 139,
SPELL_EFFECT_FORCE_CAST = 140,
- SPELL_EFFECT_141 = 141,
+ SPELL_EFFECT_FORCE_CAST_WITH_VALUE = 141,
SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE = 142,
SPELL_EFFECT_APPLY_AREA_AURA_OWNER = 143,
SPELL_EFFECT_KNOCK_BACK_DEST = 144,
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;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 71193387dc0..6e59277c550 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -3230,7 +3230,7 @@ bool CanSpellPierceImmuneAura(SpellEntry const * pierceSpell, SpellEntry const *
// these spells (Cyclone for example) can pierce all...
if ((pierceSpell->AttributesEx & SPELL_ATTR_EX_UNAFFECTED_BY_SCHOOL_IMMUNE)
// ...but not these (Divine shield for example)
- && !(aura->AttributesEx & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY))
+ && !(aura && aura->AttributesEx & SPELL_ATTR_UNAFFECTED_BY_INVULNERABILITY))
return true;
return false;
diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h
index 93af37ed18d..33a07b0085d 100644
--- a/src/server/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
@@ -398,6 +398,16 @@ inline bool IsAreaOfEffectSpell(SpellEntry const *spellInfo)
return false;
}
+inline bool IsFarUnitTargetEffect(uint32 effect)
+{
+ return (effect == SPELL_EFFECT_SUMMON_PLAYER);
+}
+
+inline bool IsFarDestTargetEffect(uint32 effect)
+{
+ return (effect == SPELL_EFFECT_TELEPORT_UNITS);
+}
+
inline bool IsAreaAuraEffect(uint32 effect)
{
if (effect == SPELL_EFFECT_APPLY_AREA_AURA_PARTY ||