diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 54e38c17b..aeed5337c 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -521,6 +521,23 @@ namespace Game.Entities { return m_vehicle != null ? m_vehicle.GetBase() : null; } + + Unit GetVehicleRoot() + { + Unit vehicleRoot = GetVehicleBase(); + + if (!vehicleRoot) + return null; + + for (; ; ) + { + if (!vehicleRoot.GetVehicleBase()) + return vehicleRoot; + + vehicleRoot = vehicleRoot.GetVehicleBase(); + } + } + public Creature GetVehicleCreatureBase() { Unit veh = GetVehicleBase(); diff --git a/Source/Game/Phasing/PhasingHandler.cs b/Source/Game/Phasing/PhasingHandler.cs index 90e1c07d8..beb8b0046 100644 --- a/Source/Game/Phasing/PhasingHandler.cs +++ b/Source/Game/Phasing/PhasingHandler.cs @@ -37,7 +37,8 @@ namespace Game for (var i = 0; i < unit.m_Controlled.Count; ++i) { Unit controlled = unit.m_Controlled[i]; - if (controlled.GetTypeId() != TypeId.Player) + if (controlled.GetTypeId() != TypeId.Player + && controlled.GetVehicle() == null) // Player inside nested vehicle should not phase the root vehicle and its accessories (only direct root vehicle control does) func(controlled); } @@ -50,6 +51,17 @@ namespace Game func(summon); } } + + Vehicle vehicle = unit.GetVehicleKit(); + if (vehicle != null) + { + foreach (var seat in vehicle.Seats) + { + Unit passenger = Global.ObjAccessor.GetUnit(unit, seat.Value.Passenger.Guid); + if (passenger != null) + func(passenger); + } + } } public static void AddPhase(WorldObject obj, uint phaseId, bool updateVisibility)