aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp10
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp20
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
3 files changed, 19 insertions, 13 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 9b0747a6cd6..eca6f44681f 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -1929,14 +1929,12 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
// near teleport, triggering send MSG_MOVE_TELEPORT_ACK from client at landing
if (!GetSession()->PlayerLogout())
{
- Position newPosition(x, y, z, orientation);
+ Position oldPos = GetPosition();
if (HasUnitMovementFlag(MOVEMENTFLAG_HOVER))
- newPosition.m_positionZ += GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
-
+ z += GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
+ Relocate(x, y, z, orientation);
SendTeleportAckPacket();
- SendTeleportPacket();
- UpdatePosition(newPosition, true);
- UpdateObjectVisibility();
+ SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place
}
}
else
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 0b817a59c54..51739b3a864 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -13809,18 +13809,26 @@ void Unit::NearTeleportTo(Position const& pos, bool casting /*= false*/)
}
else
{
- SendTeleportPacket();
+ SendTeleportPacket(pos);
UpdatePosition(pos, true);
UpdateObjectVisibility();
}
}
-void Unit::SendTeleportPacket()
+void Unit::SendTeleportPacket(Position const& pos)
{
- WorldPacket data(MSG_MOVE_TELEPORT, 38);
- data << GetPackGUID();
- BuildMovementPacket(&data);
- SendMessageToSet(&data, false);
+ Position oldPos = { GetPositionX(), GetPositionY(), GetPositionZMinusOffset(), GetOrientation() };
+ if (GetTypeId() == TYPEID_UNIT)
+ Relocate(&pos);
+
+ WorldPacket data2(MSG_MOVE_TELEPORT, 38);
+ data2 << GetPackGUID();
+ BuildMovementPacket(&data2);
+ if (GetTypeId() == TYPEID_UNIT)
+ Relocate(&oldPos);
+ if (GetTypeId() == TYPEID_PLAYER)
+ Relocate(&pos);
+ SendMessageToSet(&data2, false);
}
bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool teleport)
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index a2090a6d1b1..baf91f41779 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();
+ void SendTeleportPacket(Position const& pos);
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);