aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Item
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-04-23 20:22:53 +0200
committerShauren <shauren.trinity@gmail.com>2020-04-23 20:22:53 +0200
commitbbfbb7d4bfa869755e702b40b53dbd295f8c964d (patch)
treeba60af2e194c5f410cd8662ad324919fcd07cb48 /src/server/game/Entities/Item
parent51e99de4c6ae8039fece436494da38e9a992f531 (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')
-rw-r--r--src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp36
-rw-r--r--src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.h5
-rw-r--r--src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp42
-rw-r--r--src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h7
-rw-r--r--src/server/game/Entities/Item/Container/Bag.cpp35
-rw-r--r--src/server/game/Entities/Item/Container/Bag.h5
-rw-r--r--src/server/game/Entities/Item/Item.cpp31
-rw-r--r--src/server/game/Entities/Item/Item.h8
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;