diff options
author | Wyrserth <wyrserth@protonmail.com> | 2019-07-07 17:12:22 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-12-14 22:19:01 +0100 |
commit | 24c07367f109aa19a51defdf77c50d389ed90845 (patch) | |
tree | 93a1f3861a6b9630c4146e4974bc9ad85966b870 /src | |
parent | 004602f3e4ece8ee601c09d869f1531518313c94 (diff) |
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)
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()); |