diff options
| author | Shauren <shauren.trinity@gmail.com> | 2022-10-21 22:11:00 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-10-21 22:11:00 +0200 |
| commit | 879c0cccfcb9224f9e15cbed926c57a4e010a070 (patch) | |
| tree | bb01bada60e1c943b6981919945b1a91b4da1c11 /src/server/game/Entities/Object | |
| parent | 43ac108a527fc593b4d5fa1fb06ff98e843d0b84 (diff) | |
Core/GameObjects: Implemented per player gameobject state and visibility for looted non-consumable chests
Diffstat (limited to 'src/server/game/Entities/Object')
5 files changed, 21 insertions, 8 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 451ed8cf0dc..8815f3d5416 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1521,7 +1521,7 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo return false; } - if (obj->IsInvisibleDueToDespawn()) + if (obj->IsInvisibleDueToDespawn(this)) return false; if (!CanDetect(obj, ignoreStealth, checkAlert)) diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 550b8e5588b..b17be4c1822 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -750,11 +750,12 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation void SetLocationInstanceId(uint32 _instanceId) { m_InstanceId = _instanceId; } virtual bool CanNeverSee(WorldObject const* obj) const; - 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; } + virtual bool CanAlwaysSee([[maybe_unused]] WorldObject const* /*obj*/) const { return false; } + virtual bool IsNeverVisibleFor([[maybe_unused]] WorldObject const* seer) const { return !IsInWorld() || IsDestroyedObject(); } + virtual bool IsAlwaysVisibleFor([[maybe_unused]] WorldObject const* seer) const { return false; } + virtual bool IsInvisibleDueToDespawn([[maybe_unused]] WorldObject const* seer) const { return false; } //difference from IsAlwaysVisibleFor: 1. after distance check; 2. use owner or charmer as seer - virtual bool IsAlwaysDetectableFor(WorldObject const* /*seer*/) const { return false; } + virtual bool IsAlwaysDetectableFor([[maybe_unused]] WorldObject const* seer) const { return false; } private: Map* m_currMap; // current object's Map location @@ -771,7 +772,6 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation virtual bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D, bool incOwnRadius = true, bool incTargetRadius = true) const; - virtual bool CanAlwaysSee(WorldObject const* /*obj*/) const { return false; } bool CanDetect(WorldObject const* obj, bool ignoreStealth, bool checkAlert = false) const; bool CanDetectInvisibilityOf(WorldObject const* obj) const; bool CanDetectStealthOf(WorldObject const* obj, bool checkAlert = false) const; diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index c9f7d991d67..c38670e91ff 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -4270,7 +4270,7 @@ void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie data << float(ParentRotation->z); data << float(ParentRotation->w); data << int32(FactionTemplate); - data << int8(State); + data << int8(ViewerDependentValue<StateTag>::GetValue(this, owner, receiver)); data << int8(TypeID); data << uint8(PercentHealth); data << uint32(ArtKit); @@ -4377,7 +4377,7 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool } if (changesMask[14]) { - data << int8(State); + data << int8(ViewerDependentValue<StateTag>::GetValue(this, owner, receiver)); } if (changesMask[15]) { diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 41f47ffa22f..1d6d1499df8 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -807,6 +807,7 @@ struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask< UpdateField<QuaternionData, 0, 12> ParentRotation; UpdateField<int32, 0, 13> FactionTemplate; UpdateField<int8, 0, 14> State; + struct StateTag : ViewerDependentValueTag<int8> {}; UpdateField<int8, 0, 15> TypeID; UpdateField<uint8, 0, 16> PercentHealth; UpdateField<uint32, 0, 17> ArtKit; diff --git a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h index dfbf1d554c9..fdcd7a08a15 100644 --- a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h +++ b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h @@ -303,6 +303,18 @@ public: }; template<> +class ViewerDependentValue<UF::GameObjectData::StateTag> +{ +public: + using value_type = UF::GameObjectData::StateTag::value_type; + + static value_type GetValue(UF::GameObjectData const* /*gameObjectData*/, GameObject const* gameObject, Player const* receiver) + { + return gameObject->GetGoStateFor(receiver->GetGUID()); + } +}; + +template<> class ViewerDependentValue<UF::ConversationData::LastLineEndTimeTag> { public: |
