aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp2
-rw-r--r--src/server/game/Entities/Object/Object.cpp7
-rw-r--r--src/server/game/Entities/Object/Object.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp5
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp8
5 files changed, 17 insertions, 7 deletions
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();
}