diff --git a/pumpkin-protocol/fuzz/Cargo.lock b/pumpkin-protocol/fuzz/Cargo.lock index 45d3c7294..d8ab7c8c2 100644 --- a/pumpkin-protocol/fuzz/Cargo.lock +++ b/pumpkin-protocol/fuzz/Cargo.lock @@ -33,9 +33,9 @@ checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "async-compression" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" +checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" dependencies = [ "compression-codecs", "compression-core", @@ -168,9 +168,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" dependencies = [ "compression-core", "flate2", @@ -178,9 +178,9 @@ dependencies = [ [[package]] name = "compression-core" -version = "0.4.31" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" [[package]] name = "const-oid" @@ -665,12 +665,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hkdf" version = "0.12.4" @@ -876,16 +870,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "once_cell" version = "1.21.4" @@ -1049,7 +1033,6 @@ dependencies = [ name = "pumpkin-codecs" version = "0.1.0-dev+26.1" dependencies = [ - "dashmap", "either", "serde_json", "tracing", @@ -1099,6 +1082,7 @@ dependencies = [ "serde", "thiserror", "tracing", + "uuid", ] [[package]] @@ -1172,7 +1156,6 @@ dependencies = [ "futures", "itertools", "lz4-java-wrc", - "num_cpus", "pumpkin-config", "pumpkin-data", "pumpkin-nbt", @@ -1189,6 +1172,7 @@ dependencies = [ "tokio-util", "tracing", "uuid", + "xxhash-rust", ] [[package]] @@ -1909,6 +1893,12 @@ dependencies = [ "wasmparser", ] +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + [[package]] name = "zeroize" version = "1.8.2" diff --git a/pumpkin-protocol/src/bedrock/client/raknet/incompatible_protocol.rs b/pumpkin-protocol/src/bedrock/client/raknet/incompatible_protocol.rs new file mode 100644 index 000000000..6c1f3503c --- /dev/null +++ b/pumpkin-protocol/src/bedrock/client/raknet/incompatible_protocol.rs @@ -0,0 +1,21 @@ +use crate::{bedrock::RAKNET_MAGIC, serial::PacketWrite}; +use pumpkin_macros::packet; + +#[derive(PacketWrite)] +#[packet(0x19)] +pub struct CIncompatibleProtocolVersion { + protocol_version: u8, + magic: [u8; 16], + server_guid: u64, +} + +impl CIncompatibleProtocolVersion { + #[must_use] + pub const fn new(protocol_version: u8, server_guid: u64) -> Self { + Self { + protocol_version, + magic: RAKNET_MAGIC, + server_guid, + } + } +} diff --git a/pumpkin-protocol/src/bedrock/client/raknet/mod.rs b/pumpkin-protocol/src/bedrock/client/raknet/mod.rs index 6db4677e3..c75e08f73 100644 --- a/pumpkin-protocol/src/bedrock/client/raknet/mod.rs +++ b/pumpkin-protocol/src/bedrock/client/raknet/mod.rs @@ -1,3 +1,4 @@ pub mod connection; +pub mod incompatible_protocol; pub mod open_connection; pub mod unconnected_pong; diff --git a/pumpkin/src/net/bedrock/open_connection.rs b/pumpkin/src/net/bedrock/open_connection.rs index f22225d18..108fa6a13 100644 --- a/pumpkin/src/net/bedrock/open_connection.rs +++ b/pumpkin/src/net/bedrock/open_connection.rs @@ -1,9 +1,13 @@ use std::net::SocketAddr; use pumpkin_protocol::bedrock::{ - client::raknet::open_connection::{COpenConnectionReply1, COpenConnectionReply2}, + client::raknet::{ + incompatible_protocol::CIncompatibleProtocolVersion, + open_connection::{COpenConnectionReply1, COpenConnectionReply2}, + }, server::raknet::open_connection::{SOpenConnectionRequest1, SOpenConnectionRequest2}, }; +use pumpkin_world::CURRENT_BEDROCK_MC_PROTOCOL; use tokio::net::UdpSocket; use crate::{net::bedrock::BedrockClient, server::Server}; @@ -11,10 +15,23 @@ use crate::{net::bedrock::BedrockClient, server::Server}; impl BedrockClient { pub async fn handle_open_connection_1( server: &Server, - _packet: SOpenConnectionRequest1, + packet: SOpenConnectionRequest1, addr: SocketAddr, socket: &UdpSocket, ) { + if packet.protocol_version != CURRENT_BEDROCK_MC_PROTOCOL as u8 { + Self::send_offline_packet( + &CIncompatibleProtocolVersion::new( + CURRENT_BEDROCK_MC_PROTOCOL as u8, + server.server_guid, + ), + addr, + socket, + ) + .await; + return; + } + Self::send_offline_packet( &COpenConnectionReply1::new(server.server_guid, false, 1400), addr,