aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-10-25 15:36:11 +0200
committerShauren <shauren.trinity@gmail.com>2024-10-25 15:36:11 +0200
commit067fa31d152ecb10e5bea0419f84f7b79b96abf5 (patch)
tree9b5921a62ff86259f613f6e8f1e3e9b294be14a8 /src
parent6dab3791ae7c810114ac1d5dbdd3b018813e2a97 (diff)
Core/PacketIO: Move writing data sizes in SMSG_UPDATE_OBJECT to shared functions instead of spreading it in all overrides
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp7
-rw-r--r--src/server/game/Entities/Conversation/Conversation.cpp7
-rw-r--r--src/server/game/Entities/Corpse/Corpse.cpp7
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp85
-rw-r--r--src/server/game/Entities/Creature/Creature.h21
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.cpp7
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp7
-rw-r--r--src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp7
-rw-r--r--src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp11
-rw-r--r--src/server/game/Entities/Item/Container/Bag.cpp7
-rw-r--r--src/server/game/Entities/Item/Item.cpp11
-rw-r--r--src/server/game/Entities/Item/Item.h2
-rw-r--r--src/server/game/Entities/Object/Object.cpp11
-rw-r--r--src/server/game/Entities/Player/Player.cpp12
-rw-r--r--src/server/game/Entities/SceneObject/SceneObject.cpp7
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp96
-rw-r--r--src/server/game/Entities/Unit/Unit.h21
17 files changed, 118 insertions, 208 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index ced2a3d813c..7c5d4530edf 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -1379,19 +1379,14 @@ bool AreaTrigger::IsNeverVisibleFor(WorldObject const* seer, bool allowServersid
void AreaTrigger::BuildValuesCreate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint8(flags);
m_objectData->WriteCreate(*data, flags, this, target);
m_areaTriggerData->WriteCreate(*data, flags, this, target);
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void AreaTrigger::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TYPEID_OBJECT))
@@ -1399,8 +1394,6 @@ void AreaTrigger::BuildValuesUpdate(ByteBuffer* data, Player const* target) cons
if (m_values.HasChanged(TYPEID_AREATRIGGER))
m_areaTriggerData->WriteUpdate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void AreaTrigger::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
diff --git a/src/server/game/Entities/Conversation/Conversation.cpp b/src/server/game/Entities/Conversation/Conversation.cpp
index 11801ca0763..03029d01a6d 100644
--- a/src/server/game/Entities/Conversation/Conversation.cpp
+++ b/src/server/game/Entities/Conversation/Conversation.cpp
@@ -350,19 +350,14 @@ uint32 Conversation::GetScriptId() const
void Conversation::BuildValuesCreate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint8(flags);
m_objectData->WriteCreate(*data, flags, this, target);
m_conversationData->WriteCreate(*data, flags, this, target);
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void Conversation::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TYPEID_OBJECT))
@@ -370,8 +365,6 @@ void Conversation::BuildValuesUpdate(ByteBuffer* data, Player const* target) con
if (m_values.HasChanged(TYPEID_CONVERSATION))
m_conversationData->WriteUpdate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void Conversation::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp
index fd21865c2c2..1d59850ac96 100644
--- a/src/server/game/Entities/Corpse/Corpse.cpp
+++ b/src/server/game/Entities/Corpse/Corpse.cpp
@@ -241,19 +241,14 @@ bool Corpse::IsExpired(time_t t) const
void Corpse::BuildValuesCreate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint8(flags);
m_objectData->WriteCreate(*data, flags, this, target);
m_corpseData->WriteCreate(*data, flags, this, target);
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void Corpse::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TYPEID_OBJECT))
@@ -261,8 +256,6 @@ void Corpse::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
if (m_values.HasChanged(TYPEID_CORPSE))
m_corpseData->WriteUpdate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void Corpse::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 652ee520ecb..14cfa015eb0 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -3770,3 +3770,88 @@ void Creature::InitializeInteractSpellId()
else
SetInteractSpellId(0);
}
+
+UF::UpdateFieldFlag Creature::GetUpdateFieldFlagsFor(Player const* target) const
+{
+ UF::UpdateFieldFlag flags = UF::UpdateFieldFlag::None;
+ if (GetOwnerGUID() == target->GetGUID())
+ flags |= UF::UpdateFieldFlag::Owner;
+
+ if (HasDynamicFlag(UNIT_DYNFLAG_SPECIALINFO))
+ if (HasAuraTypeWithCaster(SPELL_AURA_EMPATHY, target->GetGUID()))
+ flags |= UF::UpdateFieldFlag::Empath;
+
+ return flags;
+}
+
+void Creature::BuildValuesCreate(ByteBuffer* data, Player const* target) const
+{
+ UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
+ *data << uint8(flags);
+ m_objectData->WriteCreate(*data, flags, this, target);
+ m_unitData->WriteCreate(*data, flags, this, target);
+}
+
+void Creature::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
+{
+ UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
+ *data << uint32(m_values.GetChangedObjectTypeMask());
+
+ if (m_values.HasChanged(TYPEID_OBJECT))
+ m_objectData->WriteUpdate(*data, flags, this, target);
+
+ if (m_values.HasChanged(TYPEID_UNIT))
+ m_unitData->WriteUpdate(*data, flags, this, target);
+}
+
+void Creature::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const
+{
+ UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
+ valuesMask.Set(TYPEID_UNIT);
+
+ *data << uint32(valuesMask.GetBlock(0));
+
+ UF::UnitData::Mask mask;
+ m_unitData->AppendAllowedFieldsMaskForFlag(mask, flags);
+ m_unitData->WriteUpdate(*data, mask, true, this, target);
+}
+
+void Creature::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(data);
+ 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();
+}
+
+void Creature::ValuesUpdateForPlayerWithMaskSender::operator()(Player const* player) const
+{
+ UpdateData udata(Owner->GetMapId());
+ WorldPacket packet;
+
+ Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), UnitMask.GetChangesMask(), player);
+
+ udata.BuildPacket(&packet);
+ player->SendDirectMessage(&packet);
+}
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 643b721db17..550563c6ad2 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -469,6 +469,27 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
void SetInteractSpellId(int32 interactSpellId) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::InteractSpellID), interactSpellId); }
protected:
+ UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const* target) const final;
+ 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;
+
+ struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
+ {
+ explicit ValuesUpdateForPlayerWithMaskSender(Creature const* owner) : Owner(owner) { }
+
+ Creature const* Owner;
+ UF::ObjectData::Base ObjectMask;
+ UF::UnitData::Base UnitMask;
+
+ void operator()(Player const* player) const;
+ };
+
+ protected:
bool CreateFromProto(ObjectGuid::LowType guidlow, uint32 entry, CreatureData const* data = nullptr, uint32 vehId = 0);
bool InitEntry(uint32 entry, CreatureData const* data = nullptr);
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
index a36af445265..f354ef01cab 100644
--- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
@@ -255,19 +255,14 @@ SpellInfo const* DynamicObject::GetSpellInfo() const
void DynamicObject::BuildValuesCreate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint8(flags);
m_objectData->WriteCreate(*data, flags, this, target);
m_dynamicObjectData->WriteCreate(*data, flags, this, target);
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void DynamicObject::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TYPEID_OBJECT))
@@ -275,8 +270,6 @@ void DynamicObject::BuildValuesUpdate(ByteBuffer* data, Player const* target) co
if (m_values.HasChanged(TYPEID_DYNAMICOBJECT))
m_dynamicObjectData->WriteUpdate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void DynamicObject::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index a95b5989fac..d3a5fa4b4dc 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -4026,19 +4026,14 @@ GameObject* GameObject::GetLinkedTrap()
void GameObject::BuildValuesCreate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint8(flags);
m_objectData->WriteCreate(*data, flags, this, target);
m_gameObjectData->WriteCreate(*data, flags, this, target);
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void GameObject::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TYPEID_OBJECT))
@@ -4046,8 +4041,6 @@ void GameObject::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
if (m_values.HasChanged(TYPEID_GAMEOBJECT))
m_gameObjectData->WriteUpdate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void GameObject::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp b/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp
index c298536ba5d..481ed961849 100644
--- a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp
+++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp
@@ -157,20 +157,15 @@ int64 AzeriteEmpoweredItem::GetRespecCost() const
void AzeriteEmpoweredItem::BuildValuesCreate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint8(flags);
m_objectData->WriteCreate(*data, flags, this, target);
m_itemData->WriteCreate(*data, flags, this, target);
m_azeriteEmpoweredItemData->WriteCreate(*data, flags, this, target);
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void AzeriteEmpoweredItem::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TYPEID_OBJECT))
@@ -181,8 +176,6 @@ void AzeriteEmpoweredItem::BuildValuesUpdate(ByteBuffer* data, Player const* tar
if (m_values.HasChanged(TYPEID_AZERITE_EMPOWERED_ITEM))
m_azeriteEmpoweredItemData->WriteUpdate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void AzeriteEmpoweredItem::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp
index b167f8f7947..aec58210f56 100644
--- a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp
+++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp
@@ -392,20 +392,15 @@ void AzeriteItem::SetSelectedAzeriteEssence(uint8 slot, uint32 azeriteEssenceId)
void AzeriteItem::BuildValuesCreate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint8(flags);
m_objectData->WriteCreate(*data, flags, this, target);
m_itemData->WriteCreate(*data, flags, this, target);
m_azeriteItemData->WriteCreate(*data, flags, this, target);
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void AzeriteItem::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TYPEID_OBJECT))
@@ -416,8 +411,6 @@ void AzeriteItem::BuildValuesUpdate(ByteBuffer* data, Player const* target) cons
if (m_values.HasChanged(TYPEID_AZERITE_ITEM))
m_azeriteItemData->WriteUpdate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void AzeriteItem::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const
@@ -426,8 +419,6 @@ void AzeriteItem::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFla
valuesMask.Set(TYPEID_ITEM);
valuesMask.Set(TYPEID_AZERITE_ITEM);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(valuesMask.GetBlock(0));
UF::ItemData::Mask mask;
@@ -437,8 +428,6 @@ void AzeriteItem::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFla
UF::AzeriteItemData::Mask mask2;
m_azeriteItemData->AppendAllowedFieldsMaskForFlag(mask2, flags);
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,
diff --git a/src/server/game/Entities/Item/Container/Bag.cpp b/src/server/game/Entities/Item/Container/Bag.cpp
index 1d26d1d6150..a949dd6a0f0 100644
--- a/src/server/game/Entities/Item/Container/Bag.cpp
+++ b/src/server/game/Entities/Item/Container/Bag.cpp
@@ -185,20 +185,15 @@ void Bag::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) cons
void Bag::BuildValuesCreate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint8(flags);
m_objectData->WriteCreate(*data, flags, this, target);
m_itemData->WriteCreate(*data, flags, this, target);
m_containerData->WriteCreate(*data, flags, this, target);
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void Bag::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TYPEID_OBJECT))
@@ -209,8 +204,6 @@ void Bag::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
if (m_values.HasChanged(TYPEID_CONTAINER))
m_containerData->WriteUpdate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void Bag::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index f426e81ded6..67b5ee0200d 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -1707,19 +1707,14 @@ UF::UpdateFieldFlag Item::GetUpdateFieldFlagsFor(Player const* target) const
void Item::BuildValuesCreate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint8(flags);
m_objectData->WriteCreate(*data, flags, this, target);
m_itemData->WriteCreate(*data, flags, this, target);
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void Item::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TYPEID_OBJECT))
@@ -1727,8 +1722,6 @@ void Item::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
if (m_values.HasChanged(TYPEID_ITEM))
m_itemData->WriteUpdate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void Item::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const
@@ -1736,15 +1729,11 @@ void Item::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
valuesMask.Set(TYPEID_ITEM);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(valuesMask.GetBlock(0));
UF::ItemData::Mask mask;
m_itemData->AppendAllowedFieldsMaskForFlag(mask, flags);
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,
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index f0e3b3216a5..7df8b8534ac 100644
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -377,7 +377,7 @@ class TC_GAME_API Item : public Object
void BuildUpdate(UpdateDataMapType&) override;
protected:
- UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const* target) const override;
+ UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const* target) const final;
void BuildValuesCreate(ByteBuffer* data, Player const* target) const override;
void BuildValuesUpdate(ByteBuffer* data, Player const* target) const override;
void ClearUpdateMask(bool remove) override;
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 1cc56f3969f..90a33683a5e 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -177,7 +177,12 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
buf << uint8(objectType);
BuildMovementUpdate(&buf, flags, target);
+
+ std::size_t sizePos = buf.wpos();
+ buf << uint32(0);
BuildValuesCreate(&buf, target);
+ buf.put<uint32>(sizePos, buf.wpos() - sizePos - 4);
+
data->AddUpdateBlock();
}
@@ -199,7 +204,10 @@ void Object::BuildValuesUpdateBlockForPlayer(UpdateData* data, Player const* tar
{
ByteBuffer& buf = PrepareValuesUpdateBuffer(data);
+ std::size_t sizePos = buf.wpos();
+ buf << uint32(0);
BuildValuesUpdate(&buf, target);
+ buf.put<uint32>(sizePos, buf.wpos() - sizePos - 4);
data->AddUpdateBlock();
}
@@ -208,7 +216,10 @@ void Object::BuildValuesUpdateBlockForPlayerWithFlag(UpdateData* data, UF::Updat
{
ByteBuffer& buf = PrepareValuesUpdateBuffer(data);
+ std::size_t sizePos = buf.wpos();
+ buf << uint32(0);
BuildValuesUpdateWithFlag(&buf, flags, target);
+ buf.put<uint32>(sizePos, buf.wpos() - sizePos - 4);
data->AddUpdateBlock();
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index fa15f098ec8..468c611d30a 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -3647,23 +3647,17 @@ UF::UpdateFieldFlag Player::GetUpdateFieldFlagsFor(Player const* target) const
void Player::BuildValuesCreate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint8(flags);
m_objectData->WriteCreate(*data, flags, this, target);
m_unitData->WriteCreate(*data, flags, this, target);
m_playerData->WriteCreate(*data, flags, this, target);
if (target == this)
m_activePlayerData->WriteCreate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void Player::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(m_values.GetChangedObjectTypeMask() & ~(uint32(target != this) << TYPEID_ACTIVE_PLAYER));
if (m_values.HasChanged(TYPEID_OBJECT))
@@ -3677,8 +3671,6 @@ void Player::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
if (target == this && m_values.HasChanged(TYPEID_ACTIVE_PLAYER))
m_activePlayerData->WriteUpdate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void Player::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const
@@ -3687,8 +3679,6 @@ void Player::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag fla
valuesMask.Set(TYPEID_UNIT);
valuesMask.Set(TYPEID_PLAYER);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(valuesMask.GetBlock(0));
UF::UnitData::Mask mask;
@@ -3698,8 +3688,6 @@ void Player::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag fla
UF::PlayerData::Mask mask2;
m_playerData->AppendAllowedFieldsMaskForFlag(mask2, flags);
m_playerData->WriteUpdate(*data, mask2, true, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void Player::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
diff --git a/src/server/game/Entities/SceneObject/SceneObject.cpp b/src/server/game/Entities/SceneObject/SceneObject.cpp
index fb2942e44dc..e1ccc771db0 100644
--- a/src/server/game/Entities/SceneObject/SceneObject.cpp
+++ b/src/server/game/Entities/SceneObject/SceneObject.cpp
@@ -139,19 +139,14 @@ bool SceneObject::Create(ObjectGuid::LowType lowGuid, SceneType type, uint32 sce
void SceneObject::BuildValuesCreate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint8(flags);
m_objectData->WriteCreate(*data, flags, this, target);
m_sceneObjectData->WriteCreate(*data, flags, this, target);
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void SceneObject::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
*data << uint32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TYPEID_OBJECT))
@@ -159,8 +154,6 @@ void SceneObject::BuildValuesUpdate(ByteBuffer* data, Player const* target) cons
if (m_values.HasChanged(TYPEID_SCENEOBJECT))
m_sceneObjectData->WriteUpdate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
}
void SceneObject::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 91731cc0a98..fe0b7bd931c 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -13749,102 +13749,6 @@ bool Unit::IsSplineEnabled() const
return movespline->Initialized() && !movespline->Finalized();
}
-UF::UpdateFieldFlag Unit::GetUpdateFieldFlagsFor(Player const* target) const
-{
- UF::UpdateFieldFlag flags = UF::UpdateFieldFlag::None;
- if (target == this || GetOwnerGUID() == target->GetGUID())
- flags |= UF::UpdateFieldFlag::Owner;
-
- if (HasDynamicFlag(UNIT_DYNFLAG_SPECIALINFO))
- if (HasAuraTypeWithCaster(SPELL_AURA_EMPATHY, target->GetGUID()))
- flags |= UF::UpdateFieldFlag::Empath;
-
- return flags;
-}
-
-void Unit::BuildValuesCreate(ByteBuffer* data, Player const* target) const
-{
- UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
- *data << uint8(flags);
- m_objectData->WriteCreate(*data, flags, this, target);
- m_unitData->WriteCreate(*data, flags, this, target);
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
-}
-
-void Unit::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
-{
- UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
- *data << uint32(m_values.GetChangedObjectTypeMask());
-
- if (m_values.HasChanged(TYPEID_OBJECT))
- m_objectData->WriteUpdate(*data, flags, this, target);
-
- if (m_values.HasChanged(TYPEID_UNIT))
- m_unitData->WriteUpdate(*data, flags, this, target);
-
- data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
-}
-
-void Unit::BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const
-{
- UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
- valuesMask.Set(TYPEID_UNIT);
-
- std::size_t sizePos = data->wpos();
- *data << uint32(0);
- *data << uint32(valuesMask.GetBlock(0));
-
- UF::UnitData::Mask mask;
- m_unitData->AppendAllowedFieldsMaskForFlag(mask, flags);
- 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(data);
- 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();
-}
-
-void Unit::ValuesUpdateForPlayerWithMaskSender::operator()(Player const* player) const
-{
- UpdateData udata(Owner->GetMapId());
- WorldPacket packet;
-
- Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), UnitMask.GetChangesMask(), player);
-
- udata.BuildPacket(&packet);
- player->SendDirectMessage(&packet);
-}
-
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 03564f43315..e40827ece4e 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1841,27 +1841,6 @@ class TC_GAME_API Unit : public WorldObject
protected:
explicit Unit (bool isWorldObject);
- 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;
-
- struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
- {
- explicit ValuesUpdateForPlayerWithMaskSender(Unit const* owner) : Owner(owner) { }
-
- Unit const* Owner;
- UF::ObjectData::Base ObjectMask;
- UF::UnitData::Base UnitMask;
-
- void operator()(Player const* player) const;
- };
-
- protected:
void DestroyForPlayer(Player* target) const override;
void ClearUpdateMask(bool remove) override;