Core/Objects: Add ignoreNestedChangesMask argument to BuildValuesUpdateForPlayerWithMask functions

This commit is contained in:
luis
2026-03-21 00:04:33 -03:00
parent ab7ba67bcd
commit 197894449f
24 changed files with 149 additions and 130 deletions
@@ -1550,7 +1550,7 @@ void AreaTrigger::BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& data,
}
void AreaTrigger::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::AreaTriggerData::Mask const& requestedAreaTriggerMask, Player const* target) const
UF::AreaTriggerData::Mask const& requestedAreaTriggerMask, Player const* target, bool ignoreNestedChangesMask) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
@@ -1567,10 +1567,10 @@ void AreaTrigger::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::Objec
buffer << uint32(valuesMask.GetBlock(0));
if (valuesMask[TYPEID_OBJECT])
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, true);
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_AREATRIGGER])
m_areaTriggerData->WriteUpdate(requestedAreaTriggerMask, buffer, target, this, true);
m_areaTriggerData->WriteUpdate(requestedAreaTriggerMask, buffer, target, this, ignoreNestedChangesMask);
buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
@@ -1582,7 +1582,7 @@ void AreaTrigger::ValuesUpdateForPlayerWithMaskSender::operator()(Player const*
UpdateData udata(Owner->GetMapId());
WorldPacket packet;
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), AreaTriggerMask.GetChangesMask(), player);
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), AreaTriggerMask.GetChangesMask(), player, IgnoreNestedChangesMask);
udata.BuildPacket(&packet);
player->SendDirectMessage(&packet);
@@ -84,15 +84,16 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
public:
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::AreaTriggerData::Mask const& requestedAreaTriggerMask, Player const* target) const;
UF::AreaTriggerData::Mask const& requestedAreaTriggerMask, Player const* target, bool ignoreNestedChangesMask) const;
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(AreaTrigger const* owner) : Owner(owner) { }
explicit ValuesUpdateForPlayerWithMaskSender(AreaTrigger const* owner) : Owner(owner), IgnoreNestedChangesMask(false) {}
AreaTrigger const* Owner;
UF::ObjectData::Base ObjectMask;
UF::AreaTriggerData::Base AreaTriggerMask;
bool IgnoreNestedChangesMask;
void operator()(Player const* player) const;
};
@@ -388,7 +388,7 @@ void Conversation::BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& data
}
void Conversation::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::ConversationData::Mask const& requestedConversationMask, Player const* target) const
UF::ConversationData::Mask const& requestedConversationMask, Player const* target, bool ignoreNestedChangesMask) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
@@ -405,10 +405,10 @@ void Conversation::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::Obje
buffer << uint32(valuesMask.GetBlock(0));
if (valuesMask[TYPEID_OBJECT])
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, true);
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_CONVERSATION])
m_conversationData->WriteUpdate(requestedConversationMask, buffer, target, this, true);
m_conversationData->WriteUpdate(requestedConversationMask, buffer, target, this, ignoreNestedChangesMask);
buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
@@ -420,7 +420,7 @@ void Conversation::ValuesUpdateForPlayerWithMaskSender::operator()(Player const*
UpdateData udata(Owner->GetMapId());
WorldPacket packet;
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), ConversationMask.GetChangesMask(), player);
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), ConversationMask.GetChangesMask(), player, IgnoreNestedChangesMask);
udata.BuildPacket(&packet);
player->SendDirectMessage(&packet);
@@ -39,15 +39,16 @@ class TC_GAME_API Conversation final : public WorldObject, public GridObject<Con
public:
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::ConversationData::Mask const& requestedConversationMask, Player const* target) const;
UF::ConversationData::Mask const& requestedConversationMask, Player const* target, bool ignoreNestedChangesMask) const;
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(Conversation const* owner) : Owner(owner) { }
explicit ValuesUpdateForPlayerWithMaskSender(Conversation const* owner) : Owner(owner), IgnoreNestedChangesMask(false) {}
Conversation const* Owner;
UF::ObjectData::Base ObjectMask;
UF::ConversationData::Base ConversationMask;
bool IgnoreNestedChangesMask;
void operator()(Player const* player) const;
};
+4 -4
View File
@@ -258,7 +258,7 @@ void Corpse::BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& data, Play
}
void Corpse::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::CorpseData::Mask const& requestedCorpseMask, Player const* target) const
UF::CorpseData::Mask const& requestedCorpseMask, Player const* target, bool ignoreNestedChangesMask) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
@@ -275,10 +275,10 @@ void Corpse::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData
buffer << uint32(valuesMask.GetBlock(0));
if (valuesMask[TYPEID_OBJECT])
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, true);
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_CORPSE])
m_corpseData->WriteUpdate(requestedCorpseMask, buffer, target, this, true);
m_corpseData->WriteUpdate(requestedCorpseMask, buffer, target, this, ignoreNestedChangesMask);
buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
@@ -290,7 +290,7 @@ void Corpse::ValuesUpdateForPlayerWithMaskSender::operator()(Player const* playe
UpdateData udata(Owner->GetMapId());
WorldPacket packet;
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), CorpseMask.GetChangesMask(), player);
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), CorpseMask.GetChangesMask(), player, IgnoreNestedChangesMask);
udata.BuildPacket(&packet);
player->SendDirectMessage(&packet);
+3 -2
View File
@@ -62,15 +62,16 @@ class TC_GAME_API Corpse final : public WorldObject, public GridObject<Corpse>
public:
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::CorpseData::Mask const& requestedCorpseMask, Player const* target) const;
UF::CorpseData::Mask const& requestedCorpseMask, Player const* target, bool ignoreNestedChangesMask) const;
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(Corpse const* owner) : Owner(owner) { }
explicit ValuesUpdateForPlayerWithMaskSender(Corpse const* owner) : Owner(owner), IgnoreNestedChangesMask(false) {}
Corpse const* Owner;
UF::ObjectData::Base ObjectMask;
UF::CorpseData::Base CorpseMask;
bool IgnoreNestedChangesMask;
void operator()(Player const* player) const;
};
@@ -3960,7 +3960,7 @@ void Creature::BuildValuesUpdateWithFlag(UF::UpdateFieldFlag flags, ByteBuffer&
}
void Creature::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::UnitData::Mask const& requestedUnitMask, Player const* target) const
UF::UnitData::Mask const& requestedUnitMask, Player const* target, bool ignoreNestedChangesMask) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
@@ -3979,10 +3979,10 @@ void Creature::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectDa
buffer << uint32(valuesMask.GetBlock(0));
if (valuesMask[TYPEID_OBJECT])
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, true);
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_UNIT])
m_unitData->WriteUpdate(unitMask, buffer, target, this, true);
m_unitData->WriteUpdate(unitMask, buffer, target, this, ignoreNestedChangesMask);
buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
@@ -3994,7 +3994,7 @@ void Creature::ValuesUpdateForPlayerWithMaskSender::operator()(Player const* pla
UpdateData udata(Owner->GetMapId());
WorldPacket packet;
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), UnitMask.GetChangesMask(), player);
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), UnitMask.GetChangesMask(), player, IgnoreNestedChangesMask);
udata.BuildPacket(&packet);
player->SendDirectMessage(&packet);
+3 -2
View File
@@ -504,15 +504,16 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
public:
void BuildValuesUpdateWithFlag(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::UnitData::Mask const& requestedUnitMask, Player const* target) const;
UF::UnitData::Mask const& requestedUnitMask, Player const* target, bool ignoreNestedChangesMask) const;
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(Creature const* owner) : Owner(owner) { }
explicit ValuesUpdateForPlayerWithMaskSender(Creature const* owner) : Owner(owner), IgnoreNestedChangesMask(false) {}
Creature const* Owner;
UF::ObjectData::Base ObjectMask;
UF::UnitData::Base UnitMask;
bool IgnoreNestedChangesMask;
void operator()(Player const* player) const;
};
@@ -267,7 +267,7 @@ void DynamicObject::BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& dat
}
void DynamicObject::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::DynamicObjectData::Mask const& requestedDynamicObjectMask, Player const* target) const
UF::DynamicObjectData::Mask const& requestedDynamicObjectMask, Player const* target, bool ignoreNestedChangesMask) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
@@ -284,10 +284,10 @@ void DynamicObject::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::Obj
buffer << uint32(valuesMask.GetBlock(0));
if (valuesMask[TYPEID_OBJECT])
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, true);
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_DYNAMICOBJECT])
m_dynamicObjectData->WriteUpdate(requestedDynamicObjectMask, buffer, target, this, true);
m_dynamicObjectData->WriteUpdate(requestedDynamicObjectMask, buffer, target, this, ignoreNestedChangesMask);
buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
@@ -299,7 +299,7 @@ void DynamicObject::ValuesUpdateForPlayerWithMaskSender::operator()(Player const
UpdateData udata(Owner->GetMapId());
WorldPacket packet;
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), DynamicObjectMask.GetChangesMask(), player);
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), DynamicObjectMask.GetChangesMask(), player, IgnoreNestedChangesMask);
udata.BuildPacket(&packet);
player->SendDirectMessage(&packet);
@@ -46,15 +46,16 @@ class TC_GAME_API DynamicObject final : public WorldObject, public GridObject<Dy
public:
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::DynamicObjectData::Mask const& requestedDynamicObjectMask, Player const* target) const;
UF::DynamicObjectData::Mask const& requestedDynamicObjectMask, Player const* target, bool ignoreNestedChangesMask) const;
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(DynamicObject const* owner) : Owner(owner) { }
explicit ValuesUpdateForPlayerWithMaskSender(DynamicObject const* owner) : Owner(owner), IgnoreNestedChangesMask(false) {}
DynamicObject const* Owner;
UF::ObjectData::Base ObjectMask;
UF::DynamicObjectData::Base DynamicObjectMask;
bool IgnoreNestedChangesMask;
void operator()(Player const* player) const;
};
@@ -1326,7 +1326,7 @@ void GameObject::Update(uint32 diff)
goMask.MarkChanged(&UF::GameObjectData::State);
UpdateData udata(GetMapId());
BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), goMask.GetChangesMask(), seer);
BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), goMask.GetChangesMask(), seer, false);
WorldPacket packet;
udata.BuildPacket(&packet);
seer->SendDirectMessage(&packet);
@@ -3994,7 +3994,7 @@ void GameObject::OnLootRelease(Player* looter)
objMask.MarkChanged(&UF::ObjectData::DynamicFlags);
UpdateData udata(GetMapId());
BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), goMask.GetChangesMask(), looter);
BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), goMask.GetChangesMask(), looter, false);
WorldPacket packet;
udata.BuildPacket(&packet);
looter->SendDirectMessage(&packet);
@@ -4199,7 +4199,7 @@ void GameObject::BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& data,
}
void GameObject::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::GameObjectData::Mask const& requestedGameObjectMask, Player const* target) const
UF::GameObjectData::Mask const& requestedGameObjectMask, Player const* target, bool ignoreNestedChangesMask) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
@@ -4216,10 +4216,10 @@ void GameObject::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::Object
buffer << uint32(valuesMask.GetBlock(0));
if (valuesMask[TYPEID_OBJECT])
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, true);
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_GAMEOBJECT])
m_gameObjectData->WriteUpdate(requestedGameObjectMask, buffer, target, this, true);
m_gameObjectData->WriteUpdate(requestedGameObjectMask, buffer, target, this, ignoreNestedChangesMask);
buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
@@ -4231,7 +4231,7 @@ void GameObject::ValuesUpdateForPlayerWithMaskSender::operator()(Player const* p
UpdateData udata(Owner->GetMapId());
WorldPacket packet;
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), GameObjectMask.GetChangesMask(), player);
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), GameObjectMask.GetChangesMask(), player, IgnoreNestedChangesMask);
udata.BuildPacket(&packet);
player->SendDirectMessage(&packet);
@@ -175,15 +175,16 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject>
public:
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::GameObjectData::Mask const& requestedGameObjectMask, Player const* target) const;
UF::GameObjectData::Mask const& requestedGameObjectMask, Player const* target, bool ignoreNestedChangesMask) const;
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(GameObject const* owner) : Owner(owner) { }
explicit ValuesUpdateForPlayerWithMaskSender(GameObject const* owner) : Owner(owner), IgnoreNestedChangesMask(false) {}
GameObject const* Owner;
UF::ObjectData::Base ObjectMask;
UF::GameObjectData::Base GameObjectMask;
bool IgnoreNestedChangesMask;
void operator()(Player const* player) const;
};
@@ -178,7 +178,8 @@ void AzeriteEmpoweredItem::BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuff
}
void AzeriteEmpoweredItem::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::ItemData::Mask const& requestedItemMask, UF::AzeriteEmpoweredItemData::Mask const& requestedAzeriteEmpoweredItemMask, Player const* target) const
UF::ItemData::Mask const& requestedItemMask, UF::AzeriteEmpoweredItemData::Mask const& requestedAzeriteEmpoweredItemMask,
Player const* target, bool ignoreNestedChangesMask) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
@@ -200,13 +201,13 @@ void AzeriteEmpoweredItem::BuildValuesUpdateForPlayerWithMask(UpdateData* data,
buffer << uint32(valuesMask.GetBlock(0));
if (valuesMask[TYPEID_OBJECT])
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, true);
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_ITEM])
m_itemData->WriteUpdate(itemMask, buffer, target, this, true);
m_itemData->WriteUpdate(itemMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_AZERITE_EMPOWERED_ITEM])
m_azeriteEmpoweredItemData->WriteUpdate(requestedAzeriteEmpoweredItemMask, buffer, target, this, true);
m_azeriteEmpoweredItemData->WriteUpdate(requestedAzeriteEmpoweredItemMask, buffer, target, this, ignoreNestedChangesMask);
buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
@@ -218,7 +219,8 @@ void AzeriteEmpoweredItem::ValuesUpdateForPlayerWithMaskSender::operator()(Playe
UpdateData udata(player->GetMapId());
WorldPacket packet;
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), ItemMask.GetChangesMask(), AzeriteEmpoweredItemMask.GetChangesMask(), player);
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), ItemMask.GetChangesMask(), AzeriteEmpoweredItemMask.GetChangesMask(),
player, IgnoreNestedChangesMask);
udata.BuildPacket(&packet);
player->SendDirectMessage(&packet);
@@ -49,16 +49,17 @@ protected:
public:
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, UF::ItemData::Mask const& requestedItemMask,
UF::AzeriteEmpoweredItemData::Mask const& requestedAzeriteEmpoweredItemMask, Player const* target) const;
UF::AzeriteEmpoweredItemData::Mask const& requestedAzeriteEmpoweredItemMask, Player const* target, bool ignoreNestedChangesMask) const;
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(AzeriteEmpoweredItem const* owner) : Owner(owner) { }
explicit ValuesUpdateForPlayerWithMaskSender(AzeriteEmpoweredItem const* owner) : Owner(owner), IgnoreNestedChangesMask(false) {}
AzeriteEmpoweredItem const* Owner;
UF::ObjectData::Base ObjectMask;
UF::ItemData::Base ItemMask;
UF::AzeriteEmpoweredItemData::Base AzeriteEmpoweredItemMask;
bool IgnoreNestedChangesMask;
void operator()(Player const* player) const;
};
@@ -430,7 +430,8 @@ void AzeriteItem::BuildValuesUpdateWithFlag(UF::UpdateFieldFlag flags, ByteBuffe
}
void AzeriteItem::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::ItemData::Mask const& requestedItemMask, UF::AzeriteItemData::Mask const& requestedAzeriteItemMask, Player const* target) const
UF::ItemData::Mask const& requestedItemMask, UF::AzeriteItemData::Mask const& requestedAzeriteItemMask,
Player const* target, bool ignoreNestedChangesMask) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
@@ -454,13 +455,13 @@ void AzeriteItem::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::Objec
buffer << uint32(valuesMask.GetBlock(0));
if (valuesMask[TYPEID_OBJECT])
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, true);
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_ITEM])
m_itemData->WriteUpdate(itemMask, buffer, target, this, true);
m_itemData->WriteUpdate(itemMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_AZERITE_ITEM])
m_azeriteItemData->WriteUpdate(azeriteItemMask, buffer, target, this, true);
m_azeriteItemData->WriteUpdate(azeriteItemMask, buffer, target, this, ignoreNestedChangesMask);
buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
@@ -472,7 +473,8 @@ void AzeriteItem::ValuesUpdateForPlayerWithMaskSender::operator()(Player const*
UpdateData udata(player->GetMapId());
WorldPacket packet;
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), ItemMask.GetChangesMask(), AzeriteItemMask.GetChangesMask(), player);
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), ItemMask.GetChangesMask(), AzeriteItemMask.GetChangesMask(),
player, IgnoreNestedChangesMask);
udata.BuildPacket(&packet);
player->SendDirectMessage(&packet);
@@ -81,16 +81,17 @@ protected:
public:
void BuildValuesUpdateWithFlag(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, UF::ItemData::Mask const& requestedItemMask,
UF::AzeriteItemData::Mask const& requestedAzeriteItemMask, Player const* target) const;
UF::AzeriteItemData::Mask const& requestedAzeriteItemMask, Player const* target, bool ignoreNestedChangesMask) const;
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(AzeriteItem const* owner) : Owner(owner) { }
explicit ValuesUpdateForPlayerWithMaskSender(AzeriteItem const* owner) : Owner(owner), IgnoreNestedChangesMask(false) {}
AzeriteItem const* Owner;
UF::ObjectData::Base ObjectMask;
UF::ItemData::Base ItemMask;
UF::AzeriteItemData::Base AzeriteItemMask;
bool IgnoreNestedChangesMask;
void operator()(Player const* player) const;
};
@@ -24,7 +24,7 @@
#include "UpdateData.h"
#include "WorldPacket.h"
Bag::Bag(): Item()
Bag::Bag() : Item()
{
m_objectTypeId = TYPEID_CONTAINER;
@@ -140,7 +140,7 @@ void Bag::DeleteFromDB(CharacterDatabaseTransaction trans)
uint32 Bag::GetFreeSlots() const
{
uint32 slots = 0;
for (uint32 i=0; i < GetBagSize(); ++i)
for (uint32 i = 0; i < GetBagSize(); ++i)
if (!m_bagslot[i])
++slots;
@@ -204,7 +204,8 @@ void Bag::BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player
}
void Bag::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::ItemData::Mask const& requestedItemMask, UF::ContainerData::Mask const& requestedContainerMask, Player const* target) const
UF::ItemData::Mask const& requestedItemMask, UF::ContainerData::Mask const& requestedContainerMask,
Player const* target, bool ignoreNestedChangesMask) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
@@ -226,13 +227,13 @@ void Bag::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::M
buffer << uint32(valuesMask.GetBlock(0));
if (valuesMask[TYPEID_OBJECT])
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, true);
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_ITEM])
m_itemData->WriteUpdate(itemMask, buffer, target, this, true);
m_itemData->WriteUpdate(itemMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_CONTAINER])
m_containerData->WriteUpdate(requestedContainerMask, buffer, target, this, true);
m_containerData->WriteUpdate(requestedContainerMask, buffer, target, this, ignoreNestedChangesMask);
buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
@@ -244,7 +245,8 @@ void Bag::ValuesUpdateForPlayerWithMaskSender::operator()(Player const* player)
UpdateData udata(player->GetMapId());
WorldPacket packet;
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), ItemMask.GetChangesMask(), ContainerMask.GetChangesMask(), player);
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), ItemMask.GetChangesMask(), ContainerMask.GetChangesMask(),
player, IgnoreNestedChangesMask);
udata.BuildPacket(&packet);
player->SendDirectMessage(&packet);
+45 -44
View File
@@ -18,70 +18,71 @@
#ifndef TRINITY_BAG_H
#define TRINITY_BAG_H
// Maximum 98 Slots ((CONTAINER_END - CONTAINER_FIELD_SLOT_1)/2
// Maximum 98 Slots ((CONTAINER_END - CONTAINER_FIELD_SLOT_1)/2
#define MAX_BAG_SIZE 98 // 11.0.0
#include "Item.h"
class TC_GAME_API Bag : public Item
{
public:
Bag();
~Bag();
public:
Bag();
~Bag();
void AddToWorld() override;
void RemoveFromWorld() override;
void AddToWorld() override;
void RemoveFromWorld() override;
bool Create(ObjectGuid::LowType guidlow, uint32 itemid, ItemContext context, Player const* owner) override;
bool Create(ObjectGuid::LowType guidlow, uint32 itemid, ItemContext context, Player const* owner) override;
void StoreItem(uint8 slot, Item* pItem, bool update);
void RemoveItem(uint8 slot, bool update);
void StoreItem(uint8 slot, Item* pItem, bool update);
void RemoveItem(uint8 slot, bool update);
Item* GetItemByPos(uint8 slot) const;
Item* GetItemByPos(uint8 slot) const;
uint8 GetSlotByItemGUID(ObjectGuid guid) const;
bool IsEmpty() const;
uint32 GetFreeSlots() const;
uint32 GetBagSize() const { return m_containerData->NumSlots; }
uint8 GetSlotByItemGUID(ObjectGuid guid) const;
bool IsEmpty() const;
uint32 GetFreeSlots() const;
uint32 GetBagSize() const { return m_containerData->NumSlots; }
// DB operations
// overwrite virtual Item::SaveToDB
void SaveToDB(CharacterDatabaseTransaction trans) override;
// overwrite virtual Item::LoadFromDB
bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fields, uint32 entry) override;
// overwrite virtual Item::DeleteFromDB
void DeleteFromDB(CharacterDatabaseTransaction trans) override;
// DB operations
// overwrite virtual Item::SaveToDB
void SaveToDB(CharacterDatabaseTransaction trans) override;
// overwrite virtual Item::LoadFromDB
bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fields, uint32 entry) override;
// overwrite virtual Item::DeleteFromDB
void DeleteFromDB(CharacterDatabaseTransaction trans) override;
protected:
void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const override;
void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
void ClearValuesChangesMask() override;
protected:
void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const override;
void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
void ClearValuesChangesMask() override;
public:
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, UF::ItemData::Mask const& requestedItemMask,
UF::ContainerData::Mask const& requestedContainerMask, Player const* target) const;
public:
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, UF::ItemData::Mask const& requestedItemMask,
UF::ContainerData::Mask const& requestedContainerMask, Player const* target, bool ignoreNestedChangesMask) const;
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(Bag const* owner) : Owner(owner) { }
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(Bag const* owner) : Owner(owner), IgnoreNestedChangesMask(false) {}
Bag const* Owner;
UF::ObjectData::Base ObjectMask;
UF::ItemData::Base ItemMask;
UF::ContainerData::Base ContainerMask;
Bag const* Owner;
UF::ObjectData::Base ObjectMask;
UF::ItemData::Base ItemMask;
UF::ContainerData::Base ContainerMask;
bool IgnoreNestedChangesMask;
void operator()(Player const* player) const;
};
void operator()(Player const* player) const;
};
UF::UpdateField<UF::ContainerData, int32(WowCS::EntityFragment::CGObject), TYPEID_CONTAINER> m_containerData;
UF::UpdateField<UF::ContainerData, int32(WowCS::EntityFragment::CGObject), TYPEID_CONTAINER> m_containerData;
protected:
void SetBagSize(uint32 numSlots) { SetUpdateFieldValue(m_values.ModifyValue(&Bag::m_containerData).ModifyValue(&UF::ContainerData::NumSlots), numSlots); }
void SetSlot(uint32 slot, ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(&Bag::m_containerData).ModifyValue(&UF::ContainerData::Slots, slot), guid); }
protected:
void SetBagSize(uint32 numSlots) { SetUpdateFieldValue(m_values.ModifyValue(&Bag::m_containerData).ModifyValue(&UF::ContainerData::NumSlots), numSlots); }
void SetSlot(uint32 slot, ObjectGuid guid) { SetUpdateFieldValue(m_values.ModifyValue(&Bag::m_containerData).ModifyValue(&UF::ContainerData::Slots, slot), guid); }
// Bag Storage space
Item* m_bagslot[MAX_BAG_SIZE];
// Bag Storage space
Item* m_bagslot[MAX_BAG_SIZE];
};
#endif
+4 -4
View File
@@ -1836,7 +1836,7 @@ void Item::BuildValuesUpdateWithFlag(UF::UpdateFieldFlag flags, ByteBuffer& data
}
void Item::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::ItemData::Mask const& requestedItemMask, Player const* target) const
UF::ItemData::Mask const& requestedItemMask, Player const* target, bool ignoreNestedChangesMask) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
@@ -1855,10 +1855,10 @@ void Item::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::
buffer << uint32(valuesMask.GetBlock(0));
if (valuesMask[TYPEID_OBJECT])
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, true);
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_ITEM])
m_itemData->WriteUpdate(itemMask, buffer, target, this, true);
m_itemData->WriteUpdate(itemMask, buffer, target, this, ignoreNestedChangesMask);
buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
@@ -1870,7 +1870,7 @@ void Item::ValuesUpdateForPlayerWithMaskSender::operator()(Player const* player)
UpdateData udata(player->GetMapId());
WorldPacket packet;
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), ItemMask.GetChangesMask(), player);
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), ItemMask.GetChangesMask(), player, IgnoreNestedChangesMask);
udata.BuildPacket(&packet);
player->SendDirectMessage(&packet);
+3 -2
View File
@@ -399,15 +399,16 @@ class TC_GAME_API Item : public Object
public:
void BuildValuesUpdateWithFlag(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::ItemData::Mask const& requestedItemMask, Player const* target) const;
UF::ItemData::Mask const& requestedItemMask, Player const* target, bool ignoreNestedChangesMask) const;
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(Item const* owner) : Owner(owner) { }
explicit ValuesUpdateForPlayerWithMaskSender(Item const* owner) : Owner(owner), IgnoreNestedChangesMask(false) {}
Item const* Owner;
UF::ObjectData::Base ObjectMask;
UF::ItemData::Base ItemMask;
bool IgnoreNestedChangesMask;
void operator()(Player const* player) const;
};
+8 -8
View File
@@ -3751,7 +3751,7 @@ void Player::BuildValuesUpdateWithFlag(UF::UpdateFieldFlag flags, ByteBuffer& da
void Player::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::UnitData::Mask const& requestedUnitMask, UF::PlayerData::Mask const& requestedPlayerMask,
UF::ActivePlayerData::Mask const& requestedActivePlayerMask, Player const* target) const
UF::ActivePlayerData::Mask const& requestedActivePlayerMask, Player const* target, bool ignoreNestedChangesMask) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
@@ -3778,13 +3778,13 @@ void Player::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData
buffer << uint32(valuesMask.GetBlock(0));
if (valuesMask[TYPEID_OBJECT])
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, true);
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_UNIT])
m_unitData->WriteUpdate(unitMask, buffer, target, this, true);
m_unitData->WriteUpdate(unitMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_PLAYER])
m_playerData->WriteUpdate(playerMask, buffer, target, this, true);
m_playerData->WriteUpdate(playerMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_ACTIVE_PLAYER])
m_activePlayerData->WriteUpdate(requestedActivePlayerMask, buffer, target, this, true);
@@ -3800,7 +3800,7 @@ void Player::ValuesUpdateForPlayerWithMaskSender::operator()(Player const* playe
WorldPacket packet;
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), UnitMask.GetChangesMask(),
PlayerMask.GetChangesMask(), ActivePlayerMask.GetChangesMask(), player);
PlayerMask.GetChangesMask(), ActivePlayerMask.GetChangesMask(), player, IgnoreNestedChangesMask);
udata.BuildPacket(&packet);
player->SendDirectMessage(&packet);
@@ -26869,7 +26869,7 @@ void Player::UpdateVisibleObjectInteractions(bool allUnits, bool onlySpellClicks
}
}
if (objMask.GetChangesMask().IsAnySet() || goMask.GetChangesMask().IsAnySet())
gameObject->BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), goMask.GetChangesMask(), this);
gameObject->BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), goMask.GetChangesMask(), this, false);
}
}
else if (visibleObjectGuid.IsCreatureOrVehicle() && (allUnits || onlySpellClicks))
@@ -26899,7 +26899,7 @@ void Player::UpdateVisibleObjectInteractions(bool allUnits, bool onlySpellClicks
}
if (objMask.GetChangesMask().IsAnySet() || unitMask.GetChangesMask().IsAnySet())
creature->BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), unitMask.GetChangesMask(), this);
creature->BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), unitMask.GetChangesMask(), this, false);
if (creature->IsQuestGiver())
giverStatusMultiple.QuestGiver.emplace_back(visibleObjectGuid, GetQuestDialogStatus(creature));
@@ -26918,7 +26918,7 @@ void Player::UpdateVisibleObjectInteractions(bool allUnits, bool onlySpellClicks
UF::ObjectData::Base objMask;
UF::UnitData::Base unitMask;
unitMask.MarkChanged(&UF::UnitData::NpcFlags); // NpcFlags has UNIT_NPC_FLAG_SPELLCLICK
creature->BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), unitMask.GetChangesMask(), this);
creature->BuildValuesUpdateForPlayerWithMask(&udata, objMask.GetChangesMask(), unitMask.GetChangesMask(), this, false);
break;
}
}
+4 -2
View File
@@ -2274,17 +2274,19 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const override;
void BuildValuesUpdateWithFlag(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask, UF::UnitData::Mask const& requestedUnitMask,
UF::PlayerData::Mask const& requestedPlayerMask, UF::ActivePlayerData::Mask const& requestedActivePlayerMask, Player const* target) const;
UF::PlayerData::Mask const& requestedPlayerMask, UF::ActivePlayerData::Mask const& requestedActivePlayerMask,
Player const* target, bool ignoreNestedChangesMask) const;
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(Player const* owner) : Owner(owner) { }
explicit ValuesUpdateForPlayerWithMaskSender(Player const* owner) : Owner(owner), IgnoreNestedChangesMask(false) {}
Player const* Owner;
UF::ObjectData::Base ObjectMask;
UF::UnitData::Base UnitMask;
UF::PlayerData::Base PlayerMask;
UF::ActivePlayerData::Base ActivePlayerMask;
bool IgnoreNestedChangesMask;
void operator()(Player const* player) const;
};
@@ -81,9 +81,9 @@ bool SceneObject::ShouldBeRemoved() const
{
// search for a dummy aura on creator
Aura const* linkedAura = creator->GetAura(_createdBySpellCast.GetEntry(), [this](Aura const* aura)
{
return aura->GetCastId() == _createdBySpellCast;
});
{
return aura->GetCastId() == _createdBySpellCast;
});
if (!linkedAura)
return true;
}
@@ -156,7 +156,7 @@ void SceneObject::BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& data,
}
void SceneObject::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::SceneObjectData::Mask const& requestedSceneObjectMask, Player const* target) const
UF::SceneObjectData::Mask const& requestedSceneObjectMask, Player const* target, bool ignoreNestedChangesMask) const
{
UF::UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask<NUM_CLIENT_OBJECT_TYPES> valuesMask;
@@ -173,10 +173,10 @@ void SceneObject::BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::Objec
buffer << uint32(valuesMask.GetBlock(0));
if (valuesMask[TYPEID_OBJECT])
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, true);
m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
if (valuesMask[TYPEID_SCENEOBJECT])
m_sceneObjectData->WriteUpdate(requestedSceneObjectMask, buffer, target, this, true);
m_sceneObjectData->WriteUpdate(requestedSceneObjectMask, buffer, target, this, ignoreNestedChangesMask);
buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
@@ -188,7 +188,7 @@ void SceneObject::ValuesUpdateForPlayerWithMaskSender::operator()(Player const*
UpdateData udata(Owner->GetMapId());
WorldPacket packet;
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), SceneObjectMask.GetChangesMask(), player);
Owner->BuildValuesUpdateForPlayerWithMask(&udata, ObjectMask.GetChangesMask(), SceneObjectMask.GetChangesMask(), player, IgnoreNestedChangesMask);
udata.BuildPacket(&packet);
player->SendDirectMessage(&packet);
@@ -25,8 +25,8 @@ struct SceneTemplate;
enum class SceneType : uint32
{
Normal = 0,
PetBattle = 1
Normal = 0,
PetBattle = 1
};
class TC_GAME_API SceneObject final : public WorldObject, public GridObject<SceneObject>
@@ -42,15 +42,16 @@ protected:
public:
void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
UF::SceneObjectData::Mask const& requestedSceneObjectMask, Player const* target) const;
UF::SceneObjectData::Mask const& requestedSceneObjectMask, Player const* target, bool ignoreNestedChangesMask) const;
struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
{
explicit ValuesUpdateForPlayerWithMaskSender(SceneObject const* owner) : Owner(owner) { }
explicit ValuesUpdateForPlayerWithMaskSender(SceneObject const* owner) : Owner(owner), IgnoreNestedChangesMask(false) {}
SceneObject const* Owner;
UF::ObjectData::Base ObjectMask;
UF::SceneObjectData::Base SceneObjectMask;
bool IgnoreNestedChangesMask;
void operator()(Player const* player) const;
};