From bbfbb7d4bfa869755e702b40b53dbd295f8c964d Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 23 Apr 2020 20:22:53 +0200 Subject: Core/PacketIO: Implement building SMSG_UPDATE_OBJECT only for selected fields and use that to fix quest objects not glowing after accepting quests --- src/server/game/Entities/GameObject/GameObject.cpp | 26 ++++++++++++++++++++++ src/server/game/Entities/GameObject/GameObject.h | 5 +++++ 2 files changed, 31 insertions(+) (limited to 'src/server/game/Entities/GameObject') diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 151f9419d51..b9e17565702 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -2609,6 +2609,32 @@ void GameObject::BuildValuesUpdate(ByteBuffer* data, Player const* target) const data->put(sizePos, data->wpos() - sizePos - 4); } +void GameObject::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, + UF::GameObjectData::Mask const& requestedGameObjectMask, Player const* target) const +{ + UpdateMask valuesMask; + if (requestedObjectMask.IsAnySet()) + valuesMask.Set(TYPEID_OBJECT); + + if (requestedGameObjectMask.IsAnySet()) + valuesMask.Set(TYPEID_GAMEOBJECT); + + ByteBuffer buffer = PrepareValuesUpdateBuffer(); + std::size_t sizePos = buffer.wpos(); + buffer << uint32(0); + buffer << uint32(valuesMask.GetBlock(0)); + + if (valuesMask[TYPEID_OBJECT]) + m_objectData->WriteUpdate(buffer, requestedObjectMask, true, this, target); + + if (valuesMask[TYPEID_GAMEOBJECT]) + m_gameObjectData->WriteUpdate(buffer, requestedGameObjectMask, true, this, target); + + buffer.put(sizePos, buffer.wpos() - sizePos - 4); + + data->AddUpdateBlock(buffer); +} + void GameObject::ClearUpdateMask(bool remove) { m_values.ClearChangesMask(&GameObject::m_gameObjectData); diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 81bd5f1e340..b34f5e7951d 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -84,10 +84,15 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject explicit GameObject(); ~GameObject(); + protected: void BuildValuesCreate(ByteBuffer* data, Player const* target) const override; void BuildValuesUpdate(ByteBuffer* data, Player const* target) const override; void ClearUpdateMask(bool remove) override; + public: + void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, + UF::GameObjectData::Mask const& requestedGameObjectMask, Player const* target) const; + void AddToWorld() override; void RemoveFromWorld() override; void CleanupsBeforeDelete(bool finalCleanup = true) override; -- cgit v1.2.3