diff --git a/Cargo.lock b/Cargo.lock index ce3a6f13..f132d125 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -36,10 +36,10 @@ checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "const-random", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -59,9 +59,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android_log-sys" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937" +checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" [[package]] name = "anes" @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.96" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" [[package]] name = "arrayvec" @@ -192,9 +192,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.86" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", @@ -238,10 +238,10 @@ dependencies = [ "num-format", "num-traits", "parking_lot", - "rand", + "rand 0.8.5", "rustc-hash 2.1.1", "serde", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tracing", "uuid", @@ -261,7 +261,7 @@ dependencies = [ "rsa", "serde", "serde_json", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tracing", "uuid", @@ -304,7 +304,7 @@ dependencies = [ "byteorder", "serde_json", "simdnbt", - "thiserror 2.0.11", + "thiserror 2.0.12", "tracing", "uuid", ] @@ -360,7 +360,7 @@ dependencies = [ "regex", "reqwest", "simdnbt", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tracing", "uuid", @@ -391,7 +391,7 @@ dependencies = [ "cfb8", "criterion", "num-bigint", - "rand", + "rand 0.8.5", "rsa", "rsa_public_encrypt_pkcs1", "sha-1", @@ -417,7 +417,7 @@ dependencies = [ "nohash-hasher", "parking_lot", "simdnbt", - "thiserror 2.0.11", + "thiserror 2.0.12", "tracing", "uuid", ] @@ -500,7 +500,7 @@ dependencies = [ "serde_json", "simdnbt", "socks5-impl", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tokio-util", "tracing", @@ -552,7 +552,7 @@ dependencies = [ "rustc-hash 2.1.1", "serde", "simdnbt", - "thiserror 2.0.11", + "thiserror 2.0.12", "tracing", ] @@ -568,7 +568,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -579,15 +579,15 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "bevy_app" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47983196daf9290ac97023de67d9364182c4a9a88ce400039e2d79aaf342dcb2" +checksum = "a0ac033a388b8699d241499a43783a09e6a3bab2430f1297c6bd4974095efb3f" dependencies = [ "bevy_derive", "bevy_ecs", @@ -604,9 +604,9 @@ dependencies = [ [[package]] name = "bevy_derive" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa901a443b9ee433823f0d1a4e6db78440ff27572a98e7fa7f2a614bf8d6e475" +checksum = "57d94761ce947b0a2402fd949fe1e7a5b1535293130ba4cd9893be6295d4680a" dependencies = [ "bevy_macro_utils", "quote", @@ -615,9 +615,9 @@ dependencies = [ [[package]] name = "bevy_ecs" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40e6d5ad061f750f710a9a4e2f9e7d65f86c0061fc9ffcf3a430b3c003bc0088" +checksum = "1597106cc01e62e6217ccb662e0748b2ce330893f27c7dc17bac33e0bb99bca9" dependencies = [ "bevy_ecs_macros", "bevy_ptr", @@ -636,9 +636,9 @@ dependencies = [ [[package]] name = "bevy_ecs_macros" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea80917f2d11e8928d0b7cd41efa55b814355e6a3544a1bf68e6b73871d332c" +checksum = "f453adf07712b39826bc5845e5b0887ce03204ee8359bbe6b40a9afda60564a1" dependencies = [ "bevy_macro_utils", "proc-macro2", @@ -648,9 +648,9 @@ dependencies = [ [[package]] name = "bevy_log" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8530cc17503ccfe86c8496136fca222bfa389c9cc70267be7d377d0f6621aa29" +checksum = "b381a22e01f24af51536ef1eace94298dd555d06ffcf368125d16317f5f179cb" dependencies = [ "android_log-sys", "bevy_app", @@ -664,9 +664,9 @@ dependencies = [ [[package]] name = "bevy_macro_utils" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090371a2cd85574989febff6063a21d1fbbc2939e80f00fe075f62aa8e616136" +checksum = "8bb6ded1ddc124ea214f6a2140e47a78d1fe79b0638dad39419cdeef2e1133f1" dependencies = [ "proc-macro2", "quote", @@ -676,15 +676,15 @@ dependencies = [ [[package]] name = "bevy_ptr" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4da2111eefa2000ea8c9dc1beee2eb7283b29b5ef90a29fe43c748df549f84ad" +checksum = "89fe0b0b919146939481a3a7c38864face2c6d0fd2c73ab3d430dc693ecd9b11" [[package]] name = "bevy_reflect" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82af24a68fd8feff476d9672ff34d220d3f45e95ef2f2324e7cb674614d18138" +checksum = "3ddbca0a39e88eff2c301dc794ee9d73a53f4b08d47b2c9b5a6aac182fae6217" dependencies = [ "assert_type_match", "bevy_ptr", @@ -701,9 +701,9 @@ dependencies = [ [[package]] name = "bevy_reflect_derive" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8369e6e779ab3540f9dcd93d062139f62551b3d2fe1ab451c6ddf74757e22ccd" +checksum = "d62affb769db17d34ad0b75ff27eca94867e2acc8ea350c5eca97d102bd98709" dependencies = [ "bevy_macro_utils", "proc-macro2", @@ -714,9 +714,9 @@ dependencies = [ [[package]] name = "bevy_tasks" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e085e93374b8dd2559968bcc1bc66d059387ef3128e59e9af92dcde03f10b7" +checksum = "028630ddc355563bd567df1076db3515858aa26715ddf7467d2086f9b40e5ab1" dependencies = [ "async-channel", "async-executor", @@ -729,9 +729,9 @@ dependencies = [ [[package]] name = "bevy_time" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02b14d56c04a372725dacc656e2e5f134ff239e72cd73431a065b32b296db31" +checksum = "1b2051ec56301b994f7c182a2a6eb1490038149ad46d95eee715e1a922acdfd9" dependencies = [ "bevy_app", "bevy_ecs", @@ -742,13 +742,13 @@ dependencies = [ [[package]] name = "bevy_utils" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2993cac374b3f88cfaf59506c71f8e3e7ad8b4961f4e9864bc76e1c9e1e4400c" +checksum = "63c2174d43a0de99f863c98a472370047a2bfa7d1e5cec8d9d647fb500905d9d" dependencies = [ "ahash", "bevy_utils_proc_macros", - "getrandom", + "getrandom 0.2.15", "hashbrown 0.14.5", "thread_local", "tracing", @@ -757,9 +757,9 @@ dependencies = [ [[package]] name = "bevy_utils_proc_macros" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2606f79dfe359a88e2a59bb6cd632cd42e9d4bcd250ac8bc3a4e7657e82f4f39" +checksum = "94847541f6dd2e28f54a9c2b0e857da5f2631e2201ebc25ce68781cdcb721391" dependencies = [ "proc-macro2", "quote", @@ -788,9 +788,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "block-buffer" @@ -815,9 +815,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cast" @@ -836,9 +836,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.15" +version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ "shlex", ] @@ -875,9 +875,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "num-traits", "serde", @@ -933,18 +933,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.30" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d" +checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.30" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c" +checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8" dependencies = [ "anstyle", "clap_lex", @@ -1017,7 +1017,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom", + "getrandom 0.2.15", "once_cell", "tiny-keccak", ] @@ -1230,9 +1230,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "enum-as-inner" @@ -1258,14 +1258,14 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.6" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" +checksum = "c3716d7a920fb4fac5d84e9d4bce8ceb321e9414b4409da61b07b75c1e3d0697" dependencies = [ "anstream", "anstyle", "env_filter", - "humantime", + "jiff", "log", ] @@ -1277,9 +1277,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" dependencies = [ "serde", "typeid", @@ -1326,11 +1326,12 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" dependencies = [ "crc32fast", + "libz-rs-sys", "miniz_oxide", ] @@ -1470,7 +1471,21 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", "wasm-bindgen", ] @@ -1488,9 +1503,9 @@ checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "half" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" dependencies = [ "cfg-if", "crunchy", @@ -1521,9 +1536,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" [[package]] name = "hickory-proto" @@ -1541,7 +1556,7 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand", + "rand 0.8.5", "thiserror 1.0.69", "tinyvec", "tokio", @@ -1561,7 +1576,7 @@ dependencies = [ "lru-cache", "once_cell", "parking_lot", - "rand", + "rand 0.8.5", "smallvec", "thiserror 1.0.69", "tokio", @@ -1570,9 +1585,9 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -1591,12 +1606,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "pin-project-lite", @@ -1604,15 +1619,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" @@ -1811,9 +1820,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -1836,9 +1845,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is-terminal" -version = "0.4.15" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi", "libc", @@ -1871,9 +1880,33 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jiff" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d699bc6dfc879fb1bf9bdff0d4c56f0884fc6f0d0eb0fba397a6d00cd9a6b85e" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", +] + +[[package]] +name = "jiff-static" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d16e75759ee0aa64c57a56acbf43916987b20c77373cb7e808979e02b93c9f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "js-sys" @@ -1896,9 +1929,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "libloading" @@ -1907,7 +1940,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -1916,6 +1949,15 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +[[package]] +name = "libz-rs-sys" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "902bc563b5d65ad9bba616b490842ef0651066a1a1dc3ce1087113ffcb873c8d" +dependencies = [ + "zlib-rs", +] + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -1924,9 +1966,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "litemap" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "lock_api" @@ -2012,7 +2054,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -2096,7 +2138,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand", + "rand 0.8.5", "smallvec", "zeroize", ] @@ -2172,15 +2214,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.3" +version = "1.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" [[package]] name = "oorandom" -version = "11.1.4" +version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "overload" @@ -2217,7 +2259,7 @@ dependencies = [ "redox_syscall", "smallvec", "thread-id", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2253,18 +2295,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", @@ -2333,19 +2375,34 @@ dependencies = [ ] [[package]] -name = "ppv-lite86" -version = "0.2.20" +name = "portable-atomic" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" dependencies = [ - "zerocopy", + "portable-atomic", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.23", ] [[package]] name = "prettyplease" -version = "0.2.29" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" +checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" dependencies = [ "proc-macro2", "syn", @@ -2353,46 +2410,48 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "quinn" -version = "0.11.6" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" dependencies = [ "bytes", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", "rustls", "socket2", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.9" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" dependencies = [ "bytes", - "getrandom", - "rand", + "getrandom 0.3.2", + "rand 0.9.0", "ring", "rustc-hash 2.1.1", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.11", + "thiserror 2.0.12", "tinyvec", "tracing", "web-time", @@ -2414,13 +2473,19 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "rand" version = "0.8.5" @@ -2428,8 +2493,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "zerocopy 0.8.23", ] [[package]] @@ -2439,7 +2515,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -2448,7 +2534,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", ] [[package]] @@ -2473,9 +2568,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ "bitflags", ] @@ -2526,9 +2621,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.12" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "base64", "bytes", @@ -2569,13 +2664,13 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.11" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", "untrusted", "windows-sys 0.52.0", @@ -2583,9 +2678,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" dependencies = [ "const-oid", "digest", @@ -2594,7 +2689,7 @@ dependencies = [ "num-traits", "pkcs1", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sha2", "signature", "spki", @@ -2609,7 +2704,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3e9243a1f8b312c5535c09de102cc061416515201b194ee4f0a9a76da20ebf4" dependencies = [ "num", - "rand", + "rand 0.8.5", "simple_asn1", ] @@ -2642,9 +2737,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.23" +version = "0.23.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" +checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" dependencies = [ "once_cell", "ring", @@ -2674,9 +2769,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f" dependencies = [ "ring", "rustls-pki-types", @@ -2685,15 +2780,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -2712,24 +2807,24 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -2738,9 +2833,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -2813,7 +2908,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -2836,7 +2931,7 @@ dependencies = [ "flate2", "simd_cesu8", "simdnbt-derive", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -2904,16 +2999,16 @@ dependencies = [ [[package]] name = "socks5-impl" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16c081d915d229c8e86edd9bfc784fbbee0e9ae6f2a338d791b22c5ec45dc00f" +checksum = "4b7bef5922371adf8b6f1dd0b9fe3d86c77c22686e8f4236b778ed0215cdcd9b" dependencies = [ "as-any", "async-trait", "byteorder", "bytes", "percent-encoding", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", ] @@ -2953,9 +3048,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.98" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -2993,11 +3088,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.12", ] [[package]] @@ -3013,9 +3108,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", @@ -3073,9 +3168,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -3088,9 +3183,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" dependencies = [ "backtrace", "bytes", @@ -3117,9 +3212,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", "tokio", @@ -3127,9 +3222,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ "bytes", "futures-core", @@ -3277,9 +3372,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typeid" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" @@ -3289,9 +3384,9 @@ checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicode-ident" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-xid" @@ -3340,7 +3435,7 @@ version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" dependencies = [ - "getrandom", + "getrandom 0.2.15", "md-5", "serde", ] @@ -3382,6 +3477,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -3514,33 +3618,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-registry" -version = "0.2.0" +name = "windows-link" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result", "windows-strings", - "windows-targets", + "windows-targets 0.53.0", ] [[package]] name = "windows-result" -version = "0.2.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" dependencies = [ - "windows-targets", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-result", - "windows-targets", + "windows-link", ] [[package]] @@ -3549,7 +3658,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3558,7 +3667,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3567,14 +3676,30 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] [[package]] @@ -3583,42 +3708,84 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -3626,14 +3793,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "winnow" -version = "0.7.3" +name = "windows_x86_64_msvc" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" dependencies = [ "memchr", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + [[package]] name = "write16" version = "1.0.0" @@ -3676,8 +3858,16 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +dependencies = [ + "zerocopy-derive 0.8.23", ] [[package]] @@ -3692,19 +3882,30 @@ dependencies = [ ] [[package]] -name = "zerofrom" -version = "0.1.5" +name = "zerocopy-derive" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", @@ -3739,3 +3940,9 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zlib-rs" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b20717f0917c908dc63de2e44e97f1e6b126ca58d0e391cee86d504eb8fbd05" diff --git a/Cargo.toml b/Cargo.toml index 04057319..7f1e42bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,7 +45,7 @@ criterion = "0.5.1" derive_more = "2.0.1" enum-as-inner = "0.6.1" env_logger = "0.11.6" -flate2 = "1.0.35" +flate2 = { version = "1.0.35", features = ["zlib-rs"] } futures = "0.3.31" futures-lite = "2.6.0" md-5 = "0.10.6" diff --git a/azalea-client/src/client.rs b/azalea-client/src/client.rs index 840d373d..72175dab 100644 --- a/azalea-client/src/client.rs +++ b/azalea-client/src/client.rs @@ -4,6 +4,7 @@ use std::{ io, net::SocketAddr, sync::Arc, + thread, time::{Duration, Instant}, }; @@ -39,7 +40,7 @@ use azalea_protocol::{ resolver, }; use azalea_world::{Instance, InstanceContainer, InstanceName, PartialInstance}; -use bevy_app::{App, Plugin, PluginGroup, PluginGroupBuilder, Update}; +use bevy_app::{App, Plugin, PluginGroup, PluginGroupBuilder, PluginsState, Update}; use bevy_ecs::{ bundle::Bundle, component::Component, @@ -60,7 +61,7 @@ use tokio::{ }, time, }; -use tracing::{debug, error}; +use tracing::{debug, error, info}; use uuid::Uuid; use crate::{ @@ -83,6 +84,7 @@ use crate::{ login::{self, InLoginState, LoginSendPacketQueue}, }, player::retroactively_add_game_profile_component, + pong::PongPlugin, raw_connection::RawConnection, respawn::RespawnPlugin, task_pool::TaskPoolPlugin, @@ -149,6 +151,7 @@ pub struct StartClientOpts<'a> { pub resolved_address: &'a SocketAddr, pub proxy: Option, pub run_schedule_sender: mpsc::Sender<()>, + pub event_sender: Option>, } impl<'a> StartClientOpts<'a> { @@ -156,6 +159,7 @@ impl<'a> StartClientOpts<'a> { account: &'a Account, address: &'a ServerAddress, resolved_address: &'a SocketAddr, + event_sender: Option>, ) -> StartClientOpts<'a> { // An event that causes the schedule to run. This is only used internally. let (run_schedule_sender, run_schedule_receiver) = mpsc::channel(1); @@ -172,6 +176,7 @@ impl<'a> StartClientOpts<'a> { resolved_address, proxy: None, run_schedule_sender, + event_sender, } } @@ -229,8 +234,16 @@ impl Client { ) -> Result<(Self, mpsc::UnboundedReceiver), JoinError> { let address: ServerAddress = address.try_into().map_err(|_| JoinError::InvalidAddress)?; let resolved_address = resolver::resolve_address(&address).await?; + let (tx, rx) = mpsc::unbounded_channel(); - Self::start_client(StartClientOpts::new(account, &address, &resolved_address)).await + let client = Self::start_client(StartClientOpts::new( + account, + &address, + &resolved_address, + Some(tx), + )) + .await?; + Ok((client, rx)) } pub async fn join_with_proxy( @@ -240,9 +253,13 @@ impl Client { ) -> Result<(Self, mpsc::UnboundedReceiver), JoinError> { let address: ServerAddress = address.try_into().map_err(|_| JoinError::InvalidAddress)?; let resolved_address = resolver::resolve_address(&address).await?; + let (tx, rx) = mpsc::unbounded_channel(); - Self::start_client(StartClientOpts::new(account, &address, &resolved_address).proxy(proxy)) - .await + let client = Self::start_client( + StartClientOpts::new(account, &address, &resolved_address, Some(tx)).proxy(proxy), + ) + .await?; + Ok((client, rx)) } /// Create a [`Client`] when you already have the ECS made with @@ -255,8 +272,9 @@ impl Client { resolved_address, proxy, run_schedule_sender, + event_sender, }: StartClientOpts<'_>, - ) -> Result<(Self, mpsc::UnboundedReceiver), JoinError> { + ) -> Result { // check if an entity with our uuid already exists in the ecs and if so then // just use that let entity = { @@ -298,8 +316,6 @@ impl Client { // we did the handshake, so now we're connected to the server - let (tx, rx) = mpsc::unbounded_channel(); - let mut ecs = ecs_lock.lock(); // we got the ConfigurationConnection, so the client is now connected :) @@ -318,7 +334,8 @@ impl Client { Arc::new(RwLock::new(instance)), ); - ecs.entity_mut(entity).insert(( + let mut entity = ecs.entity_mut(entity); + entity.insert(( // these stay when we switch to the game state LocalPlayerBundle { raw_connection: RawConnection::new( @@ -327,7 +344,6 @@ impl Client { read_conn, write_conn, ), - local_player_events: LocalPlayerEvents(tx), game_profile: GameProfileComponent(game_profile), client_information: crate::ClientInformation::default(), instance_holder, @@ -337,8 +353,12 @@ impl Client { // this component is never removed LocalEntity, )); + if let Some(event_sender) = event_sender { + // this is optional so we don't leak memory in case the user + entity.insert(LocalPlayerEvents(event_sender)); + } - Ok((client, rx)) + Ok(client) } /// Do a handshake with the server and get to the game state from the @@ -683,8 +703,16 @@ impl Client { /// Get the position of this client. /// /// This is a shortcut for `Vec3::from(&bot.component::())`. + /// + /// Note that this value is given a default of [`Vec3::ZERO`] when it + /// receives the login packet, its true position may be set ticks + /// later. pub fn position(&self) -> Vec3 { - Vec3::from(&self.component::()) + Vec3::from( + &self + .get_component::() + .expect("the client's position hasn't been initialized yet"), + ) } /// Get the position of this client's eyes. @@ -789,7 +817,6 @@ impl Client { #[derive(Bundle)] pub struct LocalPlayerBundle { pub raw_connection: RawConnection, - pub local_player_events: LocalPlayerEvents, pub game_profile: GameProfileComponent, pub client_information: ClientInformation, pub instance_holder: InstanceHolder, @@ -855,6 +882,21 @@ pub fn start_ecs_runner( run_schedule_receiver: mpsc::Receiver<()>, run_schedule_sender: mpsc::Sender<()>, ) -> Arc> { + // this block is based on Bevy's default runner: + // https://github.com/bevyengine/bevy/blob/390877cdae7a17095a75c8f9f1b4241fe5047e83/crates/bevy_app/src/schedule_runner.rs#L77-L85 + if app.plugins_state() != PluginsState::Cleaned { + // Wait for plugins to load + if app.plugins_state() == PluginsState::Adding { + info!("Waiting for plugins to load ..."); + while app.plugins_state() == PluginsState::Adding { + thread::yield_now(); + } + } + // Finish adding plugins and cleanup + app.finish(); + app.cleanup(); + } + // all resources should have been added by now so we can take the ecs from the // app let ecs = Arc::new(Mutex::new(std::mem::take(app.world_mut()))); @@ -994,7 +1036,8 @@ impl PluginGroup for DefaultPlugins { .add(ChunksPlugin) .add(TickEndPlugin) .add(BrandPlugin) - .add(TickBroadcastPlugin); + .add(TickBroadcastPlugin) + .add(PongPlugin); #[cfg(feature = "log")] { group = group.add(bevy_log::LogPlugin::default()); diff --git a/azalea-client/src/plugins/attack.rs b/azalea-client/src/plugins/attack.rs index 1b2bc1ee..226ae603 100644 --- a/azalea-client/src/plugins/attack.rs +++ b/azalea-client/src/plugins/attack.rs @@ -75,7 +75,7 @@ pub fn handle_attack_event( &mut Sprinting, &mut ShiftKeyDown, )>, - mut send_packet_events: EventWriter, + mut commands: Commands, mut swing_arm_event: EventWriter, ) { for event in events.read() { @@ -85,7 +85,7 @@ pub fn handle_attack_event( swing_arm_event.send(SwingArmEvent { entity: event.entity, }); - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( event.entity, ServerboundInteract { entity_id: event.target, diff --git a/azalea-client/src/plugins/brand.rs b/azalea-client/src/plugins/brand.rs index 5ee8e52c..94783230 100644 --- a/azalea-client/src/plugins/brand.rs +++ b/azalea-client/src/plugins/brand.rs @@ -19,7 +19,7 @@ impl Plugin for BrandPlugin { fn build(&self, app: &mut App) { app.add_systems( Update, - handle_end_login_state.before(crate::packet::config::handle_send_packet_event), + handle_end_login_state.before(crate::packet::config::handle_outgoing_packets), ); } } diff --git a/azalea-client/src/plugins/chat/handler.rs b/azalea-client/src/plugins/chat/handler.rs index 31fbc00e..356d3fba 100644 --- a/azalea-client/src/plugins/chat/handler.rs +++ b/azalea-client/src/plugins/chat/handler.rs @@ -29,7 +29,7 @@ pub struct SendChatKindEvent { pub fn handle_send_chat_kind_event( mut events: EventReader, - mut send_packet_events: EventWriter, + mut commands: Commands, ) { for event in events.read() { let content = event @@ -58,6 +58,6 @@ pub fn handle_send_chat_kind_event( } }; - send_packet_events.send(SendPacketEvent::new(event.entity, packet)); + commands.trigger(SendPacketEvent::new(event.entity, packet)); } } diff --git a/azalea-client/src/plugins/chunks.rs b/azalea-client/src/plugins/chunks.rs index 6c970db9..060b94e2 100644 --- a/azalea-client/src/plugins/chunks.rs +++ b/azalea-client/src/plugins/chunks.rs @@ -149,13 +149,13 @@ pub fn handle_chunk_batch_start_event( pub fn handle_chunk_batch_finished_event( mut query: Query<&mut ChunkBatchInfo>, mut events: EventReader, - mut send_packets: EventWriter, + mut commands: Commands, ) { for event in events.read() { if let Ok(mut chunk_batch_info) = query.get_mut(event.entity) { chunk_batch_info.batch_finished(event.batch_size); let desired_chunks_per_tick = chunk_batch_info.desired_chunks_per_tick(); - send_packets.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( event.entity, ServerboundChunkBatchReceived { desired_chunks_per_tick, diff --git a/azalea-client/src/plugins/events.rs b/azalea-client/src/plugins/events.rs index 0e30118a..ac26aaf5 100644 --- a/azalea-client/src/plugins/events.rs +++ b/azalea-client/src/plugins/events.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use azalea_chat::FormattedText; use azalea_core::tick::GameTick; -use azalea_entity::Dead; +use azalea_entity::{Dead, InLoadedChunk}; use azalea_protocol::packets::game::{ ClientboundGamePacket, c_player_combat_kill::ClientboundPlayerCombatKill, }; @@ -13,10 +13,11 @@ use azalea_world::{InstanceName, MinecraftEntityId}; use bevy_app::{App, Plugin, PreUpdate, Update}; use bevy_ecs::{ component::Component, + entity::Entity, event::EventReader, - query::{Added, With}, + query::{Added, With, Without}, schedule::IntoSystemConfigs, - system::Query, + system::{Commands, Query}, }; use derive_more::{Deref, DerefMut}; use tokio::sync::mpsc; @@ -59,17 +60,30 @@ use crate::{ /// Note: Events are sent before they're processed, so for example game ticks /// happen at the beginning of a tick before anything has happened. #[derive(Debug, Clone)] +#[non_exhaustive] pub enum Event { /// Happens right after the bot switches into the Game state, but before /// it's actually spawned. This can be useful for setting the client /// information with `Client::set_client_information`, so the packet /// doesn't have to be sent twice. /// - /// You may want to use [`Event::Login`] instead to wait for the bot to be + /// You may want to use [`Event::Spawn`] instead to wait for the bot to be /// in the world. Init, - /// The client is now in the world. Fired when we receive a login packet. + /// Fired when we receive a login packet, which is after [`Event::Init`] but + /// before [`Event::Spawn`]. You usually want [`Event::Spawn`] instead. + /// + /// Your position may be [`Vec3::ZERO`] immediately after you receive this + /// event, but it'll be ready by the time you get [`Event::Spawn`]. + /// + /// [`Vec3::ZERO`]: azalea_core::position::Vec3::ZERO Login, + /// Fired when the player fully spawns into the world and is ready to + /// interact with it. + /// + /// This is usually the event you should listen for when waiting for the bot + /// to be ready. + Spawn, /// A chat message was sent in the game chat. Chat(ChatPacket), /// Happens 20 times per second, but only when the world is loaded. @@ -125,6 +139,7 @@ impl Plugin for EventsPlugin { ( chat_listener, login_listener, + spawn_listener, packet_listener, add_player_listener, update_player_listener, @@ -156,12 +171,29 @@ pub fn login_listener(query: Query<&LocalPlayerEvents, Added> } } +/// A unit struct component that indicates that the entity has sent +/// [`Event::Spawn`]. +/// +/// This is just used internally by the [`spawn_listener`] system to avoid +/// sending the event twice for the same client. +#[derive(Component)] +pub struct SentSpawnEvent; +#[allow(clippy::type_complexity)] +pub fn spawn_listener( + query: Query<(Entity, &LocalPlayerEvents), (Added, Without)>, + mut commands: Commands, +) { + for (entity, local_player_events) in &query { + let _ = local_player_events.send(Event::Spawn); + commands.entity(entity).insert(SentSpawnEvent); + } +} + pub fn chat_listener(query: Query<&LocalPlayerEvents>, mut events: EventReader) { for event in events.read() { - let local_player_events = query - .get(event.entity) - .expect("Non-local entities shouldn't be able to receive chat events"); - let _ = local_player_events.send(Event::Chat(event.packet.clone())); + if let Ok(local_player_events) = query.get(event.entity) { + let _ = local_player_events.send(Event::Chat(event.packet.clone())); + } } } @@ -177,10 +209,9 @@ pub fn packet_listener( mut events: EventReader, ) { for event in events.read() { - let local_player_events = query - .get(event.entity) - .expect("Non-local entities shouldn't be able to receive packet events"); - let _ = local_player_events.send(Event::Packet(event.packet.clone())); + if let Ok(local_player_events) = query.get(event.entity) { + let _ = local_player_events.send(Event::Packet(event.packet.clone())); + } } } diff --git a/azalea-client/src/plugins/interact.rs b/azalea-client/src/plugins/interact.rs index 1a344cc8..a0dfa12a 100644 --- a/azalea-client/src/plugins/interact.rs +++ b/azalea-client/src/plugins/interact.rs @@ -22,7 +22,7 @@ use bevy_app::{App, Plugin, Update}; use bevy_ecs::{ component::Component, entity::Entity, - event::{Event, EventReader, EventWriter}, + event::{Event, EventReader}, query::{Changed, With}, schedule::IntoSystemConfigs, system::{Commands, Query, Res}, @@ -112,7 +112,7 @@ pub struct HitResultComponent(BlockHitResult); pub fn handle_block_interact_event( mut events: EventReader, mut query: Query<(Entity, &mut CurrentSequenceNumber, &HitResultComponent)>, - mut send_packet_events: EventWriter, + mut commands: Commands, ) { for event in events.read() { let Ok((entity, mut sequence_number, hit_result)) = query.get_mut(event.entity) else { @@ -150,7 +150,7 @@ pub fn handle_block_interact_event( } }; - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( entity, ServerboundUseItemOn { hand: InteractionHand::MainHand, @@ -299,12 +299,9 @@ pub fn can_use_game_master_blocks( pub struct SwingArmEvent { pub entity: Entity, } -pub fn handle_swing_arm_event( - mut events: EventReader, - mut send_packet_events: EventWriter, -) { +pub fn handle_swing_arm_event(mut events: EventReader, mut commands: Commands) { for event in events.read() { - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( event.entity, ServerboundSwing { hand: InteractionHand::MainHand, diff --git a/azalea-client/src/plugins/inventory.rs b/azalea-client/src/plugins/inventory.rs index 3f823ca2..da450ad7 100644 --- a/azalea-client/src/plugins/inventory.rs +++ b/azalea-client/src/plugins/inventory.rs @@ -21,7 +21,7 @@ use bevy_ecs::{ event::EventReader, prelude::{Event, EventWriter}, schedule::{IntoSystemConfigs, SystemSet}, - system::Query, + system::{Commands, Query}, }; use tracing::warn; @@ -610,7 +610,7 @@ fn handle_container_close_event( query: Query<(Entity, &Inventory)>, mut events: EventReader, mut client_side_events: EventWriter, - mut send_packet_events: EventWriter, + mut commands: Commands, ) { for event in events.read() { let (entity, inventory) = query.get(event.entity).unwrap(); @@ -622,7 +622,7 @@ fn handle_container_close_event( continue; } - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( entity, ServerboundContainerClose { container_id: inventory.id, @@ -662,7 +662,7 @@ pub struct ContainerClickEvent { pub fn handle_container_click_event( mut query: Query<(Entity, &mut Inventory)>, mut events: EventReader, - mut send_packet_events: EventWriter, + mut commands: Commands, ) { for event in events.read() { let (entity, mut inventory) = query.get_mut(event.entity).unwrap(); @@ -689,7 +689,7 @@ pub fn handle_container_click_event( } } - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( entity, ServerboundContainerClick { container_id: event.window_id, @@ -744,7 +744,7 @@ pub struct SetSelectedHotbarSlotEvent { } fn handle_set_selected_hotbar_slot_event( mut events: EventReader, - mut send_packet_events: EventWriter, + mut commands: Commands, mut query: Query<&mut Inventory>, ) { for event in events.read() { @@ -756,7 +756,7 @@ fn handle_set_selected_hotbar_slot_event( } inventory.selected_hotbar_slot = event.slot; - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( event.entity, ServerboundSetCarriedItem { slot: event.slot as u16, diff --git a/azalea-client/src/plugins/mining.rs b/azalea-client/src/plugins/mining.rs index beb380b7..d4a6f2a0 100644 --- a/azalea-client/src/plugins/mining.rs +++ b/azalea-client/src/plugins/mining.rs @@ -186,7 +186,7 @@ pub struct StartMiningBlockWithDirectionEvent { fn handle_start_mining_block_with_direction_event( mut events: EventReader, mut finish_mining_events: EventWriter, - mut send_packet_events: EventWriter, + mut commands: Commands, mut attack_block_events: EventWriter, mut mine_block_progress_events: EventWriter, mut query: Query<( @@ -204,7 +204,6 @@ fn handle_start_mining_block_with_direction_event( &mut MineBlockPos, )>, instances: Res, - mut commands: Commands, ) { for event in events.read() { let ( @@ -252,7 +251,7 @@ fn handle_start_mining_block_with_direction_event( { if mining.is_some() { // send a packet to stop mining since we just changed target - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( event.entity, ServerboundPlayerAction { action: s_player_action::Action::AbortDestroyBlock, @@ -324,7 +323,7 @@ fn handle_start_mining_block_with_direction_event( }); } - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( event.entity, ServerboundPlayerAction { action: s_player_action::Action::StartDestroyBlock, @@ -483,17 +482,16 @@ pub struct StopMiningBlockEvent { } pub fn handle_stop_mining_block_event( mut events: EventReader, - mut send_packet_events: EventWriter, + mut commands: Commands, mut mine_block_progress_events: EventWriter, mut query: Query<(&mut Mining, &MineBlockPos, &mut MineProgress)>, - mut commands: Commands, ) { for event in events.read() { let (mut _mining, mine_block_pos, mut mine_progress) = query.get_mut(event.entity).unwrap(); let mine_block_pos = mine_block_pos.expect("IsMining is true so MineBlockPos must be present"); - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( event.entity, ServerboundPlayerAction { action: s_player_action::Action::AbortDestroyBlock, @@ -529,13 +527,12 @@ pub fn continue_mining_block( &mut MineTicks, &mut CurrentSequenceNumber, )>, - mut send_packet_events: EventWriter, + mut commands: Commands, mut mine_block_progress_events: EventWriter, mut finish_mining_events: EventWriter, mut start_mining_events: EventWriter, mut swing_arm_events: EventWriter, instances: Res, - mut commands: Commands, ) { for ( entity, @@ -566,7 +563,7 @@ pub fn continue_mining_block( position: mining.pos, }); *sequence_number += 1; - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( entity, ServerboundPlayerAction { action: s_player_action::Action::StartDestroyBlock, @@ -611,7 +608,7 @@ pub fn continue_mining_block( entity, position: mining.pos, }); - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( entity, ServerboundPlayerAction { action: s_player_action::Action::StopDestroyBlock, diff --git a/azalea-client/src/plugins/mod.rs b/azalea-client/src/plugins/mod.rs index 11794fb3..b5005b22 100644 --- a/azalea-client/src/plugins/mod.rs +++ b/azalea-client/src/plugins/mod.rs @@ -9,6 +9,7 @@ pub mod inventory; pub mod mining; pub mod movement; pub mod packet; +pub mod pong; pub mod respawn; pub mod task_pool; pub mod tick_end; diff --git a/azalea-client/src/plugins/movement.rs b/azalea-client/src/plugins/movement.rs index 17b92e65..54a46bcb 100644 --- a/azalea-client/src/plugins/movement.rs +++ b/azalea-client/src/plugins/movement.rs @@ -17,7 +17,7 @@ use azalea_protocol::packets::{ }; use azalea_world::{MinecraftEntityId, MoveEntityError}; use bevy_app::{App, Plugin, Update}; -use bevy_ecs::prelude::{Event, EventWriter}; +use bevy_ecs::prelude::Event; use bevy_ecs::schedule::SystemSet; use bevy_ecs::system::Commands; use bevy_ecs::{ @@ -158,7 +158,7 @@ pub fn send_position( ), With, >, - mut send_packet_events: EventWriter, + mut commands: Commands, ) { for ( entity, @@ -245,7 +245,7 @@ pub fn send_position( }; if let Some(packet) = packet { - send_packet_events.send(SendPacketEvent { + commands.trigger(SendPacketEvent { sent_by: entity, packet, }); @@ -257,7 +257,6 @@ pub fn send_position( pub struct LastSentInput(pub ServerboundPlayerInput); pub fn send_player_input_packet( mut query: Query<(Entity, &PhysicsState, &Jumping, Option<&LastSentInput>)>, - mut send_packet_events: EventWriter, mut commands: Commands, ) { for (entity, physics_state, jumping, last_sent_input) in query.iter_mut() { @@ -279,7 +278,7 @@ pub fn send_player_input_packet( let last_sent_input = last_sent_input.cloned().unwrap_or_default(); if input != last_sent_input.0 { - send_packet_events.send(SendPacketEvent { + commands.trigger(SendPacketEvent { sent_by: entity, packet: input.clone().into_variant(), }); @@ -290,7 +289,7 @@ pub fn send_player_input_packet( fn send_sprinting_if_needed( mut query: Query<(Entity, &MinecraftEntityId, &Sprinting, &mut PhysicsState)>, - mut send_packet_events: EventWriter, + mut commands: Commands, ) { for (entity, minecraft_entity_id, sprinting, mut physics_state) in query.iter_mut() { let was_sprinting = physics_state.was_sprinting; @@ -300,7 +299,7 @@ fn send_sprinting_if_needed( } else { azalea_protocol::packets::game::s_player_command::Action::StopSprinting }; - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( entity, ServerboundPlayerCommand { id: *minecraft_entity_id, diff --git a/azalea-client/src/plugins/packet/config/events.rs b/azalea-client/src/plugins/packet/config/events.rs index eddcf72f..d0a7f3be 100644 --- a/azalea-client/src/plugins/packet/config/events.rs +++ b/azalea-client/src/plugins/packet/config/events.rs @@ -34,7 +34,7 @@ impl SendConfigPacketEvent { } } -pub fn handle_send_packet_event( +pub fn handle_outgoing_packets( mut send_packet_events: EventReader, mut query: Query<(&mut RawConnection, Option<&InConfigState>)>, ) { @@ -109,3 +109,13 @@ fn packet_interrupts(packet: &ClientboundConfigPacket) -> bool { | ClientboundConfigPacket::Transfer(_) ) } + +/// A Bevy trigger that's sent when our client receives a [`ClientboundPing`] +/// packet in the config state. +/// +/// See [`PingEvent`] for more information. +/// +/// [`ClientboundPing`]: azalea_protocol::packets::config::ClientboundPing +/// [`PingEvent`]: crate::packet::game::PingEvent +#[derive(Event, Debug, Clone)] +pub struct ConfigPingEvent(pub azalea_protocol::packets::config::ClientboundPing); diff --git a/azalea-client/src/plugins/packet/config/mod.rs b/azalea-client/src/plugins/packet/config/mod.rs index c9b84eac..ae601793 100644 --- a/azalea-client/src/plugins/packet/config/mod.rs +++ b/azalea-client/src/plugins/packet/config/mod.rs @@ -142,10 +142,8 @@ impl ConfigPacketHandler<'_> { pub fn ping(&mut self, p: ClientboundPing) { debug!("Got ping packet (in configuration) {p:?}"); - as_system::>(self.ecs, |query| { - let raw_conn = query.get(self.player).unwrap(); - - raw_conn.write_packet(ServerboundPong { id: p.id }).unwrap(); + as_system::(self.ecs, |mut commands| { + commands.trigger_targets(ConfigPingEvent(p), self.player); }); } diff --git a/azalea-client/src/plugins/packet/game/events.rs b/azalea-client/src/plugins/packet/game/events.rs index 5ba9972d..ad81f9bd 100644 --- a/azalea-client/src/plugins/packet/game/events.rs +++ b/azalea-client/src/plugins/packet/game/events.rs @@ -49,7 +49,7 @@ pub struct ReceivePacketEvent { } /// An event for sending a packet to the server while we're in the `game` state. -#[derive(Event)] +#[derive(Event, Clone, Debug)] pub struct SendPacketEvent { pub sent_by: Entity, pub packet: ServerboundGamePacket, @@ -61,25 +61,33 @@ impl SendPacketEvent { } } -pub fn handle_outgoing_packets( - mut send_packet_events: EventReader, +pub fn handle_outgoing_packets_observer( + trigger: Trigger, mut query: Query<(&mut RawConnection, Option<&InGameState>)>, ) { - for event in send_packet_events.read() { - if let Ok((raw_connection, in_game_state)) = query.get_mut(event.sent_by) { - if in_game_state.is_none() { - error!( - "Tried to send a game packet {:?} while not in game state", - event.packet - ); - continue; - } + let event = trigger.event(); - // debug!("Sending packet: {:?}", event.packet); - if let Err(e) = raw_connection.write_packet(event.packet.clone()) { - error!("Failed to send packet: {e}"); - } + if let Ok((raw_connection, in_game_state)) = query.get_mut(event.sent_by) { + if in_game_state.is_none() { + error!( + "Tried to send a game packet {:?} while not in game state", + event.packet + ); + return; } + + // debug!("Sending packet: {:?}", event.packet); + if let Err(e) = raw_connection.write_packet(event.packet.clone()) { + error!("Failed to send packet: {e}"); + } + } +} + +/// A system that converts [`SendPacketEvent`] events into triggers so they get +/// received by [`handle_outgoing_packets_observer`]. +pub fn handle_outgoing_packets(mut commands: Commands, mut events: EventReader) { + for event in events.read() { + commands.trigger(event.clone()); } } @@ -204,3 +212,21 @@ pub struct InstanceLoadedEvent { pub name: ResourceLocation, pub instance: Weak>, } + +/// A Bevy trigger that's sent when our client receives a [`ClientboundPing`] +/// packet in the game state. +/// +/// Also see [`ConfigPingEvent`] which is used for the config state. +/// +/// This is not an event and can't be listened to from a normal system, +///so `EventReader` will not work. +/// +/// To use it, add your "system" with `add_observer` instead of `add_systems` +/// and use `Trigger` instead of `EventReader`. +/// +/// The client Entity that received the packet will be attached to the trigger. +/// +/// [`ClientboundPing`]: azalea_protocol::packets::game::ClientboundPing +/// [`ConfigPingEvent`]: crate::packet::config::ConfigPingEvent +#[derive(Event, Debug, Clone)] +pub struct PingEvent(pub azalea_protocol::packets::game::ClientboundPing); diff --git a/azalea-client/src/plugins/packet/game/mod.rs b/azalea-client/src/plugins/packet/game/mod.rs index 588f5bf5..6bb93178 100644 --- a/azalea-client/src/plugins/packet/game/mod.rs +++ b/azalea-client/src/plugins/packet/game/mod.rs @@ -223,7 +223,6 @@ impl GamePacketHandler<'_> { EventWriter, ResMut, ResMut, - EventWriter, Query<&mut LoadedBy, Without>, )>( self.ecs, @@ -233,7 +232,6 @@ impl GamePacketHandler<'_> { mut instance_loaded_events, mut instance_container, mut entity_uuid_index, - mut send_packet_events, mut loaded_by_query, )| { let ( @@ -300,7 +298,7 @@ impl GamePacketHandler<'_> { let entity_bundle = EntityBundle::new( game_profile.uuid, - Vec3::default(), + Vec3::ZERO, azalea_registry::EntityKind::Player, new_instance_name, ); @@ -343,7 +341,7 @@ impl GamePacketHandler<'_> { "Sending client information because login: {:?}", client_information ); - send_packet_events.send(SendPacketEvent::new(self.player, + commands.trigger(SendPacketEvent::new(self.player, azalea_protocol::packets::game::s_client_information::ServerboundClientInformation { information: client_information.clone() }, )); }, @@ -436,8 +434,8 @@ impl GamePacketHandler<'_> { &mut Position, &mut LastSentPosition, )>, - EventWriter, - )>(self.ecs, |(mut query, mut send_packet_events)| { + Commands, + )>(self.ecs, |(mut query, mut commands)| { let Ok((mut physics, mut direction, mut position, mut last_sent_position)) = query.get_mut(self.player) else { @@ -508,11 +506,11 @@ impl GamePacketHandler<'_> { // send the relevant packets - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( self.player, ServerboundAcceptTeleportation { id: p.id }, )); - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( self.player, ServerboundMovePlayerPosRot { pos: new_pos, @@ -1044,14 +1042,14 @@ impl GamePacketHandler<'_> { pub fn keep_alive(&mut self, p: &ClientboundKeepAlive) { debug!("Got keep alive packet {p:?} for {:?}", self.player); - as_system::<(EventWriter, EventWriter)>( + as_system::<(EventWriter, Commands)>( self.ecs, - |(mut keepalive_events, mut send_packet_events)| { + |(mut keepalive_events, mut commands)| { keepalive_events.send(KeepAliveEvent { entity: self.player, id: p.id, }); - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( self.player, ServerboundKeepAlive { id: p.id }, )); @@ -1363,11 +1361,8 @@ impl GamePacketHandler<'_> { pub fn ping(&mut self, p: &ClientboundPing) { debug!("Got ping packet {p:?}"); - as_system::>(self.ecs, |mut events| { - events.send(SendPacketEvent::new( - self.player, - ServerboundPong { id: p.id }, - )); + as_system::(self.ecs, |mut commands| { + commands.trigger_targets(PingEvent(p.clone()), self.player); }); } @@ -1483,7 +1478,7 @@ impl GamePacketHandler<'_> { // this resets a bunch of our components like physics and stuff let entity_bundle = EntityBundle::new( game_profile.uuid, - Vec3::default(), + Vec3::ZERO, azalea_registry::EntityKind::Player, new_instance_name, ); diff --git a/azalea-client/src/plugins/packet/mod.rs b/azalea-client/src/plugins/packet/mod.rs index 96a396d9..826cd5cf 100644 --- a/azalea-client/src/plugins/packet/mod.rs +++ b/azalea-client/src/plugins/packet/mod.rs @@ -54,11 +54,12 @@ impl Plugin for PacketPlugin { login::process_packet_events, ), ) + .add_observer(game::handle_outgoing_packets_observer) .add_systems( Update, ( ( - config::handle_send_packet_event, + config::handle_outgoing_packets, game::handle_outgoing_packets, ) .chain(), diff --git a/azalea-client/src/plugins/pong.rs b/azalea-client/src/plugins/pong.rs new file mode 100644 index 00000000..827ddfb1 --- /dev/null +++ b/azalea-client/src/plugins/pong.rs @@ -0,0 +1,37 @@ +use bevy_app::{App, Plugin}; +use bevy_ecs::prelude::*; + +use super::packet::{ + config::{ConfigPingEvent, SendConfigPacketEvent}, + game::PingEvent, +}; +use crate::packet::game::SendPacketEvent; + +/// A plugin that replies to [`ClientboundPing`] packets with +/// [`ServerboundPong`]. +/// +/// This works in both the `game` and `config` states. +/// +/// [`ClientboundPing`]: azalea_protocol::packets::game::ClientboundPing +/// [`ServerboundPong`]: azalea_protocol::packets::game::ServerboundPong +pub struct PongPlugin; +impl Plugin for PongPlugin { + fn build(&self, app: &mut App) { + app.add_observer(reply_to_game_ping) + .add_observer(reply_to_config_ping); + } +} + +pub fn reply_to_game_ping(trigger: Trigger, mut commands: Commands) { + commands.trigger(SendPacketEvent::new( + trigger.entity(), + azalea_protocol::packets::game::ServerboundPong { id: trigger.0.id }, + )); +} + +pub fn reply_to_config_ping(trigger: Trigger, mut commands: Commands) { + commands.trigger(SendConfigPacketEvent::new( + trigger.entity(), + azalea_protocol::packets::config::ServerboundPong { id: trigger.0.id }, + )); +} diff --git a/azalea-client/src/plugins/respawn.rs b/azalea-client/src/plugins/respawn.rs index 5797406b..24479805 100644 --- a/azalea-client/src/plugins/respawn.rs +++ b/azalea-client/src/plugins/respawn.rs @@ -20,12 +20,9 @@ impl Plugin for RespawnPlugin { } } -pub fn perform_respawn( - mut events: EventReader, - mut send_packets: EventWriter, -) { +pub fn perform_respawn(mut events: EventReader, mut commands: Commands) { for event in events.read() { - send_packets.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( event.entity, ServerboundClientCommand { action: s_client_command::Action::PerformRespawn, diff --git a/azalea-client/src/plugins/tick_end.rs b/azalea-client/src/plugins/tick_end.rs index c7737eb1..6ad924ee 100644 --- a/azalea-client/src/plugins/tick_end.rs +++ b/azalea-client/src/plugins/tick_end.rs @@ -28,9 +28,9 @@ impl Plugin for TickEndPlugin { pub fn game_tick_packet( query: Query, With)>, - mut send_packets: EventWriter, + mut commands: Commands, ) { for entity in query.iter() { - send_packets.send(SendPacketEvent::new(entity, ServerboundClientTickEnd)); + commands.trigger(SendPacketEvent::new(entity, ServerboundClientTickEnd)); } } diff --git a/azalea-client/src/test_simulation.rs b/azalea-client/src/test_simulation.rs index 70da309e..7b422567 100644 --- a/azalea-client/src/test_simulation.rs +++ b/azalea-client/src/test_simulation.rs @@ -30,7 +30,6 @@ use uuid::Uuid; use crate::disconnect::DisconnectEvent; use crate::{ ClientInformation, GameProfileComponent, InConfigState, InstanceHolder, LocalPlayerBundle, - events::LocalPlayerEvents, raw_connection::{RawConnection, RawConnectionReader, RawConnectionWriter}, }; @@ -113,6 +112,15 @@ impl Simulation { pub fn has_component(&self) -> bool { self.app.world().get::(self.entity).is_some() } + pub fn resource(&self) -> T { + self.app.world().get_resource::().unwrap().clone() + } + pub fn with_resource(&self, f: impl FnOnce(&T)) { + f(self.app.world().get_resource::().unwrap()); + } + pub fn with_resource_mut(&mut self, f: impl FnOnce(Mut)) { + f(self.app.world_mut().get_resource_mut::().unwrap()); + } pub fn chunk(&self, chunk_pos: ChunkPos) -> Option>> { self.component::() @@ -182,14 +190,11 @@ fn create_local_player_bundle( connection_protocol, }; - let (local_player_events_sender, _local_player_events_receiver) = mpsc::unbounded_channel(); - let instance = Instance::default(); let instance_holder = InstanceHolder::new(entity, Arc::new(RwLock::new(instance))); let local_player_bundle = LocalPlayerBundle { raw_connection, - local_player_events: LocalPlayerEvents(local_player_events_sender), game_profile: GameProfileComponent(GameProfile::new(Uuid::nil(), "azalea".to_owned())), client_information: ClientInformation::default(), instance_holder, diff --git a/azalea-client/tests/receive_start_config_packet.rs b/azalea-client/tests/receive_start_config_packet.rs new file mode 100644 index 00000000..36762966 --- /dev/null +++ b/azalea-client/tests/receive_start_config_packet.rs @@ -0,0 +1,37 @@ +use azalea_client::{InConfigState, packet::game::SendPacketEvent, test_simulation::*}; +use azalea_core::resource_location::ResourceLocation; +use azalea_protocol::packets::{ConnectionProtocol, game::ClientboundStartConfiguration}; +use azalea_registry::DimensionType; +use azalea_world::InstanceName; +use bevy_ecs::event::Events; +use bevy_log::tracing_subscriber; + +#[test] +fn test_receive_start_config_packet() { + let _ = tracing_subscriber::fmt::try_init(); + + let mut simulation = Simulation::new(ConnectionProtocol::Game); + simulation.receive_packet(make_basic_login_packet( + DimensionType::new_raw(0), + ResourceLocation::new("minecraft:overworld"), + )); + simulation.tick(); + assert!(simulation.has_component::()); + simulation.tick(); + + // we shouldn't be using the `SendPacketEvent` event directly, we should be + // using the trigger instead + simulation.with_resource_mut::>(|send_packet_events| { + assert_eq!(send_packet_events.len(), 0); + }); + + simulation.receive_packet(ClientboundStartConfiguration); + + simulation.tick(); + assert!(simulation.has_component::()); + + // check again just in case + simulation.with_resource_mut::>(|send_packet_events| { + assert_eq!(send_packet_events.len(), 0); + }); +} diff --git a/azalea-client/tests/reply_to_ping_with_pong.rs b/azalea-client/tests/reply_to_ping_with_pong.rs new file mode 100644 index 00000000..4ef5b2cc --- /dev/null +++ b/azalea-client/tests/reply_to_ping_with_pong.rs @@ -0,0 +1,35 @@ +use std::sync::Arc; + +use azalea_client::{packet::game::SendPacketEvent, test_simulation::*}; +use azalea_protocol::packets::{ + ConnectionProtocol, + game::{ClientboundPing, ServerboundGamePacket}, +}; +use bevy_ecs::observer::Trigger; +use bevy_log::tracing_subscriber; +use parking_lot::Mutex; + +#[test] +fn reply_to_ping_with_pong() { + let _ = tracing_subscriber::fmt::try_init(); + + let mut simulation = Simulation::new(ConnectionProtocol::Game); + let reply_count = Arc::new(Mutex::new(0)); + let reply_count_clone = reply_count.clone(); + simulation + .app + .add_observer(move |trigger: Trigger| { + if trigger.sent_by == simulation.entity { + if let ServerboundGamePacket::Pong(packet) = &trigger.packet { + assert_eq!(packet.id, 123); + *reply_count_clone.lock() += 1; + } + } + }); + + simulation.tick(); + simulation.receive_packet(ClientboundPing { id: 123 }); + simulation.tick(); + + assert_eq!(*reply_count.lock(), 1); +} diff --git a/azalea-entity/src/lib.rs b/azalea-entity/src/lib.rs index 4893878a..88a1cfff 100644 --- a/azalea-entity/src/lib.rs +++ b/azalea-entity/src/lib.rs @@ -50,7 +50,7 @@ pub fn move_relative( pub fn input_vector(direction: &LookDirection, speed: f32, acceleration: &Vec3) -> Vec3 { let distance = acceleration.length_squared(); if distance < 1.0E-7 { - return Vec3::default(); + return Vec3::ZERO; } let acceleration = if distance > 1.0 { acceleration.normalize() @@ -140,8 +140,11 @@ impl Debug for EntityUuid { /// The position of the entity right now. /// -/// You are free to change this; there's systems that update the indexes -/// automatically. +/// You are free to change the value of this component; there's systems that +/// update the indexes automatically. +/// +/// Its value is set to a default of [`Vec3::ZERO`] when it receives the login +/// packet, its true position may be set ticks later. #[derive(Component, Clone, Copy, Debug, Default, PartialEq, Deref, DerefMut)] pub struct Position(Vec3); impl Position { @@ -304,7 +307,7 @@ pub struct Physics { impl Physics { pub fn new(dimensions: EntityDimensions, pos: Vec3) -> Self { Self { - velocity: Vec3::default(), + velocity: Vec3::ZERO, vec_delta_codec: VecDeltaCodec::new(pos), old_position: pos, diff --git a/azalea-physics/src/fluids.rs b/azalea-physics/src/fluids.rs index f8643b9c..c4716a27 100644 --- a/azalea-physics/src/fluids.rs +++ b/azalea-physics/src/fluids.rs @@ -109,7 +109,7 @@ fn update_fluid_height_and_do_fluid_pushing( let mut min_height_touching = 0.; let is_entity_pushable_by_fluid = true; let mut touching_fluid = false; - let mut additional_player_delta = Vec3::default(); + let mut additional_player_delta = Vec3::ZERO; let mut num_fluids_being_touched = 0; for cur_x in min_x..max_x { diff --git a/azalea/src/accept_resource_packs.rs b/azalea/src/accept_resource_packs.rs index 560140d0..25caf93d 100644 --- a/azalea/src/accept_resource_packs.rs +++ b/azalea/src/accept_resource_packs.rs @@ -1,7 +1,7 @@ use azalea_client::InConfigState; use azalea_client::chunks::handle_chunk_batch_finished_event; use azalea_client::inventory::InventorySet; -use azalea_client::packet::config::{SendConfigPacketEvent, handle_send_packet_event}; +use azalea_client::packet::config::{SendConfigPacketEvent, handle_outgoing_packets}; use azalea_client::packet::game::SendPacketEvent; use azalea_client::packet::{death_event_on_0_health, game::ResourcePackEvent}; use azalea_client::respawn::perform_respawn; @@ -24,7 +24,7 @@ impl Plugin for AcceptResourcePacksPlugin { .after(death_event_on_0_health) .after(handle_chunk_batch_finished_event) .after(InventorySet) - .before(handle_send_packet_event) + .before(handle_outgoing_packets) .after(azalea_client::brand::handle_end_login_state), ); } @@ -32,7 +32,7 @@ impl Plugin for AcceptResourcePacksPlugin { fn accept_resource_pack( mut events: EventReader, - mut send_packet_events: EventWriter, + mut commands: Commands, mut send_config_packet_events: EventWriter, query_in_config_state: Query>, ) { @@ -57,14 +57,14 @@ fn accept_resource_pack( }, )); } else { - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( event.entity, ServerboundResourcePack { id: event.id, action: s_resource_pack::Action::Accepted, }, )); - send_packet_events.send(SendPacketEvent::new( + commands.trigger(SendPacketEvent::new( event.entity, ServerboundResourcePack { id: event.id, diff --git a/azalea/src/swarm/mod.rs b/azalea/src/swarm/mod.rs index 17a3dfe3..2062446a 100644 --- a/azalea/src/swarm/mod.rs +++ b/azalea/src/swarm/mod.rs @@ -539,6 +539,7 @@ impl Default for SwarmBuilder { /// An event about something that doesn't have to do with a single bot. #[derive(Clone, Debug)] +#[non_exhaustive] pub enum SwarmEvent { /// All the bots in the swarm have successfully joined the server. Login, @@ -656,13 +657,16 @@ impl Swarm { .custom_resolved_address .unwrap_or_else(|| *self.resolved_address.read()); - let (bot, rx) = Client::start_client(StartClientOpts { + let (tx, rx) = mpsc::unbounded_channel(); + + let bot = Client::start_client(StartClientOpts { ecs_lock: self.ecs_lock.clone(), account, address: &address, resolved_address: &resolved_address, proxy: join_opts.proxy.clone(), run_schedule_sender: self.run_schedule_sender.clone(), + event_sender: Some(tx), }) .await?; // add the state to the client