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::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::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; } MovementInfo movementInfo; recv_data >> movementInfo; if (!VerifyMovementInfo(movementInfo, movementInfo.GetGuid())) return; HandleMoverRelocation(movementInfo); WorldPacket data(SMSG_MOVE_UPDATE_KNOCK_BACK, recv_data.size() + 15); data << movementInfo; mover->SendMessageToSetExcept(&data, _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.ReadAsPacked(); recv_data >> Unused<uint32>(); // knockback packets counter recv_data >> movementInfo; if (!VerifyMovementInfo(movementInfo, guid)) return; HandleMoverRelocation(movementInfo); WorldPacket data(MSG_MOVE_KNOCK_BACK, recv_data.size() + 15); data << mover->GetPackGUID(); data << movementInfo; data << movementInfo.GetJumpInfo().sinAngle; data << movementInfo.GetJumpInfo().cosAngle; data << movementInfo.GetJumpInfo().xyspeed; data << movementInfo.GetJumpInfo().velocity; mover->SendMessageToSetExcept(&data, _player); }
void WorldSession::HandleDismissControlledVehicle(WorldPacket& recv_data) { DEBUG_LOG("WORLD: Received CMSG_DISMISS_CONTROLLED_VEHICLE"); recv_data.hexlike(); MovementInfo movementInfo; recv_data >> movementInfo; if (!GetPlayer()->GetVehicle()) return; bool dismiss = true; Creature* vehicle = GetPlayer()->GetMap()->GetAnyTypeCreature(movementInfo.GetGuid()); if (!vehicle || !vehicle->IsVehicle() || !vehicle->GetVehicleKit() || !vehicle->GetEntry()) return; if (vehicle->GetVehicleKit()->GetEntry()->m_flags & (VEHICLE_FLAG_NOT_DISMISS | VEHICLE_FLAG_ACCESSORY)) dismiss = false; // Client freezes... if (vehicle->GetEntry() == 34812 || vehicle->GetEntry() == 34819 || vehicle->GetEntry() == 34822 || vehicle->GetEntry() == 34823 || vehicle->GetEntry() == 34824) dismiss = false; GetPlayer()->m_movementInfo = movementInfo; GetPlayer()->ExitVehicle(); if (dismiss) vehicle->ForcedDespawn(); }
void WorldSession::HandleForceSpeedChangeAck(WorldPacket& recv_data) { DEBUG_LOG("WORLD: Recvd CMSG_SPEED_CHANGE_ACK"); /* extract packet */ ObjectGuid guid; uint32 unk1; MovementInfo movementInfo; float newspeed; recv_data >> guid; recv_data >> unk1; // counter or moveEvent recv_data >> movementInfo; recv_data >> newspeed; // now can skip not our packet if (GetPlayer()->GetGUID() != guid.GetRawValue()) return; /*----------------*/ // Save movement flags GetPlayer()->SetUnitMovementFlags(movementInfo.GetMovementFlags()); // 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; UnitMoveType force_move_type; //static char const* move_type_name[MAX_MOVE_TYPE] = {"Walk", "Run", "RunBack", "Swim", "SwimBack", "TurnRate", "Flight", "FlightBack"}; uint16 opcode = recv_data.GetOpcode(); switch (opcode) { case CMSG_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; force_move_type = MOVE_WALK; break; case CMSG_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; force_move_type = MOVE_RUN; break; case CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; force_move_type = MOVE_RUN_BACK; break; case CMSG_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; force_move_type = MOVE_SWIM; break; case CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; force_move_type = MOVE_SWIM_BACK; break; case CMSG_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; force_move_type = MOVE_TURN_RATE; break; case CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; force_move_type = MOVE_FLIGHT; break; case CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; force_move_type = MOVE_FLIGHT_BACK; break; default: sLog.outError("WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode); return; } // skip all forced speed changes except last and unexpected // in run/mounted case used one ACK and it must be skipped.m_forced_speed_changes[MOVE_RUN] store both. if (GetPlayer()->m_forced_speed_changes[force_move_type] > 0) { --GetPlayer()->m_forced_speed_changes[force_move_type]; if (GetPlayer()->m_forced_speed_changes[force_move_type] > 0) return; } }
void WorldSession::HandleTaxiNextDestinationOpcode(WorldPacket& recv_data) { DEBUG_LOG("WORLD: Received CMSG_MOVE_SPLINE_DONE"); MovementInfo movementInfo; // used only for proper packet read recv_data >> movementInfo; recv_data >> Unused<uint32>(); // unk // in taxi flight packet received at the end of current path in far (multi-node) flight uint32 curDest = GetPlayer()->m_taxi.GetTaxiDestination(); if (!curDest) return; uint32 destinationnode = GetPlayer()->m_taxi.NextTaxiDestination(); if (destinationnode > 0) // if more destinations to go { // current source node for next destination uint32 sourcenode = GetPlayer()->m_taxi.GetTaxiSource(); // Add to taximask middle hubs in taxicheat mode (to prevent having player with disabled taxicheat and not having back flight path) if (GetPlayer()->isTaxiCheater()) { if (GetPlayer()->m_taxi.SetTaximaskNode(sourcenode)) { WorldPacket data(SMSG_NEW_TAXI_PATH, 0); _player->GetSession()->SendPacket(&data); } } DEBUG_LOG("WORLD: Taxi has to go from %u to %u", sourcenode, destinationnode); uint16 MountId = sObjectMgr.GetTaxiMount(sourcenode, GetPlayer()->GetTeam()); uint32 path, cost; sObjectMgr.GetTaxiPath(sourcenode, destinationnode, path, cost); if (path && MountId) SendDoFlight(MountId, path, 1); // skip start fly node else GetPlayer()->m_taxi.ClearTaxiDestinations(); // clear problematic path and next return; } else { GetPlayer()->m_taxi.ClearTaxiDestinations(); // not destinations, clear source node // has taxi flight just finished reset fall information to avoid receiving fall damage GetPlayer()->SetFallInformation(0, movementInfo.GetPos()->GetPositionZ()); } GetPlayer()->CleanupAfterTaxiFlight(); }
void WorldSession::HandleMovementOpcodes(WorldPacket& recvPacket) { MovementInfo info; info.ReadFromPacket(recvPacket); //Stop Emote if (GetPlayer()->GetUInt32Value(UNIT_NPC_EMOTESTATE)) GetPlayer()->HandleEmoteCommand(0); HandleMovementInfo(info, recvPacket.GetOpcode(), recvPacket.size(), _player->m_mover); }
void WorldSession::HandleMovementUnrootAck(WorldPacket& recvPacket) { MovementInfo info; info.ReadFromPacket(recvPacket); // skip old result if (_player->m_movement_ack[ACK_UNROOT] != info.ackCount) { recvPacket.rfinish(); return; } HandleMovementInfo(info, recvPacket.GetOpcode(), recvPacket.size()-4, _player->m_mover); }
void WorldSession::HandleMoveWaterWalkAck(WorldPacket& recvPacket) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_MOVE_WATER_WALK_ACK"); MovementInfo info; info.ReadFromPacket(recvPacket); recvPacket.read_skip<uint32>(); // unk MovementInfo movementInfo; GetPlayer()->ReadMovementInfo(recvPacket, &movementInfo); recvPacket.read_skip<uint32>(); // unk2 }
bool WorldSession::VerifyMovementInfo(MovementInfo const& movementInfo, ObjectGuid const& guid) const { // ignore wrong guid (player attempt cheating own session for not own guid possible...) if (guid != _player->GetMover()->GetObjectGuid()) return false; if (!MaNGOS::IsValidMapCoord(movementInfo.GetPos()->x, movementInfo.GetPos()->y, movementInfo.GetPos()->z, movementInfo.GetPos()->o)) return false; if (movementInfo.GetTransportGuid()) { // transports size limited // (also received at zeppelin/lift leave by some reason with t_* as absolute in continent coordinates, can be safely skipped) if (movementInfo.GetTransportPos()->x > 50 || movementInfo.GetTransportPos()->y > 50 || movementInfo.GetTransportPos()->z > 100) return false; if (!MaNGOS::IsValidMapCoord(movementInfo.GetPos()->x + movementInfo.GetTransportPos()->x, movementInfo.GetPos()->y + movementInfo.GetTransportPos()->y, movementInfo.GetPos()->z + movementInfo.GetTransportPos()->z, movementInfo.GetPos()->o + movementInfo.GetTransportPos()->o)) { return false; } } return true; }
void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) { uint32 opcode = recv_data.GetOpcode(); DEBUG_LOG("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode); recv_data.hexlike(); 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; } /* extract packet */ ObjectGuid guid; MovementInfo movementInfo; recv_data >> guid.ReadAsPacked(); recv_data >> movementInfo; /*----------------*/ if (!VerifyMovementInfo(movementInfo, guid)) return; // 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); /* process anticheat check */ GetPlayer()->GetAntiCheat()->DoAntiCheatCheck(CHECK_MOVEMENT,movementInfo, opcode); /* process position-change */ HandleMoverRelocation(movementInfo); if (plMover) plMover->UpdateFallInformationIfNeed(movementInfo, opcode); // after move info set if (opcode == MSG_MOVE_SET_WALK_MODE || opcode == MSG_MOVE_SET_RUN_MODE) mover->UpdateWalkMode(mover, false); WorldPacket data(opcode, recv_data.size()); data << mover->GetPackGUID(); // write guid movementInfo.Write(data); // write data mover->SendMessageToSetExcept(&data, _player); }
void WorldSession::HandleMovementOpcodes(WorldPacket& recv_data) { Opcodes opcode = recv_data.GetOpcode(); if (!sLog.HasLogFilter(LOG_FILTER_PLAYER_MOVES)) { DEBUG_LOG("WORLD: Received opcode %s (%u, 0x%X)", LookupOpcodeName(opcode), opcode, opcode); recv_data.hexlike(); } Unit* mover = _player->GetMover(); Player* plMover = mover->GetTypeId() == TYPEID_PLAYER ? (Player*)mover : nullptr; // 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 */ ObjectGuid guid; MovementInfo movementInfo; recv_data >> guid.ReadAsPacked(); recv_data >> movementInfo; /*----------------*/ if (!VerifyMovementInfo(movementInfo, guid)) return; // 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); // Remove auras that should be removed at landing on ground or water if (opcode == MSG_MOVE_FALL_LAND || opcode == MSG_MOVE_START_SWIM) mover->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_LANDING); // Parachutes /* process position-change */ HandleMoverRelocation(movementInfo); if (plMover) plMover->UpdateFallInformationIfNeed(movementInfo, opcode); WorldPacket data(opcode, recv_data.size()); data << mover->GetPackGUID(); // write guid movementInfo.Write(data); // write data mover->SendMessageToSetExcept(data, _player); }
void WorldSession::HandleMoveSetCanFlyAckOpcode(WorldPacket& recv_data) { // fly mode on/off DEBUG_LOG("WORLD: CMSG_MOVE_SET_CAN_FLY_ACK"); //recv_data.hexlike(); MovementInfo movementInfo; recv_data.read_skip<uint64>(); // guid recv_data.read_skip<uint32>(); // unk recv_data >> movementInfo; recv_data.read_skip<uint32>(); // unk2 GetPlayer()->SetUnitMovementFlags(movementInfo.GetMovementFlags()); }
void AnticheatMgr::TeleportPlaneHackDetection(Player* player, MovementInfo movementInfo) { if ((sWorld->getIntConfig(CONFIG_ANTICHEAT_DETECTIONS_ENABLED) & TELEPORT_PLANE_HACK_DETECTION) == 0) return; uint32 key = player->GetGUIDLow(); if (m_Players[key].GetLastMovementInfo().pos.GetPositionZ() != 0 || movementInfo.pos.GetPositionZ() != 0) return; if (movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING)) return; //DEAD_FALLING was deprecated //if (player->getDeathState() == DEAD_FALLING) // return; float x, y, z; player->GetPosition(x, y, z); float ground_Z = player->GetMap()->GetHeight(x, y, z); float z_diff = fabs(ground_Z - z); // we are not really walking there if (z_diff > 1.0f) { TC_LOG_DEBUG("entities.player.character", "AnticheatMgr:: Teleport To Plane - Hack detected player GUID (low) %u",player->GetGUIDLow()); BuildReport(player,TELEPORT_PLANE_HACK_REPORT); } }
void WorldSession::HandleMoveNotActiveMoverOpcode(WorldPacket &recv_data) { DEBUG_LOG("WORLD: Recvd CMSG_MOVE_NOT_ACTIVE_MOVER"); recv_data.hexlike(); MovementInfo mi; recv_data >> mi; if (_player->GetMover()->GetObjectGuid() == mi.GetGuid()) { DEBUG_LOG("World: CMSG_MOVE_NOT_ACTIVE_MOVER %s received, but his now is active mover!", mi.GetGuid().GetString().c_str()); recv_data.rpos(recv_data.wpos()); // prevent warnings spam } _player->m_movementInfo = mi; }
void AnticheatMgr::TeleportPlaneHackDetection(Player* player, MovementInfo movementInfo) { uint32 key = player->GetGUIDLow(); if (m_Players[key].GetLastMovementInfo().pos.GetPositionZ() != 0 || movementInfo.pos.GetPositionZ() != 0) return; if (movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING)) return; //DEAD_FALLING was deprecated //if (player->getDeathState() == DEAD_FALLING) // return; float x, y, z; player->GetPosition(x, y, z); float ground_Z = player->GetMap()->GetHeight(x, y, z); float z_diff = fabs(ground_Z - z); // we are not really walking there if (z_diff > 9.0f) { Report(player, TELEPORTPLANE_HACK); } }
void WorldSession::SynchronizeMovement(MovementInfo &movementInfo) { // Get time based on server uint32 currMsTime = WorldTimer::getMSTime(); // Invalidate syncs older than 750ms (and start new one) if (lastMoveTimeServer < currMsTime - 750) { lastMoveTimeServer = currMsTime; } else { // The time that is between last clients time and current client time gets applie to last server time uint32 clientMsDiff = movementInfo.time - lastMoveTimeClient; if (clientMsDiff > 750) lastMoveTimeServer = currMsTime; else { uint32 serverDiffApplied = lastMoveTimeServer + clientMsDiff; lastMoveTimeServer = serverDiffApplied; } if (lastMoveTimeServer > currMsTime) lastMoveTimeServer = currMsTime; } lastMoveTimeClient = movementInfo.time; movementInfo.UpdateTime(lastMoveTimeServer); }
void WorldSession::HandleMovementOpcodes(WorldPacket& recv_data) { Opcodes opcode = recv_data.GetOpcode(); if (!sLog.HasLogFilter(LOG_FILTER_PLAYER_MOVES)) { DEBUG_LOG("WORLD: Received opcode %s (%u, 0x%X)", LookupOpcodeName(opcode), opcode, opcode); recv_data.hexlike(); } 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; } /* extract packet */ MovementInfo movementInfo; recv_data >> movementInfo; /*----------------*/ if (!VerifyMovementInfo(movementInfo)) return; // 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); if (plMover) plMover->ToCPlayer()->DetectHacks(movementInfo, opcode); /* process position-change */ HandleMoverRelocation(movementInfo); if (plMover) plMover->UpdateFallInformationIfNeed(movementInfo, opcode); WorldPacket data(opcode, recv_data.size()); data << mover->GetPackGUID(); // write guid movementInfo.Write(data); // write data mover->SendMessageToSetExcept(&data, _player); }
void WorldSession::HandleMoveKnockBackAck(WorldPacket& recv_data) { // Currently not used but maybe use later for recheck final player position // (must be at call same as into "recv_data >> x >> y >> z >> orientation;" DEBUG_LOG("CMSG_MOVE_KNOCK_BACK_ACK"); MovementInfo movementInfo; uint64 guid; recv_data >> guid; // guid recv_data >> Unused<uint32>(); // Always set to 0 recv_data >> movementInfo; if (GetPlayer()->GetGUID() != guid) return; _player->m_movementInfo = movementInfo; // Calculate timestamp uint32 move_time, mstime; mstime = getMSTime(); if(m_clientTimeDelay == 0) m_clientTimeDelay = mstime - movementInfo.time; move_time = (movementInfo.time - (mstime - m_clientTimeDelay)) + mstime + 500; movementInfo.time = move_time; // Save movement flags GetPlayer()->SetUnitMovementFlags(movementInfo.GetMovementFlags()); // Send packet WorldPacket data(MSG_MOVE_KNOCK_BACK, uint16(recv_data.size() + 4)); data.appendPackGUID(guid); /* Includes data shown below (but in different order) */ movementInfo.Write(data); /* This is sent in addition to the rest of the movement data (yes, angle+velocity are sent twice) */ data << movementInfo.j_sinAngle; data << movementInfo.j_cosAngle; data << movementInfo.j_xyspeed; data << movementInfo.j_velocity; /* Do we really need to send the data to everyone? Seemed to work better */ _player->SendMessageToSet(&data, false); }
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::HandleMoveNotActiveMoverOpcode(WorldPacket& recv_data) { DEBUG_LOG("WORLD: Received opcode CMSG_MOVE_NOT_ACTIVE_MOVER"); recv_data.hexlike(); MovementInfo mi; recv_data >> mi; if (_player->GetMover()->GetObjectGuid() == mi.GetGuid()) { sLog.outError("HandleMoveNotActiveMover: incorrect mover guid: mover is %s and should be %s instead of %s", _player->GetMover()->GetGuidStr().c_str(), _player->GetGuidStr().c_str(), mi.GetGuid().GetString().c_str()); return; } _player->m_movementInfo = mi; }
void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data) { Unit *mover = _player->GetMover(); Player *plMover = mover->ToPlayer(); uint16 opcode = recv_data.GetOpcode(); // ignore, waiting processing in WorldSession::HandleMoveWorldportAckOpcode and WorldSession::HandleMoveTeleportAck if (plMover && plMover->IsBeingTeleported()) { recv_data.rpos(recv_data.wpos()); // prevent warnings spam return; } MovementInfo movementInfo; recv_data >> movementInfo; /*----------------*/ if (recv_data.size() != recv_data.rpos()) { sLog.outLog(LOG_DEFAULT, "ERROR: MovementHandler: player %s (guid %d, account %u) sent a packet (opcode %u) that is %u bytes larger than it should be. Kicked as cheater.", _player->GetName(), _player->GetGUIDLow(), _player->GetSession()->GetAccountId(), recv_data.GetOpcode(), recv_data.size() - recv_data.rpos()); KickPlayer(); return; } if (!Looking4group::IsValidMapCoord(movementInfo.GetPos()->x, movementInfo.GetPos()->y, movementInfo.GetPos()->z, movementInfo.GetPos()->o)) return; // 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->HandleFallDamage(movementInfo); /* process position-change */ HandleMoverRelocation(movementInfo); SynchronizeMovement(movementInfo); if (plMover) plMover->UpdateFallInformationIfNeed(movementInfo, opcode); WorldPacket data(opcode, recv_data.size()); data << mover->GetPackGUID(); // write guid movementInfo.Write(data); // write data mover->BroadcastPacketExcept(&data, _player); }
void WorldSession::HandleMoveKnockBackAck(WorldPacket & recv_data) { // Currently not used but maybe use later for recheck final player position // (must be at call same as into "recv_data >> x >> y >> z >> orientation;" DEBUG_LOG("CMSG_MOVE_KNOCK_BACK_ACK"); MovementInfo movementInfo; uint64 guid; recv_data >> guid; // guid recv_data >> Unused<uint32>(); // unk recv_data >> movementInfo; if (GetPlayer()->GetGUID() != guid) return; // Save movement flags GetPlayer()->SetUnitMovementFlags(movementInfo.GetMovementFlags()); }
void ModelRenderManager::UpdatePlayer(const Player& player) { ATLASSERT(m_spPlayerModelRenderInstance != NULL); if (m_spPlayerModelRenderInstance == nullptr) return; m_modelManager.Update(player, m_spPlayerModelRenderInstance->DisplayState()); m_spPlayerModelRenderInstance->SetPosition(player.Pos(), player.ViewAngle()); MovementInfo movementInfo = player.GetMovementInfo(); movementInfo.Position(player.Pos()); m_spPlayerModelRenderInstance->UpdateMovementInfo(movementInfo); m_selectedObjectId = player.Selection(); }
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(); 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; recv_data >> movementInfo; /*----------------*/ if (!VerifyMovementInfo(movementInfo)) return; // set stand state when moving while are seated if (plMover->IsSitState() && plMover->isMovingOrTurning()) plMover->SetStandState(UNIT_STAND_STATE_STAND); // 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); /* process position-change */ HandleMoverRelocation(movementInfo); if (plMover) plMover->UpdateFallInformationIfNeed(movementInfo, opcode); WorldPacket data(opcode, recv_data.size()); data << mover->GetPackGUID(); // write guid movementInfo.Write(data); // write data mover->SendMessageToSetExcept(&data, _player); }
void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) { Opcodes opcode = recv_data.GetOpcode(); DEBUG_FILTER_LOG(LOG_FILTER_PLAYER_MOVES,"WorldSession::HandleMovementOpcodes: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode); //recv_data.hexlike(); 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; } /* extract packet */ MovementInfo movementInfo; recv_data >> movementInfo; /*----------------*/ if (!VerifyMovementInfo(movementInfo, movementInfo.GetGuid())) return; // fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map). if (opcode == CMSG_MOVE_FALL_LAND && plMover && !plMover->IsTaxiFlying()) plMover->HandleFall(movementInfo); /* process anticheat check */ GetPlayer()->GetAntiCheat()->DoAntiCheatCheck(CHECK_MOVEMENT,movementInfo, opcode); /* process position-change */ HandleMoverRelocation(movementInfo); if (plMover) plMover->UpdateFallInformationIfNeed(movementInfo, opcode); WorldPacket data(SMSG_PLAYER_MOVE, recv_data.size()); data << movementInfo; mover->SendMessageToSetExcept(&data, _player); }
void WorldSession::HandleDismissControlledVehicle(WorldPacket &recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_DISMISS_CONTROLLED_VEHICLE"); uint64 vehicleGUID = _player->GetCharmGUID(); if (!vehicleGUID) // something wrong here... { recvData.rfinish(); // prevent warnings spam return; } MovementInfo mi; mi.ReadFromPacket(recvData); mi.Sanitize(_player); _player->m_movementInfo = mi; _player->ExitVehicle(); }
void WorldSession::HandleMoverRelocation(MovementInfo& movementInfo) { //movementInfo.UpdateTime(WorldTimer::getMSTime()); Unit *mover = _player->GetMover(); if (Player *plMover = mover->ToPlayer()) { if (sWorld.getConfig(CONFIG_ENABLE_PASSIVE_ANTICHEAT) && !plMover->hasUnitState(UNIT_STAT_LOST_CONTROL | UNIT_STAT_NOT_MOVE) && !plMover->GetSession()->HasPermissions(PERM_GMT) && plMover->m_AC_timer == 0) sWorld.m_ac.execute(new ACRequest(plMover, plMover->m_movementInfo, movementInfo)); if (movementInfo.HasMovementFlag(MOVEFLAG_ONTRANSPORT)) { if (!plMover->GetTransport()) { // elevators also cause the client to send MOVEFLAG_ONTRANSPORT - just unmount if the guid can be found in the transport list for (MapManager::TransportSet::const_iterator iter = sMapMgr.m_Transports.begin(); iter != sMapMgr.m_Transports.end(); ++iter) { if ((*iter)->GetObjectGuid() == movementInfo.GetTransportGuid()) { plMover->m_transport = (*iter); (*iter)->AddPassenger(plMover); break; } } } } else if (plMover->GetTransport()) // if we were on a transport, leave { plMover->GetTransport()->RemovePassenger(plMover); plMover->SetTransport(NULL); movementInfo.ClearTransportData(); } if (movementInfo.HasMovementFlag(MOVEFLAG_SWIMMING) != plMover->IsInWater()) { // now client not include swimming flag in case jumping under water plMover->SetInWater(!plMover->IsInWater() || plMover->GetTerrain()->IsInWater(movementInfo.GetPos()->x, movementInfo.GetPos()->y, movementInfo.GetPos()->z)); } } mover->m_movementInfo = movementInfo; mover->SetPosition(movementInfo.GetPos()->x, movementInfo.GetPos()->y, movementInfo.GetPos()->z, movementInfo.GetPos()->o); if (mover->GetObjectGuid().IsPlayer()) mover->ToPlayer()->HandleFallUnderMap(movementInfo.GetPos()->z); }
bool WorldSession::VerifyMovementInfo(MovementInfo const& movementInfo, ObjectGuid const& guid) const { // ignore wrong guid (player attempt cheating own session for not own guid possible...) if (guid != _player->GetMover()->GetObjectGuid()) return false; if (!MaNGOS::IsValidMapCoord(movementInfo.GetPos()->x, movementInfo.GetPos()->y, movementInfo.GetPos()->z, movementInfo.GetPos()->o)) return false; if (movementInfo.GetTransportGuid()) { if( !MaNGOS::IsValidMapCoord(movementInfo.GetPos()->x + movementInfo.GetTransportPos()->x, movementInfo.GetPos()->y + movementInfo.GetTransportPos()->y, movementInfo.GetPos()->z + movementInfo.GetTransportPos()->z, movementInfo.GetPos()->o + movementInfo.GetTransportPos()->o) ) { return false; } } return true; }