aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/Map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r--src/server/game/Maps/Map.cpp54
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