Core/Transports: Preserve all dynamicflags for transports

Port From (https://github.com/TrinityCore/TrinityCore/commit/495153ad2463aa3cefcdd06b2bca1538840bbbfd)
This commit is contained in:
Hondacrx
2025-08-10 13:03:15 -04:00
parent b1027ff2ed
commit ce9acfab16
@@ -80,7 +80,7 @@ namespace Game.Entities
uint GetViewerDependentDynamicFlags(ObjectFieldData objectData, WorldObject obj, Player receiver) uint GetViewerDependentDynamicFlags(ObjectFieldData objectData, WorldObject obj, Player receiver)
{ {
uint unitDynFlags = objectData.DynamicFlags; uint dynamicFlags = objectData.DynamicFlags;
Unit unit = obj.ToUnit(); Unit unit = obj.ToUnit();
if (unit != null) if (unit != null)
@@ -88,61 +88,65 @@ namespace Game.Entities
Creature creature = obj.ToCreature(); Creature creature = obj.ToCreature();
if (creature != null) if (creature != null)
{ {
if ((unitDynFlags & (uint)UnitDynFlags.Tapped) != 0 && !creature.IsTappedBy(receiver)) if ((dynamicFlags & (uint)UnitDynFlags.Tapped) != 0 && !creature.IsTappedBy(receiver))
unitDynFlags &= ~(uint)UnitDynFlags.Tapped; dynamicFlags &= ~(uint)UnitDynFlags.Tapped;
if ((unitDynFlags & (uint)UnitDynFlags.Lootable) != 0 && !receiver.IsAllowedToLoot(creature)) if ((dynamicFlags & (uint)UnitDynFlags.Lootable) != 0 && !receiver.IsAllowedToLoot(creature))
unitDynFlags &= ~(uint)UnitDynFlags.Lootable; dynamicFlags &= ~(uint)UnitDynFlags.Lootable;
if ((unitDynFlags & (uint)UnitDynFlags.CanSkin) != 0 && creature.IsSkinnedBy(receiver)) if ((dynamicFlags & (uint)UnitDynFlags.CanSkin) != 0 && creature.IsSkinnedBy(receiver))
unitDynFlags &= ~(uint)UnitDynFlags.CanSkin; dynamicFlags &= ~(uint)UnitDynFlags.CanSkin;
} }
// unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
if (unitDynFlags.HasAnyFlag((uint)UnitDynFlags.TrackUnit)) if (dynamicFlags.HasAnyFlag((uint)UnitDynFlags.TrackUnit))
if (!unit.HasAuraTypeWithCaster(AuraType.ModStalked, receiver.GetGUID())) if (!unit.HasAuraTypeWithCaster(AuraType.ModStalked, receiver.GetGUID()))
unitDynFlags &= ~(uint)UnitDynFlags.TrackUnit; dynamicFlags &= ~(uint)UnitDynFlags.TrackUnit;
} }
else else
{ {
GameObject gameObject = obj.ToGameObject(); GameObject gameObject = obj.ToGameObject();
if (gameObject != null) if (gameObject != null)
{ {
GameObjectDynamicLowFlags dynFlags = GameObjectDynamicLowFlags.StateTransitionAnimDone; uint dynFlags = (uint)GameObjectDynamicLowFlags.StateTransitionAnimDone;
switch (gameObject.GetGoType()) switch (gameObject.GetGoType())
{ {
case GameObjectTypes.Button: case GameObjectTypes.Button:
case GameObjectTypes.Goober: case GameObjectTypes.Goober:
if (gameObject.HasConditionalInteraction() && gameObject.CanActivateForPlayer(receiver)) if (gameObject.HasConditionalInteraction() && gameObject.CanActivateForPlayer(receiver))
if (gameObject.GetGoStateFor(receiver.GetGUID()) != GameObjectState.Active) if (gameObject.GetGoStateFor(receiver.GetGUID()) != GameObjectState.Active)
dynFlags |= GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Highlight; dynFlags |= (uint)(GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Highlight);
break; break;
case GameObjectTypes.QuestGiver: case GameObjectTypes.QuestGiver:
if (gameObject.CanActivateForPlayer(receiver)) if (gameObject.CanActivateForPlayer(receiver))
dynFlags |= GameObjectDynamicLowFlags.Activate; dynFlags |= (uint)GameObjectDynamicLowFlags.Activate;
break; break;
case GameObjectTypes.Chest: case GameObjectTypes.Chest:
if (gameObject.HasConditionalInteraction() && gameObject.CanActivateForPlayer(receiver)) if (gameObject.HasConditionalInteraction() && gameObject.CanActivateForPlayer(receiver))
dynFlags |= GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Sparkle | GameObjectDynamicLowFlags.Highlight; dynFlags |= (uint)(GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Sparkle | GameObjectDynamicLowFlags.Highlight);
else if (receiver.IsGameMaster()) else if (receiver.IsGameMaster())
dynFlags |= GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Sparkle; dynFlags |= (uint)(GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Sparkle);
break; break;
case GameObjectTypes.Generic: case GameObjectTypes.Generic:
case GameObjectTypes.SpellFocus: case GameObjectTypes.SpellFocus:
if (gameObject.HasConditionalInteraction() && gameObject.CanActivateForPlayer(receiver)) if (gameObject.HasConditionalInteraction() && gameObject.CanActivateForPlayer(receiver))
dynFlags |= GameObjectDynamicLowFlags.Sparkle; dynFlags |= (uint)GameObjectDynamicLowFlags.Sparkle;
break;
case GameObjectTypes.Transport:
case GameObjectTypes.MapObjTransport:
dynFlags |= dynamicFlags; // preserve all dynamicflgs
break; break;
case GameObjectTypes.CapturePoint: case GameObjectTypes.CapturePoint:
if (!gameObject.CanInteractWithCapturePoint(receiver)) if (!gameObject.CanInteractWithCapturePoint(receiver))
dynFlags |= GameObjectDynamicLowFlags.NoInterract; dynFlags |= (uint)GameObjectDynamicLowFlags.NoInterract;
else else
dynFlags &= ~GameObjectDynamicLowFlags.NoInterract; dynFlags &= ~(uint)GameObjectDynamicLowFlags.NoInterract;
break; break;
case GameObjectTypes.GatheringNode: case GameObjectTypes.GatheringNode:
if (gameObject.HasConditionalInteraction() && gameObject.CanActivateForPlayer(receiver)) if (gameObject.HasConditionalInteraction() && gameObject.CanActivateForPlayer(receiver))
dynFlags |= GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Sparkle | GameObjectDynamicLowFlags.Highlight; dynFlags |= (uint)(GameObjectDynamicLowFlags.Activate | GameObjectDynamicLowFlags.Sparkle | GameObjectDynamicLowFlags.Highlight);
if (gameObject.GetGoStateFor(receiver.GetGUID()) == GameObjectState.Active) if (gameObject.GetGoStateFor(receiver.GetGUID()) == GameObjectState.Active)
dynFlags |= GameObjectDynamicLowFlags.Depleted; dynFlags |= (uint)GameObjectDynamicLowFlags.Depleted;
break; break;
default: default:
break; break;
@@ -156,22 +160,22 @@ namespace Game.Entities
// (Ignore GAMEOBJECT_TYPE_SPELLCASTER as interaction is handled by GO_DYNFLAG_LO_NO_INTERACT) // (Ignore GAMEOBJECT_TYPE_SPELLCASTER as interaction is handled by GO_DYNFLAG_LO_NO_INTERACT)
if (gameObject.GetGoType() != GameObjectTypes.GatheringNode && gameObject.GetGoType() != GameObjectTypes.FlagStand && gameObject.GetGoType() != GameObjectTypes.SpellCaster) if (gameObject.GetGoType() != GameObjectTypes.GatheringNode && gameObject.GetGoType() != GameObjectTypes.FlagStand && gameObject.GetGoType() != GameObjectTypes.SpellCaster)
if (gameObject.HasConditionalInteraction() && !gameObject.HasFlag(GameObjectFlags.InteractCond)) if (gameObject.HasConditionalInteraction() && !gameObject.HasFlag(GameObjectFlags.InteractCond))
dynFlags |= GameObjectDynamicLowFlags.InteractCond; dynFlags |= (uint)GameObjectDynamicLowFlags.InteractCond;
if (!gameObject.MeetsInteractCondition(receiver)) if (!gameObject.MeetsInteractCondition(receiver))
dynFlags |= GameObjectDynamicLowFlags.NoInterract; dynFlags |= (uint)GameObjectDynamicLowFlags.NoInterract;
var data = Global.ObjectMgr.GetSpawnMetadata(SpawnObjectType.GameObject, gameObject.GetSpawnId()); var data = Global.ObjectMgr.GetSpawnMetadata(SpawnObjectType.GameObject, gameObject.GetSpawnId());
if (data != null && data.spawnTrackingQuestObjectiveId != 0 && data.spawnTrackingData != null) if (data != null && data.spawnTrackingQuestObjectiveId != 0 && data.spawnTrackingData != null)
if (receiver.GetSpawnTrackingStateByObjective(data.spawnTrackingData.SpawnTrackingId, data.spawnTrackingQuestObjectiveId) != SpawnTrackingState.Active) if (receiver.GetSpawnTrackingStateByObjective(data.spawnTrackingData.SpawnTrackingId, data.spawnTrackingQuestObjectiveId) != SpawnTrackingState.Active)
dynFlags &= ~GameObjectDynamicLowFlags.Activate; dynFlags &= ~(uint)GameObjectDynamicLowFlags.Activate;
} }
unitDynFlags = (uint)dynFlags; dynamicFlags = dynFlags;
} }
} }
return unitDynFlags; return dynamicFlags;
} }
} }