aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2026-01-01 00:13:40 +0100
committerShauren <shauren.trinity@gmail.com>2026-01-01 00:13:40 +0100
commitef97fb4ea74d6c804fe6342bca54cba225a46e61 (patch)
tree46e30d8116b18c5b9b19eaea4e9d8deea3b6eefe
parent5c0de6977cb1c9724a967e301797455003abe83e (diff)
Core/Movement: Restore overriding walk/run mode on individual waypoint level for legacy escort scriptsHEADmaster
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp3
-rw-r--r--src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp2
-rw-r--r--src/server/game/Movement/Waypoints/WaypointDefines.h20
-rw-r--r--src/server/game/Movement/Waypoints/WaypointManager.cpp4
4 files changed, 14 insertions, 15 deletions
diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
index f009403755c..66ee41117d4 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
@@ -257,8 +257,7 @@ void EscortAI::AddWaypoint(uint32 id, float x, float y, float z, float orientati
Trinity::NormalizeMapCoord(x);
Trinity::NormalizeMapCoord(y);
- WaypointNode& waypoint = _path.Nodes.emplace_back(id, x, y, z, orientation, waitTime);
- waypoint.MoveType = run ? WaypointMoveType::Run : WaypointMoveType::Walk;
+ _path.Nodes.emplace_back(id, x, y, z, orientation, waitTime, run ? WaypointMoveType::Run : WaypointMoveType::Walk);
}
void EscortAI::ResetPath()
diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
index f28f37134a4..4bb6db88060 100644
--- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
@@ -554,7 +554,7 @@ void WaypointMovementGenerator<Creature>::StartMove(Creature* owner, bool relaun
&& (lastWaypointForSegment->Delay || (_isReturningToStart ? _currentNode == 0 : _currentNode == path->Nodes.size() - 1)))
init.SetFacing(*lastWaypointForSegment->Orientation);
- switch (path->MoveType)
+ switch (lastWaypointForSegment->MoveType.value_or(path->MoveType))
{
case WaypointMoveType::Land:
init.SetAnimation(AnimTier::Ground);
diff --git a/src/server/game/Movement/Waypoints/WaypointDefines.h b/src/server/game/Movement/Waypoints/WaypointDefines.h
index eb388481f71..bd4e3019b29 100644
--- a/src/server/game/Movement/Waypoints/WaypointDefines.h
+++ b/src/server/game/Movement/Waypoints/WaypointDefines.h
@@ -49,17 +49,17 @@ DEFINE_ENUM_FLAG(WaypointPathFlags);
struct WaypointNode
{
- constexpr WaypointNode() : Id(0), X(0.f), Y(0.f), Z(0.f), MoveType(WaypointMoveType::Walk) { }
- constexpr WaypointNode(uint32 id, float x, float y, float z, Optional<float> orientation = { }, Optional<Milliseconds> delay = {})
- : Id(id), X(x), Y(y), Z(z), Orientation(orientation), Delay(delay), MoveType(WaypointMoveType::Walk) { }
+ constexpr WaypointNode() = default;
+ constexpr WaypointNode(uint32 id, float x, float y, float z, Optional<float> orientation = {}, Optional<Milliseconds> delay = {}, Optional<WaypointMoveType> moveType = {})
+ : Id(id), X(x), Y(y), Z(z), Orientation(orientation), Delay(delay), MoveType(moveType) { }
- uint32 Id;
- float X;
- float Y;
- float Z;
- Optional<float> Orientation;
- Optional<Milliseconds> Delay;
- WaypointMoveType MoveType;
+ uint32 Id = 0;
+ float X = 0.0f;
+ float Y = 0.0f;
+ float Z = 0.0f;
+ Optional<float> Orientation = {};
+ Optional<Milliseconds> Delay = {};
+ Optional<WaypointMoveType> MoveType = {};
};
struct WaypointPath
diff --git a/src/server/game/Movement/Waypoints/WaypointManager.cpp b/src/server/game/Movement/Waypoints/WaypointManager.cpp
index 481fdc1a43d..6f51c467da3 100644
--- a/src/server/game/Movement/Waypoints/WaypointManager.cpp
+++ b/src/server/game/Movement/Waypoints/WaypointManager.cpp
@@ -355,8 +355,8 @@ void WaypointPath::BuildSegments()
{
++ContinuousSegments.back().second;
- // split on delay
- if (i + 1 != Nodes.size() && Nodes[i].Delay)
+ // split on delay or different move type
+ if (i + 1 != Nodes.size() && (Nodes[i].Delay || Nodes[i].MoveType != Nodes[i + 1].MoveType))
ContinuousSegments.emplace_back(i, 1);
}
}