diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-03-09 00:54:27 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-03-09 00:54:27 +0100 |
commit | fccf6fb72b60b08dfbe6d5fb17fba55239944fca (patch) | |
tree | d34819afa3813592e60825b1f0d88e1262496dd1 /src/server/game/Maps/Map.cpp | |
parent | 1439535c6ac2ca8db13990e4fee29d4c1312f87a (diff) |
Core/Objects: Implemented vignettes
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 |