From 253ad6f3368c54f28dd7bb15e934442376ac1411 Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Mon, 17 Aug 2026 19:06:18 +0200 Subject: [PATCH] fix: build --- .github/workflows/rust.yml | 6 +- Cargo.lock | 701 +++++++++++++++++-------------------- Cargo.toml | 6 + README.md | 18 +- src/client.rs | 685 ++++++++++++++++++++++++++++-------- src/main.rs | 10 +- 6 files changed, 895 insertions(+), 531 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 0d9a50d..a817697 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -17,7 +17,7 @@ jobs: toolchain: - stable steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - uses: Swatinem/rust-cache@v2 - run: cargo fmt --check @@ -29,7 +29,7 @@ jobs: toolchain: - stable steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - uses: Swatinem/rust-cache@v2 - run: cargo clippy --all-targets --all-features @@ -42,7 +42,7 @@ jobs: toolchain: - stable steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - uses: Swatinem/rust-cache@v2 - run: cargo test --verbose diff --git a/Cargo.lock b/Cargo.lock index 18ababf..f1deccc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,13 +10,13 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aes" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fc76eaeac4c9164506c466d4ffdd8ec9d0c5bf57ee97177c4d8eceb3a0e138" +checksum = "f8eb277bec05f56a0e0591f155a484cbd0f4f07ff2905051a48c72f004f7ed58" dependencies = [ "cipher", "cpubits", - "cpufeatures 0.3.0", + "cpufeatures", ] [[package]] @@ -71,18 +71,18 @@ dependencies = [ [[package]] name = "arc-swap" -version = "1.9.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" dependencies = [ "rustversion", ] [[package]] name = "async-compression" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" +checksum = "3976abdc8fe7d1133d43d304afd42abdf5bc3e1319d263d223bde07b5efc4be8" dependencies = [ "compression-codecs", "compression-core", @@ -96,12 +96,6 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - [[package]] name = "base16ct" version = "1.0.0" @@ -110,9 +104,9 @@ checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" [[package]] name = "base64" -version = "0.22.1" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" [[package]] name = "base64ct" @@ -122,9 +116,9 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bitflags" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "block-buffer" @@ -154,7 +148,8 @@ dependencies = [ "pumpkin-data", "pumpkin-protocol", "pumpkin-util", - "rand 0.10.1 (git+https://github.com/rust-random/rand)", + "rand 0.10.2 (git+https://github.com/rust-random/rand)", + "rsa", "simple_logger", "tokio", "uuid", @@ -168,15 +163,15 @@ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytes" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cc" -version = "1.2.65" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +checksum = "509591b7bcd67f4ef775afad7662703b4935daaa6ec0e5605cfb1090b32a2b6d" dependencies = [ "find-msvc-tools", "shlex", @@ -210,8 +205,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", - "rand_core 0.10.1", + "cpufeatures", + "rand_core", ] [[package]] @@ -226,9 +221,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.1" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" dependencies = [ "clap_builder", "clap_derive", @@ -236,9 +231,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.0" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" dependencies = [ "anstream", "anstyle", @@ -248,14 +243,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.1" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -301,12 +296,6 @@ version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - [[package]] name = "const-oid" version = "0.10.2" @@ -319,15 +308,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - [[package]] name = "cpufeatures" version = "0.3.0" @@ -371,18 +351,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -390,53 +370,41 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crossfire" -version = "3.1.16" +version = "3.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d8c4de3db833e7ef74050bae09d5f3fa8f9d1507d3c2689c6e8c50b71208b18" +checksum = "111ce8f7abfbac38b4bc4f32a3a2dda1a8034b873c90c7899f302cc9dbbc05ec" dependencies = [ "crossbeam-utils", - "embed-collections", "futures-core", "parking_lot", + "pointers", "smallvec", ] -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.7.5" @@ -445,17 +413,20 @@ checksum = "1a52aa3fcda4e6302a9f48734f234d35d4721b96f8fe07d073f07ce9df4f0271" dependencies = [ "cpubits", "ctutils", + "getrandom 0.4.3", + "hybrid-array", "num-traits", - "rand_core 0.10.1", + "rand_core", "serdect", + "subtle", "zeroize", ] [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -467,7 +438,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ + "getrandom 0.4.3", "hybrid-array", + "rand_core", ] [[package]] @@ -476,8 +449,8 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3633a51a39c69ebbaa4feaa694bd83d241e4093901c84a0963b19d9bb3f0cf8f" dependencies = [ - "crypto-bigint 0.7.5", - "rand_core 0.10.1", + "crypto-bigint", + "rand_core", ] [[package]] @@ -487,6 +460,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" dependencies = [ "cmov", + "subtle", ] [[package]] @@ -505,21 +479,11 @@ dependencies = [ [[package]] name = "der" -version = "0.7.10" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +checksum = "a69dedd701da44b0536442edf09c81a64b0ab97a7a4a5e3d1971f00027cbc63d" dependencies = [ - "const-oid 0.9.6", - "zeroize", -] - -[[package]] -name = "der" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" -dependencies = [ - "const-oid 0.10.2", + "const-oid", "pem-rfc7468", "zeroize", ] @@ -537,9 +501,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", - "const-oid 0.9.6", - "crypto-common 0.1.6", - "subtle", + "crypto-common 0.1.7", ] [[package]] @@ -549,65 +511,50 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.1", - "const-oid 0.10.2", + "const-oid", "crypto-common 0.2.2", + "ctutils", ] [[package]] name = "ecdsa" -version = "0.16.9" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +checksum = "c0681a4fc24c767085329728d8dfba959af91228aa4610cca4f8ce317ba46ae0" dependencies = [ - "der 0.7.10", - "digest 0.10.7", + "der", + "digest 0.11.3", "elliptic-curve", "rfc6979", - "signature 2.2.0", - "spki 0.7.3", -] - -[[package]] -name = "either" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.5", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sec1", - "subtle", + "signature", + "spki", "zeroize", ] [[package]] -name = "embed-collections" -version = "0.12.4" +name = "either" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49c327886cdc0e7eda24cd0827f195db19a5f941425914bc6db76c79c64bc21" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" [[package]] -name = "enum_dispatch" -version = "0.3.13" +name = "elliptic-curve" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" +checksum = "9d65aa39b3a5c1c9c1b745c9a019234bb7a21b77abcb4f4d266d706e2d577d65" dependencies = [ - "once_cell", - "proc-macro2", - "quote", - "syn", + "base16ct", + "crypto-bigint", + "crypto-common 0.2.2", + "digest 0.11.3", + "ff", + "group", + "hybrid-array", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", ] [[package]] @@ -622,25 +569,31 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "ff" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +checksum = "a1f686ab92a9fb0eaf188f6c6c87b89490baa6fdb0db4544ba4dc47f7942489f" dependencies = [ - "rand_core 0.6.4", + "rand_core", "subtle", ] [[package]] -name = "find-msvc-tools" -version = "0.1.9" +name = "fiat-crypto" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" + +[[package]] +name = "find-msvc-tools" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" [[package]] name = "flate2" @@ -654,9 +607,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" dependencies = [ "futures-channel", "futures-core", @@ -669,9 +622,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", "futures-sink", @@ -679,15 +632,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-executor" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" dependencies = [ "futures-core", "futures-task", @@ -696,38 +649,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-channel", "futures-core", @@ -742,13 +695,12 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", - "zeroize", ] [[package]] @@ -771,17 +723,17 @@ dependencies = [ "cfg-if", "libc", "r-efi", - "rand_core 0.10.1", + "rand_core", ] [[package]] name = "group" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +checksum = "7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4" dependencies = [ "ff", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -799,18 +751,18 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hmac" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" dependencies = [ - "digest 0.10.7", + "digest 0.11.3", ] [[package]] name = "http" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ "bytes", "itoa", @@ -824,11 +776,13 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hybrid-array" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" dependencies = [ + "subtle", "typenum", + "zeroize", ] [[package]] @@ -863,9 +817,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.103" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" dependencies = [ "cfg-if", "futures-util", @@ -874,9 +828,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "lock_api" @@ -921,15 +875,15 @@ dependencies = [ [[package]] name = "md5" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0" +checksum = "7ebb8d8732c6a6df3d8f032a82911cfc747e00efb95cc46e8d0acd5b5b88570c" [[package]] name = "memchr" -version = "2.8.2" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "miniz_oxide" @@ -943,9 +897,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "wasi", @@ -960,13 +914,13 @@ checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-derive" -version = "0.4.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +checksum = "e4e98dc3b890f6c23a0f9d3d491a2823d0dea0fa656302a13dd225fa924112a8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -1001,14 +955,16 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "p384" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +checksum = "d17b851e6b3e378ab4ecb07fa2ed23f4d15f075735f8fec9fa1e7bdce5f8301f" dependencies = [ "ecdsa", "elliptic-curve", + "fiat-crypto", + "primefield", "primeorder", - "sha2 0.10.9", + "sha2", ] [[package]] @@ -1080,7 +1036,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1104,18 +1060,8 @@ version = "0.8.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "986d2e952779af96ea048f160fd9194e1751b4faea78bcf3ceb456efe008088e" dependencies = [ - "der 0.8.0", - "spki 0.8.0", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der 0.7.10", - "spki 0.7.3", + "der", + "spki", ] [[package]] @@ -1124,10 +1070,16 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" dependencies = [ - "der 0.8.0", - "spki 0.8.0", + "der", + "spki", ] +[[package]] +name = "pointers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dcdc93847ad24990939cce6e1804361e903efcb5f99daa5abd87943a9d6d7ba" + [[package]] name = "powerfmt" version = "0.2.0" @@ -1135,12 +1087,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] -name = "primeorder" -version = "0.13.6" +name = "primefield" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +checksum = "c555a6e4eb7d4e158fcb028c835c3b8642206ddc279b5c6b202ef9a8bdb592f4" +dependencies = [ + "crypto-bigint", + "crypto-common 0.2.2", + "ff", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "primeorder" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c9f42978c78a00e3d68f69fc03e57a234debae69da4020a4fb588fcdcd07b06" dependencies = [ "elliptic-curve", + "once_cell", + "primefield", + "serdect", + "wnaf", ] [[package]] @@ -1166,27 +1136,24 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] [[package]] name = "pumpkin-codecs" -version = "0.1.0-dev+26.2" -source = "git+https://github.com/Pumpkin-MC/Pumpkin#86e41e1ebb0fd384183a2726e225a5ad65cb699a" +version = "0.1.0-dev+26.2-26.40" dependencies = [ - "either", "serde_json", "tracing", ] [[package]] name = "pumpkin-config" -version = "0.1.0-dev+26.2" -source = "git+https://github.com/Pumpkin-MC/Pumpkin#86e41e1ebb0fd384183a2726e225a5ad65cb699a" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "pumpkin-util", "serde", @@ -1197,46 +1164,44 @@ dependencies = [ [[package]] name = "pumpkin-data" -version = "0.1.0-dev+26.2" -source = "git+https://github.com/Pumpkin-MC/Pumpkin#86e41e1ebb0fd384183a2726e225a5ad65cb699a" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "crc-fast", "phf", "pumpkin-nbt", "pumpkin-util", - "rand 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde", ] [[package]] name = "pumpkin-macros" -version = "0.1.0-dev+26.2" -source = "git+https://github.com/Pumpkin-MC/Pumpkin#86e41e1ebb0fd384183a2726e225a5ad65cb699a" +version = "0.1.0-dev+26.2-26.40" dependencies = [ + "heck", "proc-macro-error2", + "proc-macro2", "pumpkin-data", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "pumpkin-nbt" -version = "0.1.0-dev+26.2" -source = "git+https://github.com/Pumpkin-MC/Pumpkin#86e41e1ebb0fd384183a2726e225a5ad65cb699a" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "bytes", "cesu8", "flate2", "pumpkin-codecs", - "serde", "thiserror", "tracing", + "uuid", ] [[package]] name = "pumpkin-protocol" -version = "0.1.0-dev+26.2" -source = "git+https://github.com/Pumpkin-MC/Pumpkin#86e41e1ebb0fd384183a2726e225a5ad65cb699a" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "aes", "async-compression", @@ -1254,19 +1219,18 @@ dependencies = [ "thiserror", "tokio", "uuid", + "xxhash-rust", ] [[package]] name = "pumpkin-util" -version = "0.1.0-dev+26.2" -source = "git+https://github.com/Pumpkin-MC/Pumpkin#86e41e1ebb0fd384183a2726e225a5ad65cb699a" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "base64", "bytes", "colored", - "crypto-bigint 0.7.5", + "crypto-bigint", "ecdsa", - "enum_dispatch", "md5", "num-derive", "num-traits", @@ -1276,7 +1240,7 @@ dependencies = [ "rsa", "serde", "serde_json", - "sha2 0.11.0", + "sha2", "thiserror", "tokio", "ureq", @@ -1285,8 +1249,7 @@ dependencies = [ [[package]] name = "pumpkin-world" -version = "0.1.0-dev+26.2" -source = "git+https://github.com/Pumpkin-MC/Pumpkin#86e41e1ebb0fd384183a2726e225a5ad65cb699a" +version = "0.1.0-dev+26.2-26.40" dependencies = [ "arc-swap", "bitflags", @@ -1294,7 +1257,6 @@ dependencies = [ "crossbeam", "crossfire", "dashmap", - "enum_dispatch", "flate2", "futures", "itertools", @@ -1303,12 +1265,13 @@ dependencies = [ "pumpkin-data", "pumpkin-nbt", "pumpkin-util", - "rand 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon", "rustc-hash", "ruzstd", "serde", - "sha2 0.11.0", + "serde_json", + "sha2", "slotmap", "thiserror", "tokio", @@ -1320,9 +1283,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.46" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -1335,32 +1298,23 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ "chacha20", "getrandom 0.4.3", - "rand_core 0.10.1", + "rand_core", ] [[package]] name = "rand" -version = "0.10.1" -source = "git+https://github.com/rust-random/rand#bea8620204c7aeecdefc132b5cb0dec8134add4b" +version = "0.10.2" +source = "git+https://github.com/rust-random/rand#bb1262f703ca04e4ce56be78e1dc4e204cd6a998" dependencies = [ "chacha20", "getrandom 0.4.3", - "rand_core 0.10.1", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", + "rand_core", ] [[package]] @@ -1400,12 +1354,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +checksum = "b4a459cddafb3fe76b31fd8f1108007566c40301feb64dc7b54656eb7388172b" dependencies = [ + "crypto-bigint", "hmac", - "subtle", ] [[package]] @@ -1428,29 +1382,29 @@ version = "0.10.0-rc.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30b2aa4ba0d89f73d1e332df05be0eeab8840351c36ca5654341dfdb57bb3caf" dependencies = [ - "const-oid 0.10.2", - "crypto-bigint 0.7.5", + "const-oid", + "crypto-bigint", "crypto-primes", "digest 0.11.3", "pkcs1", - "pkcs8 0.11.0", - "rand_core 0.10.1", - "signature 3.0.0", - "spki 0.8.0", + "pkcs8", + "rand_core", + "signature", + "spki", "zeroize", ] [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustls" -version = "0.23.41" +version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ "log", "once_cell", @@ -1463,18 +1417,18 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.103.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "0527518605e68109d875e248ea259b6758801cf165e4b2c2733ae3b51f12535a" dependencies = [ "ring", "rustls-pki-types", @@ -1483,15 +1437,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "ruzstd" -version = "0.8.3" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c1c839d570d835527c9a5e4db7cb2198683a988cb9d7293fc8674e6bd58fc8" +checksum = "a252f5e20f038fe7b4ea53e073e65398d652c864cc162fc77c56c2f13717b888" [[package]] name = "scopeguard" @@ -1501,23 +1455,23 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sec1" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +checksum = "d56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4d" dependencies = [ - "base16ct 0.2.0", - "der 0.7.10", - "generic-array", - "pkcs8 0.10.2", + "base16ct", + "ctutils", + "der", + "hybrid-array", "subtle", "zeroize", ] [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -1525,29 +1479,29 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", @@ -1571,21 +1525,10 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" dependencies = [ - "base16ct 1.0.0", + "base16ct", "serde", ] -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", -] - [[package]] name = "sha2" version = "0.11.0" @@ -1593,7 +1536,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", + "cpufeatures", "digest 0.11.3", ] @@ -1613,16 +1556,6 @@ dependencies = [ "libc", ] -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - [[package]] name = "signature" version = "3.0.0" @@ -1630,14 +1563,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5" dependencies = [ "digest 0.11.3", - "rand_core 0.10.1", + "rand_core", ] [[package]] name = "simd-adler32" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" [[package]] name = "simple_logger" @@ -1680,9 +1613,9 @@ checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "socket2" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -1690,19 +1623,9 @@ dependencies = [ [[package]] name = "spin" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der 0.7.10", -] +checksum = "023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3" [[package]] name = "spki" @@ -1711,7 +1634,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6f" dependencies = [ "base64ct", - "der 0.8.0", + "der", ] [[package]] @@ -1734,9 +1657,20 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.118" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -1745,29 +1679,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "time" -version = "0.3.51" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", "libc", @@ -1787,9 +1721,9 @@ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.30" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -1797,9 +1731,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.52.3" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -1813,20 +1747,20 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", @@ -1838,9 +1772,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.1.2+spec-1.1.0" +version = "1.1.4+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" dependencies = [ "serde_core", "serde_spanned", @@ -1861,18 +1795,18 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.1.2+spec-1.1.0" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.1.1+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "tracing" @@ -1893,7 +1827,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1935,9 +1869,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" +checksum = "972d7902c8735f2695410b8aed7df6ed12a47394aa1c8d7af49f0497b731a94d" dependencies = [ "base64", "log", @@ -1951,9 +1885,9 @@ dependencies = [ [[package]] name = "ureq-proto" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" +checksum = "da5f78b09e6941e1a0f2e30e695e4b120377b54d5e0aec11b594bb57b3971613" dependencies = [ "base64", "http", @@ -1975,9 +1909,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.4" +version = "1.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53" +checksum = "2cefc03fd367c0c6d4305de1b312cf00248c4114f4a0418ce6a6af769e3b0bd9" dependencies = [ "getrandom 0.4.3", "js-sys", @@ -2000,9 +1934,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasm-bindgen" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" dependencies = [ "cfg-if", "once_cell", @@ -2013,9 +1947,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2023,31 +1957,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.126" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" dependencies = [ "unicode-ident", ] [[package]] name = "webpki-roots" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" dependencies = [ "rustls-pki-types", ] @@ -2142,15 +2076,26 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" + +[[package]] +name = "wnaf" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab12e7090f27e2ffd9322651492942d50c2926094af30601e1964337db39daf1" +dependencies = [ + "ff", + "group", + "hybrid-array", +] [[package]] name = "xxhash-rust" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" +checksum = "aee1b19627c7c60102ab80d3a9cbe18de90bfe03bfa6c3715447681f0e8c8af6" [[package]] name = "zeroize" @@ -2160,6 +2105,6 @@ checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml index df1b738..3609aa7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,3 +22,9 @@ pumpkin-data = { git = "https://github.com/Pumpkin-MC/Pumpkin", package = "pumpk crossbeam = "0.8.4" uuid = "1.23.4" rand = { git = "https://github.com/rust-random/rand"} +rsa = { version = "=0.10.0-rc.18", default-features = false, features = ["std", "encoding"] } + +[patch."https://github.com/Pumpkin-MC/Pumpkin"] +pumpkin-protocol = { path = "../Pumpkin/crates/pumpkin-protocol" } +pumpkin-util = { path = "../Pumpkin/crates/pumpkin-util" } +pumpkin-data = { path = "../Pumpkin/crates/pumpkin-data" } diff --git a/README.md b/README.md index fcca070..4cf9af6 100644 --- a/README.md +++ b/README.md @@ -46,15 +46,21 @@ Here's a detailed breakdown of all available command-line arguments: - **`--spam_message_delay_min ` (Optional, Default: `150`):** - The minimal delay (in milliseconds) between spam message. - Example: `--spam_message_delay_min 100` (100 milliseconds delay) -- **`--spam_message_delay_max ` (Optional, Default: `350`):** +- **`--spam_message_delay_max ` (Optional, Default: `250`):** - The maximal delay (in milliseconds) between spam message. - - Example: `--spam_message_delay_max 100` (100 milliseconds delay) -- **`--spam_message_delay_max ` (Optional, Default: `350`):** - - The maximal delay (in milliseconds) between spam message. - - Example: `--spam_message_delay_max 100` (100 milliseconds delay) + - Example: `--spam_message_delay_max 250` (250 milliseconds delay) - **`--enable_rotation ` (Optional, Default: `true`):** - Enable random head rotations. - Example: `--enable_rotation true` - **`--enable_swing ` (Optional, Default: `true`):** - Enable random arm swings. - - Example: `--enable_swing true` \ No newline at end of file + - Example: `--enable_swing true` +- **`--enable_movement ` (Optional, Default: `true`):** + - Enable random bot movement and walking. + - Example: `--enable_movement true` +- **`--enable_jumping ` (Optional, Default: `true`):** + - Enable jumping while moving. + - Example: `--enable_jumping true` +- **`--enable_physics ` (Optional, Default: `true`):** + - Enable physics simulation (gravity, friction, inertia, server knockback). + - Example: `--enable_physics true` \ No newline at end of file diff --git a/src/client.rs b/src/client.rs index 384b750..a296026 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,28 +1,33 @@ use crossbeam::atomic::AtomicCell; +use pumpkin_protocol::codec::lp_vector_3d::LpVector3d; use pumpkin_protocol::codec::var_int::VarInt; use pumpkin_protocol::java::client::config::{CConfigDisconnect, CFinishConfig}; use pumpkin_protocol::java::client::login::{ CEncryptionRequest, CLoginDisconnect, CLoginSuccess, CSetCompression, }; -use pumpkin_protocol::java::client::play::{CKeepAlive, CLogin, CPlayDisconnect, CPlayerPosition}; +use pumpkin_protocol::java::client::play::{ + CEntityVelocity, CKeepAlive, CLogin, CPlayDisconnect, CPlayerPosition, +}; use pumpkin_protocol::java::packet_decoder::TCPNetworkDecoder; use pumpkin_protocol::java::packet_encoder::TCPNetworkEncoder; use pumpkin_protocol::java::server::config::{SAcknowledgeFinishConfig, SKnownPacks}; use pumpkin_protocol::java::server::handshake::SHandShake; -use pumpkin_protocol::java::server::login::{SLoginAcknowledged, SLoginStart}; +use pumpkin_protocol::java::server::login::{SEncryptionResponse, SLoginAcknowledged, SLoginStart}; use pumpkin_protocol::java::server::play::{ - SChatMessage, SConfirmTeleport, SKeepAlive, SPlayerLoaded, SPlayerPosition, SPlayerRotation, - SSwingArm, + FLAG_ON_GROUND, SChatMessage, SConfirmTeleport, SKeepAlive, SPlayerLoaded, SPlayerPosition, + SPlayerPositionRotation, SPlayerRotation, SSetPlayerGround, SSwingArm, }; use pumpkin_protocol::packet::MultiVersionJavaPacket; use pumpkin_protocol::ser::NetworkWriteExt; -use pumpkin_protocol::ser::{ReadingError, WritingError}; +use pumpkin_protocol::ser::{NetworkReadExt, ReadingError, WritingError}; use pumpkin_protocol::{ ClientPacket, CompressionLevel, CompressionThreshold, ConnectionState, PacketDecodeError, RawPacket, ServerPacket, }; use pumpkin_util::math::vector3::Vector3; use pumpkin_util::version::JavaMinecraftVersion; +use rsa::pkcs8::DecodePublicKey; +use rsa::{Pkcs1v15Encrypt, RsaPublicKey}; use std::io::Write; use std::net::SocketAddr; use std::sync::atomic::{AtomicI32, AtomicU32, Ordering}; @@ -44,7 +49,6 @@ use crate::Args; pub const VERSION: JavaMinecraftVersion = JavaMinecraftVersion::V_26_2; /// Everything which makes a Connection with our Server is a `Client`. -#[expect(dead_code)] pub struct Client { /// The current connection state of the client (e.g., Handshaking, Status, Play). pub connection_state: AtomicCell, @@ -62,33 +66,42 @@ pub struct Client { message_count: AtomicU32, is_loaded: AtomicBool, swing_cooldown: AtomicU32, - // Position + + // Position & Physics current_x: AtomicCell, current_y: AtomicCell, current_z: AtomicCell, + ground_y: AtomicCell, + on_ground: AtomicBool, velocity_x: AtomicCell, velocity_y: AtomicCell, velocity_z: AtomicCell, - start_x: AtomicCell, - start_z: AtomicCell, - target_x: AtomicCell, - target_z: AtomicCell, + // Last sent position / rotation for delta synchronization + last_sent_x: AtomicCell, + last_sent_y: AtomicCell, + last_sent_z: AtomicCell, + last_sent_yaw: AtomicCell, + last_sent_pitch: AtomicCell, + last_sent_on_ground: AtomicBool, + ticks_since_last_sync: AtomicU32, - move_progress: AtomicCell, + // Movement AI + is_walking: AtomicBool, + move_ticks: AtomicU32, move_cooldown: AtomicU32, + move_dir_x: AtomicCell, + move_dir_z: AtomicCell, + jump_cooldown: AtomicU32, // Rotation current_yaw: AtomicCell, current_pitch: AtomicCell, - // Starting point of the movement start_yaw: AtomicCell, start_pitch: AtomicCell, - // Goal point target_yaw: AtomicCell, target_pitch: AtomicCell, - // Progress: 0.0 (start) to 1.0 (end) rotation_progress: AtomicCell, rotation_cooldown: AtomicU32, } @@ -105,34 +118,50 @@ impl Client { connection_reader, )))), entity_id: AtomicI32::new(0), - velocity_x: AtomicCell::new(0.0), - velocity_y: AtomicCell::new(0.0), - velocity_z: AtomicCell::new(0.0), - closed: AtomicBool::new(false), - swing_cooldown: AtomicU32::new(0), + is_loaded: AtomicBool::new(false), close_interrupt: Arc::new(Notify::new()), + message_spam_cooldown: AtomicU32::new(1), message_count: AtomicU32::new(0), - is_loaded: AtomicBool::new(false), - rotation_cooldown: AtomicU32::new(0), - rotation_progress: AtomicCell::new(1.0), + swing_cooldown: AtomicU32::new(0), + + // Rotation current_yaw: AtomicCell::new(0.0), current_pitch: AtomicCell::new(0.0), start_yaw: AtomicCell::new(0.0), start_pitch: AtomicCell::new(0.0), target_yaw: AtomicCell::new(0.0), target_pitch: AtomicCell::new(0.0), + rotation_progress: AtomicCell::new(1.0), + rotation_cooldown: AtomicU32::new(0), + // Position & Physics current_x: AtomicCell::new(0.0), current_y: AtomicCell::new(0.0), current_z: AtomicCell::new(0.0), - start_x: AtomicCell::new(0.0), - start_z: AtomicCell::new(0.0), - target_x: AtomicCell::new(0.0), - target_z: AtomicCell::new(0.0), - move_progress: AtomicCell::new(1.0), + ground_y: AtomicCell::new(0.0), + on_ground: AtomicBool::new(true), + + velocity_x: AtomicCell::new(0.0), + velocity_y: AtomicCell::new(0.0), + velocity_z: AtomicCell::new(0.0), + + last_sent_x: AtomicCell::new(0.0), + last_sent_y: AtomicCell::new(0.0), + last_sent_z: AtomicCell::new(0.0), + last_sent_yaw: AtomicCell::new(0.0), + last_sent_pitch: AtomicCell::new(0.0), + last_sent_on_ground: AtomicBool::new(true), + ticks_since_last_sync: AtomicU32::new(0), + + // Movement AI + is_walking: AtomicBool::new(false), + move_ticks: AtomicU32::new(0), move_cooldown: AtomicU32::new(0), + move_dir_x: AtomicCell::new(0.0), + move_dir_z: AtomicCell::new(0.0), + jump_cooldown: AtomicU32::new(0), } } @@ -160,6 +189,16 @@ impl Client { } } + /// Enables AES-128 CFB8 encryption for the connection using the shared secret. + pub async fn set_encryption(&self, key: &[u8; 16]) { + if let Err(err) = self.network_reader.lock().await.set_encryption(key) { + log::error!("Failed to set decoder encryption: {err}"); + } + if let Err(err) = self.network_writer.lock().await.set_encryption(key) { + log::error!("Failed to set encoder encryption: {err}"); + } + } + pub async fn await_close_interrupt(&self) { self.close_interrupt.notified().await; } @@ -203,7 +242,6 @@ impl Client { true } - // TODO: make this less ugly ig pub async fn tick(&self, args: &Args) { if self.connection_state.load() != ConnectionState::Play { return; @@ -228,17 +266,93 @@ impl Client { }, ); if let Ok(0) = result { - self.send_message(spam_message.clone()).await; + self.send_message(spam_message).await; } } + if args.enable_swing { + self.tick_swing().await; + } + + if args.enable_movement { + self.tick_movement_ai(args).await; + } + if args.enable_rotation { self.tick_rotation().await; } - if args.enable_swing { - self.tick_swing().await; + + if args.enable_physics { + self.tick_physics().await; + } + + self.sync_movement().await; + } + + async fn tick_movement_ai(&self, args: &Args) { + let is_walking = self.is_walking.load(Ordering::Relaxed); + let on_ground = self.on_ground.load(Ordering::Relaxed); + + if is_walking { + let ticks = self.move_ticks.fetch_sub(1, Ordering::Relaxed); + let dir_x = self.move_dir_x.load(); + let dir_z = self.move_dir_z.load(); + + // Walking acceleration (stronger on ground, slight in air) + let accel = if on_ground { 0.08 } else { 0.02 }; + let vx = self.velocity_x.load() + dir_x * accel; + let vz = self.velocity_z.load() + dir_z * accel; + self.velocity_x.store(vx); + self.velocity_z.store(vz); + + // Jumping behavior while moving + if args.enable_jumping { + let jump_cd = self.jump_cooldown.load(Ordering::Relaxed); + if jump_cd == 0 && on_ground && rand::random_bool(0.04) { + self.velocity_y.store(0.42); + self.on_ground.store(false, Ordering::Relaxed); + self.jump_cooldown + .store(rand::random_range(15..40), Ordering::Relaxed); + } else if jump_cd > 0 { + self.jump_cooldown.fetch_sub(1, Ordering::Relaxed); + } + } + + if ticks <= 1 { + self.is_walking.store(false, Ordering::Relaxed); + self.move_cooldown + .store(rand::random_range(20..80), Ordering::Relaxed); + } + } else { + let cd = self.move_cooldown.load(Ordering::Relaxed); + if cd == 0 { + // Pick a new random angle and start walking + let angle = rand::random_range(-std::f64::consts::PI..std::f64::consts::PI); + let dir_x = -angle.sin(); + let dir_z = angle.cos(); + + self.move_dir_x.store(dir_x); + self.move_dir_z.store(dir_z); + self.move_ticks + .store(rand::random_range(20..60), Ordering::Relaxed); + self.is_walking.store(true, Ordering::Relaxed); + + if args.enable_rotation { + self.start_yaw.store(self.current_yaw.load()); + self.start_pitch.store(self.current_pitch.load()); + self.target_yaw.store(angle.to_degrees() as f32); + self.target_pitch.store(rand::random_range(-10.0..10.0)); + self.rotation_progress.store(0.0); + } + } else { + self.move_cooldown.fetch_sub(1, Ordering::Relaxed); + } + + let jump_cd = self.jump_cooldown.load(Ordering::Relaxed); + if jump_cd > 0 { + self.jump_cooldown.fetch_sub(1, Ordering::Relaxed); + } } - //self.tick_movement().await } async fn tick_rotation(&self) { @@ -246,108 +360,172 @@ impl Client { let cooldown = self.rotation_cooldown.load(Ordering::Relaxed); if progress >= 1.0 { - // We have finished the movement. Wait for the cooldown. if cooldown == 0 { - // Pick a new target and reset - let current_y = self.current_yaw.load(); - let current_p = self.current_pitch.load(); + if !self.is_walking.load(Ordering::Relaxed) { + let current_y = self.current_yaw.load(); + let current_p = self.current_pitch.load(); - self.start_yaw.store(current_y); - self.start_pitch.store(current_p); - self.target_yaw.store(rand::random_range(-180.0..180.0)); - self.target_pitch.store(rand::random_range(-90.0..90.0)); + self.start_yaw.store(current_y); + self.start_pitch.store(current_p); + self.target_yaw.store(rand::random_range(-180.0..180.0)); + self.target_pitch.store(rand::random_range(-30.0..30.0)); - self.rotation_progress.store(0.0); - // Wait for 2-5 seconds (40-100 ticks) before moving again - self.rotation_cooldown - .store(rand::random_range(40..100), Ordering::Relaxed); + self.rotation_progress.store(0.0); + self.rotation_cooldown + .store(rand::random_range(40..100), Ordering::Relaxed); + } } else { self.rotation_cooldown.fetch_sub(1, Ordering::Relaxed); } } else { - // Increment progress (e.g., 0.02 means it takes 50 ticks/2.5s to complete turn) - let new_progress = (progress + 0.02).min(1.0); + let new_progress = (progress + 0.05).min(1.0); self.rotation_progress.store(new_progress); - // Calculate the "Smooth" T value using the S-Curve formula - // t = 3p^2 - 2p^3 + // S-Curve interpolation let t = 3.0 * new_progress.powi(2) - 2.0 * new_progress.powi(3); - // Interpolate: start + (target - start) * t let start_y = self.start_yaw.load(); let target_y = self.target_yaw.load(); - let interpolated_yaw = start_y + (target_y - start_y) * t; + let mut diff_y = (target_y - start_y) % 360.0; + if diff_y > 180.0 { + diff_y -= 360.0; + } else if diff_y < -180.0 { + diff_y += 360.0; + } + let interpolated_yaw = (start_y + diff_y * t) % 360.0; let start_p = self.start_pitch.load(); let target_p = self.target_pitch.load(); - let interpolated_pitch = start_p + (target_p - start_p) * t; + let interpolated_pitch = (start_p + (target_p - start_p) * t).clamp(-90.0, 90.0); self.current_yaw.store(interpolated_yaw); self.current_pitch.store(interpolated_pitch); - - // Send rotation packet - self.send_packet(&SPlayerRotation { - yaw: interpolated_yaw, - pitch: interpolated_pitch, - ground: true, - }) - .await; } } - #[expect(dead_code)] - async fn tick_movement(&self) { - let progress = self.move_progress.load(); - let cooldown = self.move_cooldown.load(Ordering::Relaxed); + async fn tick_physics(&self) { + let mut vx = self.velocity_x.load(); + let mut vy = self.velocity_y.load(); + let mut vz = self.velocity_z.load(); - if progress >= 1.0 { - if cooldown == 0 { - // Start a new walk - let cur_x = self.current_x.load(); - let cur_z = self.current_z.load(); + let cur_x = self.current_x.load(); + let cur_y = self.current_y.load(); + let cur_z = self.current_z.load(); + let ground_y = self.ground_y.load(); + let on_ground = self.on_ground.load(Ordering::Relaxed); - self.start_x.store(cur_x); - self.start_z.store(cur_z); + // 1. Gravity and vertical drag + if !on_ground { + vy = (vy - 0.08) * 0.98; + } else if vy < 0.0 { + vy = 0.0; + } - // Small random walk (0.5 to 1.5 blocks) - let offset_x = rand::random_range(-1.5..1.5); - let offset_z = rand::random_range(-1.5..1.5); + // 2. Horizontal friction & air resistance + let friction = if on_ground { 0.6 * 0.91 } else { 0.91 }; + vx *= friction; + vz *= friction; - self.target_x.store(cur_x + offset_x); - self.target_z.store(cur_z + offset_z); + if vx.abs() < 1e-4 { + vx = 0.0; + } + if vz.abs() < 1e-4 { + vz = 0.0; + } + if vy.abs() < 1e-4 && on_ground { + vy = 0.0; + } - self.move_progress.store(0.0); - // Wait 2-5 seconds between moves - self.move_cooldown - .store(rand::random_range(40..100), Ordering::Relaxed); - } else { - self.move_cooldown.fetch_sub(1, Ordering::Relaxed); - } + // 3. Integrate position + let new_x = cur_x + vx; + let mut new_y = cur_y + vy; + let new_z = cur_z + vz; + + // 4. Ground collision + let new_on_ground = if new_y <= ground_y { + new_y = ground_y; + vy = 0.0; + true } else { - // Increase this to 0.05 for a normal human walking pace (20 ticks to finish) - let new_progress = (progress + 0.05).min(1.0); - self.move_progress.store(new_progress); + false + }; - // Cubic easing for a natural start/stop - let t = 3.0 * new_progress.powi(2) - 2.0 * new_progress.powi(3); + self.velocity_x.store(vx); + self.velocity_y.store(vy); + self.velocity_z.store(vz); - let start_x = self.start_x.load(); - let target_x = self.target_x.load(); - let start_z = self.start_z.load(); - let target_z = self.target_z.load(); + self.current_x.store(new_x); + self.current_y.store(new_y); + self.current_z.store(new_z); + self.on_ground.store(new_on_ground, Ordering::Relaxed); + } - let interp_x = start_x + (target_x - start_x) * t as f64; - let interp_z = start_z + (target_z - start_z) * t as f64; + async fn sync_movement(&self) { + let cur_x = self.current_x.load(); + let cur_y = self.current_y.load(); + let cur_z = self.current_z.load(); + let cur_yaw = self.current_yaw.load(); + let cur_pitch = self.current_pitch.load(); + let cur_on_ground = self.on_ground.load(Ordering::Relaxed); - self.current_x.store(interp_x); - self.current_z.store(interp_z); + let last_x = self.last_sent_x.load(); + let last_y = self.last_sent_y.load(); + let last_z = self.last_sent_z.load(); + let last_yaw = self.last_sent_yaw.load(); + let last_pitch = self.last_sent_pitch.load(); + let last_on_ground = self.last_sent_on_ground.load(Ordering::Relaxed); - self.send_packet(&SPlayerPosition { - position: Vector3::new(interp_x, self.current_y.load(), interp_z), - collision: 1, // on_ground + let pos_changed = (cur_x - last_x).abs() > 1e-4 + || (cur_y - last_y).abs() > 1e-4 + || (cur_z - last_z).abs() > 1e-4; + + let rot_changed = + (cur_yaw - last_yaw).abs() > 0.01 || (cur_pitch - last_pitch).abs() > 0.01; + + let ground_changed = cur_on_ground != last_on_ground; + let ticks_since_sync = self.ticks_since_last_sync.fetch_add(1, Ordering::Relaxed); + + let collision = if cur_on_ground { FLAG_ON_GROUND } else { 0 }; + + if pos_changed && rot_changed { + self.send_packet(&SPlayerPositionRotation { + position: Vector3::new(cur_x, cur_y, cur_z), + yaw: cur_yaw, + pitch: cur_pitch, + collision, }) .await; + self.ticks_since_last_sync.store(0, Ordering::Relaxed); + } else if pos_changed { + self.send_packet(&SPlayerPosition { + position: Vector3::new(cur_x, cur_y, cur_z), + collision, + }) + .await; + self.ticks_since_last_sync.store(0, Ordering::Relaxed); + } else if rot_changed { + self.send_packet(&SPlayerRotation { + yaw: cur_yaw, + pitch: cur_pitch, + ground: cur_on_ground, + }) + .await; + self.ticks_since_last_sync.store(0, Ordering::Relaxed); + } else if ground_changed || ticks_since_sync >= 20 { + self.send_packet(&SSetPlayerGround { + on_ground: cur_on_ground, + }) + .await; + self.ticks_since_last_sync.store(0, Ordering::Relaxed); } + + self.last_sent_x.store(cur_x); + self.last_sent_y.store(cur_y); + self.last_sent_z.store(cur_z); + self.last_sent_yaw.store(cur_yaw); + self.last_sent_pitch.store(cur_pitch); + self.last_sent_on_ground + .store(cur_on_ground, Ordering::Relaxed); } async fn tick_swing(&self) { @@ -365,19 +543,19 @@ impl Client { } } - pub async fn send_message(&self, message: String) { + pub async fn send_message(&self, message: &str) { let count = self.message_count.fetch_add(1, Ordering::SeqCst); let start = SystemTime::now(); let since_the_epoch = start .duration_since(UNIX_EPOCH) .expect("Time went backwards"); self.send_packet(&SChatMessage { - message: message.into_boxed_str(), + message, timestamp: since_the_epoch.as_millis() as i64, salt: rand::random(), signature: None, message_count: VarInt(count as i32), - acknowledged: vec![0; 20].into_boxed_slice(), + acknowledged: &[0; 3], checksum: 0, }) .await; @@ -401,20 +579,21 @@ impl Client { let mut packet_buf = Vec::new(); let writer = &mut packet_buf; Self::write_packet(packet, writer).unwrap(); - if let Err(err) = self - .network_writer - .lock() - .await - .write_packet(packet_buf.into()) - .await + let mut encoder = self.network_writer.lock().await; + if let Err(err) = encoder.write_packet(packet_buf.into()).await + && !self.closed.load(Ordering::Relaxed) { - // It is expected that the packet will fail if we are closed - if !self.closed.load(Ordering::Relaxed) { - log::warn!("Failed to send packet to client: {err}"); - // We now need to close the connection to the client since the stream is in an - // unknown state - self.close().await; - } + log::warn!("Failed to send packet to server: {err}"); + // We now need to close the connection to the client since the stream is in an + // unknown state + self.close().await; + return; + } + if let Err(err) = encoder.flush().await + && !self.closed.load(Ordering::Relaxed) + { + log::warn!("Failed to flush packet to server: {err}"); + self.close().await; } } @@ -447,14 +626,45 @@ impl Client { } async fn handle_login_packet(&self, packet: &mut RawPacket) -> Result<(), ReadingError> { - let bytebuf = &packet.payload[..]; + let mut bytebuf = &packet.payload[..]; match packet.id { id if id == CEncryptionRequest::to_id(VERSION) => { - todo!("Encryption is currently not implemented, please disable it at server level") + log::trace!("Handling Encryption Request"); + let packet = CEncryptionRequest::read(&mut bytebuf, &VERSION)?; + let shared_secret: [u8; 16] = rand::random(); + + let public_key = + RsaPublicKey::from_public_key_der(packet.public_key).map_err(|e| { + ReadingError::Message(format!("Failed to parse RSA public key: {e}")) + })?; + + let (encrypted_shared_secret, encrypted_verify_token) = { + let mut rng = rand::rng(); + let enc_secret = public_key + .encrypt(&mut rng, Pkcs1v15Encrypt, &shared_secret) + .map_err(|e| { + ReadingError::Message(format!("Failed to encrypt shared secret: {e}")) + })?; + let enc_token = public_key + .encrypt(&mut rng, Pkcs1v15Encrypt, packet.verify_token) + .map_err(|e| { + ReadingError::Message(format!("Failed to encrypt verify token: {e}")) + })?; + (enc_secret, enc_token) + }; + + self.send_packet(&SEncryptionResponse { + shared_secret: encrypted_shared_secret.into_boxed_slice(), + verify_token: encrypted_verify_token.into_boxed_slice(), + }) + .await; + + self.set_encryption(&shared_secret).await; + log::trace!("Encryption enabled successfully"); } id if id == CSetCompression::to_id(VERSION) => { log::trace!("Set Compression"); - let packet = CSetCompression::read(bytebuf, &VERSION)?; + let packet = CSetCompression::read(&mut bytebuf, &VERSION)?; self.set_compression(Some((packet.threshold.0 as usize, 6))) .await } @@ -468,7 +678,7 @@ impl Client { self.connection_state.store(ConnectionState::Config); log::trace!("Sending Known packs"); self.send_packet(&SKnownPacks { - known_pack_count: VarInt(0), + known_packs: Vec::new(), }) .await; } @@ -494,29 +704,34 @@ impl Client { } async fn handle_play_packet(&self, packet: &mut RawPacket) -> Result<(), ReadingError> { - let bytebuf = &packet.payload[..]; + let mut bytebuf = &packet.payload[..]; match packet.id { id if id == CKeepAlive::to_id(VERSION) => { - let packet = CKeepAlive::read(bytebuf, &VERSION)?; + let packet = CKeepAlive::read(&mut bytebuf, &VERSION)?; self.send_packet(&SKeepAlive { keep_alive_id: packet.keep_alive_id, }) .await; } - // TODO - // id if id == CEntityVelocity::PACKET_ID => { - // let packet = CEntityVelocity::read(bytebuf)?; - - // if packet.entity_id.0 == self.entity_id.load(Ordering::Relaxed) as i32 { - // self.velocity_x.store(packet.velocity.0.x as f64 / 8000.0); - // self.velocity_y.store(packet.velocity.0.y as f64 / 8000.0); - // self.velocity_z.store(packet.velocity.0.z as f64 / 8000.0); - // } - // } + id if id == CEntityVelocity::to_id(VERSION) => { + let entity_id = bytebuf.get_var_int()?; + if entity_id.0 == self.entity_id.load(Ordering::Relaxed) { + let velocity = LpVector3d::read(&mut bytebuf)?.0; + self.velocity_x.store(velocity.x); + self.velocity_y.store(velocity.y); + self.velocity_z.store(velocity.z); + if velocity.y > 0.0 { + self.on_ground.store(false, Ordering::Relaxed); + } + } + } id if id == CPlayerPosition::to_id(VERSION) => { - let packet = CPlayerPosition::read(bytebuf, &VERSION)?; + let packet = CPlayerPosition::read(&mut bytebuf, &VERSION)?; self.current_yaw.store(packet.yaw); self.current_pitch.store(packet.pitch); + self.target_yaw.store(packet.yaw); + self.target_pitch.store(packet.pitch); + self.rotation_progress.store(1.0); let x = packet.position.x; let y = packet.position.y; @@ -525,15 +740,26 @@ impl Client { self.current_x.store(x); self.current_y.store(y); self.current_z.store(z); + self.ground_y.store(y); - self.start_x.store(x); - self.start_z.store(z); - self.target_x.store(x); - self.target_z.store(z); + self.velocity_x.store(packet.delta.x); + self.velocity_y.store(packet.delta.y); + self.velocity_z.store(packet.delta.z); - self.move_progress.store(1.0); + let on_ground = packet.delta.y <= 0.0; + self.on_ground.store(on_ground, Ordering::Relaxed); + + self.last_sent_x.store(x); + self.last_sent_y.store(y); + self.last_sent_z.store(z); + self.last_sent_yaw.store(packet.yaw); + self.last_sent_pitch.store(packet.pitch); + self.last_sent_on_ground.store(on_ground, Ordering::Relaxed); + + self.is_walking.store(false, Ordering::Relaxed); self.move_cooldown - .store(rand::random_range(40..100), Ordering::Relaxed); + .store(rand::random_range(20..60), Ordering::Relaxed); + self.send_packet(&SConfirmTeleport { teleport_id: packet.teleport_id, }) @@ -541,10 +767,8 @@ impl Client { self.is_loaded.store(true, Ordering::Relaxed); } id if id == CLogin::to_id(VERSION) => { - // TODO - // let packet = CLogin::read(bytebuf)?; - // self.entity_id.store(packet.entity_id, Ordering::Relaxed); - + let entity_id = bytebuf.get_i32_be()?; + self.entity_id.store(entity_id, Ordering::Relaxed); self.send_packet(&SPlayerLoaded).await; } id if id == CPlayDisconnect::to_id(VERSION) => { @@ -562,3 +786,180 @@ impl Client { .store(true, std::sync::atomic::Ordering::Relaxed); } } + +#[cfg(test)] +mod tests { + use super::*; + use tokio::net::TcpListener; + + async fn create_test_client() -> Client { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + let connect_handle = tokio::spawn(async move { TcpStream::connect(addr).await.unwrap() }); + let (server_stream, _) = listener.accept().await.unwrap(); + let _ = server_stream; + let client_stream = connect_handle.await.unwrap(); + Client::new(client_stream) + } + + #[tokio::test] + async fn test_gravity_and_ground_collision() { + let client = create_test_client().await; + client.current_y.store(10.0); + client.ground_y.store(0.0); + client.on_ground.store(false, Ordering::Relaxed); + + // Tick physics multiple times in the air + for _ in 0..10 { + client.tick_physics().await; + } + + // The bot should have fallen down and velocity.y should be negative + assert!(client.current_y.load() < 10.0); + assert!(client.velocity_y.load() < 0.0); + + // Tick until it lands + for _ in 0..50 { + client.tick_physics().await; + } + + assert_eq!(client.current_y.load(), 0.0); + assert_eq!(client.velocity_y.load(), 0.0); + assert!(client.on_ground.load(Ordering::Relaxed)); + } + + #[tokio::test] + async fn test_jump_physics() { + let client = create_test_client().await; + client.current_y.store(0.0); + client.ground_y.store(0.0); + client.on_ground.store(true, Ordering::Relaxed); + + // Apply jump impulse + client.velocity_y.store(0.42); + client.on_ground.store(false, Ordering::Relaxed); + + client.tick_physics().await; + assert!(client.current_y.load() > 0.0); + assert!(!client.on_ground.load(Ordering::Relaxed)); + + // Tick until landing back on ground + for _ in 0..50 { + client.tick_physics().await; + } + + assert_eq!(client.current_y.load(), 0.0); + assert!(client.on_ground.load(Ordering::Relaxed)); + } + + #[tokio::test] + async fn test_horizontal_friction_decay() { + let client = create_test_client().await; + client.current_y.store(0.0); + client.ground_y.store(0.0); + client.on_ground.store(true, Ordering::Relaxed); + + client.velocity_x.store(1.0); + client.tick_physics().await; + + let vx = client.velocity_x.load(); + assert!(vx < 1.0); + assert!((vx - 0.546).abs() < 1e-3); + } + + #[tokio::test] + async fn test_encryption_handshake_and_encrypted_stream() { + use rsa::RsaPrivateKey; + use rsa::pkcs8::EncodePublicKey; + + let mut rng = rand::rng(); + let server_private_key = RsaPrivateKey::new(&mut rng, 1024).unwrap(); + let server_public_key_der = server_private_key + .to_public_key() + .to_public_key_der() + .unwrap() + .into_vec(); + + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + + let connect_handle = tokio::spawn(async move { + let stream = TcpStream::connect(addr).await.unwrap(); + let client = Arc::new(Client::new(stream)); + client.connection_state.store(ConnectionState::Login); + client + }); + + let (server_stream, _) = listener.accept().await.unwrap(); + let client = connect_handle.await.unwrap(); + + let (server_reader, server_writer) = server_stream.into_split(); + let mut server_decoder = TCPNetworkDecoder::new(BufReader::new(server_reader)); + let mut server_encoder = TCPNetworkEncoder::new(BufWriter::new(server_writer)); + + // 1. Server sends CEncryptionRequest + let verify_token = [1u8, 2, 3, 4]; + let enc_req = CEncryptionRequest::new("", &server_public_key_der, &verify_token, false); + let mut enc_req_buf = Vec::new(); + Client::write_packet(&enc_req, &mut enc_req_buf).unwrap(); + server_encoder + .write_packet(enc_req_buf.into()) + .await + .unwrap(); + server_encoder.flush().await.unwrap(); + + // 2. Client processes the packet (CEncryptionRequest -> SEncryptionResponse + enables encryption) + let client_clone = client.clone(); + let client_process_handle = + tokio::spawn(async move { client_clone.process_packets().await }); + + // 3. Server receives SEncryptionResponse (unencrypted) + let raw_resp = server_decoder.get_raw_packet().await.unwrap(); + assert_eq!(raw_resp.id, SEncryptionResponse::to_id(VERSION)); + let mut resp_payload = &raw_resp.payload[..]; + let resp = SEncryptionResponse::read(&mut resp_payload, &VERSION).unwrap(); + + // 4. Server decrypts shared secret and verify token + let decrypted_secret = server_private_key + .decrypt(Pkcs1v15Encrypt, &resp.shared_secret) + .unwrap(); + let decrypted_token = server_private_key + .decrypt(Pkcs1v15Encrypt, &resp.verify_token) + .unwrap(); + + assert_eq!(decrypted_token.as_slice(), &verify_token); + assert_eq!(decrypted_secret.len(), 16); + + let shared_secret: [u8; 16] = decrypted_secret.try_into().unwrap(); + + // 5. Server enables encryption + server_decoder.set_encryption(&shared_secret).unwrap(); + server_encoder.set_encryption(&shared_secret).unwrap(); + + assert!(client_process_handle.await.unwrap()); + + // 6. Test encrypted communication: Server sends encrypted CKeepAlive + let keep_alive = CKeepAlive { + keep_alive_id: 123456, + }; + let mut ka_buf = Vec::new(); + Client::write_packet(&keep_alive, &mut ka_buf).unwrap(); + server_encoder.write_packet(ka_buf.into()).await.unwrap(); + server_encoder.flush().await.unwrap(); + + // 7. Client receives and handles encrypted CKeepAlive, sends encrypted SKeepAlive back + client.connection_state.store(ConnectionState::Play); + let client_clone = client.clone(); + let client_process_handle = + tokio::spawn(async move { client_clone.process_packets().await }); + + // 8. Server reads encrypted SKeepAlive from client + let raw_ka_resp = server_decoder.get_raw_packet().await.unwrap(); + assert_eq!(raw_ka_resp.id, SKeepAlive::to_id(VERSION)); + let mut ka_resp_payload = &raw_ka_resp.payload[..]; + let ka_resp = SKeepAlive::read(&mut ka_resp_payload, &VERSION).unwrap(); + assert_eq!(ka_resp.keep_alive_id, 123456); + + assert!(client_process_handle.await.unwrap()); + } +} diff --git a/src/main.rs b/src/main.rs index f1aca0a..11fc416 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,6 +29,12 @@ pub struct Args { pub enable_rotation: bool, #[arg(long, default_value_t = true)] pub enable_swing: bool, + #[arg(long, default_value_t = true)] + pub enable_movement: bool, + #[arg(long, default_value_t = true)] + pub enable_jumping: bool, + #[arg(long, default_value_t = true)] + pub enable_physics: bool, } #[tokio::main] @@ -62,7 +68,7 @@ async fn main() { "Bot {} connection to {} timed out after {}ms", i + 1, address, - bot_count + args.timeout ); continue; } @@ -72,7 +78,7 @@ async fn main() { client.join_server(address, format!("BOT_{i}")).await; let cloned_args = args.clone(); let join_handle = tokio::spawn(async move { - let mut tick_interval = tokio::time::interval(Duration::from_millis(5)); + let mut tick_interval = tokio::time::interval(Duration::from_millis(50)); tick_interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); loop { tokio::select! {