Core/Objects: Optimize spawn tracking handling in building SMSG_UPDATE_OBJECT

This commit is contained in:
Shauren
2025-03-01 15:00:46 +01:00
parent 76352cb391
commit 49aa298006
6 changed files with 40 additions and 39 deletions
@@ -3205,7 +3205,7 @@ SpawnTrackingStateData const* Creature::GetSpawnTrackingStateDataForPlayer(Playe
if (!player)
return nullptr;
if (SpawnMetadata const* data = sObjectMgr->GetSpawnMetadata(SPAWN_TYPE_CREATURE, GetSpawnId()))
if (CreatureData const* data = GetCreatureData())
{
if (data->spawnTrackingQuestObjectiveId && data->spawnTrackingData)
{
@@ -3586,7 +3586,7 @@ SpawnTrackingStateData const* GameObject::GetSpawnTrackingStateDataForPlayer(Pla
if (!player)
return nullptr;
if (SpawnMetadata const* data = sObjectMgr->GetSpawnMetadata(SPAWN_TYPE_GAMEOBJECT, GetSpawnId()))
if (GameObjectData const* data = GetGameObjectData())
{
if (data->spawnTrackingQuestObjectiveId && data->spawnTrackingData)
{
@@ -929,19 +929,20 @@ bool PassiveSpellHistory::operator==(PassiveSpellHistory const& right) const
void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
{
ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = ViewerDependentValue<StateWorldEffectIDsTag>::GetValue(this, owner, receiver);
data << int32(ViewerDependentValue<DisplayIDTag>::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue<NpcFlags2Tag>::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue<StateSpellVisualIDTag>::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue<StateAnimIDTag>::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue<StateAnimKitIDTag>::GetValue(this, owner, receiver));
std::vector stateWorldEffects = ViewerDependentValue<StateWorldEffectIDsTag>::GetValue(this, owner, receiver);
data << uint32(stateWorldEffects.size());
data << uint32(stateWorldEffectIDs->size());
data << uint32(StateWorldEffectsQuestObjectiveID);
data << int32(SpellOverrideNameID);
for (uint32 i = 0; i < stateWorldEffects.size(); ++i)
for (uint32 i = 0; i < stateWorldEffectIDs->size(); ++i)
{
data << uint32((stateWorldEffects)[i]);
data << uint32((*stateWorldEffectIDs)[i]);
}
data << Charm;
data << Summon;
@@ -1169,6 +1170,8 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = {};
if (changesMask[0])
{
if (changesMask[1])
@@ -1177,11 +1180,11 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
if (changesMask[2])
{
std::vector stateWorldEffects = ViewerDependentValue<StateWorldEffectIDsTag>::GetValue(this, owner, receiver);
data.WriteBits(stateWorldEffects.size(), 32);
for (uint32 i = 0; i < stateWorldEffects.size(); ++i)
stateWorldEffectIDs = ViewerDependentValue<StateWorldEffectIDsTag>::GetValue(this, owner, receiver);
data.WriteBits(stateWorldEffectIDs->size(), 32);
for (uint32 i = 0; i < stateWorldEffectIDs->size(); ++i)
{
data << uint32((stateWorldEffects)[i]);
data << uint32((*stateWorldEffectIDs)[i]);
}
}
}
@@ -6438,17 +6441,18 @@ void ActivePlayerData::ClearChangesMask()
void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const
{
ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = ViewerDependentValue<StateWorldEffectIDsTag>::GetValue(this, owner, receiver);
data << int32(DisplayID);
data << uint32(SpellVisualID);
data << uint32(ViewerDependentValue<StateSpellVisualIDTag>::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue<StateAnimIDTag>::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue<StateAnimKitIDTag>::GetValue(this, owner, receiver));
std::vector stateWorldEffects = ViewerDependentValue<StateWorldEffectIDsTag>::GetValue(this, owner, receiver);
data << uint32(stateWorldEffects.size());
data << uint32(ViewerDependentValue<SpawnTrackingStateAnimIDTag>::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue<SpawnTrackingStateAnimKitIDTag>::GetValue(this, owner, receiver));
data << uint32(stateWorldEffectIDs->size());
data << uint32(StateWorldEffectsQuestObjectiveID);
for (uint32 i = 0; i < stateWorldEffects.size(); ++i)
for (uint32 i = 0; i < stateWorldEffectIDs->size(); ++i)
{
data << uint32((stateWorldEffects)[i]);
data << uint32((*stateWorldEffectIDs)[i]);
}
data << CreatedBy;
data << GuildGUID;
@@ -6489,15 +6493,17 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool
{
data.WriteBits(changesMask.GetBlock(0), 25);
ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = {};
if (changesMask[0])
{
if (changesMask[1])
{
std::vector stateWorldEffects = ViewerDependentValue<StateWorldEffectIDsTag>::GetValue(this, owner, receiver);
data.WriteBits(stateWorldEffects.size(), 32);
for (uint32 i = 0; i < stateWorldEffects.size(); ++i)
stateWorldEffectIDs = ViewerDependentValue<StateWorldEffectIDsTag>::GetValue(this, owner, receiver);
data.WriteBits(stateWorldEffectIDs->size(), 32);
for (uint32 i = 0; i < stateWorldEffectIDs->size(); ++i)
{
data << uint32((stateWorldEffects)[i]);
data << uint32((*stateWorldEffectIDs)[i]);
}
}
}
@@ -6556,11 +6562,11 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool
}
if (changesMask[7])
{
data << uint32(ViewerDependentValue<StateAnimIDTag>::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue<SpawnTrackingStateAnimIDTag>::GetValue(this, owner, receiver));
}
if (changesMask[8])
{
data << uint32(ViewerDependentValue<StateAnimKitIDTag>::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue<SpawnTrackingStateAnimKitIDTag>::GetValue(this, owner, receiver));
}
if (changesMask[9])
{
@@ -1204,9 +1204,9 @@ struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<
UpdateField<uint32, 0, 6> StateSpellVisualID;
struct StateSpellVisualIDTag : ViewerDependentValueTag<uint32> {};
UpdateField<uint32, 0, 7> SpawnTrackingStateAnimID;
struct StateAnimIDTag : ViewerDependentValueTag<uint32> {};
struct SpawnTrackingStateAnimIDTag : ViewerDependentValueTag<uint32> {};
UpdateField<uint32, 0, 8> SpawnTrackingStateAnimKitID;
struct StateAnimKitIDTag : ViewerDependentValueTag<uint32> {};
struct SpawnTrackingStateAnimKitIDTag : ViewerDependentValueTag<uint32> {};
UpdateField<uint32, 0, 9> StateWorldEffectsQuestObjectiveID;
UpdateField<ObjectGuid, 0, 10> CreatedBy;
UpdateField<ObjectGuid, 0, 11> GuildGUID;
@@ -207,17 +207,15 @@ template<>
class ViewerDependentValue<UF::UnitData::StateWorldEffectIDsTag>
{
public:
using value_type = UF::UnitData::StateWorldEffectIDsTag::value_type;
using value_type = UF::UnitData::StateWorldEffectIDsTag::value_type const*;
static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver)
{
value_type stateWorldEffects = unitData->StateWorldEffectIDs;
if (unit->IsCreature())
if (SpawnTrackingStateData const* spawnTrackingStateData = unit->GetSpawnTrackingStateDataForPlayer(receiver))
stateWorldEffects = spawnTrackingStateData->StateWorldEffects;
return &spawnTrackingStateData->StateWorldEffects;
return stateWorldEffects;
return &*unitData->StateWorldEffectIDs;
}
};
@@ -462,16 +460,14 @@ template<>
class ViewerDependentValue<UF::GameObjectData::StateWorldEffectIDsTag>
{
public:
using value_type = UF::GameObjectData::StateWorldEffectIDsTag::value_type;
using value_type = UF::GameObjectData::StateWorldEffectIDsTag::value_type const*;
static value_type GetValue(UF::GameObjectData const* gameObjectData, GameObject const* gameObject, Player const* receiver)
{
value_type stateWorldEffects = gameObjectData->StateWorldEffectIDs;
if (SpawnTrackingStateData const* spawnTrackingStateData = gameObject->GetSpawnTrackingStateDataForPlayer(receiver))
stateWorldEffects = spawnTrackingStateData->StateWorldEffects;
return &spawnTrackingStateData->StateWorldEffects;
return stateWorldEffects;
return &*gameObjectData->StateWorldEffectIDs;
}
};
@@ -493,10 +489,10 @@ public:
};
template<>
class ViewerDependentValue<UF::GameObjectData::StateAnimIDTag>
class ViewerDependentValue<UF::GameObjectData::SpawnTrackingStateAnimIDTag>
{
public:
using value_type = UF::GameObjectData::StateAnimIDTag::value_type;
using value_type = UF::GameObjectData::SpawnTrackingStateAnimIDTag::value_type;
static value_type GetValue(UF::GameObjectData const* /*gameObjectData*/, GameObject const* gameObject, Player const* receiver)
{
@@ -510,10 +506,10 @@ public:
};
template<>
class ViewerDependentValue<UF::GameObjectData::StateAnimKitIDTag>
class ViewerDependentValue<UF::GameObjectData::SpawnTrackingStateAnimKitIDTag>
{
public:
using value_type = UF::GameObjectData::StateAnimKitIDTag::value_type;
using value_type = UF::GameObjectData::SpawnTrackingStateAnimKitIDTag::value_type;
static value_type GetValue(UF::GameObjectData const* gameObjectData, GameObject const* gameObject, Player const* receiver)
{
@@ -687,7 +687,6 @@ WorldPacket const* WorldPackets::Movement::TransferPending::Write()
if (TransferSpellID)
_worldPacket << int32(*TransferSpellID);
return &_worldPacket;
}