diff options
| author | Shauren <shauren.trinity@gmail.com> | 2022-01-29 16:01:57 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-01-29 16:01:57 +0100 |
| commit | 5a82a0381d704e4b4b9976daf04d541d1130e541 (patch) | |
| tree | 3c24066dfab82cfcf572f4613c1b5de003da8522 /src/server/game/Entities/Object | |
| parent | 472384e75781ce362af9721fc16928da9eea82dd (diff) | |
Core/Objects: Properly choose between "Destroyed" or "OutOfRange" during visibility update
Diffstat (limited to 'src/server/game/Entities/Object')
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 12 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 6 |
2 files changed, 17 insertions, 1 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index f07d8f71fb6..e926d7d5aab 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -75,6 +75,7 @@ Object::Object() : m_values(this) m_inWorld = false; m_isNewObject = false; + m_isDestroyedObject = false; m_objectUpdated = false; } @@ -243,6 +244,17 @@ void Object::DestroyForPlayer(Player* target) const target->SendDirectMessage(&packet); } +void Object::SendOutOfRangeForPlayer(Player* target) const +{ + ASSERT(target); + + UpdateData updateData(target->GetMapId()); + BuildOutOfRangeUpdateBlock(&updateData); + WorldPacket packet; + updateData.BuildPacket(&packet); + target->SendDirectMessage(&packet); +} + void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const { std::vector<uint32> const* PauseTimes = nullptr; diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 065994344d3..7068f7e73bf 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -180,6 +180,7 @@ class TC_GAME_API Object ByteBuffer PrepareValuesUpdateBuffer() const; virtual void DestroyForPlayer(Player* target) const; + void SendOutOfRangeForPlayer(Player* target) const; virtual void ClearUpdateMask(bool remove); @@ -188,6 +189,8 @@ class TC_GAME_API Object virtual bool hasQuest(uint32 /* quest_id */) const { return false; } virtual bool hasInvolvedQuest(uint32 /* quest_id */) const { return false; } void SetIsNewObject(bool enable) { m_isNewObject = enable; } + bool IsDestroyedObject() const { return m_isDestroyedObject; } + void SetDestroyedObject(bool destroyed) { m_isDestroyedObject = destroyed; } virtual void BuildUpdate(UpdateDataMapType&) { } void BuildFieldsUpdate(Player*, UpdateDataMapType &) const; @@ -391,6 +394,7 @@ class TC_GAME_API Object ObjectGuid m_guid; bool m_inWorld; bool m_isNewObject; + bool m_isDestroyedObject; Object(Object const& right) = delete; Object& operator=(Object const& right) = delete; @@ -745,7 +749,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation void SetLocationMapId(uint32 _mapId) { m_mapId = _mapId; } void SetLocationInstanceId(uint32 _instanceId) { m_InstanceId = _instanceId; } - virtual bool IsNeverVisibleFor(WorldObject const* /*seer*/) const { return !IsInWorld(); } + virtual bool IsNeverVisibleFor(WorldObject const* /*seer*/) const { return !IsInWorld() || IsDestroyedObject(); } virtual bool IsAlwaysVisibleFor(WorldObject const* /*seer*/) const { return false; } virtual bool IsInvisibleDueToDespawn() const { return false; } //difference from IsAlwaysVisibleFor: 1. after distance check; 2. use owner or charmer as seer |
