diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 107 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 3 | ||||
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 4 |
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(); |