feat(Core/Visibility): Visibility improvements part 1 (#22624)

This commit is contained in:
Takenbacon
2025-08-07 07:17:45 -07:00
committed by GitHub
parent bde4e076ed
commit 1499aa51de
25 changed files with 456 additions and 296 deletions

View File

@@ -33,6 +33,7 @@
#include "Position.h"
#include "UpdateData.h"
#include "UpdateMask.h"
#include "ObjectVisibilityContainer.h"
#include <memory>
#include <set>
#include <sstream>
@@ -96,7 +97,6 @@ class MotionTransport;
struct PositionFullTerrainStatus;
typedef std::unordered_map<Player*, UpdateData> UpdateDataMapType;
typedef GuidUnorderedSet UpdatePlayerSet;
static constexpr Milliseconds HEARTBEAT_INTERVAL = 5s + 200ms;
@@ -189,7 +189,7 @@ public:
[[nodiscard]] virtual bool hasQuest(uint32 /* quest_id */) const { return false; }
[[nodiscard]] virtual bool hasInvolvedQuest(uint32 /* quest_id */) const { return false; }
virtual void BuildUpdate(UpdateDataMapType&, UpdatePlayerSet&) {}
virtual void BuildUpdate(UpdateDataMapType&) {}
void BuildFieldsUpdate(Player*, UpdateDataMapType&);
void SetFieldNotifyFlag(uint16 flag) { _fieldNotifyFlags |= flag; }
@@ -559,6 +559,29 @@ public:
void PlayDirectMusic(uint32 music_id, Player* target = nullptr);
void PlayRadiusMusic(uint32 music_id, float radius);
// Warning: Possible iterator invalidation in uses that may modify visibility map
template<typename Worker>
void DoForAllVisiblePlayers(Worker&& worker)
{
for (auto const& kvPair : GetObjectVisibilityContainer().GetVisiblePlayersMap())
worker(kvPair.second);
}
// Warning: Possible iterator invalidation in uses that may modify visibility map
template<typename Worker>
void DoForAllVisibleWorldObjects(Worker&& worker)
{
// Not a player, no access to this map
VisibleWorldObjectsMap const* visibleWorldObjectsMap = GetObjectVisibilityContainer().GetVisibleWorldObjectsMap();
if (!visibleWorldObjectsMap)
return;
for (auto const& kvPair : *visibleWorldObjectsMap)
worker(kvPair.second);
}
void DestroyForVisiblePlayers();
void SendObjectDeSpawnAnim(ObjectGuid guid);
virtual void SaveRespawnTime() {}
@@ -609,10 +632,9 @@ public:
void GetCreatureListWithEntryInGrid(std::list<Creature*>& creatureList, std::vector<uint32> const& entries, float maxSearchRange) const;
void GetDeadCreatureListInGrid(std::list<Creature*>& lList, float maxSearchRange, bool alive = false) const;
void DestroyForNearbyPlayers();
virtual void UpdateObjectVisibility(bool forced = true, bool fromUpdate = false);
virtual void UpdateObjectVisibilityOnCreate() { UpdateObjectVisibility(true); }
void BuildUpdate(UpdateDataMapType& data_map, UpdatePlayerSet& player_set) override;
void BuildUpdate(UpdateDataMapType& data_map) override;
void GetCreaturesWithEntryInRange(std::list<Creature*>& creatureList, float radius, uint32 entry);
void SetPositionDataUpdate();
@@ -688,6 +710,9 @@ public:
std::string GetDebugInfo() const override;
ObjectVisibilityContainer& GetObjectVisibilityContainer() { return _objectVisibilityContainer; }
ObjectVisibilityContainer const& GetObjectVisibilityContainer() const { return _objectVisibilityContainer; }
// Event handler
ElunaEventProcessor* elunaEvents;
EventProcessor m_Events;
@@ -745,6 +770,8 @@ private:
bool CanDetectStealthOf(WorldObject const* obj, bool checkAlert = false) const;
GuidUnorderedSet _allowedLooters;
ObjectVisibilityContainer _objectVisibilityContainer;
};
namespace Acore