aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/Map.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2017-09-14 22:33:40 +0200
committerShauren <shauren.trinity@gmail.com>2019-07-09 21:17:59 +0200
commit6eecb685ce0f3d3bf4cb7cd387b83ccf384b0c48 (patch)
tree1371c51fa67715c8afce5e05110750be534e9ebe /src/server/game/Maps/Map.cpp
parent9a9af3cc5f7433a4de653b2cf28f3d8c757db8f9 (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.cpp83
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);