aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp20
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp107
-rw-r--r--src/server/game/Entities/Unit/Unit.h3
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp4
5 files changed, 69 insertions, 67 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index eca6f44681f..779b1fc57a0 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -1817,15 +1817,6 @@ uint8 Player::GetChatTag() const
return tag;
}
-void Player::SendTeleportAckPacket()
-{
- WorldPacket data(MSG_MOVE_TELEPORT_ACK, 41);
- data << GetPackGUID();
- data << uint32(0); // this value increments every time
- BuildMovementPacket(&data);
- GetSession()->SendPacket(&data);
-}
-
bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options)
{
if (!MapManager::IsValidMapCoord(mapid, x, y, z, orientation))
@@ -1928,14 +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())
- {
- Position oldPos = GetPosition();
- if (HasUnitMovementFlag(MOVEMENTFLAG_HOVER))
- z += GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
- Relocate(x, y, z, orientation);
- SendTeleportAckPacket();
- SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place
- }
+ SendTeleportPacket(m_teleport_dest);
}
else
{
@@ -19675,7 +19659,7 @@ void Player::_SaveInventory(SQLTransaction& trans)
Item* item = m_items[i];
if (!item)
continue;
-
+
if (item->GetState() == ITEM_NEW)
{
if (ItemTemplate const* itemTemplate = item->GetTemplate())
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 8670f1c851b..57258eb78ba 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1814,8 +1814,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void SendMessageToSetInRange(WorldPacket const* data, float dist, bool self, bool own_team_only);
void SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) override;
- void SendTeleportAckPacket();
-
Corpse* GetCorpse() const;
void SpawnCorpseBones(bool triggerSave = true);
Corpse* CreateCorpse();
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 51739b3a864..0573c95eb1d 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -13744,54 +13744,52 @@ void Unit::_ExitVehicle(Position const* exitPosition)
void Unit::BuildMovementPacket(ByteBuffer *data) const
{
- *data << uint32(GetUnitMovementFlags()); // movement flags
- *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
+ Unit::BuildMovementPacket(Position(GetPositionX(), GetPositionY(), GetPositionZMinusOffset(), GetOrientation()), m_movementInfo.transport.pos, m_movementInfo, data);
+}
+
+void Unit::BuildMovementPacket(Position const& pos, Position const& transportPos, MovementInfo const& movementInfo, ByteBuffer* data)
+{
+ *data << uint32(movementInfo.GetMovementFlags());
+ *data << uint16(movementInfo.GetExtraMovementFlags());
*data << uint32(GameTime::GetGameTimeMS()); // time / counter
- *data << GetPositionX();
- *data << GetPositionY();
- *data << GetPositionZMinusOffset();
- *data << GetOrientation();
+ *data << float(pos.GetPositionX());
+ *data << float(pos.GetPositionY());
+ *data << float(pos.GetPositionZ());
+ *data << float(pos.GetOrientation());
// 0x00000200
- if (GetUnitMovementFlags() & MOVEMENTFLAG_ONTRANSPORT)
+ if (movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
{
- if (m_vehicle)
- *data << m_vehicle->GetBase()->GetPackGUID();
- else if (GetTransport())
- *data << GetTransport()->GetPackGUID();
- else
- *data << (uint8)0;
-
- *data << float (GetTransOffsetX());
- *data << float (GetTransOffsetY());
- *data << float (GetTransOffsetZ());
- *data << float (GetTransOffsetO());
- *data << uint32(GetTransTime());
- *data << uint8 (GetTransSeat());
+ *data << movementInfo.transport.guid.WriteAsPacked();
+ *data << float(transportPos.GetPositionX());
+ *data << float(transportPos.GetPositionY());
+ *data << float(transportPos.GetPositionZ());
+ *data << float(transportPos.GetOrientation());
+ *data << uint32(movementInfo.transport.time);
+ *data << int8(movementInfo.transport.seat);
- if (GetExtraUnitMovementFlags() & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT)
- *data << uint32(m_movementInfo.transport.time2);
+ if (movementInfo.HasExtraMovementFlag(MOVEMENTFLAG2_INTERPOLATED_MOVEMENT))
+ *data << uint32(movementInfo.transport.time2);
}
// 0x02200000
- if ((GetUnitMovementFlags() & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING))
- || (m_movementInfo.flags2 & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING))
- *data << (float)m_movementInfo.pitch;
+ if ((movementInfo.HasMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (movementInfo.HasExtraMovementFlag(MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING)))
+ *data << float(movementInfo.pitch);
- *data << (uint32)m_movementInfo.fallTime;
+ *data << uint32(movementInfo.fallTime);
// 0x00001000
- if (GetUnitMovementFlags() & MOVEMENTFLAG_FALLING)
+ if (movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING))
{
- *data << (float)m_movementInfo.jump.zspeed;
- *data << (float)m_movementInfo.jump.sinAngle;
- *data << (float)m_movementInfo.jump.cosAngle;
- *data << (float)m_movementInfo.jump.xyspeed;
+ *data << float(movementInfo.jump.zspeed);
+ *data << float(movementInfo.jump.sinAngle);
+ *data << float(movementInfo.jump.cosAngle);
+ *data << float(movementInfo.jump.xyspeed);
}
// 0x04000000
- if (GetUnitMovementFlags() & MOVEMENTFLAG_SPLINE_ELEVATION)
- *data << (float)m_movementInfo.splineElevation;
+ if (movementInfo.HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION))
+ *data << float(movementInfo.splineElevation);
}
bool Unit::IsFalling() const
@@ -13817,18 +13815,39 @@ void Unit::NearTeleportTo(Position const& pos, bool casting /*= false*/)
void Unit::SendTeleportPacket(Position const& pos)
{
- Position oldPos = { GetPositionX(), GetPositionY(), GetPositionZMinusOffset(), GetOrientation() };
- if (GetTypeId() == TYPEID_UNIT)
- Relocate(&pos);
+ // 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
- 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);
+ MovementInfo teleportMovementInfo = m_movementInfo;
+ teleportMovementInfo.pos.Relocate(pos);
+ Position transportPos = 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);
+ }
+
+ WorldPacket moveUpdateTeleport(MSG_MOVE_TELEPORT, 38);
+ moveUpdateTeleport << GetPackGUID();
+ Unit* broadcastSource = this;
+
+ if (Player* playerMover = GetPlayerBeingMoved())
+ {
+ WorldPacket moveTeleport(MSG_MOVE_TELEPORT_ACK, 41);
+ moveTeleport << GetPackGUID();
+ moveTeleport << uint32(0); // this value increments every time
+ Unit::BuildMovementPacket(pos, transportPos, teleportMovementInfo, &moveTeleport);
+ playerMover->SendDirectMessage(&moveTeleport);
+
+ broadcastSource = playerMover;
+ }
+
+ Unit::BuildMovementPacket(pos, transportPos, teleportMovementInfo, &moveUpdateTeleport);
+
+ // Broadcast the packet to everyone except self.
+ broadcastSource->SendMessageToSet(&moveUpdateTeleport, 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 baf91f41779..6c6d8457a0e 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -2182,7 +2182,8 @@ class TC_GAME_API Unit : public WorldObject
void _ExitVehicle(Position const* exitPosition = NULL);
void _EnterVehicle(Vehicle* vehicle, int8 seatId, AuraApplication const* aurApp = NULL);
- void BuildMovementPacket(ByteBuffer *data) const;
+ void BuildMovementPacket(ByteBuffer* data) const;
+ static void BuildMovementPacket(Position const& pos, Position const& transportPos, MovementInfo const& movementInfo, ByteBuffer* data);
bool isMoving() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_MASK_MOVING); }
bool isTurning() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_MASK_TURNING); }
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index c3cf39488ff..871031025e5 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -208,8 +208,8 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recvData)
recvData >> guid.ReadAsPacked();
- uint32 flags, time;
- recvData >> flags >> time;
+ uint32 sequenceIndex, time;
+ recvData >> sequenceIndex >> time;
Player* plMover = _player->m_unitMovedByMe->ToPlayer();