aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Creature
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/server/game/Entities/Creature
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/server/game/Entities/Creature')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp85
-rw-r--r--src/server/game/Entities/Creature/Creature.h21
2 files changed, 106 insertions, 0 deletions
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);