aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp21
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());