Core/Entities: Minor refactor to viewer dependent updatefield writing to allow using viewer dependent dynamic updatefields

Port From (https://github.com/TrinityCore/TrinityCore/commit/b8227f92d54e1e3130adb06fdd75c2338afa9414)
This commit is contained in:
hondacrx
2021-11-02 17:15:12 -04:00
parent e7421549c3
commit af21142819
@@ -38,7 +38,7 @@ namespace Game.Entities
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, WorldObject owner, Player receiver) public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, WorldObject owner, Player receiver)
{ {
data.WriteUInt32(EntryId); data.WriteUInt32(EntryId);
data.WriteUInt32(GetViewerDependentDynamicFlags(DynamicFlags, owner, receiver)); data.WriteUInt32(GetViewerDependentDynamicFlags(this, owner, receiver));
data.WriteFloat(Scale); data.WriteFloat(Scale);
} }
@@ -60,7 +60,7 @@ namespace Game.Entities
} }
if (changesMask[2]) if (changesMask[2])
{ {
data.WriteUInt32(GetViewerDependentDynamicFlags(DynamicFlags, owner, receiver)); data.WriteUInt32(GetViewerDependentDynamicFlags(this, owner, receiver));
} }
if (changesMask[3]) if (changesMask[3])
{ {
@@ -77,9 +77,9 @@ namespace Game.Entities
_changesMask.ResetAll(); _changesMask.ResetAll();
} }
uint GetViewerDependentDynamicFlags(uint dynamicFlags, WorldObject obj, Player receiver) uint GetViewerDependentDynamicFlags(ObjectFieldData objectData, WorldObject obj, Player receiver)
{ {
UnitDynFlags unitDynFlags = (UnitDynFlags)dynamicFlags; UnitDynFlags unitDynFlags = (UnitDynFlags)(uint)objectData.DynamicFlags;
Unit unit = obj.ToUnit(); Unit unit = obj.ToUnit();
if (unit != null) if (unit != null)
@@ -1239,9 +1239,9 @@ 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)
{ {
data.WriteUInt32(GetViewerDependentDisplayId(DisplayID, owner, receiver)); data.WriteUInt32(GetViewerDependentDisplayId(this, owner, receiver));
for (int i = 0; i < 2; ++i) for (int i = 0; i < 2; ++i)
data.WriteUInt32(GetViewerDependentNpcFlags(NpcFlags[i], i, owner, receiver)); data.WriteUInt32(GetViewerDependentNpcFlags(this, i, owner, receiver));
data.WriteUInt32(StateSpellVisualID); data.WriteUInt32(StateSpellVisualID);
data.WriteUInt32(StateAnimID); data.WriteUInt32(StateAnimID);
@@ -1297,14 +1297,14 @@ namespace Game.Entities
data.WriteInt32(ScalingFactionGroup); data.WriteInt32(ScalingFactionGroup);
data.WriteInt32(ScalingHealthItemLevelCurveID); data.WriteInt32(ScalingHealthItemLevelCurveID);
data.WriteInt32(ScalingDamageItemLevelCurveID); data.WriteInt32(ScalingDamageItemLevelCurveID);
data.WriteUInt32(GetViewerDependentFactionTemplate(FactionTemplate, owner, receiver)); data.WriteUInt32(GetViewerDependentFactionTemplate(this, owner, receiver));
for (int i = 0; i < 3; ++i) for (int i = 0; i < 3; ++i)
VirtualItems[i].WriteCreate(data, owner, receiver); VirtualItems[i].WriteCreate(data, owner, receiver);
data.WriteUInt32(GetViewerDependentFlags(Flags, owner, receiver)); data.WriteUInt32(GetViewerDependentFlags(this, owner, receiver));
data.WriteUInt32(Flags2); data.WriteUInt32(Flags2);
data.WriteUInt32(Flags3); data.WriteUInt32(Flags3);
data.WriteUInt32(GetViewerDependentAuraState(AuraState, owner, receiver)); data.WriteUInt32(GetViewerDependentAuraState(this, owner, receiver));
for (int i = 0; i < 2; ++i) for (int i = 0; i < 2; ++i)
data.WriteUInt32(AttackRoundBaseTime[i]); data.WriteUInt32(AttackRoundBaseTime[i]);
@@ -1373,7 +1373,7 @@ namespace Game.Entities
data.WriteUInt32(BaseHealth); data.WriteUInt32(BaseHealth);
data.WriteUInt8(SheatheState); data.WriteUInt8(SheatheState);
data.WriteUInt8((byte)GetViewerDependentPvpFlags(PvpFlags, owner, receiver)); data.WriteUInt8((byte)GetViewerDependentPvpFlags(this, owner, receiver));
data.WriteUInt8(PetFlags); data.WriteUInt8(PetFlags);
data.WriteUInt8(ShapeshiftForm); data.WriteUInt8(ShapeshiftForm);
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner))
@@ -1529,7 +1529,7 @@ namespace Game.Entities
} }
if (changesMask[5]) if (changesMask[5])
{ {
data.WriteUInt32(GetViewerDependentDisplayId(DisplayID, owner, receiver)); data.WriteUInt32(GetViewerDependentDisplayId(this, owner, receiver));
} }
if (changesMask[6]) if (changesMask[6])
{ {
@@ -1676,11 +1676,11 @@ namespace Game.Entities
} }
if (changesMask[42]) if (changesMask[42])
{ {
data.WriteUInt32(GetViewerDependentFactionTemplate(FactionTemplate, owner, receiver)); data.WriteUInt32(GetViewerDependentFactionTemplate(this, owner, receiver));
} }
if (changesMask[43]) if (changesMask[43])
{ {
data.WriteUInt32(GetViewerDependentFlags(Flags, owner, receiver)); data.WriteUInt32(GetViewerDependentFlags(this, owner, receiver));
} }
if (changesMask[44]) if (changesMask[44])
{ {
@@ -1692,7 +1692,7 @@ namespace Game.Entities
} }
if (changesMask[46]) if (changesMask[46])
{ {
data.WriteUInt32(GetViewerDependentAuraState(AuraState, owner, receiver)); data.WriteUInt32(GetViewerDependentAuraState(this, owner, receiver));
} }
if (changesMask[47]) if (changesMask[47])
{ {
@@ -1835,7 +1835,7 @@ namespace Game.Entities
} }
if (changesMask[82]) if (changesMask[82])
{ {
data.WriteUInt8((byte)GetViewerDependentPvpFlags(PvpFlags, owner, receiver)); data.WriteUInt8((byte)GetViewerDependentPvpFlags(this, owner, receiver));
} }
if (changesMask[83]) if (changesMask[83])
{ {
@@ -1991,7 +1991,7 @@ namespace Game.Entities
{ {
if (changesMask[121 + i]) if (changesMask[121 + i])
{ {
data.WriteUInt32(GetViewerDependentNpcFlags(NpcFlags[i], i, owner, receiver)); data.WriteUInt32(GetViewerDependentNpcFlags(this, i, owner, receiver));
} }
} }
} }
@@ -2209,8 +2209,9 @@ namespace Game.Entities
_changesMask.ResetAll(); _changesMask.ResetAll();
} }
uint GetViewerDependentDisplayId(uint displayId, Unit unit, Player receiver) uint GetViewerDependentDisplayId(UnitData unitData, Unit unit, Player receiver)
{ {
uint displayId = unitData.DisplayID;
if (unit.IsCreature()) if (unit.IsCreature())
{ {
CreatureTemplate cinfo = unit.ToCreature().GetCreatureTemplate(); CreatureTemplate cinfo = unit.ToCreature().GetCreatureTemplate();
@@ -2240,15 +2241,17 @@ namespace Game.Entities
return displayId; return displayId;
} }
uint GetViewerDependentNpcFlags(uint npcFlag, int i, Unit unit, Player receiver) uint GetViewerDependentNpcFlags(UnitData unitData, int i, Unit unit, Player receiver)
{ {
uint npcFlag = unitData.NpcFlags[i];
if (i == 0 && unit.IsCreature() && !receiver.CanSeeSpellClickOn(unit.ToCreature())) if (i == 0 && unit.IsCreature() && !receiver.CanSeeSpellClickOn(unit.ToCreature()))
npcFlag &= ~(uint)NPCFlags.SpellClick; npcFlag &= ~(uint)NPCFlags.SpellClick;
return npcFlag; return npcFlag;
} }
uint GetViewerDependentFactionTemplate(uint factionTemplate, Unit unit, Player receiver) uint GetViewerDependentFactionTemplate(UnitData unitData, Unit unit, Player receiver)
{ {
uint factionTemplate = unitData.FactionTemplate;
if (unit.IsControlledByPlayer() && receiver != unit && WorldConfig.GetBoolValue(WorldCfg.AllowTwoSideInteractionGroup) && unit.IsInRaidWith(receiver)) if (unit.IsControlledByPlayer() && receiver != unit && WorldConfig.GetBoolValue(WorldCfg.AllowTwoSideInteractionGroup) && unit.IsInRaidWith(receiver))
{ {
FactionTemplateRecord ft1 = unit.GetFactionTemplateEntry(); FactionTemplateRecord ft1 = unit.GetFactionTemplateEntry();
@@ -2260,21 +2263,23 @@ namespace Game.Entities
return factionTemplate; return factionTemplate;
} }
uint GetViewerDependentFlags(uint flags, Unit unit, Player receiver) uint GetViewerDependentFlags(UnitData unitData, Unit unit, Player receiver)
{ {
uint flags = unitData.Flags;
// Gamemasters should be always able to select units - remove not selectable flag // Gamemasters should be always able to select units - remove not selectable flag
if (receiver.IsGameMaster()) if (receiver.IsGameMaster())
flags &= ~(uint)UnitFlags.NotSelectable; flags &= ~(uint)UnitFlags.NotSelectable;
return flags; return flags;
} }
uint GetViewerDependentAuraState(uint auraState, 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);
} }
uint GetViewerDependentPvpFlags(uint pvpFlags, Unit unit, Player receiver) uint GetViewerDependentPvpFlags(UnitData unitData, Unit unit, Player receiver)
{ {
uint pvpFlags = unitData.PvpFlags;
if (unit.IsControlledByPlayer() && receiver != unit && WorldConfig.GetBoolValue(WorldCfg.AllowTwoSideInteractionGroup) && unit.IsInRaidWith(receiver)) if (unit.IsControlledByPlayer() && receiver != unit && WorldConfig.GetBoolValue(WorldCfg.AllowTwoSideInteractionGroup) && unit.IsInRaidWith(receiver))
{ {
FactionTemplateRecord ft1 = unit.GetFactionTemplateEntry(); FactionTemplateRecord ft1 = unit.GetFactionTemplateEntry();
@@ -4930,20 +4935,20 @@ namespace Game.Entities
} }
data.WritePackedGuid(CreatedBy); data.WritePackedGuid(CreatedBy);
data.WritePackedGuid(GuildGUID); data.WritePackedGuid(GuildGUID);
data.WriteUInt32(GetViewerGameObjectFlags(Flags, owner, receiver)); data.WriteUInt32(GetViewerGameObjectFlags(this, owner, receiver));
Quaternion rotation = ParentRotation; Quaternion rotation = ParentRotation;
data.WriteFloat(rotation.X); data.WriteFloat(rotation.X);
data.WriteFloat(rotation.Y); data.WriteFloat(rotation.Y);
data.WriteFloat(rotation.Z); data.WriteFloat(rotation.Z);
data.WriteFloat(rotation.W); data.WriteFloat(rotation.W);
data.WriteUInt32(FactionTemplate); data.WriteUInt32(FactionTemplate);
data.WriteInt8(GetViewerGameObjectState(State, owner, receiver)); data.WriteInt8(GetViewerGameObjectState(this, owner, receiver));
data.WriteInt8(TypeID); data.WriteInt8(TypeID);
data.WriteUInt8(PercentHealth); data.WriteUInt8(PercentHealth);
data.WriteUInt32(ArtKit); data.WriteUInt32(ArtKit);
data.WriteInt32(EnableDoodadSets.Size()); data.WriteInt32(EnableDoodadSets.Size());
data.WriteUInt32(CustomParam); data.WriteUInt32(CustomParam);
data.WriteUInt32(GetViewerGameObjectLevel(Level, owner, receiver)); data.WriteUInt32(GetViewerGameObjectLevel(this, owner, receiver));
data.WriteUInt32(AnimGroupInstance); data.WriteUInt32(AnimGroupInstance);
for (int i = 0; i < EnableDoodadSets.Size(); ++i) for (int i = 0; i < EnableDoodadSets.Size(); ++i)
{ {
@@ -5029,7 +5034,7 @@ namespace Game.Entities
} }
if (changesMask[11]) if (changesMask[11])
{ {
data.WriteUInt32(GetViewerGameObjectFlags(Flags, owner, receiver)); data.WriteUInt32(GetViewerGameObjectFlags(this, owner, receiver));
} }
if (changesMask[12]) if (changesMask[12])
{ {
@@ -5044,7 +5049,7 @@ namespace Game.Entities
} }
if (changesMask[14]) if (changesMask[14])
{ {
data.WriteInt8(GetViewerGameObjectState(State, owner, receiver)); data.WriteInt8(GetViewerGameObjectState(this, owner, receiver));
} }
if (changesMask[15]) if (changesMask[15])
{ {
@@ -5064,7 +5069,7 @@ namespace Game.Entities
} }
if (changesMask[19]) if (changesMask[19])
{ {
data.WriteUInt32(GetViewerGameObjectLevel(Level, owner, receiver)); data.WriteUInt32(GetViewerGameObjectLevel(this, owner, receiver));
} }
if (changesMask[20]) if (changesMask[20])
{ {
@@ -5098,23 +5103,26 @@ namespace Game.Entities
_changesMask.ResetAll(); _changesMask.ResetAll();
} }
uint GetViewerGameObjectFlags(uint flags, GameObject gameObject, Player receiver) uint GetViewerGameObjectFlags(GameObjectFieldData gameObjectData, GameObject gameObject, Player receiver)
{ {
uint flags = gameObjectData.Flags;
if (gameObject.GetGoType() == GameObjectTypes.Chest) if (gameObject.GetGoType() == GameObjectTypes.Chest)
if (gameObject.GetGoInfo().Chest.usegrouplootrules != 0 && !gameObject.IsLootAllowedFor(receiver)) if (gameObject.GetGoInfo().Chest.usegrouplootrules != 0 && !gameObject.IsLootAllowedFor(receiver))
flags |= (uint)(GameObjectFlags.Locked | GameObjectFlags.NotSelectable); flags |= (uint)(GameObjectFlags.Locked | GameObjectFlags.NotSelectable);
return (uint)flags; return flags;
} }
uint GetViewerGameObjectLevel(uint level, GameObject gameObject, Player receiver) uint GetViewerGameObjectLevel(GameObjectFieldData gameObjectData, GameObject gameObject, Player receiver)
{ {
uint level = gameObjectData.Level;
bool isStoppableTransport = gameObject.GetGoType() == GameObjectTypes.Transport && !gameObject.GetGoValue().Transport.StopFrames.Empty(); bool isStoppableTransport = gameObject.GetGoType() == GameObjectTypes.Transport && !gameObject.GetGoValue().Transport.StopFrames.Empty();
return isStoppableTransport ? gameObject.GetGoValue().Transport.PathProgress : level; return isStoppableTransport ? gameObject.GetGoValue().Transport.PathProgress : level;
} }
sbyte GetViewerGameObjectState(sbyte state, GameObject gameObject, Player receiver) sbyte GetViewerGameObjectState(GameObjectFieldData gameObjectData, GameObject gameObject, Player receiver)
{ {
sbyte state = gameObjectData.State;
bool isStoppableTransport = gameObject.GetGoType() == GameObjectTypes.Transport && !gameObject.GetGoValue().Transport.StopFrames.Empty(); bool isStoppableTransport = gameObject.GetGoType() == GameObjectTypes.Transport && !gameObject.GetGoValue().Transport.StopFrames.Empty();
if (isStoppableTransport && gameObject.GetGoState() == GameObjectState.TransportActive) if (isStoppableTransport && gameObject.GetGoState() == GameObjectState.TransportActive)
if (((gameObject.GetGoValue().Transport.StateUpdateTimer / 20000) & 1) != 0) if (((gameObject.GetGoValue().Transport.StateUpdateTimer / 20000) & 1) != 0)