diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Globals/ObjectAccessor.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectAccessor.h | 1 | ||||
-rw-r--r-- | src/server/game/Maps/MapManager.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.h | 10 |
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 || |