diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 12c9be96f7..8f518671dc 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1809,21 +1809,9 @@ void WorldObject::SetMap(Map* map) m_mapId = map->GetId(); m_InstanceId = map->GetInstanceId(); #ifdef ELUNA - // always reset Map events, then recreate the Map events procesor if Eluna is enabled for the map - auto& events = GetElunaEvents(m_mapId); - if (events) - events.reset(); - - if (Eluna* e = map->GetEluna()) - events = std::make_unique(e, this); - - // create the World events processor - if (Eluna* e = sWorld->GetEluna()) - { - auto& events = GetElunaEvents(-1); - if (!events) - events = std::make_unique(e, this); - } + // Reset MAP processor + if (elunaMapEvents) + elunaMapEvents.reset(); #endif if (IsStoredInWorldObjectGridContainer()) m_currMap->AddWorldObject(this); @@ -3634,6 +3622,29 @@ Eluna* WorldObject::GetEluna() const return nullptr; } + +ElunaEventProcessor* WorldObject::GetElunaEvents(int32 mapId) +{ + Eluna* eluna = mapId == -1 ? sWorld->GetEluna() : GetEluna(); + if (!eluna) + return nullptr; + + EventMgr* mgr = eluna->eventMgr.get(); + if (!mgr) + return nullptr; + + // Select the correct ProcessorInfo slot + std::unique_ptr& info = (mapId == -1) ? elunaWorldEvents : elunaMapEvents; + + // Lazily create processor + ProcessorInfo handle + if (!info) + { + uint64 id = mgr->CreateObjectProcessor(this); + info = std::make_unique(mgr, id); + } + + return mgr->GetObjectProcessor(info->GetProcessorId()); +} #endif template TC_GAME_API void WorldObject::GetGameObjectListWithEntryInGrid(std::list&, uint32, float) const; diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 78a849cbdc..5a4f4193ff 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -62,6 +62,7 @@ class WorldObject; class WorldPacket; class ZoneScript; #ifdef ELUNA +class ElunaEventProcessorInfo; class ElunaEventProcessor; class Eluna; #endif @@ -568,12 +569,12 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation uint32 LastUsedScriptID; #ifdef ELUNA - std::unique_ptr elunaMapEvents; - std::unique_ptr elunaWorldEvents; + std::unique_ptr elunaMapEvents; + std::unique_ptr elunaWorldEvents; Eluna* GetEluna() const; - std::unique_ptr& GetElunaEvents(int32 mapId) { return (mapId == -1) ? elunaWorldEvents : elunaMapEvents; } + ElunaEventProcessor* GetElunaEvents(int32 mapId); LuaVal lua_data = LuaVal({}); #endif diff --git a/src/server/game/LuaEngine b/src/server/game/LuaEngine index da9205c820..4790ef83ef 160000 --- a/src/server/game/LuaEngine +++ b/src/server/game/LuaEngine @@ -1 +1 @@ -Subproject commit da9205c820e117725c5c15245ab685555c8c0811 +Subproject commit 4790ef83efb1da9d9a99b036a7a2aabb3144d9c6