diff options
author | megamage <none@none> | 2009-03-25 15:54:23 -0600 |
---|---|---|
committer | megamage <none@none> | 2009-03-25 15:54:23 -0600 |
commit | 581ae2719d1639d063a812901ff4b0983169cde7 (patch) | |
tree | 77db4a465848205ee497a140a1b1c4efa0c47db4 | |
parent | 435570903a8eee6e9d81dd3e871aace1eb3cd73e (diff) |
*Do not allow to add/remove obj to/from world more than once.
--HG--
branch : trunk
-rw-r--r-- | src/game/Creature.cpp | 21 | ||||
-rw-r--r-- | src/game/DynamicObject.cpp | 14 | ||||
-rw-r--r-- | src/game/GameObject.cpp | 14 | ||||
-rw-r--r-- | src/game/Object.h | 3 | ||||
-rw-r--r-- | src/game/Pet.cpp | 16 | ||||
-rw-r--r-- | src/game/Unit.cpp | 3 |
6 files changed, 48 insertions, 23 deletions
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 8c120309217..ad3f435ae53 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -177,19 +177,24 @@ Creature::~Creature() void Creature::AddToWorld() { ///- Register the creature for guid lookup - if(!IsInWorld()) ObjectAccessor::Instance().AddObject(this); - Unit::AddToWorld(); - SearchFormation(); + if(!IsInWorld()) + { + ObjectAccessor::Instance().AddObject(this); + Unit::AddToWorld(); + SearchFormation(); + } } void Creature::RemoveFromWorld() { - if(m_formationID) - formation_mgr.DestroyGroup(m_formationID, GetGUID()); - ///- Remove the creature from the accessor - if(IsInWorld()) ObjectAccessor::Instance().RemoveObject(this); - Unit::RemoveFromWorld(); + if(IsInWorld()) + { + if(m_formationID) + formation_mgr.DestroyGroup(m_formationID, GetGUID()); + ObjectAccessor::Instance().RemoveObject(this); + Unit::RemoveFromWorld(); + } } void Creature::SearchFormation() diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp index fddac254272..801626d5a9b 100644 --- a/src/game/DynamicObject.cpp +++ b/src/game/DynamicObject.cpp @@ -46,15 +46,21 @@ DynamicObject::DynamicObject() : WorldObject() void DynamicObject::AddToWorld() { ///- Register the dynamicObject for guid lookup - if(!IsInWorld()) ObjectAccessor::Instance().AddObject(this); - WorldObject::AddToWorld(); + if(!IsInWorld()) + { + ObjectAccessor::Instance().AddObject(this); + WorldObject::AddToWorld(); + } } void DynamicObject::RemoveFromWorld() { ///- Remove the dynamicObject from the accessor - if(IsInWorld()) ObjectAccessor::Instance().RemoveObject(this); - WorldObject::RemoveFromWorld(); + if(IsInWorld()) + { + ObjectAccessor::Instance().RemoveObject(this); + WorldObject::RemoveFromWorld(); + } } bool DynamicObject::Create( uint32 guidlow, Unit *caster, uint32 spellId, uint32 effIndex, float x, float y, float z, int32 duration, float radius ) diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp index 9338ee17079..d1bb0362872 100644 --- a/src/game/GameObject.cpp +++ b/src/game/GameObject.cpp @@ -82,15 +82,21 @@ GameObject::~GameObject() void GameObject::AddToWorld() { ///- Register the gameobject for guid lookup - if(!IsInWorld()) ObjectAccessor::Instance().AddObject(this); - WorldObject::AddToWorld(); + if(!IsInWorld()) + { + ObjectAccessor::Instance().AddObject(this); + WorldObject::AddToWorld(); + } } void GameObject::RemoveFromWorld() { ///- Remove the gameobject from the accessor - if(IsInWorld()) ObjectAccessor::Instance().RemoveObject(this); - WorldObject::RemoveFromWorld(); + if(IsInWorld()) + { + ObjectAccessor::Instance().RemoveObject(this); + WorldObject::RemoveFromWorld(); + } } bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 animprogress, uint32 go_state, uint32 ArtKit) diff --git a/src/game/Object.h b/src/game/Object.h index 1a7a70163ca..7e18ea4db92 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -130,6 +130,9 @@ class TRINITY_DLL_SPEC Object } virtual void RemoveFromWorld() { + if(!m_inWorld) + return; + // if we remove from world then sending changes not required if(m_uint32Values) ClearUpdateMask(true); diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index a5d80266242..6b5ff6c1543 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -114,16 +114,22 @@ Pet::~Pet() void Pet::AddToWorld() { ///- Register the pet for guid lookup - if(!IsInWorld()) ObjectAccessor::Instance().AddObject(this); - Unit::AddToWorld(); + if(!IsInWorld()) + { + ObjectAccessor::Instance().AddObject(this); + Unit::AddToWorld(); + } } void Pet::RemoveFromWorld() { ///- Remove the pet from the accessor - if(IsInWorld()) ObjectAccessor::Instance().RemoveObject(this); - ///- Don't call the function for Creature, normal mobs + totems go in a different storage - Unit::RemoveFromWorld(); + if(IsInWorld()) + { + ObjectAccessor::Instance().RemoveObject(this); + ///- Don't call the function for Creature, normal mobs + totems go in a different storage + Unit::RemoveFromWorld(); + } } bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool current ) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index ac6881a4356..4e400c509c8 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -11268,9 +11268,8 @@ void Unit::RemoveFromWorld() RemoveCharmAuras(); RemoveBindSightAuras(); RemoveNotOwnSingleTargetAuras(); + WorldObject::RemoveFromWorld(); } - - WorldObject::RemoveFromWorld(); } void Unit::CleanupsBeforeDelete() |