diff options
author | Giacomo Pozzoni <giacomopoz@gmail.com> | 2019-08-04 11:33:29 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-04 11:33:29 +0200 |
commit | 15e85f882fdb7b5d1d48302907e76c993ee4e923 (patch) | |
tree | 4c37b3a480d45d4ee2a06870d459b82ee3977ab8 /src | |
parent | b159921099e3d10fbe282d9496b9ffb56f28f16d (diff) |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 7 |
6 files changed, 54 insertions, 3 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 096aea99f24..28d6f010e20 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -629,6 +629,24 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/, return true; } +void Creature::SetPhaseMask(uint32 newPhaseMask, bool update) +{ + if (newPhaseMask == GetPhaseMask()) + return; + + Unit::SetPhaseMask(newPhaseMask, false); + + if (Vehicle* vehicle = GetVehicleKit()) + { + for (auto seat = vehicle->Seats.begin(); seat != vehicle->Seats.end(); seat++) + if (Unit* passenger = ObjectAccessor::GetUnit(*this, seat->second.Passenger.Guid)) + passenger->SetPhaseMask(newPhaseMask, update); + } + + if (update) + UpdateObjectVisibility(); +} + void Creature::Update(uint32 diff) { if (IsAIEnabled() && m_triggerJustAppeared && m_deathState != DEAD) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index ed4b8fce669..db770589659 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -162,6 +162,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool HasSpell(uint32 spellID) const override; bool UpdateEntry(uint32 entry, CreatureData const* data = nullptr, bool updateLevel = true); + void SetPhaseMask(uint32 newPhaseMask, bool update) override;// overwrite Unit::SetPhaseMask bool UpdateStats(Stats stat) override; bool UpdateAllStats() override; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 89fd02dbdce..392514a2f93 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22484,6 +22484,20 @@ void Player::UpdateVisibilityForPlayer() notifier.SendToSelf(); // send gathered data } +void Player::SetPhaseMask(uint32 newPhaseMask, bool update) +{ + if (newPhaseMask == GetPhaseMask()) + return; + + Unit::SetPhaseMask(newPhaseMask, false); + + if (Unit* vehicle = GetVehicleRoot()) + vehicle->SetPhaseMask(newPhaseMask, update); + + if (update) + UpdateObjectVisibility(); +} + void Player::InitPrimaryProfessions() { SetFreePrimaryProfessions(sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL)); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 454ab16bf11..5aa9069f91a 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2008,6 +2008,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void UpdateVisibilityForPlayer(); void UpdateVisibilityOf(WorldObject* target); void UpdateTriggerVisibility(); + void SetPhaseMask(uint32 newPhaseMask, bool update) override;// overwrite Unit::SetPhaseMask template<class T> void UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& visibleNow); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 07c3b35de1a..7fae69d54f0 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11657,6 +11657,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 f92c80c9b55..1de18af19b7 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1593,11 +1593,12 @@ class TC_GAME_API Unit : public WorldObject ObjectGuid LastCharmerGUID; bool CreateVehicleKit(uint32 id, uint32 creatureEntry); void RemoveVehicleKit(); - 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) |