diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
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<AuraApplication*>(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()); |