From 53cc363c409f951615c1da86e1c90994ad4e1537 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 19 May 2025 16:58:12 +0200 Subject: Core/Scripts: Fixed WorldMapScript being unintentionally restricted to one script for a given map id (cherry picked from commit 5bc24dad58bf33658636719268621f0c5627d45b) --- src/server/game/Scripting/ScriptMgr.cpp | 106 ++++++++++---------------------- 1 file changed, 34 insertions(+), 72 deletions(-) diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index ac1cb69b6a1..9a9d5bcb5b1 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1576,55 +1576,50 @@ void ScriptMgr::OnGroupRateCalculation(float& rate, uint32 count, bool isRaid) FOREACH_SCRIPT(FormulaScript)->OnGroupRateCalculation(rate, count, isRaid); } -#define SCR_MAP_BGN(M, V, I, E, C, T) \ - if (V->GetEntry() && V->GetEntry()->T()) \ - { \ - FOR_SCRIPTS(M, I, E) \ - { \ - MapEntry const* C = I->second->GetEntry(); \ - if (!C) \ - continue; \ - if (C->ID == V->GetId()) \ - { +template Action> +static inline void ForEachMapScriptType(Action const& action, MapType* map, Args... args) +{ + if constexpr (is_script_database_bound::value) + { + if (ScriptType* script = ScriptRegistry::Instance()->GetScriptById(map->GetScriptId())) + action(script, map, args...); + } + else + { + for (auto const& [_, script] : ScriptRegistry::Instance()->GetScripts()) + { + MapEntry const* entry = script->GetEntry(); + if (!entry || entry->ID != map->GetId()) + continue; -#define SCR_MAP_END \ - return; \ - } \ - } \ + action(script.get(), map, args...); + } } +} + +template +static inline void ForEachMapScript(Action const& action, Map* map, Args... args) +{ + if (InstanceMap* instanceMap = map->ToInstanceMap()) + ForEachMapScriptType(action, instanceMap, args...); + else if (BattlegroundMap* battlegroundMap = map->ToBattlegroundMap()) + ForEachMapScriptType(action, battlegroundMap, args...); + else if (map->GetEntry()->IsWorldMap()) + ForEachMapScriptType(action, map, args...); +} void ScriptMgr::OnCreateMap(Map* map) { ASSERT(map); - SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap); - itr->second->OnCreate(map); - SCR_MAP_END; - - SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon); - itr->second->OnCreate((InstanceMap*)map); - SCR_MAP_END; - - SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground); - itr->second->OnCreate((BattlegroundMap*)map); - SCR_MAP_END; + ForEachMapScript([](auto* script, auto* map) { script->OnCreate(map); }, map); } void ScriptMgr::OnDestroyMap(Map* map) { ASSERT(map); - SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap); - itr->second->OnDestroy(map); - SCR_MAP_END; - - SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon); - itr->second->OnDestroy((InstanceMap*)map); - SCR_MAP_END; - - SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground); - itr->second->OnDestroy((BattlegroundMap*)map); - SCR_MAP_END; + ForEachMapScript([](auto* script, auto* map) { script->OnDestroy(map); }, map); } void ScriptMgr::OnPlayerEnterMap(Map* map, Player* player) @@ -1634,17 +1629,7 @@ void ScriptMgr::OnPlayerEnterMap(Map* map, Player* player) FOREACH_SCRIPT(PlayerScript)->OnMapChanged(player); - SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap); - itr->second->OnPlayerEnter(map, player); - SCR_MAP_END; - - SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon); - itr->second->OnPlayerEnter((InstanceMap*)map, player); - SCR_MAP_END; - - SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground); - itr->second->OnPlayerEnter((BattlegroundMap*)map, player); - SCR_MAP_END; + ForEachMapScript([](auto* script, auto* map, Player* player) { script->OnPlayerEnter(map, player); }, map, player); } void ScriptMgr::OnPlayerLeaveMap(Map* map, Player* player) @@ -1652,39 +1637,16 @@ void ScriptMgr::OnPlayerLeaveMap(Map* map, Player* player) ASSERT(map); ASSERT(player); - SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap); - itr->second->OnPlayerLeave(map, player); - SCR_MAP_END; - - SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon); - itr->second->OnPlayerLeave((InstanceMap*)map, player); - SCR_MAP_END; - - SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground); - itr->second->OnPlayerLeave((BattlegroundMap*)map, player); - SCR_MAP_END; + ForEachMapScript([](auto* script, auto* map, Player* player) { script->OnPlayerLeave(map, player); }, map, player); } void ScriptMgr::OnMapUpdate(Map* map, uint32 diff) { ASSERT(map); - SCR_MAP_BGN(WorldMapScript, map, itr, end, entry, IsWorldMap); - itr->second->OnUpdate(map, diff); - SCR_MAP_END; - - SCR_MAP_BGN(InstanceMapScript, map, itr, end, entry, IsDungeon); - itr->second->OnUpdate((InstanceMap*)map, diff); - SCR_MAP_END; - - SCR_MAP_BGN(BattlegroundMapScript, map, itr, end, entry, IsBattleground); - itr->second->OnUpdate((BattlegroundMap*)map, diff); - SCR_MAP_END; + ForEachMapScript([](auto* script, auto* map, uint32 diff) { script->OnUpdate(map, diff); }, map, diff); } -#undef SCR_MAP_BGN -#undef SCR_MAP_END - InstanceScript* ScriptMgr::CreateInstanceData(InstanceMap* map) { ASSERT(map); -- cgit v1.2.3