aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp5
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp8
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp7
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp33
-rw-r--r--src/server/game/Entities/Creature/Creature.h2
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.cpp7
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp36
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h2
-rw-r--r--src/server/game/Entities/Object/Object.cpp7
-rw-r--r--src/server/game/Entities/Object/Position.cpp19
-rw-r--r--src/server/game/Entities/Object/Position.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp23
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp63
-rw-r--r--src/server/game/Entities/Transport/Transport.h12
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp9
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp8
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h16
-rw-r--r--src/server/game/Entities/Vehicle/VehicleDefines.h35
-rw-r--r--src/server/game/Garrison/Garrison.cpp12
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp30
-rw-r--r--src/server/game/Maps/Map.cpp34
-rw-r--r--src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp3
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp2
-rw-r--r--src/server/game/Spells/Spell.cpp7
-rw-r--r--src/server/scripts/Battlegrounds/StrandOfTheAncients/battleground_strand_of_the_ancients.cpp12
-rw-r--r--src/server/scripts/ExilesReach/zone_exiles_reach.cpp5
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp38
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp4
28 files changed, 141 insertions, 300 deletions
diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
index a6343124e51..f009403755c 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
@@ -176,10 +176,7 @@ void EscortAI::UpdateAI(uint32 diff)
TC_LOG_DEBUG("scripts.ai.escortai", "EscortAI::UpdateAI: reached end of waypoints, despawning at end ({})", me->GetGUID().ToString());
if (_returnToStart)
{
- Position respawnPosition;
- float orientation = 0.f;
- me->GetRespawnPosition(respawnPosition.m_positionX, respawnPosition.m_positionY, respawnPosition.m_positionZ, &orientation);
- respawnPosition.SetOrientation(orientation);
+ Position respawnPosition = me->GetRespawnPosition();
me->GetMotionMaster()->MovePoint(POINT_HOME, respawnPosition);
TC_LOG_DEBUG("scripts.ai.escortai", "EscortAI::UpdateAI: returning to spawn location: {} ({})", respawnPosition.ToString(), me->GetGUID().ToString());
}
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 7eccef96070..42a3e09d1d9 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -810,11 +810,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
// Reset home position to respawn position if specified in the parameters
if (e.action.evade.toRespawnPosition == 0)
- {
- float homeX, homeY, homeZ, homeO;
- me->GetRespawnPosition(homeX, homeY, homeZ, &homeO);
- me->SetHomePosition(homeX, homeY, homeZ, homeO);
- }
+ me->SetHomePosition(me->GetRespawnPosition());
me->AI()->EnterEvadeMode();
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_EVADE: Creature {} EnterEvadeMode", me->GetGUID());
@@ -1523,7 +1519,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
Position dest(e.target.x, e.target.y, e.target.z);
if (e.action.moveToPos.transport)
if (TransportBase* trans = me->GetDirectTransport())
- trans->CalculatePassengerPosition(dest.m_positionX, dest.m_positionY, dest.m_positionZ);
+ dest = trans->GetPositionWithOffset(dest);
me->GetMotionMaster()->MovePoint(e.action.moveToPos.pointId, dest, e.action.moveToPos.disablePathfinding == 0, {}, {},
MovementWalkRunSpeedSelectionMode::Default, {}, std::move(scriptResult));
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;
};
diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp
index e7c6c059cd0..d71fe4d7474 100644
--- a/src/server/game/Garrison/Garrison.cpp
+++ b/src/server/game/Garrison/Garrison.cpp
@@ -670,7 +670,7 @@ GarrisonError Garrison::CheckBuildingRemoval(uint32 garrPlotInstanceId) const
return GARRISON_SUCCESS;
}
-template<class T, void(T::*SecondaryRelocate)(float,float,float,float)>
+template<class T, void(T::*SecondaryRelocate)(Position const&)>
T* BuildingSpawnHelper(GameObject* building, ObjectGuid::LowType spawnId, Map* map)
{
T* spawn = new T();
@@ -680,14 +680,10 @@ T* BuildingSpawnHelper(GameObject* building, ObjectGuid::LowType spawnId, Map* m
return nullptr;
}
- float x = spawn->GetPositionX();
- float y = spawn->GetPositionY();
- float z = spawn->GetPositionZ();
- float o = spawn->GetOrientation();
- TransportBase::CalculatePassengerPosition(x, y, z, &o, building->GetPositionX(), building->GetPositionY(), building->GetPositionZ(), building->GetOrientation());
+ Position globalPosition = building->GetPositionWithOffset(spawn->GetPosition());
- spawn->Relocate(x, y, z, o);
- (spawn->*SecondaryRelocate)(x, y, z, o);
+ spawn->Relocate(globalPosition);
+ (spawn->*SecondaryRelocate)(globalPosition);
if (!spawn->IsPositionValid())
{
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 5d40526d315..c897e588fb7 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -119,14 +119,13 @@ void WorldSession::HandleMoveWorldportAck()
if (player->m_teleport_dest.TransportGuid)
{
- if (Transport* newTransport = newMap->GetTransport(*player->m_teleport_dest.TransportGuid))
+ if (GameObject* go = newMap->GetTransport(*player->m_teleport_dest.TransportGuid))
{
- newTransport->AddPassenger(player);
- player->m_movementInfo.transport.pos.Relocate(loc.Location);
- float x, y, z, o;
- loc.Location.GetPosition(x, y, z, o);
- newTransport->CalculatePassengerPosition(x, y, z, &o);
- player->Relocate(x, y, z, o);
+ if (TransportBase* newTransport = go->ToTransportBase())
+ {
+ newTransport->AddPassenger(player, loc.Location);
+ player->Relocate(newTransport->GetPositionWithOffset(loc.Location));
+ }
}
}
else if (TransportBase* transport = player->GetTransport())
@@ -297,14 +296,13 @@ void WorldSession::HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck
if (dest.TransportGuid)
{
- if (Transport* transport = plMover->GetMap()->GetTransport(*dest.TransportGuid))
+ if (GameObject* go = plMover->GetMap()->GetGameObject(*dest.TransportGuid))
{
- transport->AddPassenger(plMover);
- plMover->m_movementInfo.transport.pos.Relocate(destLocation);
- float x, y, z, o;
- dest.Location.GetPosition(x, y, z, o);
- transport->CalculatePassengerPosition(x, y, z, &o);
- destLocation.Relocate(x, y, z, o);
+ if (TransportBase* transport = go->ToTransportBase())
+ {
+ transport->AddPassenger(plMover, destLocation);
+ destLocation.Relocate(transport->GetPositionWithOffset(plMover->m_movementInfo.transport.pos));
+ }
}
}
@@ -397,7 +395,7 @@ void WorldSession::HandleMovementOpcode(OpcodeClient opcode, MovementInfo& movem
{
if (GameObject* go = plrMover->GetMap()->GetGameObject(movementInfo.transport.guid))
if (TransportBase* transport = go->ToTransportBase())
- transport->AddPassenger(plrMover);
+ transport->AddPassenger(plrMover, movementInfo.transport.pos);
}
else if (plrMover->GetTransport()->GetTransportGUID() != movementInfo.transport.guid)
{
@@ -405,7 +403,7 @@ void WorldSession::HandleMovementOpcode(OpcodeClient opcode, MovementInfo& movem
if (GameObject* go = plrMover->GetMap()->GetGameObject(movementInfo.transport.guid))
{
if (TransportBase* transport = go->ToTransportBase())
- transport->AddPassenger(plrMover);
+ transport->AddPassenger(plrMover, movementInfo.transport.pos);
else
movementInfo.ResetTransport();
}
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 76bfb162ec0..b95bd2b9359 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -1513,9 +1513,8 @@ bool Map::AreaTriggerCellRelocation(AreaTrigger* at, Cell new_cell)
bool Map::CreatureRespawnRelocation(Creature* c, bool diffGridOnly)
{
- float resp_x, resp_y, resp_z, resp_o;
- c->GetRespawnPosition(resp_x, resp_y, resp_z, &resp_o);
- Cell resp_cell(resp_x, resp_y);
+ Position resp = c->GetRespawnPosition();
+ Cell resp_cell(resp.GetPositionX(), resp.GetPositionY());
//creature will be unloaded with grid
if (diffGridOnly && !c->GetCurrentCell().DiffGrid(resp_cell))
@@ -1531,7 +1530,7 @@ bool Map::CreatureRespawnRelocation(Creature* c, bool diffGridOnly)
// teleport it to respawn point (like normal respawn if player see)
if (CreatureCellRelocation(c, resp_cell))
{
- c->Relocate(resp_x, resp_y, resp_z, resp_o);
+ c->Relocate(resp);
c->GetMotionMaster()->Initialize(); // prevent possible problems with default move generators
//CreatureRelocationNotify(c, resp_cell, resp_cell.GetCellCoord());
c->UpdatePositionData();
@@ -1544,9 +1543,8 @@ bool Map::CreatureRespawnRelocation(Creature* c, bool diffGridOnly)
bool Map::GameObjectRespawnRelocation(GameObject* go, bool diffGridOnly)
{
- float resp_x, resp_y, resp_z, resp_o;
- go->GetRespawnPosition(resp_x, resp_y, resp_z, &resp_o);
- Cell resp_cell(resp_x, resp_y);
+ Position resp = go->GetRespawnPosition();
+ Cell resp_cell(resp.GetPositionX(), resp.GetPositionY());
//GameObject will be unloaded with grid
if (diffGridOnly && !go->GetCurrentCell().DiffGrid(resp_cell))
@@ -1559,7 +1557,7 @@ bool Map::GameObjectRespawnRelocation(GameObject* go, bool diffGridOnly)
// teleport it to respawn point (like normal respawn if player see)
if (GameObjectCellRelocation(go, resp_cell))
{
- go->Relocate(resp_x, resp_y, resp_z, resp_o);
+ go->Relocate(resp);
go->UpdatePositionData();
go->UpdateObjectVisibility(false);
return true;
@@ -2729,17 +2727,11 @@ void Map::AddToActive(WorldObject* obj)
{
case TYPEID_UNIT:
if (Creature* creature = obj->ToCreature(); !creature->IsPet() && creature->GetSpawnId())
- {
- respawnLocation.emplace();
- creature->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);
- }
+ respawnLocation = creature->GetRespawnPosition();
break;
case TYPEID_GAMEOBJECT:
if (GameObject* gameObject = obj->ToGameObject(); gameObject->GetSpawnId())
- {
- respawnLocation.emplace();
- gameObject->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);
- }
+ respawnLocation = gameObject->GetRespawnPosition();
break;
default:
break;
@@ -2780,17 +2772,11 @@ void Map::RemoveFromActive(WorldObject* obj)
{
case TYPEID_UNIT:
if (Creature* creature = obj->ToCreature(); !creature->IsPet() && creature->GetSpawnId())
- {
- respawnLocation.emplace();
- creature->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);
- }
+ respawnLocation = creature->GetRespawnPosition();
break;
case TYPEID_GAMEOBJECT:
if (GameObject* gameObject = obj->ToGameObject(); gameObject->GetSpawnId())
- {
- respawnLocation.emplace();
- gameObject->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);
- }
+ respawnLocation = gameObject->GetRespawnPosition();
break;
default:
break;
diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
index 232ad771b16..f28f37134a4 100644
--- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
@@ -486,8 +486,7 @@ void WaypointMovementGenerator<Creature>::StartMove(Creature* owner, bool relaun
{
o -= trans->GetTransportOrientation();
owner->SetTransportHomePosition(x, y, z, o);
- trans->CalculatePassengerPosition(x, y, z, &o);
- owner->SetHomePosition(x, y, z, o);
+ owner->SetHomePosition(trans->GetPositionWithOffset(owner->GetTransportHomePosition()));
}
// else if (vehicle) - this should never happen, vehicle offsets are const
}
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp
index 9eb54f0ce73..0f8ac3c2cc4 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.cpp
+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp
@@ -35,7 +35,7 @@ namespace Movement
Vector3 operator()(Vector3 input) const
{
if (_transport)
- _transport->CalculatePassengerOffset(input.x, input.y, input.z);
+ _transport->GetPositionOffsetTo({ input.x, input.y, input.z }).GetPosition(input.x, input.y, input.z);
return input;
}
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index b4e5711d7f2..986c8376a00 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -81,11 +81,8 @@ SpellDestination::SpellDestination(WorldObject const& wObj) : _position(wObj.Get
void SpellDestination::Relocate(Position const& pos)
{
if (!_transportGUID.IsEmpty())
- {
- Position offset;
- _position.GetPositionOffsetTo(pos, offset);
- _transportOffset.RelocateOffset(offset);
- }
+ _transportOffset.RelocateOffset(_position.GetPositionOffsetTo(pos));
+
_position.Relocate(pos);
}
diff --git a/src/server/scripts/Battlegrounds/StrandOfTheAncients/battleground_strand_of_the_ancients.cpp b/src/server/scripts/Battlegrounds/StrandOfTheAncients/battleground_strand_of_the_ancients.cpp
index feb9c4334d1..9cefe03b553 100644
--- a/src/server/scripts/Battlegrounds/StrandOfTheAncients/battleground_strand_of_the_ancients.cpp
+++ b/src/server/scripts/Battlegrounds/StrandOfTheAncients/battleground_strand_of_the_ancients.cpp
@@ -554,16 +554,12 @@ struct battleground_strand_of_the_ancients : BattlegroundScript
{
if (TransportBase* transport = boat->ToTransportBase())
{
- player->Relocate(spawnPositionOnTransport[_attackers]);
- transport->AddPassenger(player);
- player->m_movementInfo.transport.pos.Relocate(spawnPositionOnTransport[_attackers]);
- float x, y, z, o;
- spawnPositionOnTransport[_attackers].GetPosition(x, y, z, o);
- transport->CalculatePassengerPosition(x, y, z, &o);
- player->Relocate(x, y, z, o);
+ transport->AddPassenger(player, spawnPositionOnTransport[_attackers]);
+ Position position = transport->GetPositionWithOffset(player->m_movementInfo.transport.pos);
+ player->Relocate(position);
if (player->IsInWorld())
- player->NearTeleportTo({ x, y, z, o });
+ player->NearTeleportTo(position);
}
}
}
diff --git a/src/server/scripts/ExilesReach/zone_exiles_reach.cpp b/src/server/scripts/ExilesReach/zone_exiles_reach.cpp
index 14518d79a32..df91066a55c 100644
--- a/src/server/scripts/ExilesReach/zone_exiles_reach.cpp
+++ b/src/server/scripts/ExilesReach/zone_exiles_reach.cpp
@@ -632,10 +632,7 @@ public:
if (!transport || !creature)
return;
- float x, y, z, o;
- position.GetPosition(x, y, z, o);
- transport->CalculatePassengerPosition(x, y, z, &o);
- creature->SummonPersonalClone({ x, y, z, o }, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
+ creature->SummonPersonalClone(transport->GetPositionWithOffset(position), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
index 6790b95f7e4..bb32cd14c0d 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
@@ -567,18 +567,13 @@ struct gunship_npc_AI : public ScriptedAI
me->SetReactState(REACT_PASSIVE);
- float x, y, z, o;
- Slot->TargetPosition.GetPosition(x, y, z, o);
-
me->SetTransportHomePosition(Slot->TargetPosition);
- float hx = x, hy = y, hz = z, ho = o;
- me->GetTransport()->CalculatePassengerPosition(hx, hy, hz, &ho);
- me->SetHomePosition(hx, hy, hz, ho);
+ me->SetHomePosition(me->GetTransport()->GetPositionWithOffset(Slot->TargetPosition));
- std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
+ std::function<void(Movement::MoveSplineInit&)> initializer = [pos = Slot->TargetPosition](Movement::MoveSplineInit& init)
{
init.DisableTransportPathTransformations();
- init.MoveTo(x, y, z, false);
+ init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), false);
};
me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_CHARGE_PREPATH, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
}
@@ -1417,23 +1412,21 @@ struct npc_gunship_boarding_addAI : public gunship_npc_AI
if (pointId == EVENT_CHARGE_PREPATH && Slot)
{
Position const& otherTransportPos = Instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE ? OrgrimsHammerTeleportExit : SkybreakerTeleportExit;
- float x, y, z, o;
- otherTransportPos.GetPosition(x, y, z, o);
-
- TransportBase* myTransport = me->GetTransport();
+ TransportBase const* myTransport = me->GetTransport();
if (!myTransport)
return;
- if (Transport* destTransport = ObjectAccessor::GetTransport(*me, Instance->GetGuidData(DATA_ICECROWN_GUNSHIP_BATTLE)))
- destTransport->CalculatePassengerPosition(x, y, z, &o);
+ if (Transport const* destTransport = ObjectAccessor::GetTransport(*me, Instance->GetGuidData(DATA_ICECROWN_GUNSHIP_BATTLE)))
+ {
+ Position globalPosition = destTransport->GetPositionWithOffset(otherTransportPos);
- float angle = frand(0, float(M_PI) * 2.0f);
- x += 2.0f * std::cos(angle);
- y += 2.0f * std::sin(angle);
+ float angle = frand(0, float(M_PI) * 2.0f);
+ globalPosition.m_positionX += 2.0f * std::cos(angle);
+ globalPosition.m_positionY += 2.0f * std::sin(angle);
- me->SetHomePosition(x, y, z, o);
- myTransport->CalculatePassengerOffset(x, y, z, &o);
- me->SetTransportHomePosition(x, y, z, o);
+ me->SetHomePosition(globalPosition);
+ me->SetTransportHomePosition(myTransport->GetPositionOffsetTo(globalPosition));
+ }
me->m_Events.AddEvent(new BattleExperienceEvent(me), me->m_Events.CalculateTime(BattleExperienceEvent::ExperiencedTimes[0]));
DoCast(me, SPELL_BATTLE_EXPERIENCE, true);
@@ -1974,10 +1967,7 @@ class spell_igb_teleport_to_enemy_ship : public SpellScript
if (!dest || !target || !target->GetTransport())
return;
- float x, y, z, o;
- dest->GetPosition(x, y, z, o);
- target->GetTransport()->CalculatePassengerOffset(x, y, z, &o);
- target->m_movementInfo.transport.pos.Relocate(x, y, z, o);
+ target->m_movementInfo.transport.pos.Relocate(target->GetTransport()->GetPositionOffsetTo(*dest));
}
void Register() override
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
index 37794e1ae26..182f71a0163 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
@@ -504,9 +504,7 @@ struct boss_malygos : public BossAI
break;
case ACTION_HANDLE_RESPAWN:
// Teleport to spawn position, we can't use normal relocate
- float x, y, z, o;
- me->GetRespawnPosition(x, y, z, &o);
- me->NearTeleportTo(x, y, z, o);
+ me->NearTeleportTo(me->GetRespawnPosition());
// Respawn Iris
instance->SetData(DATA_RESPAWN_IRIS, 0);
_despawned = false;