Core/GameObjects: Transport (type 11) improvements

Port From (https://github.com/TrinityCore/TrinityCore/commit/630b60eb0dcd3d9ce41582664ab822b049365431)
This commit is contained in:
hondacrx
2022-06-03 16:20:41 -04:00
parent e65ce31742
commit 40444525b2
30 changed files with 807 additions and 377 deletions
@@ -79,27 +79,27 @@ namespace Game.Entities
uint GetViewerDependentDynamicFlags(ObjectFieldData objectData, WorldObject obj, Player receiver)
{
UnitDynFlags unitDynFlags = (UnitDynFlags)(uint)objectData.DynamicFlags;
uint unitDynFlags = objectData.DynamicFlags;
Unit unit = obj.ToUnit();
if (unit != null)
{
unitDynFlags &= ~UnitDynFlags.Tapped;
unitDynFlags &= ~(uint)UnitDynFlags.Tapped;
Creature creature = obj.ToCreature();
if (creature != null)
{
if (creature.HasLootRecipient() && !creature.IsTappedBy(receiver))
unitDynFlags |= UnitDynFlags.Tapped;
unitDynFlags |= (uint)UnitDynFlags.Tapped;
if (!receiver.IsAllowedToLoot(creature))
unitDynFlags &= ~UnitDynFlags.Lootable;
unitDynFlags &= ~(uint)UnitDynFlags.Lootable;
}
// unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
if (unitDynFlags.HasAnyFlag(UnitDynFlags.TrackUnit))
if (unitDynFlags.HasAnyFlag((uint)UnitDynFlags.TrackUnit))
if (!unit.HasAuraTypeWithCaster(AuraType.ModStalked, receiver.GetGUID()))
unitDynFlags &= ~UnitDynFlags.TrackUnit;
unitDynFlags &= ~(uint)UnitDynFlags.TrackUnit;
}
else
{
@@ -126,12 +126,18 @@ namespace Game.Entities
dynFlags |= GameObjectDynamicLowFlags.Sparkle | GameObjectDynamicLowFlags.Highlight;
break;
case GameObjectTypes.Transport:
{
dynFlags = (GameObjectDynamicLowFlags)((int)unitDynFlags & 0xFFFF);
pathProgress = (ushort)((int)unitDynFlags >> 16);
break;
}
case GameObjectTypes.MapObjTransport:
{
uint transportPeriod = gameObject.GetTransportPeriod();
Transport transport = gameObject.ToTransport();
uint transportPeriod = transport.GetTransportPeriod();
if (transportPeriod != 0)
{
float timer = (float)(gameObject.GetGoValue().Transport.PathProgress % transportPeriod);
float timer = (float)(transport.GetTimer() % transportPeriod);
pathProgress = (ushort)(timer / (float)transportPeriod * 65535.0f);
}
break;
@@ -146,11 +152,11 @@ namespace Game.Entities
break;
}
unitDynFlags = (UnitDynFlags)((pathProgress << 16) | (ushort)dynFlags);
unitDynFlags = (uint)((pathProgress << 16) | (ushort)dynFlags);
}
}
return (uint)unitDynFlags;
return unitDynFlags;
}
}
@@ -4946,13 +4952,13 @@ namespace Game.Entities
data.WriteFloat(rotation.Z);
data.WriteFloat(rotation.W);
data.WriteUInt32(FactionTemplate);
data.WriteInt8(GetViewerGameObjectState(this, owner, receiver));
data.WriteInt8(State);
data.WriteInt8(TypeID);
data.WriteUInt8(PercentHealth);
data.WriteUInt32(ArtKit);
data.WriteInt32(EnableDoodadSets.Size());
data.WriteUInt32(CustomParam);
data.WriteUInt32(GetViewerGameObjectLevel(this, owner, receiver));
data.WriteUInt32(Level);
data.WriteUInt32(AnimGroupInstance);
for (int i = 0; i < EnableDoodadSets.Size(); ++i)
{
@@ -5053,7 +5059,7 @@ namespace Game.Entities
}
if (changesMask[14])
{
data.WriteInt8(GetViewerGameObjectState(this, owner, receiver));
data.WriteInt8(State);
}
if (changesMask[15])
{
@@ -5073,7 +5079,7 @@ namespace Game.Entities
}
if (changesMask[19])
{
data.WriteUInt32(GetViewerGameObjectLevel(this, owner, receiver));
data.WriteUInt32(Level);
}
if (changesMask[20])
{
@@ -5116,24 +5122,6 @@ namespace Game.Entities
return flags;
}
uint GetViewerGameObjectLevel(GameObjectFieldData gameObjectData, GameObject gameObject, Player receiver)
{
uint level = gameObjectData.Level;
bool isStoppableTransport = gameObject.GetGoType() == GameObjectTypes.Transport && !gameObject.GetGoValue().Transport.StopFrames.Empty();
return isStoppableTransport ? gameObject.GetGoValue().Transport.PathProgress : level;
}
sbyte GetViewerGameObjectState(GameObjectFieldData gameObjectData, GameObject gameObject, Player receiver)
{
sbyte state = gameObjectData.State;
bool isStoppableTransport = gameObject.GetGoType() == GameObjectTypes.Transport && !gameObject.GetGoValue().Transport.StopFrames.Empty();
if (isStoppableTransport && gameObject.GetGoState() == GameObjectState.TransportActive)
if (((gameObject.GetGoValue().Transport.StateUpdateTimer / 20000) & 1) != 0)
state = (sbyte)GameObjectState.TransportStopped;
return state;
}
}
public class DynamicObjectData : BaseUpdateData<DynamicObject>