diff options
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r-- | src/server/game/Maps/Map.cpp | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index b722717a86a..9bb50c2d913 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -54,6 +54,8 @@ #include "Vehicle.h" #include "VMapFactory.h" #include "VMapManager2.h" +#include "Vignette.h" +#include "VignettePackets.h" #include "Weather.h" #include "WeatherMgr.h" #include "World.h" @@ -144,7 +146,7 @@ m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), m_VisibilityNotifyPeriod(DEFAULT_VISIBILITY_NOTIFY_PERIOD), m_activeNonPlayersIter(m_activeNonPlayers.end()), _transportsUpdateIter(_transports.end()), i_gridExpiry(expiry), m_terrain(sTerrainMgr.LoadTerrain(id)), m_forceEnabledNavMeshFilterFlags(0), m_forceDisabledNavMeshFilterFlags(0), -i_scriptLock(false), _respawnTimes(std::make_unique<RespawnListContainer>()), _respawnCheckTimer(0) +i_scriptLock(false), _respawnTimes(std::make_unique<RespawnListContainer>()), _respawnCheckTimer(0), _vignetteUpdateTimer(5200, 5200) { for (uint32 x = 0; x < MAX_NUMBER_OF_GRIDS; ++x) { @@ -511,6 +513,38 @@ void Map::SetWorldStateValue(int32 worldStateId, int32 value, bool hidden) } } +void Map::AddInfiniteAOIVignette(Vignettes::VignetteData* vignette) +{ + _infiniteAOIVignettes.push_back(vignette); + + WorldPackets::Vignette::VignetteUpdate vignetteUpdate; + vignette->FillPacket(vignetteUpdate.Added); + vignetteUpdate.Write(); + + for (MapReference const& ref : m_mapRefManager) + if (Vignettes::CanSee(ref.GetSource(), *vignette)) + ref.GetSource()->SendDirectMessage(vignetteUpdate.GetRawPacket()); +} + +void Map::RemoveInfiniteAOIVignette(Vignettes::VignetteData* vignette) +{ + if (!std::erase(_infiniteAOIVignettes, vignette)) + return; + + WorldPackets::Vignette::VignetteUpdate vignetteUpdate; + vignetteUpdate.Removed.push_back(vignette->Guid); + vignetteUpdate.Write(); + + if (vignette->Data->GetFlags().HasFlag(VignetteFlags::ZoneInfiniteAOI)) + { + for (MapReference const& ref : m_mapRefManager) + if (ref.GetSource()->GetZoneId() == vignette->ZoneID) + ref.GetSource()->SendDirectMessage(vignetteUpdate.GetRawPacket()); + } + else + SendToPlayers(vignetteUpdate.GetRawPacket()); +} + template<class T> void Map::InitializeObject(T* /*obj*/) { } @@ -774,6 +808,24 @@ void Map::Update(uint32 t_diff) obj->Update(t_diff); } + if (_vignetteUpdateTimer.Update(t_diff)) + { + for (Vignettes::VignetteData* vignette : _infiniteAOIVignettes) + { + if (vignette->NeedUpdate) + { + WorldPackets::Vignette::VignetteUpdate vignetteUpdate; + vignette->FillPacket(vignetteUpdate.Updated); + vignetteUpdate.Write(); + for (MapReference const& ref : m_mapRefManager) + if (Vignettes::CanSee(ref.GetSource(), *vignette)) + ref.GetSource()->SendDirectMessage(vignetteUpdate.GetRawPacket()); + + vignette->NeedUpdate = false; + } + } + } + SendObjectUpdates(); ///- Process necessary scripts |