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:
@@ -317,7 +317,7 @@ namespace Game.AI
|
|||||||
GridDefines.NormalizeMapCoord(ref x);
|
GridDefines.NormalizeMapCoord(ref x);
|
||||||
GridDefines.NormalizeMapCoord(ref y);
|
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;
|
waypoint.MoveType = run ? WaypointMoveType.Run : WaypointMoveType.Walk;
|
||||||
_path.Nodes.Add(waypoint);
|
_path.Nodes.Add(waypoint);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ namespace Game.Movement
|
|||||||
_nextMoveTime = new TimeTracker(0);
|
_nextMoveTime = new TimeTracker(0);
|
||||||
_pathId = pathId;
|
_pathId = pathId;
|
||||||
_repeating = repeating;
|
_repeating = repeating;
|
||||||
_loadedFromDB = true;
|
|
||||||
_speed = speed;
|
_speed = speed;
|
||||||
_speedSelectionMode = speedSelectionMode;
|
_speedSelectionMode = speedSelectionMode;
|
||||||
_waitTimeRangeAtPathEnd = waitTimeRangeAtPathEnd;
|
_waitTimeRangeAtPathEnd = waitTimeRangeAtPathEnd;
|
||||||
@@ -167,7 +166,10 @@ namespace Game.Movement
|
|||||||
if (owner == null || !owner.IsAlive())
|
if (owner == null || !owner.IsAlive())
|
||||||
return true;
|
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;
|
return true;
|
||||||
|
|
||||||
if (_duration != null)
|
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})");
|
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);
|
WaypointNode waypoint = _path.Nodes.ElementAt(_currentNode);
|
||||||
|
|
||||||
TimeSpan delay = new Func<TimeSpan>(() =>
|
if (waypoint.Delay != TimeSpan.Zero)
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
owner.ClearUnitState(UnitState.RoamingMove);
|
owner.ClearUnitState(UnitState.RoamingMove);
|
||||||
_nextMoveTime.Reset(delay);
|
_nextMoveTime.Reset(waypoint.Delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_waitTimeRangeAtPathEnd.HasValue && IsFollowingPathBackwardsFromEndToStart()
|
if (_waitTimeRangeAtPathEnd.HasValue && IsFollowingPathBackwardsFromEndToStart()
|
||||||
@@ -336,7 +326,10 @@ namespace Game.Movement
|
|||||||
void StartMove(Creature owner, bool relaunch = false)
|
void StartMove(Creature owner, bool relaunch = false)
|
||||||
{
|
{
|
||||||
// sanity checks
|
// 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;
|
return;
|
||||||
|
|
||||||
if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting() || (owner.IsFormationLeader() && !owner.IsFormationLeaderMoveAllowed())) // if cannot move OR cannot move because of formation
|
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)
|
if (transportPath)
|
||||||
init.DisableTransportPathTransformations();
|
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);
|
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);
|
init.SetFacing(waypoint.Orientation.Value);
|
||||||
|
|
||||||
switch (_path.MoveType)
|
switch (_path.MoveType)
|
||||||
@@ -522,5 +513,5 @@ namespace Game.Movement
|
|||||||
public override void UnitSpeedChanged() { AddFlag(MovementGeneratorFlags.SpeedUpdatePending); }
|
public override void UnitSpeedChanged() { AddFlag(MovementGeneratorFlags.SpeedUpdatePending); }
|
||||||
|
|
||||||
bool IsLoadedFromDB() { return _path != null; }
|
bool IsLoadedFromDB() { return _path != null; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ namespace Game
|
|||||||
while (result.NextRow());
|
while (result.NextRow());
|
||||||
|
|
||||||
Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} waypoint path nodes in {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
|
Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} waypoint path nodes in {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
|
||||||
DoPostLoadingChecks();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoadPathFromDB(SQLFields fields)
|
void LoadPathFromDB(SQLFields fields)
|
||||||
@@ -118,10 +117,15 @@ namespace Game
|
|||||||
if (!fields.IsNull(5))
|
if (!fields.IsNull(5))
|
||||||
o = fields.Read<float>(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 x);
|
||||||
GridDefines.NormalizeMapCoord(ref y);
|
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);
|
_pathStorage[pathId].Nodes.Add(waypoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -303,7 +307,7 @@ namespace Game
|
|||||||
public class WaypointNode
|
public class WaypointNode
|
||||||
{
|
{
|
||||||
public WaypointNode() { MoveType = WaypointMoveType.Run; }
|
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;
|
Id = id;
|
||||||
X = x;
|
X = x;
|
||||||
@@ -319,7 +323,7 @@ namespace Game
|
|||||||
public float Y;
|
public float Y;
|
||||||
public float Z;
|
public float Z;
|
||||||
public float? Orientation;
|
public float? Orientation;
|
||||||
public uint Delay;
|
public TimeSpan Delay;
|
||||||
public WaypointMoveType MoveType;
|
public WaypointMoveType MoveType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user