diff options
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> |