Core/Movement: Store delay in WaypointNode as Milliseconds instead of raw integer

Port From (https://github.com/TrinityCore/TrinityCore/commit/e1f43900d110e50a2021d605c61cfe7c436bcc54)
This commit is contained in:
Hondacrx
2024-08-12 16:13:15 -04:00
parent 194ca97e93
commit 8805432cee
3 changed files with 21 additions and 26 deletions
@@ -317,7 +317,7 @@ namespace Game.AI
GridDefines.NormalizeMapCoord(ref x);
GridDefines.NormalizeMapCoord(ref y);
WaypointNode waypoint = new(id, x, y, z, orientation, (uint)waitTime.TotalMilliseconds);
WaypointNode waypoint = new(id, x, y, z, orientation, waitTime);
waypoint.MoveType = run ? WaypointMoveType.Run : WaypointMoveType.Walk;
_path.Nodes.Add(waypoint);
}
@@ -35,7 +35,6 @@ namespace Game.Movement
_nextMoveTime = new TimeTracker(0);
_pathId = pathId;
_repeating = repeating;
_loadedFromDB = true;
_speed = speed;
_speedSelectionMode = speedSelectionMode;
_waitTimeRangeAtPathEnd = waitTimeRangeAtPathEnd;
@@ -167,7 +166,10 @@ namespace Game.Movement
if (owner == null || !owner.IsAlive())
return true;
if (HasFlag(MovementGeneratorFlags.Finalized | MovementGeneratorFlags.Paused) || _path == null || _path.Nodes.Empty())
if (HasFlag(MovementGeneratorFlags.Finalized | MovementGeneratorFlags.Paused))
return true;
if (_path == null || _path.Nodes.Empty())
return true;
if (_duration != null)
@@ -296,22 +298,10 @@ namespace Game.Movement
Cypher.Assert(_currentNode < _path.Nodes.Count, $"WaypointMovementGenerator.OnArrived: tried to reference a node id ({_currentNode}) which is not included in path ({_path.Id})");
WaypointNode waypoint = _path.Nodes.ElementAt(_currentNode);
TimeSpan delay = new Func<TimeSpan>(() =>
{
if (!_isReturningToStart)
return TimeSpan.FromMilliseconds(waypoint.Delay);
// when traversing the path backwards, use delays from "next" waypoint to make sure pauses happen between the same points as in forward direction
if (_currentNode > 0)
return TimeSpan.FromMilliseconds(_path.Nodes[_currentNode - 1].Delay);
return TimeSpan.Zero;
})();
if (delay > TimeSpan.Zero)
if (waypoint.Delay != TimeSpan.Zero)
{
owner.ClearUnitState(UnitState.RoamingMove);
_nextMoveTime.Reset(delay);
_nextMoveTime.Reset(waypoint.Delay);
}
if (_waitTimeRangeAtPathEnd.HasValue && IsFollowingPathBackwardsFromEndToStart()
@@ -336,7 +326,10 @@ namespace Game.Movement
void StartMove(Creature owner, bool relaunch = false)
{
// sanity checks
if (owner == null || !owner.IsAlive() || HasFlag(MovementGeneratorFlags.Finalized) || _path == null || _path.Nodes.Empty() || (relaunch && (HasFlag(MovementGeneratorFlags.InformEnabled) || !HasFlag(MovementGeneratorFlags.Initialized))))
if (owner == null || !owner.IsAlive() || HasFlag(MovementGeneratorFlags.Finalized) || (relaunch && (HasFlag(MovementGeneratorFlags.InformEnabled) || !HasFlag(MovementGeneratorFlags.Initialized))))
return;
if (_path == null || _path.Nodes.Empty())
return;
if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting() || (owner.IsFormationLeader() && !owner.IsFormationLeaderMoveAllowed())) // if cannot move OR cannot move because of formation
@@ -415,11 +408,9 @@ namespace Game.Movement
if (transportPath)
init.DisableTransportPathTransformations();
//! Do not use formationDest here, MoveTo requires transport offsets due to DisableTransportPathTransformations() call
//! but formationDest contains global coordinates
init.MoveTo(waypoint.X, waypoint.Y, waypoint.Z, _generatePath);
if (waypoint.Orientation.HasValue && (waypoint.Delay > 0 || _currentNode == _path.Nodes.Count - 1))
if (waypoint.Orientation.HasValue && (waypoint.Delay != TimeSpan.Zero || _currentNode == _path.Nodes.Count - 1))
init.SetFacing(waypoint.Orientation.Value);
switch (_path.MoveType)
+8 -4
View File
@@ -68,7 +68,6 @@ namespace Game
while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} waypoint path nodes in {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
DoPostLoadingChecks();
}
void LoadPathFromDB(SQLFields fields)
@@ -118,10 +117,15 @@ namespace Game
if (!fields.IsNull(5))
o = fields.Read<float>(5);
TimeSpan delay = default;
uint delayMs = fields.Read<uint>(6);
if (delayMs != 0)
delay = TimeSpan.FromMilliseconds(delayMs);
GridDefines.NormalizeMapCoord(ref x);
GridDefines.NormalizeMapCoord(ref y);
WaypointNode waypoint = new(fields.Read<uint>(1), x, y, z, o, fields.Read<uint>(6));
WaypointNode waypoint = new(fields.Read<uint>(1), x, y, z, o, delay);
_pathStorage[pathId].Nodes.Add(waypoint);
}
@@ -303,7 +307,7 @@ namespace Game
public class WaypointNode
{
public WaypointNode() { MoveType = WaypointMoveType.Run; }
public WaypointNode(uint id, float x, float y, float z, float? orientation = null, uint delay = 0)
public WaypointNode(uint id, float x, float y, float z, float? orientation = null, TimeSpan delay = default)
{
Id = id;
X = x;
@@ -319,7 +323,7 @@ namespace Game
public float Y;
public float Z;
public float? Orientation;
public uint Delay;
public TimeSpan Delay;
public WaypointMoveType MoveType;
}