aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-10-21 22:11:00 +0200
committerShauren <shauren.trinity@gmail.com>2022-10-21 22:11:00 +0200
commit879c0cccfcb9224f9e15cbed926c57a4e010a070 (patch)
treebb01bada60e1c943b6981919945b1a91b4da1c11 /src/server/game/Entities/Object
parent43ac108a527fc593b4d5fa1fb06ff98e843d0b84 (diff)
Core/GameObjects: Implemented per player gameobject state and visibility for looted non-consumable chests
Diffstat (limited to 'src/server/game/Entities/Object')
-rw-r--r--src/server/game/Entities/Object/Object.cpp2
-rw-r--r--src/server/game/Entities/Object/Object.h10
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp4
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h1
-rw-r--r--src/server/game/Entities/Object/Updates/ViewerDependentValues.h12
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: