From b6965b2c30eb3317228b328a0c1da71235d7c257 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 5 Feb 2023 16:24:13 +0100 Subject: Core/Objects: Move EventProcessor update to WorldObject::Update --- src/server/game/Entities/GameObject/GameObject.cpp | 2 -- src/server/game/Entities/Object/Object.cpp | 7 +++++++ src/server/game/Entities/Object/Object.h | 2 +- src/server/game/Entities/Unit/Unit.cpp | 5 +---- src/server/game/Scripting/ScriptMgr.cpp | 8 ++++++++ 5 files changed, 17 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index e61735671f8..d26144cd019 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -881,8 +881,6 @@ GameObject* GameObject::CreateGameObjectFromDB(ObjectGuid::LowType spawnId, Map* void GameObject::Update(uint32 diff) { - m_Events.Update(diff); - WorldObject::Update(diff); if (AI()) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index cb3bbe1a0d6..a5deb3883bc 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -868,6 +868,11 @@ WorldObject::~WorldObject() } } +void WorldObject::Update(uint32 diff) +{ + m_Events.Update(diff); +} + void WorldObject::SetWorldObject(bool on) { if (!IsInWorld()) @@ -953,6 +958,8 @@ void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/) if (TransportBase* transport = GetTransport()) transport->RemovePassenger(this); + + m_Events.KillAllEvents(false); // non-delatable (currently cast spells) will not deleted now but it will deleted at call in Map::RemoveAllObjectsInRemoveList } void WorldObject::UpdatePositionData() diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index e3642269040..db0f64db245 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -486,7 +486,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation public: virtual ~WorldObject(); - virtual void Update(uint32 /*time_diff*/) { } + virtual void Update(uint32 diff); void AddToWorld() override; void RemoveFromWorld() override; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index edceb7440ab..46568161698 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -445,15 +445,13 @@ void Unit::Update(uint32 p_time) // WARNING! Order of execution here is important, do not change. // Spells must be processed with event system BEFORE they go to _UpdateSpells. // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad. - m_Events.Update(p_time); + WorldObject::Update(p_time); if (!IsInWorld()) return; _UpdateSpells(p_time); - WorldObject::Update(p_time); - // If this is set during update SetCantProc(false) call is missing somewhere in the code // Having this would prevent spells from being proced, so let's crash ASSERT(!m_procDeep); @@ -9409,7 +9407,6 @@ void Unit::CleanupBeforeRemoveFromMap(bool finalCleanup) if (finalCleanup) m_cleanupDone = true; - m_Events.KillAllEvents(false); // non-delatable (currently cast spells) will not deleted now but it will deleted at call in Map::RemoveAllObjectsInRemoveList CombatStop(); } diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 2a60e031416..74c7d0ed747 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -447,6 +447,10 @@ class CreatureGameObjectAreaTriggerScriptRegistrySwapHooks // Hook which is called before a gameobject is swapped static void UnloadResetScript(GameObject* gameobject) { + // Remove deletable events only, + // otherwise it causes crashes with non-deletable spell events. + gameobject->m_Events.KillAllEvents(false); + gameobject->AI()->Reset(); } @@ -461,6 +465,10 @@ class CreatureGameObjectAreaTriggerScriptRegistrySwapHooks // Hook which is called before a areatrigger is swapped static void UnloadResetScript(AreaTrigger* at) { + // Remove deletable events only, + // otherwise it causes crashes with non-deletable spell events. + at->m_Events.KillAllEvents(false); + at->AI()->OnRemove(); } -- cgit v1.2.3