From fe08615d17c5d6830d7a622818002a7517df6311 Mon Sep 17 00:00:00 2001 From: megamage Date: Tue, 24 Mar 2009 22:25:22 -0600 Subject: *Try to fix a crash bug. --HG-- branch : trunk --- src/game/Creature.cpp | 12 ++++++++---- src/game/ObjectGridLoader.cpp | 1 + src/game/Unit.cpp | 16 ---------------- 3 files changed, 9 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 7d0db29b68c..8c120309217 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -162,12 +162,16 @@ m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL),m_creatureInfo(NULL), m_DBTabl Creature::~Creature() { - CleanupsBeforeDelete(); - m_vendorItemCounts.clear(); - delete i_AI; - i_AI = NULL; + if(i_AI) + { + delete i_AI; + i_AI = NULL; + } + + if(m_uint32Values) + sLog.outDetail("Deconstruct Creature Entry = %u", GetEntry()); } void Creature::AddToWorld() diff --git a/src/game/ObjectGridLoader.cpp b/src/game/ObjectGridLoader.cpp index 14b1865cfa7..0c1de5859e9 100644 --- a/src/game/ObjectGridLoader.cpp +++ b/src/game/ObjectGridLoader.cpp @@ -285,6 +285,7 @@ ObjectGridUnloader::Visit(CreatureMapType &m) if(!sWorld.getConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY)) obj->SaveRespawnTime(); ///- object will get delinked from the manager when deleted + obj->CleanupsBeforeDelete(); delete obj; } } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 159ce634a2d..ac6881a4356 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -260,22 +260,6 @@ Unit::~Unit() RemoveAllDynObjects(); if(m_charmInfo) delete m_charmInfo; - - if(m_uint32Values) - { - sLog.outDetail("Deconstruct Unit Entry = %u", GetEntry()); - /*for(int i = 0; i < TOTAL_AURAS; ++i) - { - if(m_modAuras[i].begin() != m_modAuras[i].end()) - sLog.outError("Unit %u has mod auras during deconstruction", GetEntry()); - } - if(m_scAuras.begin() != m_scAuras.end()) - sLog.outError("Unit %u has sc auras during deconstruction", GetEntry()); - if(m_interruptableAuras.begin() != m_interruptableAuras.end()) - sLog.outError("Unit %u has interruptable auras during deconstruction", GetEntry()); - if(m_ccAuras.begin() != m_ccAuras.end()) - sLog.outError("Unit %u has cc auras during deconstruction", GetEntry());*/ - } } void Unit::Update( uint32 p_time ) -- cgit v1.2.3 From 435570903a8eee6e9d81dd3e871aace1eb3cd73e Mon Sep 17 00:00:00 2001 From: megamage Date: Wed, 25 Mar 2009 15:48:54 -0600 Subject: *Fix dynamic object radius. Backported from TC2. --HG-- branch : trunk --- src/game/DynamicObject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp index fd3e16e79d7..fddac254272 100644 --- a/src/game/DynamicObject.cpp +++ b/src/game/DynamicObject.cpp @@ -75,7 +75,7 @@ bool DynamicObject::Create( uint32 guidlow, Unit *caster, uint32 spellId, uint32 SetUInt64Value( DYNAMICOBJECT_CASTER, caster->GetGUID() ); SetUInt32Value( DYNAMICOBJECT_BYTES, 0x00000001 ); SetUInt32Value( DYNAMICOBJECT_SPELLID, spellId ); - SetFloatValue( DYNAMICOBJECT_RADIUS, radius); + SetFloatValue( DYNAMICOBJECT_RADIUS, radius * 2); SetFloatValue( DYNAMICOBJECT_POS_X, x ); SetFloatValue( DYNAMICOBJECT_POS_Y, y ); SetFloatValue( DYNAMICOBJECT_POS_Z, z ); -- cgit v1.2.3 From 581ae2719d1639d063a812901ff4b0983169cde7 Mon Sep 17 00:00:00 2001 From: megamage Date: Wed, 25 Mar 2009 15:54:23 -0600 Subject: *Do not allow to add/remove obj to/from world more than once. --HG-- branch : trunk --- src/game/Creature.cpp | 21 +++++++++++++-------- src/game/DynamicObject.cpp | 14 ++++++++++---- src/game/GameObject.cpp | 14 ++++++++++---- src/game/Object.h | 3 +++ src/game/Pet.cpp | 16 +++++++++++----- src/game/Unit.cpp | 3 +-- 6 files changed, 48 insertions(+), 23 deletions(-) (limited to 'src') 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() -- cgit v1.2.3