diff options
Diffstat (limited to 'src/server')
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; | 
