mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-21 23:38:54 -04:00
Core/PacketIO: Move writing data sizes in SMSG_UPDATE_OBJECT to shared functions instead of spreading it in all overrides
(cherry picked from commit 067fa31d15)
# Conflicts:
# src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp
# src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp
This commit is contained in:
@@ -1370,19 +1370,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))
|
||||
@@ -1390,8 +1385,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,
|
||||
|
||||
@@ -339,19 +339,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))
|
||||
@@ -359,8 +354,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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -3583,3 +3583,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);
|
||||
}
|
||||
|
||||
@@ -457,6 +457,27 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
|
||||
void InitializeInteractSpellId();
|
||||
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);
|
||||
|
||||
@@ -254,19 +254,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))
|
||||
@@ -274,8 +269,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,
|
||||
|
||||
@@ -3973,19 +3973,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))
|
||||
@@ -3993,8 +3988,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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -1419,19 +1419,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))
|
||||
@@ -1439,8 +1434,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
|
||||
@@ -1448,15 +1441,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,
|
||||
|
||||
@@ -323,7 +323,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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -3281,23 +3281,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))
|
||||
@@ -3311,8 +3305,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
|
||||
@@ -3321,8 +3313,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;
|
||||
@@ -3332,8 +3322,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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -13770,102 +13770,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())
|
||||
|
||||
@@ -1825,27 +1825,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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user