diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-06-26 21:27:17 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-06-26 21:27:17 +0200 |
commit | 70eacebad531af0a4b5b4ac6be6d90ddc56ed5d4 (patch) | |
tree | 06d22a98099f3e56aee2d8492427fe3ac63beea0 /src/server/game/Maps/Map.cpp | |
parent | 6285033ed5ba8f67330eca40c1ae4840882a98d3 (diff) |
Core/WorldStates: Add area requirements to world states
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r-- | src/server/game/Maps/Map.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 7771fe6198e..acf5a1a035c 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -702,14 +702,28 @@ void Map::SetWorldStateValue(int32 worldStateId, int32 value) int32 oldValue = itr->second; itr->second = value; - if (WorldStateTemplate const* worldStateTemplate = sWorldStateMgr->GetWorldStateTemplate(worldStateId)) + WorldStateTemplate const* worldStateTemplate = sWorldStateMgr->GetWorldStateTemplate(worldStateId); + if (worldStateTemplate) sScriptMgr->OnWorldStateValueChange(worldStateTemplate, oldValue, value, this); // Broadcast update to all players on the map WorldPackets::WorldState::UpdateWorldState updateWorldState; updateWorldState.VariableID = worldStateId; updateWorldState.Value = value; - SendToPlayers(updateWorldState.Write()); + updateWorldState.Write(); + + for (MapReference const& mapReference : m_mapRefManager) + { + if (worldStateTemplate && !worldStateTemplate->AreaIds.empty()) + { + bool isInAllowedArea = std::any_of(worldStateTemplate->AreaIds.begin(), worldStateTemplate->AreaIds.end(), + [playerAreaId = mapReference.GetSource()->GetAreaId()](uint32 requiredAreaId) { return DB2Manager::IsInArea(playerAreaId, requiredAreaId); }); + if (!isInAllowedArea) + continue; + } + + mapReference.GetSource()->SendDirectMessage(updateWorldState.GetRawPacket()); + } } template<class T> |