aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.h3
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp3
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp17
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
5 files changed, 17 insertions, 10 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index fb447b78375..1de2ad3de79 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -1919,7 +1919,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
SetSemaphoreTeleportNear(true);
// near teleport, triggering send MSG_MOVE_TELEPORT_ACK from client at landing
if (!GetSession()->PlayerLogout())
- SendTeleportPacket(m_teleport_dest);
+ SendTeleportPacket(m_teleport_dest, (options & TELE_TO_TRANSPORT_TELEPORT) != 0);
}
else
{
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 57258eb78ba..1b14046f7a6 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -749,7 +749,8 @@ enum TeleportToOptions
TELE_TO_NOT_LEAVE_TRANSPORT = 0x02,
TELE_TO_NOT_LEAVE_COMBAT = 0x04,
TELE_TO_NOT_UNSUMMON_PET = 0x08,
- TELE_TO_SPELL = 0x10
+ TELE_TO_SPELL = 0x10,
+ TELE_TO_TRANSPORT_TELEPORT = 0x20
};
/// Type of environmental damages
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index cb52b145d93..a7e89f9aac0 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -632,7 +632,8 @@ bool Transport::TeleportTransport(uint32 newMapid, float x, float y, float z, fl
(*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)->ToPlayer()->TeleportTo(newMapid, destX, destY, destZ, destO,
+ TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET | TELE_TO_TRANSPORT_TELEPORT);
}
}
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index a3eaa245435..f16366e50e9 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -13837,20 +13837,25 @@ void Unit::NearTeleportTo(Position const& pos, bool casting /*= false*/)
}
}
-void Unit::SendTeleportPacket(Position const& pos)
+void Unit::SendTeleportPacket(Position const& pos, bool teleportingTransport /*= false*/)
{
// MSG_MOVE_TELEPORT is sent to nearby players to signal the teleport
// MSG_MOVE_TELEPORT_ACK is sent to self in order to trigger ACK and update the position server side
MovementInfo teleportMovementInfo = m_movementInfo;
teleportMovementInfo.pos.Relocate(pos);
- Position transportPos = pos;
+ Position transportPos = m_movementInfo.transport.pos;
if (TransportBase* transportBase = GetDirectTransport())
{
- float x, y, z, o;
- pos.GetPosition(x, y, z, o);
- transportBase->CalculatePassengerOffset(x, y, z, &o);
- transportPos.Relocate(x, y, z, o);
+ // if its the transport that is teleported then we have old transport position here and cannot use it to calculate offsets
+ // assume that both transport teleport and teleport within transport cannot happen at the same time
+ if (!teleportingTransport)
+ {
+ float x, y, z, o;
+ pos.GetPosition(x, y, z, o);
+ transportBase->CalculatePassengerOffset(x, y, z, &o);
+ transportPos.Relocate(x, y, z, o);
+ }
}
WorldPacket moveUpdateTeleport(MSG_MOVE_TELEPORT, 38);
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 6c6d8457a0e..2c58b250b3c 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1620,7 +1620,7 @@ class TC_GAME_API Unit : public WorldObject
void NearTeleportTo(Position const& pos, bool casting = false);
void NearTeleportTo(float x, float y, float z, float orientation, bool casting = false) { NearTeleportTo(Position(x, y, z, orientation), casting); }
- void SendTeleportPacket(Position const& pos);
+ void SendTeleportPacket(Position const& pos, bool teleportingTransport = false);
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport = false);
// returns true if unit's position really changed
virtual bool UpdatePosition(const Position &pos, bool teleport = false);