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::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::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::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 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); }