diff options
| author | Shauren <shauren.trinity@gmail.com> | 2025-10-14 13:11:41 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2025-10-14 13:11:41 +0200 |
| commit | a8f01e07d111ea14cbe843d82fbfce19f63faa12 (patch) | |
| tree | 2aca52b9b4dfa9723ec170e672e2a4ddb7481178 /src/server/game/Entities | |
| parent | d48e97731538b01c4005cd7c73653a0f33015098 (diff) | |
Core/Entities: Merge duplicate functions calculating relative positions - remove CalculatePassengerPosition/CalculatePassengerOffset from TransportBase class
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 33 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/DynamicObject/DynamicObject.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 36 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Position.cpp | 19 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Position.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 23 | ||||
| -rw-r--r-- | src/server/game/Entities/Transport/Transport.cpp | 63 | ||||
| -rw-r--r-- | src/server/game/Entities/Transport/Transport.h | 12 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 9 | ||||
| -rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.h | 16 | ||||
| -rw-r--r-- | src/server/game/Entities/Vehicle/VehicleDefines.h | 35 |
16 files changed, 86 insertions, 195 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 4dc90db22fe..93acbc2bf47 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -272,13 +272,8 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti transport = m_movementInfo.transport.guid.IsEmpty() ? caster->GetTransport() : nullptr; if (transport) { - float x, y, z, o; - pos.GetPosition(x, y, z, o); - transport->CalculatePassengerOffset(x, y, z, &o); - m_movementInfo.transport.pos.Relocate(x, y, z, o); - // This object must be added to transport before adding to map for the client to properly display it - transport->AddPassenger(this); + transport->AddPassenger(this, transport->GetPositionOffsetTo(pos)); } } diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 8d89686e32f..2098fdaaad3 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -454,25 +454,20 @@ void Creature::RemoveCorpse(bool setSpawnTime, bool destroyForNearbyPlayers) if (IsFalling()) StopMoving(); - float x, y, z, o; - GetRespawnPosition(x, y, z, &o); + Position respawnPosition = GetRespawnPosition(); // We were spawned on transport, calculate real position if (IsSpawnedOnTransport()) { - Position& pos = m_movementInfo.transport.pos; - pos.m_positionX = x; - pos.m_positionY = y; - pos.m_positionZ = z; - pos.SetOrientation(o); + m_movementInfo.transport.pos = respawnPosition; if (TransportBase* transport = GetDirectTransport()) - transport->CalculatePassengerPosition(x, y, z, &o); + respawnPosition = transport->GetPositionWithOffset(respawnPosition); } - UpdateAllowedPositionZ(x, y, z); - SetHomePosition(x, y, z, o); - GetMap()->CreatureRelocation(this, x, y, z, o); + UpdateAllowedPositionZ(respawnPosition.GetPositionX(), respawnPosition.GetPositionY(), respawnPosition.m_positionZ); + SetHomePosition(respawnPosition); + GetMap()->CreatureRelocation(this, respawnPosition.GetPositionX(), respawnPosition.GetPositionY(), respawnPosition.GetPositionZ(), respawnPosition.GetOrientation()); } else { @@ -2907,27 +2902,21 @@ void Creature::SetRespawnTime(uint32 respawn) m_respawnTime = respawn ? GameTime::GetGameTime() + respawn : 0; } -void Creature::GetRespawnPosition(float &x, float &y, float &z, float* ori, float* dist) const +Position Creature::GetRespawnPosition(float* dist) const { if (m_creatureData) { - if (ori) - m_creatureData->spawnPoint.GetPosition(x, y, z, *ori); - else - m_creatureData->spawnPoint.GetPosition(x, y, z); - if (dist) *dist = m_creatureData->wander_distance; + + return m_creatureData->spawnPoint; } else { - Position const& homePos = GetHomePosition(); - if (ori) - homePos.GetPosition(x, y, z, *ori); - else - homePos.GetPosition(x, y, z); if (dist) *dist = 0; + + return GetHomePosition(); } } diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 7765c8732b7..77821c0a901 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -112,7 +112,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma void Update(uint32 time) override; // overwrited Unit::Update void Heartbeat() override; - void GetRespawnPosition(float &x, float &y, float &z, float* ori = nullptr, float* dist = nullptr) const; + Position GetRespawnPosition(float* dist = nullptr) const; bool IsSpawnedOnTransport() const { return m_creatureData && m_creatureData->mapId != GetMapId(); } void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio = false) diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 018435e3875..fc3e1c4da04 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -116,13 +116,8 @@ bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caste TransportBase* transport = caster->GetTransport(); if (transport) { - float x, y, z, o; - pos.GetPosition(x, y, z, o); - transport->CalculatePassengerOffset(x, y, z, &o); - m_movementInfo.transport.pos.Relocate(x, y, z, o); - // This object must be added to transport before adding to map for the client to properly display it - transport->AddPassenger(this); + transport->AddPassenger(this, transport->GetPositionOffsetTo(pos)); } if (!GetMap()->AddToMap(this)) diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index d0076bc282b..b43c8c19049 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -418,12 +418,7 @@ public: void UpdatePassengerPositions() { for (WorldObject* passenger : _passengers) - { - float x, y, z, o; - passenger->m_movementInfo.transport.pos.GetPosition(x, y, z, o); - CalculatePassengerPosition(x, y, z, &o); - UpdatePassengerPosition(_owner.GetMap(), passenger, x, y, z, o, true); - } + UpdatePassengerPosition(_owner.GetMap(), passenger, _owner.GetPositionWithOffset(passenger->m_movementInfo.transport.pos), true); } uint32 GetTransportPeriod() const @@ -443,7 +438,7 @@ public: float GetTransportOrientation() const override { return _owner.GetOrientation(); } - void AddPassenger(WorldObject* passenger) override + void AddPassenger(WorldObject* passenger, Position const& offset) override { if (!_owner.IsInWorld()) return; @@ -452,6 +447,7 @@ public: { passenger->SetTransport(this); passenger->m_movementInfo.transport.guid = GetTransportGUID(); + passenger->m_movementInfo.transport.pos = offset; TC_LOG_DEBUG("entities.transport", "Object {} boarded transport {}.", passenger->GetName(), _owner.GetName()); } } @@ -471,14 +467,14 @@ public: return this; } - void CalculatePassengerPosition(float& x, float& y, float& z, float* o) const override + Position GetPositionWithOffset(Position const& offset) const override { - TransportBase::CalculatePassengerPosition(x, y, z, o, _owner.GetPositionX(), _owner.GetPositionY(), _owner.GetPositionZ(), _owner.GetOrientation()); + return _owner.GetPositionWithOffset(offset); } - void CalculatePassengerOffset(float& x, float& y, float& z, float* o) const override + Position GetPositionOffsetTo(Position const& endPos) const override { - TransportBase::CalculatePassengerOffset(x, y, z, o, _owner.GetPositionX(), _owner.GetPositionY(), _owner.GetPositionZ(), _owner.GetOrientation()); + return _owner.GetPositionOffsetTo(endPos); } int32 GetMapIdForSpawning() const override @@ -4129,22 +4125,12 @@ void GameObject::SetPathProgressForClient(float progress) m_transportPathProgress = progress; } -void GameObject::GetRespawnPosition(float &x, float &y, float &z, float* ori /* = nullptr*/) const +Position GameObject::GetRespawnPosition() const { if (m_goData) - { - if (ori) - m_goData->spawnPoint.GetPosition(x, y, z, *ori); - else - m_goData->spawnPoint.GetPosition(x, y, z); - } - else - { - if (ori) - GetPosition(x, y, z, *ori); - else - GetPosition(x, y, z); - } + return m_goData->spawnPoint; + + return GetPosition(); } TransportBase const* GameObject::ToTransportBase() const diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 582e73efd00..40c38ac3518 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -397,7 +397,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> void SetFaction(uint32 faction) override { SetUpdateFieldValue(m_values.ModifyValue(&GameObject::m_gameObjectData).ModifyValue(&UF::GameObjectData::FactionTemplate), faction); } GameObjectModel* m_model; - void GetRespawnPosition(float &x, float &y, float &z, float* ori = nullptr) const; + Position GetRespawnPosition() const; TransportBase* ToTransportBase() { return const_cast<TransportBase*>(const_cast<GameObject const*>(this)->ToTransportBase()); } TransportBase const* ToTransportBase() const; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index d5b732a145e..0f729d06dff 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1849,13 +1849,8 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert TransportBase* transport = summoner ? summoner->GetTransport() : nullptr; if (transport) { - float x, y, z, o; - pos.GetPosition(x, y, z, o); - transport->CalculatePassengerOffset(x, y, z, &o); - summon->m_movementInfo.transport.pos.Relocate(x, y, z, o); - // This object must be added to transport before adding to map for the client to properly display it - transport->AddPassenger(summon); + transport->AddPassenger(summon, transport->GetPositionOffsetTo(pos)); } if (summoner && !(properties && properties->GetFlags().HasFlag(SummonPropertiesFlags::IgnoreSummonerPhase))) diff --git a/src/server/game/Entities/Object/Position.cpp b/src/server/game/Entities/Object/Position.cpp index c3a4d0f57c9..6fb5f0e1c51 100644 --- a/src/server/game/Entities/Object/Position.cpp +++ b/src/server/game/Entities/Object/Position.cpp @@ -33,9 +33,9 @@ bool Position::operator==(Position const& a) const void Position::RelocateOffset(Position const& offset) { - m_positionX = GetPositionX() + (offset.GetPositionX() * std::cos(GetOrientation()) + offset.GetPositionY() * std::sin(GetOrientation() + float(M_PI))); - m_positionY = GetPositionY() + (offset.GetPositionY() * std::cos(GetOrientation()) + offset.GetPositionX() * std::sin(GetOrientation())); - m_positionZ = GetPositionZ() + offset.GetPositionZ(); + m_positionX += offset.GetPositionX() * std::cos(GetOrientation()) - offset.GetPositionY() * std::sin(GetOrientation()); + m_positionY += offset.GetPositionY() * std::cos(GetOrientation()) + offset.GetPositionX() * std::sin(GetOrientation()); + m_positionZ += offset.GetPositionZ(); SetOrientation(GetOrientation() + offset.GetOrientation()); } @@ -44,15 +44,18 @@ bool Position::IsPositionValid() const return Trinity::IsValidMapCoord(m_positionX, m_positionY, m_positionZ, m_orientation); } -void Position::GetPositionOffsetTo(Position const& endPos, Position& retOffset) const +Position Position::GetPositionOffsetTo(Position const& endPos) const { float dx = endPos.GetPositionX() - GetPositionX(); float dy = endPos.GetPositionY() - GetPositionY(); - retOffset.m_positionX = (dx + dy * std::tan(GetOrientation())) / (std::cos(GetOrientation()) + std::sin(GetOrientation()) * std::tan(GetOrientation())); - retOffset.m_positionY = (dy - dx * std::tan(GetOrientation())) / (std::cos(GetOrientation()) + std::sin(GetOrientation()) * std::tan(GetOrientation())); - retOffset.m_positionZ = endPos.GetPositionZ() - GetPositionZ(); - retOffset.SetOrientation(endPos.GetOrientation() - GetOrientation()); + return + { + (dx + dy * std::tan(GetOrientation())) / (std::cos(GetOrientation()) + std::sin(GetOrientation()) * std::tan(GetOrientation())), + (dy - dx * std::tan(GetOrientation())) / (std::cos(GetOrientation()) + std::sin(GetOrientation()) * std::tan(GetOrientation())), + endPos.GetPositionZ() - GetPositionZ(), + endPos.GetOrientation() - GetOrientation() + }; } Position Position::GetPositionWithOffset(Position const& offset) const diff --git a/src/server/game/Entities/Object/Position.h b/src/server/game/Entities/Object/Position.h index f2f1ddcde43..14553c4a14b 100644 --- a/src/server/game/Entities/Object/Position.h +++ b/src/server/game/Entities/Object/Position.h @@ -129,7 +129,7 @@ public: float GetExactDist(Position const& pos) const { return GetExactDist(pos.m_positionX, pos.m_positionY, pos.m_positionZ); } float GetExactDist(Position const* pos) const { return GetExactDist(*pos); } - void GetPositionOffsetTo(Position const & endPos, Position & retOffset) const; + Position GetPositionOffsetTo(Position const & endPos) const; Position GetPositionWithOffset(Position const& offset) const; float GetAbsoluteAngle(float x, float y) const diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f2b50b5c68e..3014b1b19f9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -431,12 +431,8 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac { if (Transport* transport = ObjectAccessor::GetTransport(*this, ObjectGuid::Create<HighGuid::Transport>(*position.TransportGuid))) { - transport->AddPassenger(this); - m_movementInfo.transport.pos.Relocate(position.Loc); - float x, y, z, o; - position.Loc.GetPosition(x, y, z, o); - transport->CalculatePassengerPosition(x, y, z, &o); - Relocate(x, y, z, o); + transport->AddPassenger(this, position.Loc); + Relocate(transport->GetPositionWithOffset(position.Loc)); } } @@ -18089,18 +18085,17 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol if (transport) { - float x = fields.trans_x, y = fields.trans_y, z = fields.trans_z, o = fields.trans_o; - m_movementInfo.transport.pos.Relocate(x, y, z, o); - transport->CalculatePassengerPosition(x, y, z, &o); + m_movementInfo.transport.pos.Relocate(fields.trans_x, fields.trans_y, fields.trans_z, fields.trans_o); + Position globalPosition = transport->GetPositionWithOffset(m_movementInfo.transport.pos); - if (!Trinity::IsValidMapCoord(x, y, z, o) || + if (!globalPosition.IsPositionValid() || // transport size limited std::fabs(m_movementInfo.transport.pos.GetPositionX()) > 250.0f || std::fabs(m_movementInfo.transport.pos.GetPositionY()) > 250.0f || std::fabs(m_movementInfo.transport.pos.GetPositionZ()) > 250.0f) { - TC_LOG_ERROR("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid transport coordinates (X: {} Y: {} Z: {} O: {}). Teleport to bind location.", - guid.ToString(), x, y, z, o); + TC_LOG_ERROR("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid transport coordinates ({}). Teleport to bind location.", + guid.ToString(), globalPosition.ToString()); m_movementInfo.transport.Reset(); @@ -18108,10 +18103,10 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol } else { - Relocate(x, y, z, o); + Relocate(globalPosition); mapId = transport->GetMapId(); - transport->AddPassenger(this); + transport->AddPassenger(this, m_movementInfo.transport.pos); } } else diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index 56982dc1a1d..f7ac68ef840 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -16,9 +16,7 @@ */ #include "Transport.h" -#include "Cell.h" #include "CellImpl.h" -#include "Common.h" #include "DB2Stores.h" #include "GameEventSender.h" #include "GameObjectAI.h" @@ -28,20 +26,21 @@ #include "PhasingHandler.h" #include "Player.h" #include "ScriptMgr.h" -#include "Spline.h" #include "Totem.h" #include "UpdateData.h" #include "Vehicle.h" #include <boost/dynamic_bitset.hpp> -#include <G3D/Vector3.h> #include <sstream> -void TransportBase::UpdatePassengerPosition(Map* map, WorldObject* passenger, float x, float y, float z, float o, bool setHomePosition) +void TransportBase::UpdatePassengerPosition(Map* map, WorldObject* passenger, Position const& position, bool setHomePosition) { // transport teleported but passenger not yet (can happen for players) if (passenger->GetMap() != map) return; + float x, y, z, o; + position.GetPosition(x, y, z, o); + // Do not use Unit::UpdatePosition here, we don't want to remove auras // as if regular movement occurred switch (passenger->GetTypeId()) @@ -51,11 +50,7 @@ void TransportBase::UpdatePassengerPosition(Map* map, WorldObject* passenger, fl Creature* creature = passenger->ToCreature(); map->CreatureRelocation(creature, x, y, z, o, false); if (setHomePosition) - { - creature->GetTransportHomePosition(x, y, z, o); - CalculatePassengerPosition(x, y, z, &o); - creature->SetHomePosition(x, y, z, o); - } + creature->SetHomePosition(GetPositionWithOffset(creature->GetTransportHomePosition())); break; } case TYPEID_PLAYER: @@ -68,7 +63,7 @@ void TransportBase::UpdatePassengerPosition(Map* map, WorldObject* passenger, fl break; case TYPEID_GAMEOBJECT: map->GameObjectRelocation(passenger->ToGameObject(), x, y, z, o, false); - passenger->ToGameObject()->RelocateStationaryPosition(x, y, z, o); + passenger->ToGameObject()->RelocateStationaryPosition(position); break; case TYPEID_DYNAMICOBJECT: map->DynamicObjectRelocation(passenger->ToDynObject(), x, y, z, o); @@ -277,7 +272,7 @@ void Transport::Update(uint32 diff) } } -void Transport::AddPassenger(WorldObject* passenger) +void Transport::AddPassenger(WorldObject* passenger, Position const& offset) { if (!IsInWorld()) return; @@ -286,6 +281,7 @@ void Transport::AddPassenger(WorldObject* passenger) { passenger->SetTransport(this); passenger->m_movementInfo.transport.guid = GetGUID(); + passenger->m_movementInfo.transport.pos = offset; TC_LOG_DEBUG("entities.transport", "Object {} boarded transport {}.", passenger->GetName(), GetName()); if (Player* plr = passenger->ToPlayer()) @@ -323,16 +319,12 @@ Creature* Transport::CreateNPCPassenger(ObjectGuid::LowType guid, CreatureData c ASSERT(data); - float x, y, z, o; - data->spawnPoint.GetPosition(x, y, z, o); - creature->SetTransport(this); creature->m_movementInfo.transport.guid = GetGUID(); - creature->m_movementInfo.transport.pos.Relocate(x, y, z, o); + creature->m_movementInfo.transport.pos.Relocate(data->spawnPoint); creature->m_movementInfo.transport.seat = -1; - CalculatePassengerPosition(x, y, z, &o); - creature->Relocate(x, y, z, o); - creature->SetHomePosition(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetOrientation()); + creature->Relocate(GetPositionWithOffset(creature->m_movementInfo.transport.pos)); + creature->SetHomePosition(creature->GetPosition()); creature->SetTransportHomePosition(creature->m_movementInfo.transport.pos); /// @HACK - transport models are not added to map's dynamic LoS calculations @@ -372,16 +364,12 @@ GameObject* Transport::CreateGOPassenger(ObjectGuid::LowType guid, GameObjectDat ASSERT(data); - float x, y, z, o; - data->spawnPoint.GetPosition(x, y, z, o); - go->SetTransport(this); go->m_movementInfo.transport.guid = GetGUID(); - go->m_movementInfo.transport.pos.Relocate(x, y, z, o); + go->m_movementInfo.transport.pos.Relocate(data->spawnPoint); go->m_movementInfo.transport.seat = -1; - CalculatePassengerPosition(x, y, z, &o); - go->Relocate(x, y, z, o); - go->RelocateStationaryPosition(x, y, z, o); + go->Relocate(GetPositionWithOffset(go->m_movementInfo.transport.pos)); + go->RelocateStationaryPosition(go->GetPosition()); if (!go->IsPositionValid()) { @@ -477,11 +465,9 @@ TempSummon* Transport::SummonPassenger(uint32 entry, Position const& pos, TempSu break; } - float x, y, z, o; - pos.GetPosition(x, y, z, o); - CalculatePassengerPosition(x, y, z, &o); + Position globalPosition = GetPositionWithOffset(pos); - if (!summon->Create(map->GenerateLowGuid<HighGuid::Creature>(), map, entry, { x, y, z, o }, nullptr, vehId)) + if (!summon->Create(map->GenerateLowGuid<HighGuid::Creature>(), map, entry, globalPosition, nullptr, vehId)) { delete summon; return nullptr; @@ -499,8 +485,8 @@ TempSummon* Transport::SummonPassenger(uint32 entry, Position const& pos, TempSu summon->SetTransport(this); summon->m_movementInfo.transport.guid = GetGUID(); summon->m_movementInfo.transport.pos.Relocate(pos); - summon->Relocate(x, y, z, o); - summon->SetHomePosition(x, y, z, o); + summon->Relocate(globalPosition); + summon->SetHomePosition(globalPosition); summon->SetTransportHomePosition(pos); /// @HACK - transport models are not added to map's dynamic LoS calculations @@ -626,11 +612,7 @@ bool Transport::TeleportTransport(uint32 oldMapId, uint32 newMapId, float x, flo if (veh->GetTransport() == this) continue; - float destX, destY, destZ, destO; - (*itr)->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO); - TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o); - - (*itr)->ToUnit()->NearTeleportTo(destX, destY, destZ, destO); + (*itr)->ToUnit()->NearTeleportTo(GetPositionWithOffset((*itr)->m_movementInfo.transport.pos)); } } @@ -702,12 +684,7 @@ void Transport::TeleportPassengersAndHideTransport(uint32 newMapid) void Transport::UpdatePassengerPositions(PassengerSet const& passengers) { for (WorldObject* passenger : passengers) - { - float x, y, z, o; - passenger->m_movementInfo.transport.pos.GetPosition(x, y, z, o); - CalculatePassengerPosition(x, y, z, &o); - UpdatePassengerPosition(GetMap(), passenger, x, y, z, o, true); - } + UpdatePassengerPosition(GetMap(), passenger, GetPositionWithOffset(passenger->m_movementInfo.transport.pos), true); } void Transport::BuildUpdate(UpdateDataMapType& data_map) diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h index b78f02d3be9..616763af492 100644 --- a/src/server/game/Entities/Transport/Transport.h +++ b/src/server/game/Entities/Transport/Transport.h @@ -43,7 +43,7 @@ class TC_GAME_API Transport final : public GameObject, public TransportBase void BuildUpdate(UpdateDataMapType& data_map) override; - void AddPassenger(WorldObject* passenger) override; + void AddPassenger(WorldObject* passenger, Position const& offset) override; Transport* RemovePassenger(WorldObject* passenger) override; PassengerSet const& GetPassengers() const { return _passengers; } @@ -73,16 +73,10 @@ class TC_GAME_API Transport final : public GameObject, public TransportBase float GetTransportOrientation() const override { return GetOrientation(); } /// This method transforms supplied transport offsets into global coordinates - void CalculatePassengerPosition(float& x, float& y, float& z, float* o = nullptr) const override - { - TransportBase::CalculatePassengerPosition(x, y, z, o, GetPositionX(), GetPositionY(), GetPositionZ(), GetTransportOrientation()); - } + Position GetPositionWithOffset(Position const& offset) const override { return Position::GetPositionWithOffset(offset); } /// This method transforms supplied global coordinates into local offsets - void CalculatePassengerOffset(float& x, float& y, float& z, float* o = nullptr) const override - { - TransportBase::CalculatePassengerOffset(x, y, z, o, GetPositionX(), GetPositionY(), GetPositionZ(), GetTransportOrientation()); - } + Position GetPositionOffsetTo(Position const& endPos) const override { return Position::GetPositionOffsetTo(endPos); } int32 GetMapIdForSpawning() const override; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a24c32d8d74..03205c45f78 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -618,7 +618,7 @@ void Unit::UpdateSplinePosition() pos.SetOrientation(loc.orientation); if (TransportBase* transport = GetDirectTransport()) - transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation); + transport->GetPositionWithOffset(pos).GetPosition(loc.x, loc.y, loc.z, loc.orientation); else return; } @@ -12852,10 +12852,7 @@ void Unit::SendTeleportPacket(TeleportLocation const& teleportLocation) if (!transport) return; - float x, y, z, o; - teleportLocation.Location.GetPosition(x, y, z, o); - transport->CalculatePassengerPosition(x, y, z, &o); - moveUpdateTeleport.Status->pos.Relocate(x, y, z, o); + moveUpdateTeleport.Status->pos.Relocate(transport->GetPositionWithOffset(teleportLocation.Location)); moveUpdateTeleport.Status->transport.pos.Relocate(teleportLocation.Location); } else @@ -13078,7 +13075,7 @@ void CharmInfo::SaveStayPosition() if (_unit->movespline->onTransport) if (TransportBase* transport = _unit->GetDirectTransport()) - transport->CalculatePassengerPosition(stayPos.x, stayPos.y, stayPos.z); + transport->GetPositionWithOffset({ stayPos.x, stayPos.y, stayPos.z }).GetPosition(stayPos.x, stayPos.y, stayPos.z); _stayX = stayPos.x; _stayY = stayPos.y; diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index d7537f878d1..232c5748d51 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -572,16 +572,12 @@ void Vehicle::RelocatePassengers() { ASSERT(passenger->IsInWorld()); - float px, py, pz, po; - passenger->m_movementInfo.transport.pos.GetPosition(px, py, pz, po); - CalculatePassengerPosition(px, py, pz, &po); - - seatRelocation.emplace_back(passenger, Position(px, py, pz, po)); + seatRelocation.emplace_back(passenger, _me->GetPositionWithOffset(passenger->m_movementInfo.transport.pos)); } } for (auto const& [passenger, position] : seatRelocation) - UpdatePassengerPosition(_me->GetMap(), passenger, position.GetPositionX(), position.GetPositionY(), position.GetPositionZ(), position.GetOrientation(), false); + UpdatePassengerPosition(_me->GetMap(), passenger, position, false); } /** diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 5b68a429fe3..fb740a7d962 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -95,23 +95,13 @@ class TC_GAME_API Vehicle final : public TransportBase float GetTransportOrientation() const override { return GetBase()->GetOrientation(); } - void AddPassenger(WorldObject* /*passenger*/) override { ABORT_MSG("Vehicle cannot directly gain passengers without auras"); } + void AddPassenger(WorldObject* /*passenger*/, Position const& /*offset*/) override { ABORT_MSG("Vehicle cannot directly gain passengers without auras"); } /// This method transforms supplied transport offsets into global coordinates - void CalculatePassengerPosition(float& x, float& y, float& z, float* o /*= nullptr*/) const override - { - TransportBase::CalculatePassengerPosition(x, y, z, o, - GetBase()->GetPositionX(), GetBase()->GetPositionY(), - GetBase()->GetPositionZ(), GetBase()->GetOrientation()); - } + Position GetPositionWithOffset(Position const& offset) const override { return GetBase()->GetPositionWithOffset(offset); } /// This method transforms supplied global coordinates into local offsets - void CalculatePassengerOffset(float& x, float& y, float& z, float* o /*= nullptr*/) const override - { - TransportBase::CalculatePassengerOffset(x, y, z, o, - GetBase()->GetPositionX(), GetBase()->GetPositionY(), - GetBase()->GetPositionZ(), GetBase()->GetOrientation()); - } + Position GetPositionOffsetTo(Position const& endPos) const override { return GetBase()->GetPositionOffsetTo(endPos); } int32 GetMapIdForSpawning() const override { return GetBase()->GetMapId(); } diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h index fd012bdc53e..7349434f5ce 100644 --- a/src/server/game/Entities/Vehicle/VehicleDefines.h +++ b/src/server/game/Entities/Vehicle/VehicleDefines.h @@ -21,6 +21,9 @@ #include "Define.h" #include "Duration.h" #include "EnumFlag.h" +#include "ObjectGuid.h" +#include "Optional.h" +#include "Position.h" #include <map> #include <vector> @@ -172,42 +175,18 @@ public: virtual ObjectGuid GetTransportGUID() const = 0; /// This method transforms supplied transport offsets into global coordinates - virtual void CalculatePassengerPosition(float& x, float& y, float& z, float* o = nullptr) const = 0; + virtual Position GetPositionWithOffset(Position const& offset) const = 0; /// This method transforms supplied global coordinates into local offsets - virtual void CalculatePassengerOffset(float& x, float& y, float& z, float* o = nullptr) const = 0; + virtual Position GetPositionOffsetTo(Position const& endPos) const = 0; virtual float GetTransportOrientation() const = 0; - virtual void AddPassenger(WorldObject* passenger) = 0; + virtual void AddPassenger(WorldObject* passenger, Position const& offset) = 0; virtual TransportBase* RemovePassenger(WorldObject* passenger) = 0; - void UpdatePassengerPosition(Map* map, WorldObject* passenger, float x, float y, float z, float o, bool setHomePosition); - - static void CalculatePassengerPosition(float& x, float& y, float& z, float* o, float transX, float transY, float transZ, float transO) - { - float inx = x, iny = y, inz = z; - if (o) - *o = Position::NormalizeOrientation(transO + *o); - - x = transX + inx * std::cos(transO) - iny * std::sin(transO); - y = transY + iny * std::cos(transO) + inx * std::sin(transO); - z = transZ + inz; - } - - static void CalculatePassengerOffset(float& x, float& y, float& z, float* o, float transX, float transY, float transZ, float transO) - { - if (o) - *o = Position::NormalizeOrientation(*o - transO); - - z -= transZ; - y -= transY; // y = searchedY * std::cos(o) + searchedX * std::sin(o) - x -= transX; // x = searchedX * std::cos(o) + searchedY * std::sin(o + pi) - float inx = x, iny = y; - y = (iny - inx * std::tan(transO)) / (std::cos(transO) + std::sin(transO) * std::tan(transO)); - x = (inx + iny * std::tan(transO)) / (std::cos(transO) + std::sin(transO) * std::tan(transO)); - } + void UpdatePassengerPosition(Map* map, WorldObject* passenger, Position const& position, bool setHomePosition); virtual int32 GetMapIdForSpawning() const = 0; }; |
