From 6eb997394722fcd4b5248646b5abfa185a7ec58f Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 14 Sep 2017 22:33:40 +0200 Subject: Core/Weather: Fixed weather updates to be thread safe --- src/server/game/Weather/Weather.cpp | 18 +++++---- src/server/game/Weather/Weather.h | 1 + src/server/game/Weather/WeatherMgr.cpp | 74 +++------------------------------- src/server/game/Weather/WeatherMgr.h | 10 +---- 4 files changed, 20 insertions(+), 83 deletions(-) (limited to 'src/server/game/Weather') diff --git a/src/server/game/Weather/Weather.cpp b/src/server/game/Weather/Weather.cpp index 37be7e40e85..9494dfe9e56 100644 --- a/src/server/game/Weather/Weather.cpp +++ b/src/server/game/Weather/Weather.cpp @@ -21,15 +21,13 @@ */ #include "Weather.h" -#include "WorldPacket.h" -#include "Player.h" -#include "World.h" #include "Log.h" -#include "Util.h" -#include "ScriptMgr.h" -#include "WorldSession.h" #include "MiscPackets.h" +#include "Player.h" #include "Random.h" +#include "ScriptMgr.h" +#include "Util.h" +#include "World.h" /// Create the Weather object Weather::Weather(uint32 zone, WeatherData const* weatherChances) @@ -195,7 +193,13 @@ bool Weather::ReGenerate() void Weather::SendWeatherUpdateToPlayer(Player* player) { WorldPackets::Misc::Weather weather(GetWeatherState(), m_grade); - player->GetSession()->SendPacket(weather.Write()); + player->SendDirectMessage(weather.Write()); +} + +void Weather::SendFineWeatherUpdateToPlayer(Player* player) +{ + WorldPackets::Misc::Weather weather(WEATHER_STATE_FINE); + player->SendDirectMessage(weather.Write()); } /// Send the new weather to all players in the zone diff --git a/src/server/game/Weather/Weather.h b/src/server/game/Weather/Weather.h index da1e5b13af3..e38ecc9a612 100644 --- a/src/server/game/Weather/Weather.h +++ b/src/server/game/Weather/Weather.h @@ -74,6 +74,7 @@ class TC_GAME_API Weather bool UpdateWeather(); void SendWeatherUpdateToPlayer(Player* player); + static void SendFineWeatherUpdateToPlayer(Player* player); void SetWeather(WeatherType type, float grade); /// For which zone is this weather? diff --git a/src/server/game/Weather/WeatherMgr.cpp b/src/server/game/Weather/WeatherMgr.cpp index fcda5662560..ae69d8a009f 100644 --- a/src/server/game/Weather/WeatherMgr.cpp +++ b/src/server/game/Weather/WeatherMgr.cpp @@ -21,64 +21,24 @@ */ #include "WeatherMgr.h" +#include "Containers.h" #include "DatabaseEnv.h" #include "Log.h" -#include "MiscPackets.h" #include "ObjectMgr.h" -#include "Player.h" +#include "Timer.h" #include "Weather.h" -#include "WorldSession.h" namespace WeatherMgr { namespace { - typedef std::unordered_map > WeatherMap; - typedef std::unordered_map WeatherZoneMap; - - WeatherMap m_weathers; - WeatherZoneMap mWeatherZoneMap; - - WeatherData const* GetWeatherData(uint32 zone_id) - { - WeatherZoneMap::const_iterator itr = mWeatherZoneMap.find(zone_id); - return (itr != mWeatherZoneMap.end()) ? &itr->second : NULL; - } -} - -/// Find a Weather object by the given zoneid -Weather* FindWeather(uint32 id) -{ - WeatherMap::const_iterator itr = m_weathers.find(id); - return (itr != m_weathers.end()) ? itr->second.get() : nullptr; + std::unordered_map _weatherData; } -/// Remove a Weather object for the given zoneid -void RemoveWeather(uint32 id) +WeatherData const* GetWeatherData(uint32 zone_id) { - // not called at the moment. Kept for completeness - WeatherMap::iterator itr = m_weathers.find(id); - - if (itr != m_weathers.end()) - m_weathers.erase(itr); -} - -/// Add a Weather object to the list -Weather* AddWeather(uint32 zone_id) -{ - WeatherData const* weatherChances = GetWeatherData(zone_id); - - // zone does not have weather, ignore - if (!weatherChances) - return NULL; - - Weather* w = new Weather(zone_id, weatherChances); - m_weathers[w->GetZone()].reset(w); - w->ReGenerate(); - w->UpdateWeather(); - - return w; + return Trinity::Containers::MapGetValuePtr(_weatherData, zone_id); } void LoadWeatherData() @@ -106,7 +66,7 @@ void LoadWeatherData() uint32 zone_id = fields[0].GetUInt32(); - WeatherData& wzc = mWeatherZoneMap[zone_id]; + WeatherData& wzc = _weatherData[zone_id]; for (uint8 season = 0; season < WEATHER_SEASONS; ++season) { @@ -142,26 +102,4 @@ void LoadWeatherData() TC_LOG_INFO("server.loading", ">> Loaded %u weather definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } -void SendFineWeatherUpdateToPlayer(Player* player) -{ - WorldPackets::Misc::Weather weather(WEATHER_STATE_FINE); - player->GetSession()->SendPacket(weather.Write()); -} - -void Update(uint32 diff) -{ - ///- Send an update signal to Weather objects - WeatherMap::iterator itr, next; - for (itr = m_weathers.begin(); itr != m_weathers.end(); itr = next) - { - next = itr; - ++next; - - ///- and remove Weather objects for zones with no player - // As interval > WorldTick - if (!itr->second->Update(diff)) - m_weathers.erase(itr); - } -} - } // namespace diff --git a/src/server/game/Weather/WeatherMgr.h b/src/server/game/Weather/WeatherMgr.h index e00f190b0dc..155f04c64d5 100644 --- a/src/server/game/Weather/WeatherMgr.h +++ b/src/server/game/Weather/WeatherMgr.h @@ -27,18 +27,12 @@ class Weather; class Player; +struct WeatherData; namespace WeatherMgr { TC_GAME_API void LoadWeatherData(); - - TC_GAME_API Weather* FindWeather(uint32 id); - TC_GAME_API Weather* AddWeather(uint32 zone_id); - TC_GAME_API void RemoveWeather(uint32 zone_id); - - TC_GAME_API void SendFineWeatherUpdateToPlayer(Player* player); - - TC_GAME_API void Update(uint32 diff); + TC_GAME_API WeatherData const* GetWeatherData(uint32 zone_id); } #endif -- cgit v1.2.3