aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-10-02 19:53:55 +0200
committerTreeston <treeston.mmoc@gmail.com>2018-10-02 19:53:55 +0200
commitead439fbd6620ab53530c3d1d28b4755280a1059 (patch)
treefe982264b80c0a0d7f71b980cd87add5701f9202
parentdbf25d554828330a1c8c4ae501ff5c23891e9fbe (diff)
Core/Movement: Add some extra assertions to MotionMaster to catch issues like #22444 earlier in the future.
-rw-r--r--src/server/game/Handlers/TaxiHandler.cpp2
-rw-r--r--src/server/game/Movement/MotionMaster.cpp3
-rw-r--r--src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp5
-rw-r--r--src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h2
4 files changed, 7 insertions, 5 deletions
diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp
index 2845e723724..9405397383c 100644
--- a/src/server/game/Handlers/TaxiHandler.cpp
+++ b/src/server/game/Handlers/TaxiHandler.cpp
@@ -119,8 +119,6 @@ void WorldSession::SendDoFlight(uint32 mountDisplayId, uint32 path, uint32 pathN
if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
- GetPlayer()->GetMotionMaster()->Remove(FLIGHT_MOTION_TYPE);
-
if (mountDisplayId)
GetPlayer()->Mount(mountDisplayId);
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index ebccc6fa481..018550c079e 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -950,7 +950,8 @@ void MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode)
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveTaxiFlight: '%s', taxi to path Id: %u (node %u)", _owner->GetGUID().ToString().c_str(), path, pathnode);
// Only one FLIGHT_MOTION_TYPE is allowed
- Remove(FLIGHT_MOTION_TYPE);
+ bool hasExisting = HasMovementGenerator([](MovementGenerator const* gen) { return gen->GetMovementGeneratorType() == FLIGHT_MOTION_TYPE; });
+ ASSERT(!hasExisting, "Duplicate flight path movement generator");
FlightPathMovementGenerator* movement = new FlightPathMovementGenerator(pathnode);
movement->LoadPath(_owner->ToPlayer());
diff --git a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp
index 14749b9603c..d19d93c1f8e 100644
--- a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp
@@ -251,7 +251,10 @@ void FlightPathMovementGenerator::InitEndGridInfo()
uint32 nodeCount = _path.size(); //! Number of nodes in path.
ASSERT(nodeCount, "FlightPathMovementGenerator::InitEndGridInfo() called with empty _path");
_endMapId = _path[nodeCount - 1]->MapID; //! MapId of last node
- _preloadTargetNode = nodeCount - 3;
+ if (nodeCount < 3)
+ _preloadTargetNode = 0;
+ else
+ _preloadTargetNode = nodeCount - 3;
_endGridX = _path[nodeCount - 1]->LocX;
_endGridY = _path[nodeCount - 1]->LocY;
}
diff --git a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h
index 2815073b17f..817243b0e70 100644
--- a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h
@@ -47,7 +47,7 @@ class FlightPathMovementGenerator : public MovementGeneratorMedium<Player, Fligh
uint32 GetPathAtMapEnd() const;
bool HasArrived() const { return _currentNode >= _path.size(); }
- void LoadPath(Player* owner);
+ void LoadPath(Player* owner); // called from MotionMaster
void SetCurrentNodeAfterTeleport();
void SkipCurrentNode() { ++_currentNode; }
void DoEventIfAny(Player* owner, TaxiPathNodeEntry const* node, bool departure);