fix: bedrock bitset

fixes the input packet/sneaking
This commit is contained in:
Alexander Medvedev 2026-04-30 21:40:50 +02:00
parent 081e1d7e64
commit e035a5fb58
2 changed files with 17 additions and 10 deletions

View File

@ -36,13 +36,13 @@ impl<const N: usize> PacketRead for Bitset<N> {
fn read<R: Read>(reader: &mut R) -> Result<Self, Error> {
let mut bitset = Self::default();
for i in 0..N.div_ceil(8) {
for i in 0..N.div_ceil(7) {
let byte = u8::read(reader)?;
bitset.bits |= (u128::from(byte) & 0x7F) << (i * 7);
if byte & 0x80 == 0 {
return Ok(bitset);
}
}
Err(Error::new(ErrorKind::InvalidData, ""))
Err(Error::new(ErrorKind::InvalidData, "Bitset too large"))
}
}

View File

@ -512,34 +512,41 @@ impl BedrockClient {
server: &Arc<Server>,
packet: RawPacket,
) -> Result<(), Error> {
let packet_id = packet.id;
let payload = &mut Cursor::new(&packet.payload);
match packet.id {
let result = match packet.id {
SRequestNetworkSettings::PACKET_ID => {
self.handle_request_network_settings(SRequestNetworkSettings::read(payload)?)
.await;
Ok(())
}
SLogin::PACKET_ID => {
self.handle_login(SLogin::read(payload)?, server).await;
Ok(())
}
SClientCacheStatus::PACKET_ID => {
// TODO
Ok(())
}
SResourcePackResponse::PACKET_ID => {
self.handle_resource_pack_response(SResourcePackResponse::read(payload)?, server)
.await;
Ok(())
}
_ => {
let player_lock = self.player.lock().await;
if let Some(player) = player_lock.as_ref() {
return self.handle_play_packet(player, server, packet).await;
self.handle_play_packet(player, server, packet).await
} else {
debug!(
"Received game packet {} before player was initialized",
packet.id
);
Ok(())
}
debug!(
"Received game packet {} before player was initialized",
packet.id
);
}
}
Ok(())
};
result.map_err(|e| Error::new(e.kind(), format!("Game packet {packet_id}: {e}")))
}
pub async fn handle_play_packet(