aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2019-08-04 11:33:29 +0200
committerGitHub <noreply@github.com>2019-08-04 11:33:29 +0200
commit15e85f882fdb7b5d1d48302907e76c993ee4e923 (patch)
tree4c37b3a480d45d4ee2a06870d459b82ee3977ab8 /src
parentb159921099e3d10fbe282d9496b9ffb56f28f16d (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.cpp18
-rw-r--r--src/server/game/Entities/Creature/Creature.h1
-rw-r--r--src/server/game/Entities/Player/Player.cpp14
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp16
-rw-r--r--src/server/game/Entities/Unit/Unit.h7
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)