diff options
Diffstat (limited to 'src/server/game/Maps')
| -rw-r--r-- | src/server/game/Maps/Map.cpp | 54 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.h | 13 |
2 files changed, 66 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 diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 5763fce777d..78a8cb3e647 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -78,6 +78,7 @@ enum WeatherState : uint32; enum class ItemContext : uint8; namespace Trinity { struct ObjectUpdater; } +namespace Vignettes { struct VignetteData; } namespace VMAP { enum class ModelIgnoreFlags : uint32; } enum TransferAbortReason : uint32 @@ -821,6 +822,18 @@ class TC_GAME_API Map : public GridRefManager<NGridType> private: WorldStateValueContainer _worldStateValues; + + /*********************************************************/ + /*** Vignettes ***/ + /*********************************************************/ + public: + void AddInfiniteAOIVignette(Vignettes::VignetteData* vignette); + void RemoveInfiniteAOIVignette(Vignettes::VignetteData* vignette); + std::vector<Vignettes::VignetteData*> const& GetInfiniteAOIVignettes() const { return _infiniteAOIVignettes; } + + private: + std::vector<Vignettes::VignetteData*> _infiniteAOIVignettes; + PeriodicTimer _vignetteUpdateTimer; }; enum class InstanceResetMethod : uint8 |
