From 55843a00c63709d508ba870152720873839cdcb8 Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 29 Dec 2022 22:58:20 +0100 Subject: [PATCH] Core/Maps: Split Ebon Hold by faction and removed forced sanctuary hack original commit: 515c0a43ef8fcf41ffb2785c5940f0234e757ec3 --- src/server/game/DataStores/DBCStructure.h | 14 +++++++++--- src/server/game/Maps/MapManager.cpp | 27 +++++++++++++++++++++++ src/server/game/Maps/MapManager.h | 2 ++ src/server/game/Scripting/ScriptMgr.cpp | 3 +++ 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 9bc9c94ff0..0bea4627c4 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -225,8 +225,6 @@ struct AreaTableEntry // helpers bool IsSanctuary() const { - if (ContinentID == 609) - return true; return (Flags & AREA_FLAG_SANCTUARY) != 0; } @@ -1256,11 +1254,21 @@ struct MapEntry bool IsContinent() const { - return ID == 0 || ID == 1 || ID == 530 || ID == 571; + switch (ID) + { + case 0: + case 1: + case 530: + case 571: + return true; + default: + return false; + } } bool IsDynamicDifficultyMap() const { return GetFlags().HasFlag(MapFlags::DynamicDifficulty); } bool IsFlexLocking() const { return GetFlags().HasFlag(MapFlags::FlexibleRaidLocking); } + bool IsSplitByFaction() const { return ID == 609; } EnumFlag GetFlags() const { return static_cast(Flags); } }; diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index 7b0164d455..112c4cfdba 100644 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -28,7 +28,9 @@ #include "ObjectMgr.h" #include "Opcodes.h" #include "Player.h" +#include "ScriptMgr.h" #include "World.h" +#include "WorldStateMgr.h" #include "WorldPacket.h" #include "WorldSession.h" #include @@ -223,6 +225,9 @@ Map* MapManager::CreateMap(uint32 mapId, Player* player, uint32 loginInstanceId else { newInstanceId = 0; + if (entry->IsSplitByFaction()) + newInstanceId = player->GetTeamId(); + map = FindMap_i(mapId, newInstanceId); if (!map) map = CreateWorldMap(mapId, newInstanceId); @@ -481,3 +486,25 @@ void MapManager::FreeInstanceId(uint32 instanceId) _nextInstanceId = std::min(instanceId, _nextInstanceId); _freeInstanceIds->set(instanceId, true); } + +// hack to allow conditions to access what faction owns the map (these worldstates should not be set on these maps) +class SplitByFactionMapScript : public WorldMapScript +{ +public: + SplitByFactionMapScript(char const* name, uint32 mapId) : WorldMapScript(name, mapId) + { + } + + void OnCreate(Map* map) override + { + sWorldStateMgr->SetValue(WS_TEAM_IN_INSTANCE_ALLIANCE, map->GetInstanceId() == TEAM_ALLIANCE, false, map); + sWorldStateMgr->SetValue(WS_TEAM_IN_INSTANCE_HORDE, map->GetInstanceId() == TEAM_HORDE, false, map); + } +}; + +void MapManager::AddSC_BuiltInScripts() +{ + for (MapEntry const* mapEntry : sMapStore) + if (mapEntry->IsWorldMap() && mapEntry->IsSplitByFaction()) + new SplitByFactionMapScript(Trinity::StringFormat("world_map_set_faction_worldstates_%u", mapEntry->ID).c_str(), mapEntry->ID); +} diff --git a/src/server/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h index 22158cb2fb..b23f8148b2 100644 --- a/src/server/game/Maps/MapManager.h +++ b/src/server/game/Maps/MapManager.h @@ -125,6 +125,8 @@ class TC_GAME_API MapManager void DecreaseScheduledScriptCount(std::size_t count) { _scheduledScripts -= count; } bool IsScriptScheduled() const { return _scheduledScripts > 0; } + void AddSC_BuiltInScripts(); + private: using MapKey = std::pair; typedef std::map MapMapType; diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 94baaea4fb..d5e1396dc3 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1052,6 +1052,9 @@ void ScriptMgr::Initialize() // LFGScripts lfg::AddSC_LFGScripts(); + // MapScripts + sMapMgr->AddSC_BuiltInScripts(); + // Load all static linked scripts through the script loader function. ASSERT(_script_loader_callback, "Script loader callback wasn't registered!");