Core/Objects: Optimize spawn tracking handling in building SMSG_UPDATE_OBJECT
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user