diff options
| author | Shauren <shauren.trinity@gmail.com> | 2020-04-23 20:22:53 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2020-04-23 20:22:53 +0200 |
| commit | bbfbb7d4bfa869755e702b40b53dbd295f8c964d (patch) | |
| tree | ba60af2e194c5f410cd8662ad324919fcd07cb48 /src/server/game/Entities/Unit | |
| parent | 51e99de4c6ae8039fece436494da38e9a992f531 (diff) | |
Core/PacketIO: Implement building SMSG_UPDATE_OBJECT only for selected fields and use that to fix quest objects not glowing after accepting quests
Diffstat (limited to 'src/server/game/Entities/Unit')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 31 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 6 |
2 files changed, 36 insertions, 1 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index cf86f82f55c..62790919a9c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -14098,11 +14098,40 @@ void Unit::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags UF::UnitData::Mask mask; m_unitData->AppendAllowedFieldsMaskForFlag(mask, flags); - m_unitData->WriteUpdate(*data, mask, flags, this, target); + m_unitData->WriteUpdate(*data, mask, true, this, target); data->put<uint32>(sizePos, data->wpos() - sizePos - 4); } +void Unit::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, + UF::UnitData::Mask const& requestedUnitMask, Player const* target) const +{ + UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask; + if (requestedObjectMask.IsAnySet()) + valuesMask.Set(TYPEID_OBJECT); + + UF::UnitData::Mask unitMask = requestedUnitMask; + m_unitData->FilterDisallowedFieldsMaskForFlag(unitMask, flags); + if (unitMask.IsAnySet()) + valuesMask.Set(TYPEID_UNIT); + + 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_UNIT]) + m_unitData->WriteUpdate(buffer, unitMask, true, this, target); + + buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4); + + data->AddUpdateBlock(buffer); +} + void Unit::DestroyForPlayer(Player* target) const { if (Battleground* bg = target->GetBattleground()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index b4ffcc85ce3..1f9de500ad1 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2011,7 +2011,13 @@ class TC_GAME_API Unit : public WorldObject UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const* target) const override; void BuildValuesCreate(ByteBuffer* data, Player const* target) const override; void BuildValuesUpdate(ByteBuffer* data, Player const* target) const override; + + public: void BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const override; + void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, + UF::UnitData::Mask const& requestedUnitMask, Player const* target) const; + + protected: void DestroyForPlayer(Player* target) const override; void ClearUpdateMask(bool remove) override; |
