diff options
author | Shauren <shauren.trinity@gmail.com> | 2017-09-14 22:33:40 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2019-07-09 21:17:59 +0200 |
commit | 6eecb685ce0f3d3bf4cb7cd387b83ccf384b0c48 (patch) | |
tree | 1371c51fa67715c8afce5e05110750be534e9ebe /src/server/game/Maps/Map.cpp | |
parent | 9a9af3cc5f7433a4de653b2cf28f3d8c757db8f9 (diff) |
Core/Weather: Fixed weather updates to be thread safe
(cherry picked from commit 6eb997394722fcd4b5248646b5abfa185a7ec58f)
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r-- | src/server/game/Maps/Map.cpp | 83 |
1 files changed, 61 insertions, 22 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 8655e83a5c5..8b44bd316c1 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -45,6 +45,7 @@ #include "Vehicle.h" #include "VMapFactory.h" #include "Weather.h" +#include "WeatherMgr.h" #include "World.h" #include <unordered_set> #include <vector> @@ -65,7 +66,7 @@ static uint16 const holetab_v[4] = { 0x000F, 0x00F0, 0x0F00, 0xF000 }; GridState* si_GridStates[MAX_GRID_STATE]; -ZoneDynamicInfo::ZoneDynamicInfo() : MusicId(0), WeatherId(WEATHER_STATE_FINE), +ZoneDynamicInfo::ZoneDynamicInfo() : MusicId(0), DefaultWeather(nullptr), WeatherId(WEATHER_STATE_FINE), WeatherGrade(0.0f), OverrideLightId(0), LightFadeInTime(0) { } Map::~Map() @@ -288,6 +289,8 @@ i_scriptLock(false), _respawnCheckTimer(0), _defaultLight(GetDefaultMapLight(id) //lets initialize visibility distance for map Map::InitVisibilityDistance(); + _weatherUpdateTimer.SetInterval(time_t(1 * IN_MILLISECONDS)); + sScriptMgr->OnCreateMap(this); } @@ -589,7 +592,6 @@ bool Map::AddPlayerToMap(Player* player) SendInitSelf(player); SendInitTransports(player); - SendZoneDynamicInfo(player); player->m_clientGUIDs.clear(); player->UpdateObjectVisibility(false); @@ -858,6 +860,15 @@ void Map::Update(uint32 t_diff) i_scriptLock = false; } + if (_weatherUpdateTimer.Passed()) + { + for (auto&& zoneInfo : _zoneDynamicInfo) + if (zoneInfo.second.DefaultWeather && !zoneInfo.second.DefaultWeather->Update(_weatherUpdateTimer.GetInterval())) + zoneInfo.second.DefaultWeather.reset(); + + _weatherUpdateTimer.Reset(); + } + MoveAllCreaturesInMoveList(); MoveAllGameObjectsInMoveList(); @@ -4559,10 +4570,9 @@ void Map::RemoveOldCorpses() } } -void Map::SendZoneDynamicInfo(Player* player) +void Map::SendZoneDynamicInfo(uint32 zoneId, Player* player) const { - uint32 zoneId = GetZoneId(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); - ZoneDynamicInfoMap::const_iterator itr = _zoneDynamicInfo.find(zoneId); + auto itr = _zoneDynamicInfo.find(zoneId); if (itr == _zoneDynamicInfo.end()) return; @@ -4573,11 +4583,7 @@ void Map::SendZoneDynamicInfo(Player* player) player->SendDirectMessage(&data); } - if (WeatherState weatherId = itr->second.WeatherId) - { - WorldPackets::Misc::Weather weather(weatherId, itr->second.WeatherGrade); - player->SendDirectMessage(weather.Write()); - } + SendZoneWeather(itr->second, player); if (uint32 overrideLight = itr->second.OverrideLightId) { @@ -4589,11 +4595,32 @@ void Map::SendZoneDynamicInfo(Player* player) } } -void Map::SetZoneMusic(uint32 zoneId, uint32 musicId) +void Map::SendZoneWeather(uint32 zoneId, Player* player) const { - if (_zoneDynamicInfo.find(zoneId) == _zoneDynamicInfo.end()) - _zoneDynamicInfo.insert(ZoneDynamicInfoMap::value_type(zoneId, ZoneDynamicInfo())); + auto itr = _zoneDynamicInfo.find(zoneId); + if (itr == _zoneDynamicInfo.end()) + return; + + SendZoneWeather(itr->second, player); +} +void Map::SendZoneWeather(ZoneDynamicInfo const& zoneDynamicInfo, Player* player) const +{ + if (WeatherState weatherId = zoneDynamicInfo.WeatherId) + { + WorldPackets::Misc::Weather weather(weatherId, zoneDynamicInfo.WeatherGrade); + player->SendDirectMessage(weather.Write()); + } + else if (zoneDynamicInfo.DefaultWeather) + { + zoneDynamicInfo.DefaultWeather->SendWeatherUpdateToPlayer(player); + } + else + Weather::SendFineWeatherUpdateToPlayer(player); +} + +void Map::SetZoneMusic(uint32 zoneId, uint32 musicId) +{ _zoneDynamicInfo[zoneId].MusicId = musicId; Map::PlayerList const& players = GetPlayers(); @@ -4609,37 +4636,49 @@ void Map::SetZoneMusic(uint32 zoneId, uint32 musicId) } } -void Map::SetZoneWeather(uint32 zoneId, WeatherState weatherId, float weatherGrade) +Weather* Map::GetOrGenerateZoneDefaultWeather(uint32 zoneId) { - if (_zoneDynamicInfo.find(zoneId) == _zoneDynamicInfo.end()) - _zoneDynamicInfo.insert(ZoneDynamicInfoMap::value_type(zoneId, ZoneDynamicInfo())); + WeatherData const* weatherData = WeatherMgr::GetWeatherData(zoneId); + if (!weatherData) + return nullptr; ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId]; + if (!info.DefaultWeather) + { + info.DefaultWeather = Trinity::make_unique<Weather>(zoneId, weatherData); + info.DefaultWeather->ReGenerate(); + info.DefaultWeather->UpdateWeather(); + } + + return info.DefaultWeather.get(); +} + +void Map::SetZoneWeather(uint32 zoneId, WeatherState weatherId, float weatherGrade) +{ + ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId]; info.WeatherId = weatherId; info.WeatherGrade = weatherGrade; - Map::PlayerList const& players = GetPlayers(); + Map::PlayerList const& players = GetPlayers(); if (!players.isEmpty()) { WorldPackets::Misc::Weather weather(weatherId, weatherGrade); + weather.Write(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (Player* player = itr->GetSource()) if (player->GetZoneId() == zoneId) - player->SendDirectMessage(weather.Write()); + player->SendDirectMessage(weather.GetRawPacket()); } } void Map::SetZoneOverrideLight(uint32 zoneId, uint32 lightId, uint32 fadeInTime) { - if (_zoneDynamicInfo.find(zoneId) == _zoneDynamicInfo.end()) - _zoneDynamicInfo.insert(ZoneDynamicInfoMap::value_type(zoneId, ZoneDynamicInfo())); - ZoneDynamicInfo& info = _zoneDynamicInfo[zoneId]; info.OverrideLightId = lightId; info.LightFadeInTime = fadeInTime; - Map::PlayerList const& players = GetPlayers(); + Map::PlayerList const& players = GetPlayers(); if (!players.isEmpty()) { WorldPacket data(SMSG_OVERRIDE_LIGHT, 4 + 4 + 1); |