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/Item | |
| 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/Item')
8 files changed, 164 insertions, 5 deletions
diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp b/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp index d36d3120ee4..bf8047b5d20 100644 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp +++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp @@ -19,6 +19,7 @@ #include "DatabaseEnv.h" #include "DB2Stores.h" #include "Player.h" +#include "UpdateData.h" AzeriteEmpoweredItem::AzeriteEmpoweredItem() { @@ -184,6 +185,41 @@ void AzeriteEmpoweredItem::BuildValuesUpdate(ByteBuffer* data, Player const* tar data->put<uint32>(sizePos, data->wpos() - sizePos - 4); } +void AzeriteEmpoweredItem::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, + UF::ItemData::Mask const& requestedItemMask, UF::AzeriteEmpoweredItemData::Mask const& requestedAzeriteEmpoweredItemMask, Player const* target) const +{ + UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask; + if (requestedObjectMask.IsAnySet()) + valuesMask.Set(TYPEID_OBJECT); + + UF::ItemData::Mask itemMask = requestedItemMask; + m_itemData->FilterDisallowedFieldsMaskForFlag(itemMask, flags); + if (itemMask.IsAnySet()) + valuesMask.Set(TYPEID_ITEM); + + if (requestedAzeriteEmpoweredItemMask.IsAnySet()) + valuesMask.Set(TYPEID_AZERITE_EMPOWERED_ITEM); + + 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_ITEM]) + m_itemData->WriteUpdate(buffer, itemMask, true, this, target); + + if (valuesMask[TYPEID_AZERITE_EMPOWERED_ITEM]) + m_azeriteEmpoweredItemData->WriteUpdate(buffer, requestedAzeriteEmpoweredItemMask, true, this, target); + + buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4); + + data->AddUpdateBlock(buffer); +} + void AzeriteEmpoweredItem::ClearUpdateMask(bool remove) { m_values.ClearChangesMask(&AzeriteEmpoweredItem::m_azeriteEmpoweredItemData); diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.h b/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.h index 25e00ba139a..a0c66f2f43d 100644 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.h +++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.h @@ -42,10 +42,15 @@ public: int64 GetRespecCost() const; +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::ItemData::Mask const& requestedItemMask, + UF::AzeriteEmpoweredItemData::Mask const& requestedAzeriteEmpoweredItemMask, Player const* target) const; + UF::UpdateField<UF::AzeriteEmpoweredItemData, 0, TYPEID_AZERITE_EMPOWERED_ITEM> m_azeriteEmpoweredItemData; private: diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp index f156f14ccaa..3429055b7e4 100644 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp +++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp @@ -22,6 +22,7 @@ #include "GameObject.h" #include "GameTime.h" #include "Player.h" +#include "UpdateData.h" #include <boost/date_time/gregorian/gregorian_types.hpp> #include <boost/date_time/posix_time/conversion.hpp> @@ -433,15 +434,52 @@ void AzeriteItem::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFla UF::ItemData::Mask mask; m_itemData->AppendAllowedFieldsMaskForFlag(mask, flags); - m_itemData->WriteUpdate(*data, mask, flags, this, target); + m_itemData->WriteUpdate(*data, mask, true, this, target); UF::AzeriteItemData::Mask mask2; m_azeriteItemData->AppendAllowedFieldsMaskForFlag(mask2, flags); - m_azeriteItemData->WriteUpdate(*data, mask2, flags, this, target); + m_azeriteItemData->WriteUpdate(*data, mask2, true, this, target); data->put<uint32>(sizePos, data->wpos() - sizePos - 4); } +void AzeriteItem::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, + UF::ItemData::Mask const& requestedItemMask, UF::AzeriteItemData::Mask const& requestedAzeriteItemMask, Player const* target) const +{ + UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask; + if (requestedObjectMask.IsAnySet()) + valuesMask.Set(TYPEID_OBJECT); + + UF::ItemData::Mask itemMask = requestedItemMask; + m_itemData->FilterDisallowedFieldsMaskForFlag(itemMask, flags); + if (itemMask.IsAnySet()) + valuesMask.Set(TYPEID_ITEM); + + UF::AzeriteItemData::Mask azeriteItemMask = requestedAzeriteItemMask; + m_azeriteItemData->FilterDisallowedFieldsMaskForFlag(azeriteItemMask, flags); + if (azeriteItemMask.IsAnySet()) + valuesMask.Set(TYPEID_AZERITE_ITEM); + + 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_ITEM]) + m_itemData->WriteUpdate(buffer, itemMask, true, this, target); + + if (valuesMask[TYPEID_AZERITE_ITEM]) + m_azeriteItemData->WriteUpdate(buffer, azeriteItemMask, true, this, target); + + buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4); + + data->AddUpdateBlock(buffer); +} + void AzeriteItem::ClearUpdateMask(bool remove) { m_values.ClearChangesMask(&AzeriteItem::m_azeriteItemData); diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h index d1049e9ff66..14fba648e53 100644 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h +++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h @@ -73,11 +73,16 @@ public: void CreateSelectedAzeriteEssences(uint32 specializationId); void SetSelectedAzeriteEssence(uint8 slot, uint32 azeriteEssenceId); +protected: void BuildValuesCreate(ByteBuffer* data, Player const* target) const override; void BuildValuesUpdate(ByteBuffer* data, Player const* target) const override; - void BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const override; void ClearUpdateMask(bool remove) override; +public: + void BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const override; + void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, UF::ItemData::Mask const& requestedItemMask, + UF::AzeriteItemData::Mask const& requestedAzeriteItemMask, Player const* target) const; + UF::UpdateField<UF::AzeriteItemData, 0, TYPEID_AZERITE_ITEM> m_azeriteItemData; private: diff --git a/src/server/game/Entities/Item/Container/Bag.cpp b/src/server/game/Entities/Item/Container/Bag.cpp index ccf44e3dc0d..f7216c89bd7 100644 --- a/src/server/game/Entities/Item/Container/Bag.cpp +++ b/src/server/game/Entities/Item/Container/Bag.cpp @@ -212,6 +212,41 @@ void Bag::BuildValuesUpdate(ByteBuffer* data, Player const* target) const data->put<uint32>(sizePos, data->wpos() - sizePos - 4); } +void Bag::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, + UF::ItemData::Mask const& requestedItemMask, UF::ContainerData::Mask const& requestedContainerMask, Player const* target) const +{ + UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask; + if (requestedObjectMask.IsAnySet()) + valuesMask.Set(TYPEID_OBJECT); + + UF::ItemData::Mask itemMask = requestedItemMask; + m_itemData->FilterDisallowedFieldsMaskForFlag(itemMask, flags); + if (itemMask.IsAnySet()) + valuesMask.Set(TYPEID_ITEM); + + if (requestedContainerMask.IsAnySet()) + valuesMask.Set(TYPEID_CONTAINER); + + 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_ITEM]) + m_itemData->WriteUpdate(buffer, itemMask, true, this, target); + + if (valuesMask[TYPEID_CONTAINER]) + m_containerData->WriteUpdate(buffer, requestedContainerMask, true, this, target); + + buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4); + + data->AddUpdateBlock(buffer); +} + void Bag::ClearUpdateMask(bool remove) { m_values.ClearChangesMask(&Bag::m_containerData); diff --git a/src/server/game/Entities/Item/Container/Bag.h b/src/server/game/Entities/Item/Container/Bag.h index 72074ea4911..6ef24ee9db1 100644 --- a/src/server/game/Entities/Item/Container/Bag.h +++ b/src/server/game/Entities/Item/Container/Bag.h @@ -56,11 +56,16 @@ class TC_GAME_API Bag : public Item // overwrite virtual Item::DeleteFromDB void DeleteFromDB(CharacterDatabaseTransaction& trans) override; + protected: void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const override; 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::ItemData::Mask const& requestedItemMask, + UF::ContainerData::Mask const& requestedContainerMask, Player const* target) const; + UF::UpdateField<UF::ContainerData, 0, TYPEID_CONTAINER> m_containerData; protected: diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index e0d19a8b86b..57be82a51ef 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1628,11 +1628,40 @@ void Item::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags UF::ItemData::Mask mask; m_itemData->AppendAllowedFieldsMaskForFlag(mask, flags); - m_itemData->WriteUpdate(*data, mask, flags, this, target); + m_itemData->WriteUpdate(*data, mask, true, this, target); data->put<uint32>(sizePos, data->wpos() - sizePos - 4); } +void Item::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, + UF::ItemData::Mask const& requestedItemMask, Player const* target) const +{ + UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target); + UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask; + if (requestedObjectMask.IsAnySet()) + valuesMask.Set(TYPEID_OBJECT); + + UF::ItemData::Mask itemMask = requestedItemMask; + m_itemData->FilterDisallowedFieldsMaskForFlag(itemMask, flags); + if (itemMask.IsAnySet()) + valuesMask.Set(TYPEID_ITEM); + + 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_ITEM]) + m_itemData->WriteUpdate(buffer, itemMask, true, this, target); + + buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4); + + data->AddUpdateBlock(buffer); +} + void Item::ClearUpdateMask(bool remove) { m_values.ClearChangesMask(&Item::m_itemData); diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index f9839baa41f..13f0cb7de66 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -373,11 +373,17 @@ class TC_GAME_API Item : public Object bool CheckSoulboundTradeExpire(); void BuildUpdate(UpdateDataMapType&) override; + + protected: 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; - void BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const override; void ClearUpdateMask(bool remove) override; + + public: + void BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const override; + void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, + UF::ItemData::Mask const& requestedItemMask, Player const* target) const; void AddToObjectUpdate() override; void RemoveFromObjectUpdate() override; |
