Core/PacketIO: Implement building SMSG_UPDATE_OBJECT only for selected fields and use that to fix quest objects not glowing after accepting quests

This commit is contained in:
Shauren
2020-04-23 20:22:53 +02:00
parent 51e99de4c6
commit bbfbb7d4bf
29 changed files with 903 additions and 198 deletions

View File

@@ -273,6 +273,32 @@ void DynamicObject::BuildValuesUpdate(ByteBuffer* data, Player const* target) co
data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void DynamicObject::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::DynamicObjectData::Mask const& requestedDynamicObjectMask, Player const* target) const
{
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
if (requestedObjectMask.IsAnySet())
valuesMask.Set(TYPEID_OBJECT);
if (requestedDynamicObjectMask.IsAnySet())
valuesMask.Set(TYPEID_DYNAMICOBJECT);
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_DYNAMICOBJECT])
m_dynamicObjectData->WriteUpdate(buffer, requestedDynamicObjectMask, true, this, target);
buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
data->AddUpdateBlock(buffer);
}
void DynamicObject::ClearUpdateMask(bool remove)
{
m_values.ClearChangesMask(&DynamicObject::m_dynamicObjectData);

View File

@@ -38,10 +38,15 @@ class TC_GAME_API DynamicObject : public WorldObject, public GridObject<DynamicO
DynamicObject(bool isWorldObject);
~DynamicObject();
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::DynamicObjectData::Mask const& requestedDynamicObjectMask, Player const* target) const;
void AddToWorld() override;
void RemoveFromWorld() override;