From 792914fb518349ef270e6f769f343bbcd333b942 Mon Sep 17 00:00:00 2001 From: Treeston Date: Tue, 2 Oct 2018 19:53:55 +0200 Subject: [PATCH] Core/Movement: Add some extra assertions to MotionMaster to catch issues like #22444 earlier in the future. (cherry picked from commit ead439fbd6620ab53530c3d1d28b4755280a1059) --- src/server/game/Handlers/TaxiHandler.cpp | 2 -- src/server/game/Movement/MotionMaster.cpp | 3 ++- .../MovementGenerators/FlightPathMovementGenerator.cpp | 5 ++++- .../MovementGenerators/FlightPathMovementGenerator.h | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp index da4800ca319..ca4efad8e78 100644 --- a/src/server/game/Handlers/TaxiHandler.cpp +++ b/src/server/game/Handlers/TaxiHandler.cpp @@ -130,8 +130,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 b7c76bd4431..a3c8b04f9a7 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -974,7 +974,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(); movement->LoadPath(_owner->ToPlayer(), pathnode); diff --git a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp index 3aa391e2c1c..586d054d024 100644 --- a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp @@ -256,7 +256,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]->ContinentID; //! MapId of last node - _preloadTargetNode = nodeCount - 3; + if (nodeCount < 3) + _preloadTargetNode = 0; + else + _preloadTargetNode = nodeCount - 3; _endGridX = _path[nodeCount - 1]->Loc.X; _endGridY = _path[nodeCount - 1]->Loc.Y; } diff --git a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.h index 6dc32e9ec84..5ae722964b6 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= _path.size(); } - void LoadPath(Player* owner, uint32 startNode = 0); + void LoadPath(Player* owner, uint32 startNode = 0); // called from MotionMaster void SetCurrentNodeAfterTeleport(); void SkipCurrentNode() { ++_currentNode; } void DoEventIfAny(Player* owner, TaxiPathNodeEntry const* node, bool departure);