From fccf6fb72b60b08dfbe6d5fb17fba55239944fca Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 9 Mar 2024 00:54:27 +0100 Subject: Core/Objects: Implemented vignettes --- src/server/game/Maps/Map.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++- src/server/game/Maps/Map.h | 13 +++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) (limited to 'src/server/game/Maps') 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()), _respawnCheckTimer(0) +i_scriptLock(false), _respawnTimes(std::make_unique()), _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 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 private: WorldStateValueContainer _worldStateValues; + + /*********************************************************/ + /*** Vignettes ***/ + /*********************************************************/ + public: + void AddInfiniteAOIVignette(Vignettes::VignetteData* vignette); + void RemoveInfiniteAOIVignette(Vignettes::VignetteData* vignette); + std::vector const& GetInfiniteAOIVignettes() const { return _infiniteAOIVignettes; } + + private: + std::vector _infiniteAOIVignettes; + PeriodicTimer _vignetteUpdateTimer; }; enum class InstanceResetMethod : uint8 -- cgit v1.2.3