Core/Movement: Change default spline flags - Steering replaces SmoothGroundPath
Port From (https://github.com/TrinityCore/TrinityCore/commit/3af5cafec782ab4d5d5d8478927caae0e6258174)
This commit is contained in:
@@ -14,10 +14,9 @@ namespace Framework.Constants
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
public enum SplineFlag : uint
|
public enum MoveSplineFlagEnum : uint
|
||||||
{
|
{
|
||||||
None = 0x00,
|
None = 0x00,
|
||||||
// x00-x07 used as animation Ids storage in pair with Animation flag
|
|
||||||
Unknown_0x1 = 0x00000001, // NOT VERIFIED
|
Unknown_0x1 = 0x00000001, // NOT VERIFIED
|
||||||
Unknown_0x2 = 0x00000002, // NOT VERIFIED
|
Unknown_0x2 = 0x00000002, // NOT VERIFIED
|
||||||
Unknown_0x4 = 0x00000004, // NOT VERIFIED
|
Unknown_0x4 = 0x00000004, // NOT VERIFIED
|
||||||
@@ -51,12 +50,10 @@ namespace Framework.Constants
|
|||||||
Unknown_0x40000000 = 0x40000000, // NOT VERIFIED
|
Unknown_0x40000000 = 0x40000000, // NOT VERIFIED
|
||||||
Unknown_0x80000000 = 0x80000000, // NOT VERIFIED
|
Unknown_0x80000000 = 0x80000000, // NOT VERIFIED
|
||||||
|
|
||||||
// animation ids stored here, see AnimType enum, used with Animation flag
|
|
||||||
MaskAnimations = 0x7,
|
|
||||||
// flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably
|
// flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably
|
||||||
MaskNoMonsterMove = Done,
|
MaskNoMonsterMove = Done,
|
||||||
// Unused, not suported flags
|
// Unused, not suported flags
|
||||||
MaskUnused = NoSpline | EnterCycle | Frozen | Unknown_0x8 | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000
|
MaskUnused = NoSpline | EnterCycle | Frozen | Unknown_0x8 | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000
|
||||||
| Unknown_0x800000 | FastSteering | FadeObject | UnlimitedSpeed | Unknown_0x40000000 | Unknown_0x80000000
|
| Unknown_0x800000 | FadeObject | UnlimitedSpeed | Unknown_0x40000000 | Unknown_0x80000000
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -437,10 +437,6 @@ namespace Game.Movement
|
|||||||
|
|
||||||
MoveSplineInit init = new(owner);
|
MoveSplineInit init = new(owner);
|
||||||
|
|
||||||
// because steering flag can cause position on client to not be perfectly accurate, dont do it in combat
|
|
||||||
if (!owner.IsInCombat())
|
|
||||||
init.SetSteering();
|
|
||||||
|
|
||||||
//! If creature is on transport, we assume waypoints set in DB are already transport offsets
|
//! If creature is on transport, we assume waypoints set in DB are already transport offsets
|
||||||
if (transportPath)
|
if (transportPath)
|
||||||
init.DisableTransportPathTransformations();
|
init.DisableTransportPathTransformations();
|
||||||
@@ -494,6 +490,7 @@ namespace Game.Movement
|
|||||||
if (!IsExactSplinePath()
|
if (!IsExactSplinePath()
|
||||||
&& duration > 2 * SEND_NEXT_POINT_EARLY_DELTA
|
&& duration > 2 * SEND_NEXT_POINT_EARLY_DELTA
|
||||||
&& lastWaypointForSegment.Delay == TimeSpan.Zero
|
&& lastWaypointForSegment.Delay == TimeSpan.Zero
|
||||||
|
&& _path.Nodes.Count > 2
|
||||||
// don't cut movement short at ends of path if its not a looping path or if it can be traversed backwards
|
// don't cut movement short at ends of path if its not a looping path or if it can be traversed backwards
|
||||||
&& ((_currentNode != 0 && _currentNode != _path.Nodes.Count - 1) || (!IsFollowingPathBackwardsFromEndToStart() && _repeating)))
|
&& ((_currentNode != 0 && _currentNode != _path.Nodes.Count - 1) || (!IsFollowingPathBackwardsFromEndToStart() && _repeating)))
|
||||||
duration -= SEND_NEXT_POINT_EARLY_DELTA;
|
duration -= SEND_NEXT_POINT_EARLY_DELTA;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ namespace Game.Movement
|
|||||||
point_Idx_offset = 0;
|
point_Idx_offset = 0;
|
||||||
onTransport = false;
|
onTransport = false;
|
||||||
splineIsFacingOnly = false;
|
splineIsFacingOnly = false;
|
||||||
splineflags.Flags = SplineFlag.Done;
|
splineflags.Flags = MoveSplineFlagEnum.Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialize(MoveSplineInitArgs args)
|
public void Initialize(MoveSplineInitArgs args)
|
||||||
@@ -43,7 +43,7 @@ namespace Game.Movement
|
|||||||
velocity = args.velocity;
|
velocity = args.velocity;
|
||||||
|
|
||||||
// Check if its a stop spline
|
// Check if its a stop spline
|
||||||
if (args.flags.HasFlag(SplineFlag.Done))
|
if (args.flags.HasFlag(MoveSplineFlagEnum.Done))
|
||||||
{
|
{
|
||||||
spline.Clear();
|
spline.Clear();
|
||||||
return;
|
return;
|
||||||
@@ -53,14 +53,14 @@ namespace Game.Movement
|
|||||||
|
|
||||||
// init parabolic / animation
|
// init parabolic / animation
|
||||||
// spline initialized, duration known and i able to compute parabolic acceleration
|
// spline initialized, duration known and i able to compute parabolic acceleration
|
||||||
if (args.flags.HasFlag(SplineFlag.Parabolic | SplineFlag.Animation | SplineFlag.FadeObject))
|
if (args.flags.HasFlag(MoveSplineFlagEnum.Parabolic | MoveSplineFlagEnum.Animation | MoveSplineFlagEnum.FadeObject))
|
||||||
{
|
{
|
||||||
int spline_duration = Duration();
|
int spline_duration = Duration();
|
||||||
effect_start_time = (int)(spline_duration * args.effect_start_time_percent + args.effect_start_time.TotalMilliseconds);
|
effect_start_time = (int)(spline_duration * args.effect_start_time_percent + args.effect_start_time.TotalMilliseconds);
|
||||||
if (effect_start_time > spline_duration)
|
if (effect_start_time > spline_duration)
|
||||||
effect_start_time = spline_duration;
|
effect_start_time = spline_duration;
|
||||||
|
|
||||||
if (args.flags.HasFlag(SplineFlag.Parabolic) && effect_start_time < spline_duration)
|
if (args.flags.HasFlag(MoveSplineFlagEnum.Parabolic) && effect_start_time < spline_duration)
|
||||||
{
|
{
|
||||||
if (args.parabolic_amplitude != 0.0f)
|
if (args.parabolic_amplitude != 0.0f)
|
||||||
{
|
{
|
||||||
@@ -78,10 +78,10 @@ namespace Game.Movement
|
|||||||
void InitSpline(MoveSplineInitArgs args)
|
void InitSpline(MoveSplineInitArgs args)
|
||||||
{
|
{
|
||||||
EvaluationMode[] modes = new EvaluationMode[2] { EvaluationMode.Linear, EvaluationMode.Catmullrom };
|
EvaluationMode[] modes = new EvaluationMode[2] { EvaluationMode.Linear, EvaluationMode.Catmullrom };
|
||||||
if (args.flags.HasFlag(SplineFlag.Cyclic))
|
if (args.flags.HasFlag(MoveSplineFlagEnum.Cyclic))
|
||||||
{
|
{
|
||||||
int cyclic_point = 0;
|
int cyclic_point = 0;
|
||||||
if (splineflags.HasFlag(SplineFlag.EnterCycle))
|
if (splineflags.HasFlag(MoveSplineFlagEnum.EnterCycle))
|
||||||
cyclic_point = 1; // shouldn't be modified, came from client
|
cyclic_point = 1; // shouldn't be modified, came from client
|
||||||
spline.InitCyclicSpline(args.path.ToArray(), args.path.Count, modes[Convert.ToInt32(args.flags.IsSmooth())], cyclic_point, args.initialOrientation);
|
spline.InitCyclicSpline(args.path.ToArray(), args.path.Count, modes[Convert.ToInt32(args.flags.IsSmooth())], cyclic_point, args.initialOrientation);
|
||||||
}
|
}
|
||||||
@@ -91,7 +91,7 @@ namespace Game.Movement
|
|||||||
}
|
}
|
||||||
|
|
||||||
// init spline timestamps
|
// init spline timestamps
|
||||||
if (splineflags.HasFlag(SplineFlag.Falling))
|
if (splineflags.HasFlag(MoveSplineFlagEnum.Falling))
|
||||||
{
|
{
|
||||||
FallInitializer init = new(spline.GetPoint(spline.First()).Z);
|
FallInitializer init = new(spline.GetPoint(spline.First()).Z);
|
||||||
spline.InitLengths(init);
|
spline.InitLengths(init);
|
||||||
@@ -126,10 +126,10 @@ namespace Game.Movement
|
|||||||
public int Duration() { return spline.Length(); }
|
public int Duration() { return spline.Length(); }
|
||||||
public int CurrentSplineIdx() { return point_Idx; }
|
public int CurrentSplineIdx() { return point_Idx; }
|
||||||
public uint GetId() { return m_Id; }
|
public uint GetId() { return m_Id; }
|
||||||
public bool Finalized() { return splineflags.HasFlag(SplineFlag.Done); }
|
public bool Finalized() { return splineflags.HasFlag(MoveSplineFlagEnum.Done); }
|
||||||
void _Finalize()
|
void _Finalize()
|
||||||
{
|
{
|
||||||
splineflags.SetUnsetFlag(SplineFlag.Done);
|
splineflags.SetUnsetFlag(MoveSplineFlagEnum.Done);
|
||||||
point_Idx = spline.Last() - 1;
|
point_Idx = spline.Last() - 1;
|
||||||
time_passed = Duration();
|
time_passed = Duration();
|
||||||
}
|
}
|
||||||
@@ -144,12 +144,12 @@ namespace Game.Movement
|
|||||||
float orientation = initialOrientation;
|
float orientation = initialOrientation;
|
||||||
spline.Evaluate_Percent(point_index, u, out c);
|
spline.Evaluate_Percent(point_index, u, out c);
|
||||||
|
|
||||||
if (splineflags.HasFlag(SplineFlag.Parabolic))
|
if (splineflags.HasFlag(MoveSplineFlagEnum.Parabolic))
|
||||||
ComputeParabolicElevation(time_point, ref c.Z);
|
ComputeParabolicElevation(time_point, ref c.Z);
|
||||||
else if (splineflags.HasFlag(SplineFlag.Falling))
|
else if (splineflags.HasFlag(MoveSplineFlagEnum.Falling))
|
||||||
ComputeFallElevation(time_point, ref c.Z);
|
ComputeFallElevation(time_point, ref c.Z);
|
||||||
|
|
||||||
if (splineflags.HasFlag(SplineFlag.Done) && facing.type != MonsterMoveType.Normal)
|
if (splineflags.HasFlag(MoveSplineFlagEnum.Done) && facing.type != MonsterMoveType.Normal)
|
||||||
{
|
{
|
||||||
if (facing.type == MonsterMoveType.FacingAngle)
|
if (facing.type == MonsterMoveType.FacingAngle)
|
||||||
orientation = facing.angle;
|
orientation = facing.angle;
|
||||||
@@ -159,7 +159,7 @@ namespace Game.Movement
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!splineflags.HasFlag(SplineFlag.OrientationFixed | SplineFlag.Falling | SplineFlag.Unknown_0x8))
|
if (!splineflags.HasFlag(MoveSplineFlagEnum.OrientationFixed | MoveSplineFlagEnum.Falling | MoveSplineFlagEnum.Unknown_0x8))
|
||||||
{
|
{
|
||||||
Vector3 hermite;
|
Vector3 hermite;
|
||||||
spline.Evaluate_Derivative(point_Idx, u, out hermite);
|
spline.Evaluate_Derivative(point_Idx, u, out hermite);
|
||||||
@@ -167,7 +167,7 @@ namespace Game.Movement
|
|||||||
orientation = MathF.Atan2(hermite.Y, hermite.X);
|
orientation = MathF.Atan2(hermite.Y, hermite.X);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (splineflags.HasFlag(SplineFlag.Backward))
|
if (splineflags.HasFlag(MoveSplineFlagEnum.Backward))
|
||||||
orientation -= MathF.PI;
|
orientation -= MathF.PI;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,7 +250,7 @@ namespace Game.Movement
|
|||||||
return time_passed > 0;
|
return time_passed > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Interrupt() { splineflags.SetUnsetFlag(SplineFlag.Done); }
|
public void Interrupt() { splineflags.SetUnsetFlag(MoveSplineFlagEnum.Done); }
|
||||||
public void UpdateState(int difftime)
|
public void UpdateState(int difftime)
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
@@ -287,9 +287,9 @@ namespace Game.Movement
|
|||||||
result = UpdateResult.NextCycle;
|
result = UpdateResult.NextCycle;
|
||||||
// Remove first point from the path after one full cycle.
|
// Remove first point from the path after one full cycle.
|
||||||
// That point was the position of the unit prior to entering the cycle and it shouldn't be repeated with continuous cycles.
|
// That point was the position of the unit prior to entering the cycle and it shouldn't be repeated with continuous cycles.
|
||||||
if (splineflags.HasFlag(SplineFlag.EnterCycle))
|
if (splineflags.HasFlag(MoveSplineFlagEnum.EnterCycle))
|
||||||
{
|
{
|
||||||
splineflags.SetUnsetFlag(SplineFlag.EnterCycle, false);
|
splineflags.SetUnsetFlag(MoveSplineFlagEnum.EnterCycle, false);
|
||||||
|
|
||||||
MoveSplineInitArgs args = new(spline.GetPointCount());
|
MoveSplineInitArgs args = new(spline.GetPointCount());
|
||||||
args.path.AddRange(spline.GetPoints().AsSpan().Slice(spline.First() + 1, spline.Last()).ToArray());
|
args.path.AddRange(spline.GetPoints().AsSpan().Slice(spline.First() + 1, spline.Last()).ToArray());
|
||||||
@@ -333,8 +333,8 @@ namespace Game.Movement
|
|||||||
}
|
}
|
||||||
int NextTimestamp() { return spline.Length(point_Idx + 1); }
|
int NextTimestamp() { return spline.Length(point_Idx + 1); }
|
||||||
int SegmentTimeElapsed() { return NextTimestamp() - time_passed; }
|
int SegmentTimeElapsed() { return NextTimestamp() - time_passed; }
|
||||||
public bool IsCyclic() { return splineflags.HasFlag(SplineFlag.Cyclic); }
|
public bool IsCyclic() { return splineflags.HasFlag(MoveSplineFlagEnum.Cyclic); }
|
||||||
public bool IsFalling() { return splineflags.HasFlag(SplineFlag.Falling); }
|
public bool IsFalling() { return splineflags.HasFlag(MoveSplineFlagEnum.Falling); }
|
||||||
public bool Initialized() { return !spline.Empty(); }
|
public bool Initialized() { return !spline.Empty(); }
|
||||||
public Vector3 FinalDestination() { return Initialized() ? spline.GetPoint(spline.Last()) : Vector3.Zero; }
|
public Vector3 FinalDestination() { return Initialized() ? spline.GetPoint(spline.Last()) : Vector3.Zero; }
|
||||||
public Vector3 CurrentDestination() { return Initialized() ? spline.GetPoint(point_Idx + 1) : Vector3.Zero; }
|
public Vector3 CurrentDestination() { return Initialized() ? spline.GetPoint(point_Idx + 1) : Vector3.Zero; }
|
||||||
|
|||||||
@@ -9,16 +9,16 @@ namespace Game.Movement
|
|||||||
public class MoveSplineFlag
|
public class MoveSplineFlag
|
||||||
{
|
{
|
||||||
public MoveSplineFlag() { }
|
public MoveSplineFlag() { }
|
||||||
public MoveSplineFlag(SplineFlag f) { Flags = f; }
|
public MoveSplineFlag(MoveSplineFlagEnum f) { Flags = f; }
|
||||||
public MoveSplineFlag(MoveSplineFlag f) { Flags = f.Flags; }
|
public MoveSplineFlag(MoveSplineFlag f) { Flags = f.Flags; }
|
||||||
|
|
||||||
public bool IsSmooth() { return Flags.HasAnyFlag(SplineFlag.Catmullrom); }
|
public bool IsSmooth() { return Flags.HasAnyFlag(MoveSplineFlagEnum.Catmullrom); }
|
||||||
public bool IsLinear() { return !IsSmooth(); }
|
public bool IsLinear() { return !IsSmooth(); }
|
||||||
|
|
||||||
public bool HasAllFlags(SplineFlag f) { return (Flags & f) == f; }
|
public bool HasAllFlags(MoveSplineFlagEnum f) { return (Flags & f) == f; }
|
||||||
public bool HasFlag(SplineFlag f) { return (Flags & f) != 0; }
|
public bool HasFlag(MoveSplineFlagEnum f) { return (Flags & f) != 0; }
|
||||||
|
|
||||||
public void SetUnsetFlag(SplineFlag f, bool Set = true)
|
public void SetUnsetFlag(MoveSplineFlagEnum f, bool Set = true)
|
||||||
{
|
{
|
||||||
if (Set)
|
if (Set)
|
||||||
Flags |= f;
|
Flags |= f;
|
||||||
@@ -26,16 +26,16 @@ namespace Game.Movement
|
|||||||
Flags &= ~f;
|
Flags &= ~f;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void EnableAnimation() { Flags = (Flags & ~(SplineFlag.Falling | SplineFlag.Parabolic | SplineFlag.FallingSlow | SplineFlag.FadeObject)) | SplineFlag.Animation; }
|
public void EnableAnimation() { Flags = (Flags & ~(MoveSplineFlagEnum.Falling | MoveSplineFlagEnum.Parabolic | MoveSplineFlagEnum.FallingSlow | MoveSplineFlagEnum.FadeObject)) | MoveSplineFlagEnum.Animation; }
|
||||||
public void EnableParabolic() { Flags = (Flags & ~(SplineFlag.Falling | SplineFlag.Animation | SplineFlag.FallingSlow | SplineFlag.FadeObject)) | SplineFlag.Parabolic; }
|
public void EnableParabolic() { Flags = (Flags & ~(MoveSplineFlagEnum.Falling | MoveSplineFlagEnum.Animation | MoveSplineFlagEnum.FallingSlow | MoveSplineFlagEnum.FadeObject)) | MoveSplineFlagEnum.Parabolic; }
|
||||||
public void EnableFlying() { Flags = (Flags & ~SplineFlag.Falling) | SplineFlag.Flying; }
|
public void EnableFlying() { Flags = (Flags & ~MoveSplineFlagEnum.Falling) | MoveSplineFlagEnum.Flying; }
|
||||||
public void EnableFalling() { Flags = (Flags & ~(SplineFlag.Parabolic | SplineFlag.Animation | SplineFlag.Flying)) | SplineFlag.Falling; }
|
public void EnableFalling() { Flags = (Flags & ~(MoveSplineFlagEnum.Parabolic | MoveSplineFlagEnum.Animation | MoveSplineFlagEnum.Flying)) | MoveSplineFlagEnum.Falling; }
|
||||||
public void EnableCatmullRom() { Flags = (Flags & ~SplineFlag.SmoothGroundPath) | SplineFlag.Catmullrom; }
|
public void EnableCatmullRom() { Flags = (Flags & ~MoveSplineFlagEnum.SmoothGroundPath) | MoveSplineFlagEnum.Catmullrom; }
|
||||||
public void EnableTransportEnter() { Flags = (Flags & ~SplineFlag.TransportExit) | SplineFlag.TransportEnter; }
|
public void EnableTransportEnter() { Flags = (Flags & ~MoveSplineFlagEnum.TransportExit) | MoveSplineFlagEnum.TransportEnter; }
|
||||||
public void EnableTransportExit() { Flags = (Flags & ~SplineFlag.TransportEnter) | SplineFlag.TransportExit; }
|
public void EnableTransportExit() { Flags = (Flags & ~MoveSplineFlagEnum.TransportEnter) | MoveSplineFlagEnum.TransportExit; }
|
||||||
public void EnableSteering() { Flags = (Flags & ~SplineFlag.SmoothGroundPath) | SplineFlag.Steering; }
|
public void EnableSteering() { Flags = (Flags & ~MoveSplineFlagEnum.SmoothGroundPath) | MoveSplineFlagEnum.Steering; }
|
||||||
|
|
||||||
public SplineFlag Flags;
|
public MoveSplineFlagEnum Flags;
|
||||||
public byte animTier;
|
public byte animTier;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ namespace Game.Movement
|
|||||||
// Elevators also use MOVEMENTFLAG_ONTRANSPORT but we do not keep track of their position changes
|
// Elevators also use MOVEMENTFLAG_ONTRANSPORT but we do not keep track of their position changes
|
||||||
args.TransformForTransport = !unit.GetTransGUID().IsEmpty();
|
args.TransformForTransport = !unit.GetTransGUID().IsEmpty();
|
||||||
// mix existing state into new
|
// mix existing state into new
|
||||||
args.flags.SetUnsetFlag(SplineFlag.CanSwim, unit.CanSwim());
|
args.flags.SetUnsetFlag(MoveSplineFlagEnum.CanSwim, unit.CanSwim());
|
||||||
args.walk = unit.HasUnitMovementFlag(MovementFlag.Walking);
|
args.walk = unit.HasUnitMovementFlag(MovementFlag.Walking);
|
||||||
args.flags.SetUnsetFlag(SplineFlag.Flying, unit.HasUnitMovementFlag(MovementFlag.CanFly | MovementFlag.DisableGravity));
|
args.flags.SetUnsetFlag(MoveSplineFlagEnum.Flying, unit.HasUnitMovementFlag(MovementFlag.CanFly | MovementFlag.DisableGravity));
|
||||||
args.flags.SetUnsetFlag(SplineFlag.Steering, unit.HasNpcFlag2(NPCFlags2.Steering));
|
args.flags.SetUnsetFlag(MoveSplineFlagEnum.FastSteering, true);
|
||||||
args.flags.SetUnsetFlag(SplineFlag.SmoothGroundPath, !args.flags.HasFlag(SplineFlag.Flying) && !args.flags.HasFlag(SplineFlag.Steering)); // enabled by default, CatmullRom mode or client config "pathSmoothing" will disable this
|
args.flags.SetUnsetFlag(MoveSplineFlagEnum.Steering, unit.HasNpcFlag2(NPCFlags2.Steering) || !unit.IsInCombat());
|
||||||
}
|
}
|
||||||
|
|
||||||
UnitMoveType SelectSpeedType(MovementFlag moveFlags)
|
UnitMoveType SelectSpeedType(MovementFlag moveFlags)
|
||||||
@@ -87,11 +87,11 @@ namespace Game.Movement
|
|||||||
// correct first vertex
|
// correct first vertex
|
||||||
args.path[0] = new Vector3(real_position.X, real_position.Y, real_position.Z);
|
args.path[0] = new Vector3(real_position.X, real_position.Y, real_position.Z);
|
||||||
args.initialOrientation = real_position.W;
|
args.initialOrientation = real_position.W;
|
||||||
args.flags.SetUnsetFlag(SplineFlag.EnterCycle, args.flags.HasFlag(SplineFlag.Cyclic));
|
args.flags.SetUnsetFlag(MoveSplineFlagEnum.EnterCycle, args.flags.HasFlag(MoveSplineFlagEnum.Cyclic));
|
||||||
move_spline.onTransport = transport;
|
move_spline.onTransport = transport;
|
||||||
|
|
||||||
MovementFlag moveFlags = unit.m_movementInfo.GetMovementFlags();
|
MovementFlag moveFlags = unit.m_movementInfo.GetMovementFlags();
|
||||||
if (!args.flags.HasFlag(SplineFlag.Backward))
|
if (!args.flags.HasFlag(MoveSplineFlagEnum.Backward))
|
||||||
moveFlags = (moveFlags & ~MovementFlag.Backward) | MovementFlag.Forward;
|
moveFlags = (moveFlags & ~MovementFlag.Backward) | MovementFlag.Forward;
|
||||||
else
|
else
|
||||||
moveFlags = (moveFlags & ~MovementFlag.Forward) | MovementFlag.Backward;
|
moveFlags = (moveFlags & ~MovementFlag.Forward) | MovementFlag.Backward;
|
||||||
@@ -119,10 +119,10 @@ namespace Game.Movement
|
|||||||
// limit the speed in the same way the client does
|
// limit the speed in the same way the client does
|
||||||
float speedLimit()
|
float speedLimit()
|
||||||
{
|
{
|
||||||
if (args.flags.HasFlag(SplineFlag.UnlimitedSpeed))
|
if (args.flags.HasFlag(MoveSplineFlagEnum.UnlimitedSpeed))
|
||||||
return float.MaxValue;
|
return float.MaxValue;
|
||||||
|
|
||||||
if (args.flags.HasFlag(SplineFlag.Falling) || args.flags.HasFlag(SplineFlag.Catmullrom) || args.flags.HasFlag(SplineFlag.Flying) || args.flags.HasFlag(SplineFlag.Parabolic))
|
if (args.flags.HasFlag(MoveSplineFlagEnum.Falling) || args.flags.HasFlag(MoveSplineFlagEnum.Catmullrom) || args.flags.HasFlag(MoveSplineFlagEnum.Flying) || args.flags.HasFlag(MoveSplineFlagEnum.Parabolic))
|
||||||
return 50.0f;
|
return 50.0f;
|
||||||
|
|
||||||
return Math.Max(28.0f, unit.GetSpeed(UnitMoveType.Run) * 4.0f);
|
return Math.Max(28.0f, unit.GetSpeed(UnitMoveType.Run) * 4.0f);
|
||||||
@@ -176,7 +176,7 @@ namespace Game.Movement
|
|||||||
loc.W = unit.GetOrientation();
|
loc.W = unit.GetOrientation();
|
||||||
}
|
}
|
||||||
|
|
||||||
args.flags.Flags = SplineFlag.Done;
|
args.flags.Flags = MoveSplineFlagEnum.Done;
|
||||||
unit.m_movementInfo.RemoveMovementFlag(MovementFlag.Forward);
|
unit.m_movementInfo.RemoveMovementFlag(MovementFlag.Forward);
|
||||||
move_spline.onTransport = transport;
|
move_spline.onTransport = transport;
|
||||||
move_spline.Initialize(args);
|
move_spline.Initialize(args);
|
||||||
@@ -257,7 +257,7 @@ namespace Game.Movement
|
|||||||
public void SetFall()
|
public void SetFall()
|
||||||
{
|
{
|
||||||
args.flags.EnableFalling();
|
args.flags.EnableFalling();
|
||||||
args.flags.SetUnsetFlag(SplineFlag.FallingSlow, unit.HasUnitMovementFlag(MovementFlag.FallingSlow));
|
args.flags.SetUnsetFlag(MoveSplineFlagEnum.FallingSlow, unit.HasUnitMovementFlag(MovementFlag.FallingSlow));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetFirstPointId(int pointId) { args.path_Idx_offset = pointId; }
|
public void SetFirstPointId(int pointId) { args.path_Idx_offset = pointId; }
|
||||||
@@ -268,23 +268,23 @@ namespace Game.Movement
|
|||||||
|
|
||||||
public void SetSmooth() { args.flags.EnableCatmullRom(); }
|
public void SetSmooth() { args.flags.EnableCatmullRom(); }
|
||||||
|
|
||||||
public void SetUncompressed() { args.flags.SetUnsetFlag(SplineFlag.UncompressedPath); }
|
public void SetUncompressed() { args.flags.SetUnsetFlag(MoveSplineFlagEnum.UncompressedPath); }
|
||||||
|
|
||||||
public void SetCyclic() { args.flags.SetUnsetFlag(SplineFlag.Cyclic); }
|
public void SetCyclic() { args.flags.SetUnsetFlag(MoveSplineFlagEnum.Cyclic); }
|
||||||
|
|
||||||
public void SetVelocity(float vel) { args.velocity = vel; args.HasVelocity = true; }
|
public void SetVelocity(float vel) { args.velocity = vel; args.HasVelocity = true; }
|
||||||
|
|
||||||
void SetBackward() { args.flags.SetUnsetFlag(SplineFlag.Backward); }
|
void SetBackward() { args.flags.SetUnsetFlag(MoveSplineFlagEnum.Backward); }
|
||||||
|
|
||||||
public void SetTransportEnter() { args.flags.EnableTransportEnter(); }
|
public void SetTransportEnter() { args.flags.EnableTransportEnter(); }
|
||||||
|
|
||||||
public void SetTransportExit() { args.flags.EnableTransportExit(); }
|
public void SetTransportExit() { args.flags.EnableTransportExit(); }
|
||||||
|
|
||||||
public void SetOrientationFixed(bool enable) { args.flags.SetUnsetFlag(SplineFlag.OrientationFixed, enable); }
|
public void SetOrientationFixed(bool enable) { args.flags.SetUnsetFlag(MoveSplineFlagEnum.OrientationFixed, enable); }
|
||||||
|
|
||||||
public void SetSteering() { args.flags.EnableSteering(); }
|
public void SetSteering() { args.flags.EnableSteering(); }
|
||||||
|
|
||||||
public void SetUnlimitedSpeed() { args.flags.SetUnsetFlag(SplineFlag.UnlimitedSpeed, true); }
|
public void SetUnlimitedSpeed() { args.flags.SetUnsetFlag(MoveSplineFlagEnum.UnlimitedSpeed, true); }
|
||||||
|
|
||||||
public void MovebyPath(Vector3[] controls, int path_offset = 0)
|
public void MovebyPath(Vector3[] controls, int path_offset = 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -97,11 +97,11 @@ namespace Game.Movement
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// when compression is enabled, each point coord is packed into 11 bits (10 for Z)
|
// when compression is enabled, each point coord is packed into 11 bits (10 for Z)
|
||||||
if (!flags.HasFlag(SplineFlag.UncompressedPath))
|
if (!flags.HasFlag(MoveSplineFlagEnum.UncompressedPath))
|
||||||
if (!isValidPackedXYOffset(MathF.Abs(path[i].X - middle.X))
|
if (!isValidPackedXYOffset(MathF.Abs(path[i].X - middle.X))
|
||||||
|| !isValidPackedXYOffset(MathF.Abs(path[i].Y - middle.Y))
|
|| !isValidPackedXYOffset(MathF.Abs(path[i].Y - middle.Y))
|
||||||
|| !isValidPackedZOffset(MathF.Abs(path[i].Z - middle.Z)))
|
|| !isValidPackedZOffset(MathF.Abs(path[i].Z - middle.Z)))
|
||||||
flags.SetUnsetFlag(SplineFlag.UncompressedPath, true);
|
flags.SetUnsetFlag(MoveSplineFlagEnum.UncompressedPath, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -235,11 +235,11 @@ namespace Game.Networking.Packets
|
|||||||
data.WriteFloat(1.0f); // DurationModifier
|
data.WriteFloat(1.0f); // DurationModifier
|
||||||
data.WriteFloat(1.0f); // NextDurationModifier
|
data.WriteFloat(1.0f); // NextDurationModifier
|
||||||
data.WriteBits((byte)moveSpline.facing.type, 2); // Face
|
data.WriteBits((byte)moveSpline.facing.type, 2); // Face
|
||||||
bool hasFadeObjectTime = data.WriteBit(moveSpline.splineflags.HasFlag(SplineFlag.FadeObject) && moveSpline.effect_start_time < moveSpline.Duration());
|
bool hasFadeObjectTime = data.WriteBit(moveSpline.splineflags.HasFlag(MoveSplineFlagEnum.FadeObject) && moveSpline.effect_start_time < moveSpline.Duration());
|
||||||
data.WriteBits(moveSpline.GetPath().Length, 16);
|
data.WriteBits(moveSpline.GetPath().Length, 16);
|
||||||
data.WriteBit(false); // HasSplineFilter
|
data.WriteBit(false); // HasSplineFilter
|
||||||
data.WriteBit(moveSpline.spell_effect_extra != null); // HasSpellEffectExtraData
|
data.WriteBit(moveSpline.spell_effect_extra != null); // HasSpellEffectExtraData
|
||||||
bool hasJumpExtraData = data.WriteBit(moveSpline.splineflags.HasFlag(SplineFlag.Parabolic) && (moveSpline.spell_effect_extra == null || moveSpline.effect_start_time != 0));
|
bool hasJumpExtraData = data.WriteBit(moveSpline.splineflags.HasFlag(MoveSplineFlagEnum.Parabolic) && (moveSpline.spell_effect_extra == null || moveSpline.effect_start_time != 0));
|
||||||
data.WriteBit(moveSpline.anim_tier != null); // HasAnimTierTransition
|
data.WriteBit(moveSpline.anim_tier != null); // HasAnimTierTransition
|
||||||
data.WriteBit(false); // HasUnknown901
|
data.WriteBit(false); // HasUnknown901
|
||||||
data.FlushBits();
|
data.FlushBits();
|
||||||
@@ -396,7 +396,7 @@ namespace Game.Networking.Packets
|
|||||||
MovementSpline movementSpline = SplineData.Move;
|
MovementSpline movementSpline = SplineData.Move;
|
||||||
|
|
||||||
MoveSplineFlag splineFlags = moveSpline.splineflags;
|
MoveSplineFlag splineFlags = moveSpline.splineflags;
|
||||||
movementSpline.Flags = (uint)(splineFlags.Flags & ~SplineFlag.MaskNoMonsterMove);
|
movementSpline.Flags = (uint)(splineFlags.Flags & ~MoveSplineFlagEnum.MaskNoMonsterMove);
|
||||||
movementSpline.Face = moveSpline.facing.type;
|
movementSpline.Face = moveSpline.facing.type;
|
||||||
movementSpline.FaceDirection = moveSpline.facing.angle;
|
movementSpline.FaceDirection = moveSpline.facing.angle;
|
||||||
movementSpline.FaceGUID = moveSpline.facing.target;
|
movementSpline.FaceGUID = moveSpline.facing.target;
|
||||||
@@ -413,7 +413,7 @@ namespace Game.Networking.Packets
|
|||||||
|
|
||||||
movementSpline.MoveTime = (uint)moveSpline.Duration();
|
movementSpline.MoveTime = (uint)moveSpline.Duration();
|
||||||
|
|
||||||
if (splineFlags.HasFlag(SplineFlag.Parabolic) && (moveSpline.spell_effect_extra == null || moveSpline.effect_start_time != 0))
|
if (splineFlags.HasFlag(MoveSplineFlagEnum.Parabolic) && (moveSpline.spell_effect_extra == null || moveSpline.effect_start_time != 0))
|
||||||
{
|
{
|
||||||
MonsterSplineJumpExtraData jumpExtraData = new();
|
MonsterSplineJumpExtraData jumpExtraData = new();
|
||||||
jumpExtraData.JumpGravity = moveSpline.vertical_acceleration;
|
jumpExtraData.JumpGravity = moveSpline.vertical_acceleration;
|
||||||
@@ -421,7 +421,7 @@ namespace Game.Networking.Packets
|
|||||||
movementSpline.JumpExtraData = jumpExtraData;
|
movementSpline.JumpExtraData = jumpExtraData;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (splineFlags.HasFlag(SplineFlag.FadeObject))
|
if (splineFlags.HasFlag(MoveSplineFlagEnum.FadeObject))
|
||||||
movementSpline.FadeObjectTime = (uint)moveSpline.effect_start_time;
|
movementSpline.FadeObjectTime = (uint)moveSpline.effect_start_time;
|
||||||
|
|
||||||
if (moveSpline.spell_effect_extra != null)
|
if (moveSpline.spell_effect_extra != null)
|
||||||
@@ -438,15 +438,15 @@ namespace Game.Networking.Packets
|
|||||||
var spline = moveSpline.spline;
|
var spline = moveSpline.spline;
|
||||||
Vector3[] array = spline.GetPoints();
|
Vector3[] array = spline.GetPoints();
|
||||||
|
|
||||||
if (splineFlags.HasFlag(SplineFlag.UncompressedPath))
|
if (splineFlags.HasFlag(MoveSplineFlagEnum.UncompressedPath))
|
||||||
{
|
{
|
||||||
int count = spline.GetPointCount() - (splineFlags.HasFlag(SplineFlag.Cyclic) ? 4 : 3);
|
int count = spline.GetPointCount() - (splineFlags.HasFlag(MoveSplineFlagEnum.Cyclic) ? 4 : 3);
|
||||||
for (int i = 0; i < count; ++i)
|
for (int i = 0; i < count; ++i)
|
||||||
movementSpline.Points.Add(new Vector3(array[i + 2].X, array[i + 2].Y, array[i + 2].Z));
|
movementSpline.Points.Add(new Vector3(array[i + 2].X, array[i + 2].Y, array[i + 2].Z));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int lastIdx = spline.GetPointCount() - (splineFlags.HasFlag(SplineFlag.Cyclic) ? 4 : 3);
|
int lastIdx = spline.GetPointCount() - (splineFlags.HasFlag(MoveSplineFlagEnum.Cyclic) ? 4 : 3);
|
||||||
Vector3[] realPath = array[1..];
|
Vector3[] realPath = array[1..];
|
||||||
|
|
||||||
movementSpline.Points.Add(realPath[lastIdx]);
|
movementSpline.Points.Add(realPath[lastIdx]);
|
||||||
|
|||||||
Reference in New Issue
Block a user