From 6d5086da1747816e1a4e8518e16ab1923de22e1a Mon Sep 17 00:00:00 2001 From: Giacomo Pozzoni Date: Sun, 4 Aug 2019 11:33:29 +0200 Subject: Core/Vehicle: Change vehicle accessories' phase according to the player on the vehicle (#23646) * Core/Vehicle: Change vehicle accessories' phase according to the player on the vehicle * Get the root vehicle to set the phase to all accessories. Attempt to get the accessories to stay mounted on the vehicle. * Fix the accessories to stay mounted on the vehicle (cherry picked from commit 15e85f882fdb7b5d1d48302907e76c993ee4e923) --- src/server/game/Entities/Unit/Unit.cpp | 16 ++++++++++++++++ src/server/game/Entities/Unit/Unit.h | 7 ++++--- src/server/game/Phasing/PhasingHandler.cpp | 10 +++++++++- 3 files changed, 29 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f0d6ba8877e..aa752d844fd 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11160,6 +11160,22 @@ Unit* Unit::GetVehicleBase() const return m_vehicle ? m_vehicle->GetBase() : nullptr; } +Unit* Unit::GetVehicleRoot() const +{ + Unit* vehicleRoot = GetVehicleBase(); + + if (!vehicleRoot) + return nullptr; + + for (;;) + { + if (!vehicleRoot->GetVehicleBase()) + return vehicleRoot; + + vehicleRoot = vehicleRoot->GetVehicleBase(); + } +} + Creature* Unit::GetVehicleCreatureBase() const { if (Unit* veh = GetVehicleBase()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 50444e4efa6..5db10b8953d 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1761,11 +1761,12 @@ class TC_GAME_API Unit : public WorldObject ObjectGuid LastCharmerGUID; bool CreateVehicleKit(uint32 id, uint32 creatureEntry, bool loading = false); void RemoveVehicleKit(bool onRemoveFromWorld = false); - Vehicle* GetVehicleKit()const { return m_vehicleKit; } - Vehicle* GetVehicle() const { return m_vehicle; } + Vehicle* GetVehicleKit() const { return m_vehicleKit; } + Vehicle* GetVehicle() const { return m_vehicle; } void SetVehicle(Vehicle* vehicle) { m_vehicle = vehicle; } bool IsOnVehicle(Unit const* vehicle) const; - Unit* GetVehicleBase() const; + Unit* GetVehicleBase() const; + Unit* GetVehicleRoot() const; Creature* GetVehicleCreatureBase() const; ObjectGuid GetTransGUID() const override; /// Returns the transport this unit is on directly (if on vehicle and transport, return vehicle) diff --git a/src/server/game/Phasing/PhasingHandler.cpp b/src/server/game/Phasing/PhasingHandler.cpp index 9fdb411395d..e1432b49351 100644 --- a/src/server/game/Phasing/PhasingHandler.cpp +++ b/src/server/game/Phasing/PhasingHandler.cpp @@ -23,11 +23,13 @@ #include "Language.h" #include "Map.h" #include "MiscPackets.h" +#include "ObjectAccessor.h" #include "ObjectMgr.h" #include "PartyPackets.h" #include "PhaseShift.h" #include "Player.h" #include "SpellAuraEffects.h" +#include "Vehicle.h" #include namespace @@ -52,13 +54,19 @@ template inline void ForAllControlled(Unit* unit, Func&& func) { for (Unit* controlled : unit->m_Controlled) - if (controlled->GetTypeId() != TYPEID_PLAYER) + if (controlled->GetTypeId() != TYPEID_PLAYER + && !controlled->GetVehicle()) // Player inside nested vehicle should not phase the root vehicle and its accessories (only direct root vehicle control does) func(controlled); for (ObjectGuid summonGuid : unit->m_SummonSlot) if (!summonGuid.IsEmpty()) if (Creature* summon = unit->GetMap()->GetCreature(summonGuid)) func(summon); + + if (Vehicle const* vehicle = unit->GetVehicleKit()) + for (auto seat = vehicle->Seats.begin(); seat != vehicle->Seats.end(); ++seat) + if (Unit* passenger = ObjectAccessor::GetUnit(*unit, seat->second.Passenger.Guid)) + func(passenger); } } -- cgit v1.2.3