Core/WorldStates: Add area requirements to world states

This commit is contained in:
Shauren authored and Ovahlord committed 2022-10-09 01:34:37 +02:00
1 parent 67dd72dfc0
commit 10823f8fcc
6 files changed
+90 -8

No files matched your search

+19 -2
View File
@@ -3538,12 +3538,29 @@ 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 DBCManager::IsInArea(playerAreaId, requiredAreaId);
});
if (!isInAllowedArea)
continue;
}
mapReference.GetSource()->SendDirectMessage(updateWorldState.GetRawPacket());
}
}