Core/Objects: Optimize spawn tracking handling in building SMSG_UPDATE_OBJECT

Port From (https://github.com/TrinityCore/TrinityCore/commit/49aa298006456ed90211e42103ed7b073ff0c156)
This commit is contained in:
Hondacrx
2025-06-15 20:31:03 -04:00
parent f105edae7c
commit b6bccbad44
3 changed files with 40 additions and 26 deletions
+1 -1
View File
@@ -3030,7 +3030,7 @@ namespace Game.Entities
if (player == null) if (player == null)
return null; return null;
SpawnMetadata data = Global.ObjectMgr.GetSpawnMetadata(SpawnObjectType.Creature, GetSpawnId()); CreatureData data = GetCreatureData();
if (data != null) if (data != null)
{ {
if (data.spawnTrackingQuestObjectiveId != 0 && data.spawnTrackingData != null) if (data.spawnTrackingQuestObjectiveId != 0 && data.spawnTrackingData != null)
@@ -2734,7 +2734,7 @@ namespace Game.Entities
if (player == null) if (player == null)
return null; return null;
SpawnMetadata data = Global.ObjectMgr.GetSpawnMetadata(SpawnObjectType.GameObject, GetSpawnId()); GameObjectData data = GetGameObjectData();
if (data != null) if (data != null)
{ {
if (data.spawnTrackingQuestObjectiveId != 0 && data.spawnTrackingData != null) if (data.spawnTrackingQuestObjectiveId != 0 && data.spawnTrackingData != null)
@@ -1279,6 +1279,8 @@ namespace Game.Entities
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver)
{ {
var stateWorldEffectIDs = GetViewerDependentStateWorldEffectIDs(this, owner, receiver);
data.WriteUInt32(GetViewerDependentDisplayId(this, owner, receiver)); data.WriteUInt32(GetViewerDependentDisplayId(this, owner, receiver));
data.WriteUInt32(GetViewerDependentNpcFlags(this, owner, receiver)); data.WriteUInt32(GetViewerDependentNpcFlags(this, owner, receiver));
data.WriteUInt32(GetViewerDependentNpcFlags2(this, owner, receiver)); data.WriteUInt32(GetViewerDependentNpcFlags2(this, owner, receiver));
@@ -1286,12 +1288,11 @@ namespace Game.Entities
data.WriteUInt32(GetViewerDependentStateSpellVisualID(this, owner, receiver)); data.WriteUInt32(GetViewerDependentStateSpellVisualID(this, owner, receiver));
data.WriteUInt32(GetViewerDependentStateAnimID(this, owner, receiver)); data.WriteUInt32(GetViewerDependentStateAnimID(this, owner, receiver));
data.WriteUInt32(GetViewerDependentStateAnimKitID(this, owner, receiver)); data.WriteUInt32(GetViewerDependentStateAnimKitID(this, owner, receiver));
var stateWorldEffects = GetViewerDependentStateWorldEffectIDs(this, owner, receiver); data.WriteInt32(stateWorldEffectIDs.Count);
data.WriteInt32(stateWorldEffects.Count);
data.WriteUInt32(StateWorldEffectsQuestObjectiveID); data.WriteUInt32(StateWorldEffectsQuestObjectiveID);
data.WriteInt32(SpellOverrideNameID); data.WriteInt32(SpellOverrideNameID);
for (int i = 0; i < stateWorldEffects.Count; ++i) for (int i = 0; i < stateWorldEffectIDs.Count; ++i)
data.WriteUInt32(stateWorldEffects[i]); data.WriteUInt32(stateWorldEffectIDs[i]);
data.WritePackedGuid(Charm); data.WritePackedGuid(Charm);
data.WritePackedGuid(Summon); data.WritePackedGuid(Summon);
@@ -1512,6 +1513,8 @@ namespace Game.Entities
if (changesMask.GetBlock(i) != 0) if (changesMask.GetBlock(i) != 0)
data.WriteBits(changesMask.GetBlock(i), 32); data.WriteBits(changesMask.GetBlock(i), 32);
List<uint> stateWorldEffectIDs = new();
if (changesMask[0]) if (changesMask[0])
{ {
if (changesMask[1]) if (changesMask[1])
@@ -1520,11 +1523,11 @@ namespace Game.Entities
} }
if (changesMask[2]) if (changesMask[2])
{ {
var stateWorldEffects = GetViewerDependentStateWorldEffectIDs(this, owner, receiver); stateWorldEffectIDs = GetViewerDependentStateWorldEffectIDs(this, owner, receiver);
data.WriteBits(stateWorldEffects.Count, 32); data.WriteBits(stateWorldEffectIDs.Count, 32);
for (int i = 0; i < stateWorldEffects.Count; ++i) for (int i = 0; i < stateWorldEffectIDs.Count; ++i)
{ {
data.WriteUInt32(stateWorldEffects[i]); data.WriteUInt32(stateWorldEffectIDs[i]);
} }
} }
} }
@@ -2366,6 +2369,7 @@ namespace Game.Entities
return displayId; return displayId;
} }
uint GetViewerDependentNpcFlags(UnitData unitData, Unit unit, Player receiver) uint GetViewerDependentNpcFlags(UnitData unitData, Unit unit, Player receiver)
{ {
uint npcFlag = unitData.NpcFlags; uint npcFlag = unitData.NpcFlags;
@@ -2390,6 +2394,7 @@ namespace Game.Entities
return npcFlag; return npcFlag;
} }
uint GetViewerDependentNpcFlags2(UnitData unitData, Unit unit, Player receiver) uint GetViewerDependentNpcFlags2(UnitData unitData, Unit unit, Player receiver)
{ {
uint npcFlag = unitData.NpcFlags2; uint npcFlag = unitData.NpcFlags2;
@@ -2402,6 +2407,7 @@ namespace Game.Entities
return npcFlag; return npcFlag;
} }
uint GetViewerDependentFactionTemplate(UnitData unitData, Unit unit, Player receiver) uint GetViewerDependentFactionTemplate(UnitData unitData, Unit unit, Player receiver)
{ {
uint factionTemplate = unitData.FactionTemplate; uint factionTemplate = unitData.FactionTemplate;
@@ -2416,6 +2422,7 @@ namespace Game.Entities
return factionTemplate; return factionTemplate;
} }
uint GetViewerDependentFlags(UnitData unitData, Unit unit, Player receiver) uint GetViewerDependentFlags(UnitData unitData, Unit unit, Player receiver)
{ {
uint flags = unitData.Flags; uint flags = unitData.Flags;
@@ -2425,6 +2432,7 @@ namespace Game.Entities
return flags; return flags;
} }
uint GetViewerDependentFlags2(UnitData unitData, Unit unit, Player receiver) uint GetViewerDependentFlags2(UnitData unitData, Unit unit, Player receiver)
{ {
uint flags = unitData.Flags2; uint flags = unitData.Flags2;
@@ -2434,6 +2442,7 @@ namespace Game.Entities
return flags; return flags;
} }
uint GetViewerDependentFlags3(UnitData unitData, Unit unit, Player receiver) uint GetViewerDependentFlags3(UnitData unitData, Unit unit, Player receiver)
{ {
uint flags = unitData.Flags3; uint flags = unitData.Flags3;
@@ -2442,11 +2451,13 @@ namespace Game.Entities
return flags; return flags;
} }
uint GetViewerDependentAuraState(UnitData unitData, Unit unit, Player receiver) uint GetViewerDependentAuraState(UnitData unitData, Unit unit, Player receiver)
{ {
// Check per caster aura states to not enable using a spell in client if specified aura is not by target // Check per caster aura states to not enable using a spell in client if specified aura is not by target
return unit.BuildAuraStateUpdateForTarget(receiver); return unit.BuildAuraStateUpdateForTarget(receiver);
} }
byte GetViewerDependentPvpFlags(UnitData unitData, Unit unit, Player receiver) byte GetViewerDependentPvpFlags(UnitData unitData, Unit unit, Player receiver)
{ {
byte pvpFlags = unitData.PvpFlags; byte pvpFlags = unitData.PvpFlags;
@@ -2461,6 +2472,7 @@ namespace Game.Entities
return pvpFlags; return pvpFlags;
} }
int GetViewerDependentInteractSpellId(UnitData unitData, Unit unit, Player receiver) int GetViewerDependentInteractSpellId(UnitData unitData, Unit unit, Player receiver)
{ {
int interactSpellId = unitData.InteractSpellID; int interactSpellId = unitData.InteractSpellID;
@@ -2483,6 +2495,7 @@ namespace Game.Entities
} }
return interactSpellId; return interactSpellId;
} }
List<uint> GetViewerDependentStateWorldEffectIDs(UnitData unitData, Unit unit, Player receiver) List<uint> GetViewerDependentStateWorldEffectIDs(UnitData unitData, Unit unit, Player receiver)
{ {
List<uint> stateWorldEffects = unitData.StateWorldEffectIDs; List<uint> stateWorldEffects = unitData.StateWorldEffectIDs;
@@ -2497,7 +2510,6 @@ namespace Game.Entities
return stateWorldEffects; return stateWorldEffects;
} }
uint GetViewerDependentStateSpellVisualID(UnitData unitData, Unit unit, Player receiver) uint GetViewerDependentStateSpellVisualID(UnitData unitData, Unit unit, Player receiver)
{ {
uint stateSpellVisual = unitData.StateSpellVisualID; uint stateSpellVisual = unitData.StateSpellVisualID;
@@ -2512,7 +2524,6 @@ namespace Game.Entities
return stateSpellVisual; return stateSpellVisual;
} }
uint GetViewerDependentStateAnimID(UnitData unitData, Unit unit, Player receiver) uint GetViewerDependentStateAnimID(UnitData unitData, Unit unit, Player receiver)
{ {
uint stateAnimId = Global.DB2Mgr.GetEmptyAnimStateID(); uint stateAnimId = Global.DB2Mgr.GetEmptyAnimStateID();
@@ -7566,17 +7577,18 @@ namespace Game.Entities
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, GameObject owner, Player receiver) public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, GameObject owner, Player receiver)
{ {
var stateWorldEffectIDs = GetViewerDependentStateWorldEffectIDs(this, owner, receiver);
data.WriteUInt32(DisplayID); data.WriteUInt32(DisplayID);
data.WriteUInt32(SpellVisualID); data.WriteUInt32(SpellVisualID);
data.WriteUInt32(GetViewerDependentStateSpellVisualID(this, owner, receiver)); data.WriteUInt32(GetViewerDependentStateSpellVisualID(this, owner, receiver));
data.WriteUInt32(GetViewerDependentStateAnimID(this, owner, receiver)); data.WriteUInt32(GetViewerDependentSpawnTrackingStateAnimID(this, owner, receiver));
data.WriteUInt32(GetViewerDependentStateAnimKitID(this, owner, receiver)); data.WriteUInt32(GetViewerDependentSpawnTrackingStateAnimKitID(this, owner, receiver));
var stateWorldEffects = GetViewerDependentStateWorldEffectIDs(this, owner, receiver); data.WriteInt32(stateWorldEffectIDs.Count);
data.WriteInt32(stateWorldEffects.Count);
data.WriteUInt32(StateWorldEffectsQuestObjectiveID); data.WriteUInt32(StateWorldEffectsQuestObjectiveID);
for (int i = 0; i < stateWorldEffects.Count; ++i) for (int i = 0; i < stateWorldEffectIDs.Count; ++i)
{ {
data.WriteUInt32(stateWorldEffects[i]); data.WriteUInt32(stateWorldEffectIDs[i]);
} }
data.WritePackedGuid(CreatedBy); data.WritePackedGuid(CreatedBy);
data.WritePackedGuid(GuildGUID); data.WritePackedGuid(GuildGUID);
@@ -7618,15 +7630,17 @@ namespace Game.Entities
{ {
data.WriteBits(changesMask.GetBlock(0), 25); data.WriteBits(changesMask.GetBlock(0), 25);
List<uint> stateWorldEffectIDs;
if (changesMask[0]) if (changesMask[0])
{ {
if (changesMask[1]) if (changesMask[1])
{ {
var stateWorldEffects = GetViewerDependentStateWorldEffectIDs(this, owner, receiver); stateWorldEffectIDs = GetViewerDependentStateWorldEffectIDs(this, owner, receiver);
data.WriteBits(stateWorldEffects.Count, 32); data.WriteBits(stateWorldEffectIDs.Count, 32);
for (int i = 0; i < stateWorldEffects.Count; ++i) for (int i = 0; i < stateWorldEffectIDs.Count; ++i)
{ {
data.WriteUInt32(stateWorldEffects[i]); data.WriteUInt32(stateWorldEffectIDs[i]);
} }
} }
} }
@@ -7685,11 +7699,11 @@ namespace Game.Entities
} }
if (changesMask[7]) if (changesMask[7])
{ {
data.WriteUInt32(GetViewerDependentStateAnimID(this, owner, receiver)); data.WriteUInt32(GetViewerDependentSpawnTrackingStateAnimID(this, owner, receiver));
} }
if (changesMask[8]) if (changesMask[8])
{ {
data.WriteUInt32(GetViewerDependentStateAnimKitID(this, owner, receiver)); data.WriteUInt32(GetViewerDependentSpawnTrackingStateAnimKitID(this, owner, receiver));
} }
if (changesMask[9]) if (changesMask[9])
{ {
@@ -7827,7 +7841,7 @@ namespace Game.Entities
return stateSpellVisual; return stateSpellVisual;
} }
uint GetViewerDependentStateAnimID(GameObjectFieldData gameObjectData, GameObject gameObject, Player receiver) uint GetViewerDependentSpawnTrackingStateAnimID(GameObjectFieldData gameObjectData, GameObject gameObject, Player receiver)
{ {
uint stateAnimId = Global.DB2Mgr.GetEmptyAnimStateID(); uint stateAnimId = Global.DB2Mgr.GetEmptyAnimStateID();
@@ -7838,7 +7852,7 @@ namespace Game.Entities
return stateAnimId; return stateAnimId;
} }
uint GetViewerDependentStateAnimKitID(GameObjectFieldData gameObjectData, GameObject gameObject, Player receiver) uint GetViewerDependentSpawnTrackingStateAnimKitID(GameObjectFieldData gameObjectData, GameObject gameObject, Player receiver)
{ {
uint stateAnimKitId = gameObjectData.SpawnTrackingStateAnimKitID; uint stateAnimKitId = gameObjectData.SpawnTrackingStateAnimKitID;