aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQAston <none@none>2010-08-02 18:05:07 +0200
committerQAston <none@none>2010-08-02 18:05:07 +0200
commit18dd17730876dd41c38452a1c99b1dd61c9a0f5e (patch)
tree6467069b8f23d3a6a5b723cba619735f484e6c44
parent027ca9b62a260a8a10811448b6346b577341ca55 (diff)
*Search for aura caster in our out of world in Aura::UnregisterSingleTarget().
--HG-- branch : trunk
-rw-r--r--src/server/game/Globals/ObjectAccessor.h15
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp3
-rw-r--r--src/server/game/Spells/Spell.cpp2
3 files changed, 18 insertions, 2 deletions
diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h
index 8134bff2c19..4bdef49e2b2 100644
--- a/src/server/game/Globals/ObjectAccessor.h
+++ b/src/server/game/Globals/ObjectAccessor.h
@@ -98,6 +98,21 @@ class ObjectAccessor
// TODO: override these template functions for each holder type and add assertions
+ template<class T> static T* GetObjectInOrOutOfWorld(uint64 guid, T* /*typeSpecifier*/)
+ {
+ return HashMapHolder<T>::Find(guid);
+ }
+ static Unit* GetObjectInOrOutOfWorld(uint64 guid, Unit* /*typeSpecifier*/)
+ {
+ if (IS_PLAYER_GUID(guid))
+ return (Unit*)GetObjectInOrOutOfWorld(guid, (Player*)NULL);
+
+ if (IS_PET_GUID(guid))
+ return (Unit*)GetObjectInOrOutOfWorld(guid, (Pet*)NULL);
+
+ return (Unit*)GetObjectInOrOutOfWorld(guid, (Creature*)NULL);
+ }
+
// returns object if is in world
template<class T> static T* GetObjectInWorld(uint64 guid, T* /*typeSpecifier*/)
{
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index b68f3cfa79b..1ec2320da9b 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -764,7 +764,8 @@ bool Aura::IsVisible() const
void Aura::UnregisterSingleTarget()
{
ASSERT(m_isSingleTarget);
- Unit * caster = GetCaster();
+ Unit * caster = ObjectAccessor::GetObjectInOrOutOfWorld(GetCasterGUID(), (Unit*)NULL);//GetCaster();
+ assert(caster);
caster->GetSingleCastAuras().remove(this);
SetIsSingleTarget(false);
}
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 1f3f2883d09..eef6783330f 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -264,7 +264,7 @@ bool SpellCastTargets::read (WorldPacket * data, Unit *caster)
if (!(m_targetMask & TARGET_FLAG_SOURCE_LOCATION))
m_srcPos.Relocate(caster);
- if (!(m_targetMask & TARGET_FLAG_DEST_LOCATION)
+ if (!(m_targetMask & TARGET_FLAG_DEST_LOCATION))
m_dstPos.Relocate(caster);
// find real units/GOs