diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-10-25 15:36:11 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-10-25 15:36:11 +0200 |
| commit | 067fa31d152ecb10e5bea0419f84f7b79b96abf5 (patch) | |
| tree | 9b5921a62ff86259f613f6e8f1e3e9b294be14a8 /src/server/game/Entities/Creature | |
| parent | 6dab3791ae7c810114ac1d5dbdd3b018813e2a97 (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.cpp | 85 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 21 |
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); |
