diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Transport/Transport.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 17 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 |
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); |