From 24c07367f109aa19a51defdf77c50d389ed90845 Mon Sep 17 00:00:00 2001 From: Wyrserth Date: Sun, 7 Jul 2019 17:12:22 +0200 Subject: Core/Vehicle: prevent creature vehicles from following their old movement generator when a player enters them in some cases. Closes #21731 and #22368. (cherry picked from commit f869c4969ebd573da2742dcee0dfbe688e7896e0) --- src/server/game/Entities/Unit/Unit.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f628204418f..490a6fc8292 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -35,6 +35,7 @@ #include "CreatureAI.h" #include "CreatureAIImpl.h" #include "CreatureAIFactory.h" +#include "CreatureGroups.h" #include "DB2Stores.h" #include "Formulas.h" #include "GameObjectAI.h" @@ -11750,6 +11751,20 @@ void Unit::_EnterVehicle(Vehicle* vehicle, int8 seatId, AuraApplication const* a vehicle->GetBase()->RemoveAura(const_cast(aurApp)); return; } + + if (vehicle->GetBase()->GetTypeId() == TYPEID_UNIT) + { + // If a player entered a vehicle that is part of a formation, remove it from said formation and replace current movement generator with MoveIdle (no movement) + if (CreatureGroup* creatureGroup = vehicle->GetBase()->ToCreature()->GetFormation()) + { + creatureGroup->RemoveMember(vehicle->GetBase()->ToCreature()); + vehicle->GetBase()->GetMotionMaster()->MoveIdle(); + } + + // If the vehicle has the random movement generator active, replace it with MoveIdle (no movement) so it won't override player control + if (vehicle->GetBase()->GetMotionMaster()->GetCurrentMovementGeneratorType() == RANDOM_MOTION_TYPE) + vehicle->GetBase()->GetMotionMaster()->MoveIdle(); + } } ASSERT(!m_vehicle); @@ -11857,8 +11872,14 @@ void Unit::_ExitVehicle(Position const* exitPosition) GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_VEHICLE_EXIT, MOTION_PRIORITY_HIGHEST); if (player) + { player->ResummonPetTemporaryUnSummonedIfAny(); + // When a player exits a creature vehicle, restore its default motion generator (if any) + if (vehicle->GetBase()->GetTypeId() == TYPEID_UNIT) + vehicle->GetBase()->GetMotionMaster()->InitializeDefault(); + } + if (vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION) && vehicle->GetBase()->GetTypeId() == TYPEID_UNIT) if (((Minion*)vehicle->GetBase())->GetOwner() == this) vehicle->GetBase()->ToCreature()->DespawnOrUnsummon(vehicle->GetDespawnDelay()); -- cgit v1.2.3