Core/Objects: Implemented vignettes

This commit is contained in:
Shauren
2024-03-09 00:54:27 +01:00
parent 1439535c6a
commit fccf6fb72b
27 changed files with 743 additions and 11 deletions

View File

@@ -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