void WorldSession::HandleMoveRootAck(WorldPacket& recv_data) { DEBUG_LOG("WORLD: CMSG_FORCE_MOVE_ROOT_ACK"); ObjectGuid guid; recv_data >> guid; // now can skip not our packet if (_player->GetObjectGuid() != guid) { recv_data.rpos(recv_data.wpos()); // prevent warnings spam return; } MovementInfo movementInfo; recv_data.read_skip<uint32>(); // unk recv_data >> movementInfo; movementInfo.UpdateTime(recv_data.GetPacketTime()); if (!VerifyMovementInfo(movementInfo)) return; if (!_player->GetCheatData()->HandleAnticheatTests(movementInfo, this, &recv_data)) return; // Position change HandleMoverRelocation(movementInfo); _player->UpdateFallInformationIfNeed(movementInfo, recv_data.GetOpcode()); WorldPacket data(MSG_MOVE_ROOT, recv_data.size()); data << _player->GetPackGUID(); movementInfo.Write(data); _player->SendMovementMessageToSet(std::move(data), true, _player); }
void WorldSession::HandleFeatherFallAck(WorldPacket &recv_data) { DEBUG_LOG("WORLD: CMSG_MOVE_FEATHER_FALL_ACK size %u", recv_data.wpos()); ObjectGuid guid; MovementInfo movementInfo; recv_data >> guid; // guid recv_data.read_skip<uint32>(); // counter recv_data >> movementInfo; movementInfo.UpdateTime(recv_data.GetPacketTime()); if (guid != _clientMoverGuid) return; if (!VerifyMovementInfo(movementInfo)) return; if (!_player->GetCheatData()->HandleAnticheatTests(movementInfo, this, &recv_data)) return; // Position change HandleMoverRelocation(movementInfo); _player->UpdateFallInformationIfNeed(movementInfo, recv_data.GetOpcode()); WorldPacket data(MSG_MOVE_FEATHER_FALL, recv_data.size()); data << guid.WriteAsPacked(); movementInfo.Write(data); _player->SendMovementMessageToSet(std::move(data), true, _player); }
void WorldSession::HandleMoveKnockBackAck(WorldPacket & recv_data) { DEBUG_LOG("CMSG_MOVE_KNOCK_BACK_ACK"); Unit *mover = _player->GetMover(); Player *plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL; // ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck if (plMover && plMover->IsBeingTeleported()) { recv_data.rpos(recv_data.wpos()); // prevent warnings spam return; } ObjectGuid guid; MovementInfo movementInfo; recv_data >> guid; recv_data >> Unused<uint32>(); // knockback packets counter recv_data >> movementInfo; movementInfo.UpdateTime(recv_data.GetPacketTime()); if (guid != _clientMoverGuid) return; if (!VerifyMovementInfo(movementInfo, guid)) return; if (!_player->GetCheatData()->HandleAnticheatTests(movementInfo, this, &recv_data)) return; HandleMoverRelocation(movementInfo); // Actually other clients don't need this packet ... // CMSG_MOVE_KNOCK_BACK_ACK only use is to update position server side for now. /* WorldPacket data(MSG_MOVE_KNOCK_BACK, recv_data.size() + 12); data << guid.WriteAsPacked(); data << movementInfo; data << movementInfo.GetJumpInfo().sinAngle; data << movementInfo.GetJumpInfo().cosAngle; data << movementInfo.GetJumpInfo().xyspeed; data << movementInfo.GetJumpInfo().velocity; mover->SendMovementMessageToSet(&data, true, _player);*/ }
void WorldSession::HandleForceSpeedChangeAckOpcodes(WorldPacket &recv_data) { uint32 opcode = recv_data.GetOpcode(); DEBUG_LOG("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode); /* extract packet */ ObjectGuid guid; MovementInfo movementInfo; float newspeed; recv_data >> guid; recv_data >> Unused<uint32>(); // counter or moveEvent recv_data >> movementInfo; recv_data >> newspeed; movementInfo.UpdateTime(recv_data.GetPacketTime()); // now can skip not our packet ObjectGuid moverGuid = _player->GetMover()->GetObjectGuid(); if (guid != moverGuid && guid != _clientMoverGuid) return; if (!VerifyMovementInfo(movementInfo)) return; // Process anticheat checks, remember client-side speed ... if (_player->IsSelfMover() && !_player->GetCheatData()->HandleSpeedChangeAck(movementInfo, this, &recv_data, newspeed)) return; // Process position-change HandleMoverRelocation(movementInfo); _player->UpdateFallInformationIfNeed(movementInfo, opcode); /*----------------*/ // client ACK send one packet for mounted/run case and need skip all except last from its // in other cases anti-cheat check can be fail in false case UnitMoveType move_type; switch (opcode) { case CMSG_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; break; case CMSG_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; break; case CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; break; case CMSG_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; break; case CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; break; case CMSG_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; break; default: sLog.outError("WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode); return; } // Daemon TODO: enregistrement de cette position ? // Daemon: mise a jour de la vitesse pour les joueurs a cote. // Cf Unit::SetSpeedRate pour plus d'infos. const uint16 SetSpeed2Opc_table[MAX_MOVE_TYPE][2] = { {MSG_MOVE_SET_WALK_SPEED, SMSG_FORCE_WALK_SPEED_CHANGE}, {MSG_MOVE_SET_RUN_SPEED, SMSG_FORCE_RUN_SPEED_CHANGE}, {MSG_MOVE_SET_RUN_BACK_SPEED, SMSG_FORCE_RUN_BACK_SPEED_CHANGE}, {MSG_MOVE_SET_SWIM_SPEED, SMSG_FORCE_SWIM_SPEED_CHANGE}, {MSG_MOVE_SET_SWIM_BACK_SPEED, SMSG_FORCE_SWIM_BACK_SPEED_CHANGE}, {MSG_MOVE_SET_TURN_RATE, SMSG_FORCE_TURN_RATE_CHANGE}, }; WorldPacket data(SetSpeed2Opc_table[move_type][0], 31); data << _player->GetMover()->GetPackGUID(); data << movementInfo; data << float(newspeed); _player->SendMovementMessageToSet(std::move(data), false); if (!_player->GetMover()->movespline->Finalized()) { WorldPacket splineData(SMSG_MONSTER_MOVE, 31); splineData << _player->GetMover()->GetPackGUID(); Movement::PacketBuilder::WriteMonsterMove(*(_player->GetMover()->movespline), splineData); _player->SendMovementMessageToSet(std::move(splineData), false); } }
void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data) { uint32 opcode = recv_data.GetOpcode(); DEBUG_LOG("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode); Unit *mover = _player->GetMover(); if (mover->GetObjectGuid() != _clientMoverGuid) return; Player *plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : NULL; // ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck if (plMover && plMover->IsBeingTeleported()) { recv_data.rpos(recv_data.wpos()); // prevent warnings spam return; } /* extract packet */ MovementInfo movementInfo = plMover ? plMover->m_movementInfo : MovementInfo(); recv_data >> movementInfo; movementInfo.UpdateTime(recv_data.GetPacketTime()); /*----------------*/ if (!VerifyMovementInfo(movementInfo)) return; if (plMover && !plMover->GetCheatData()->HandleAnticheatTests(movementInfo, this, &recv_data)) return; // this must be called after HandleAnticheatTests because that function will update order counters (for things like slow fall, water walk, etc.) if (plMover && !plMover->GetCheatData()->CheckTeleport(opcode, movementInfo)) return; // Interrupt spell cast at move if (movementInfo.HasMovementFlag(MOVEFLAG_MASK_MOVING)) mover->InterruptSpellsWithInterruptFlags(SPELL_INTERRUPT_FLAG_MOVEMENT); HandleMoverRelocation(movementInfo); // fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map). if (opcode == MSG_MOVE_FALL_LAND && plMover && !plMover->IsTaxiFlying()) plMover->HandleFall(movementInfo); // TODO: remove it // reset knockback state when fall to ground or water if (plMover) { if ((opcode == MSG_MOVE_FALL_LAND || opcode == MSG_MOVE_START_SWIM) && plMover->IsLaunched()) { plMover->SetLaunched(false); plMover->SetXYSpeed(0.0f); } } if (plMover) plMover->UpdateFallInformationIfNeed(movementInfo, opcode); WorldPacket data(opcode, recv_data.size()); data << _clientMoverGuid.WriteAsPacked(); // write guid movementInfo.Write(data); // write data mover->SendMovementMessageToSet(std::move(data), true, _player); }