1
2
Fork 0
mirror of https://github.com/mat-1/azalea.git synced 2025-08-02 23:44:38 +00:00

update to bevy 0.16

This commit is contained in:
mat 2025-04-25 01:10:03 -01:00
commit b3af8d73fa
34 changed files with 283 additions and 311 deletions

300
Cargo.lock generated
View file

@ -28,20 +28,6 @@ dependencies = [
"cpufeatures", "cpufeatures",
] ]
[[package]]
name = "ahash"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
"cfg-if",
"const-random",
"getrandom 0.2.16",
"once_cell",
"version_check",
"zerocopy 0.7.35",
]
[[package]] [[package]]
name = "aho-corasick" name = "aho-corasick"
version = "1.1.3" version = "1.1.3"
@ -51,12 +37,6 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "allocator-api2"
version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]] [[package]]
name = "android_log-sys" name = "android_log-sys"
version = "0.3.2" version = "0.3.2"
@ -202,6 +182,9 @@ name = "async-task"
version = "4.7.1" version = "4.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
dependencies = [
"portable-atomic",
]
[[package]] [[package]]
name = "async-trait" name = "async-trait"
@ -214,6 +197,15 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "atomic-waker"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
dependencies = [
"portable-atomic",
]
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.4.0" version = "1.4.0"
@ -600,28 +592,32 @@ checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3"
[[package]] [[package]]
name = "bevy_app" name = "bevy_app"
version = "0.15.3" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0ac033a388b8699d241499a43783a09e6a3bab2430f1297c6bd4974095efb3f" checksum = "a2b6267ac23a9947d5b2725ff047a1e1add70076d85fa9fb73d044ab9bea1f3c"
dependencies = [ dependencies = [
"bevy_derive", "bevy_derive",
"bevy_ecs", "bevy_ecs",
"bevy_platform",
"bevy_reflect", "bevy_reflect",
"bevy_tasks", "bevy_tasks",
"bevy_utils", "bevy_utils",
"cfg-if",
"console_error_panic_hook", "console_error_panic_hook",
"ctrlc", "ctrlc",
"derive_more 1.0.0",
"downcast-rs", "downcast-rs",
"log",
"thiserror 2.0.12",
"variadics_please",
"wasm-bindgen", "wasm-bindgen",
"web-sys", "web-sys",
] ]
[[package]] [[package]]
name = "bevy_derive" name = "bevy_derive"
version = "0.15.3" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57d94761ce947b0a2402fd949fe1e7a5b1535293130ba4cd9893be6295d4680a" checksum = "f626531b9c05c25a758ede228727bd11c2c2c8498ecbed9925044386d525a2a3"
dependencies = [ dependencies = [
"bevy_macro_utils", "bevy_macro_utils",
"quote", "quote",
@ -630,30 +626,37 @@ dependencies = [
[[package]] [[package]]
name = "bevy_ecs" name = "bevy_ecs"
version = "0.15.3" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1597106cc01e62e6217ccb662e0748b2ce330893f27c7dc17bac33e0bb99bca9" checksum = "d9e807b5d9aab3bb8dfe47e7a44c9ff088bad2ceefe299b80ac77609a87fe9d4"
dependencies = [ dependencies = [
"arrayvec",
"bevy_ecs_macros", "bevy_ecs_macros",
"bevy_platform",
"bevy_ptr", "bevy_ptr",
"bevy_reflect", "bevy_reflect",
"bevy_tasks", "bevy_tasks",
"bevy_utils", "bevy_utils",
"bitflags", "bitflags",
"bumpalo",
"concurrent-queue", "concurrent-queue",
"derive_more 1.0.0", "derive_more 1.0.0",
"disqualified", "disqualified",
"fixedbitset 0.5.7", "fixedbitset 0.5.7",
"indexmap",
"log",
"nonmax", "nonmax",
"petgraph", "serde",
"smallvec", "smallvec",
"thiserror 2.0.12",
"variadics_please",
] ]
[[package]] [[package]]
name = "bevy_ecs_macros" name = "bevy_ecs_macros"
version = "0.15.3" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f453adf07712b39826bc5845e5b0887ce03204ee8359bbe6b40a9afda60564a1" checksum = "467d7bb98aeb8dd30f36e6a773000c12a891d4f1bee2adc3841ec89cc8eaf54e"
dependencies = [ dependencies = [
"bevy_macro_utils", "bevy_macro_utils",
"proc-macro2", "proc-macro2",
@ -663,14 +666,15 @@ dependencies = [
[[package]] [[package]]
name = "bevy_log" name = "bevy_log"
version = "0.15.3" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b381a22e01f24af51536ef1eace94298dd555d06ffcf368125d16317f5f179cb" checksum = "7156df8d2f11135cf71c03eb4c11132b65201fd4f51648571e59e39c9c9ee2f6"
dependencies = [ dependencies = [
"android_log-sys", "android_log-sys",
"bevy_app", "bevy_app",
"bevy_ecs", "bevy_ecs",
"bevy_utils", "bevy_utils",
"tracing",
"tracing-log", "tracing-log",
"tracing-oslog", "tracing-oslog",
"tracing-subscriber", "tracing-subscriber",
@ -679,10 +683,11 @@ dependencies = [
[[package]] [[package]]
name = "bevy_macro_utils" name = "bevy_macro_utils"
version = "0.15.3" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bb6ded1ddc124ea214f6a2140e47a78d1fe79b0638dad39419cdeef2e1133f1" checksum = "7a2473db70d8785b5c75d6dd951a2e51e9be2c2311122db9692c79c9d887517b"
dependencies = [ dependencies = [
"parking_lot",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn",
@ -690,18 +695,37 @@ dependencies = [
] ]
[[package]] [[package]]
name = "bevy_ptr" name = "bevy_platform"
version = "0.15.3" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89fe0b0b919146939481a3a7c38864face2c6d0fd2c73ab3d430dc693ecd9b11" checksum = "704db2c11b7bc31093df4fbbdd3769f9606a6a5287149f4b51f2680f25834ebc"
dependencies = [
"cfg-if",
"critical-section",
"foldhash",
"getrandom 0.2.16",
"hashbrown",
"portable-atomic",
"portable-atomic-util",
"serde",
"spin",
"web-time",
]
[[package]]
name = "bevy_ptr"
version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86f1275dfb4cfef4ffc90c3fa75408964864facf833acc932413d52aa5364ba4"
[[package]] [[package]]
name = "bevy_reflect" name = "bevy_reflect"
version = "0.15.3" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ddbca0a39e88eff2c301dc794ee9d73a53f4b08d47b2c9b5a6aac182fae6217" checksum = "607ebacc31029cf2f39ac330eabf1d4bc411b159528ec08dbe6b0593eaccfd41"
dependencies = [ dependencies = [
"assert_type_match", "assert_type_match",
"bevy_platform",
"bevy_ptr", "bevy_ptr",
"bevy_reflect_derive", "bevy_reflect_derive",
"bevy_utils", "bevy_utils",
@ -709,16 +733,22 @@ dependencies = [
"disqualified", "disqualified",
"downcast-rs", "downcast-rs",
"erased-serde", "erased-serde",
"foldhash",
"glam",
"serde", "serde",
"smallvec", "smallvec",
"smol_str", "smol_str",
"thiserror 2.0.12",
"uuid",
"variadics_please",
"wgpu-types",
] ]
[[package]] [[package]]
name = "bevy_reflect_derive" name = "bevy_reflect_derive"
version = "0.15.3" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d62affb769db17d34ad0b75ff27eca94867e2acc8ea350c5eca97d102bd98709" checksum = "cf35e45e4eb239018369f63f2adc2107a54c329f9276d020e01eee1625b0238b"
dependencies = [ dependencies = [
"bevy_macro_utils", "bevy_macro_utils",
"proc-macro2", "proc-macro2",
@ -729,56 +759,49 @@ dependencies = [
[[package]] [[package]]
name = "bevy_tasks" name = "bevy_tasks"
version = "0.15.3" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "028630ddc355563bd567df1076db3515858aa26715ddf7467d2086f9b40e5ab1" checksum = "444c450b65e108855f42ecb6db0c041a56ea7d7f10cc6222f0ca95e9536a7d19"
dependencies = [ dependencies = [
"async-channel", "async-channel",
"async-executor", "async-executor",
"async-task",
"atomic-waker",
"bevy_platform",
"cfg-if",
"concurrent-queue", "concurrent-queue",
"crossbeam-queue",
"derive_more 1.0.0",
"futures-channel", "futures-channel",
"futures-lite", "futures-lite",
"heapless",
"pin-project", "pin-project",
"wasm-bindgen-futures", "wasm-bindgen-futures",
] ]
[[package]] [[package]]
name = "bevy_time" name = "bevy_time"
version = "0.15.3" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b2051ec56301b994f7c182a2a6eb1490038149ad46d95eee715e1a922acdfd9" checksum = "456369ca10f8e039aaf273332744674844827854833ee29e28f9e161702f2f55"
dependencies = [ dependencies = [
"bevy_app", "bevy_app",
"bevy_ecs", "bevy_ecs",
"bevy_platform",
"bevy_reflect", "bevy_reflect",
"bevy_utils",
"crossbeam-channel", "crossbeam-channel",
"log",
"serde",
] ]
[[package]] [[package]]
name = "bevy_utils" name = "bevy_utils"
version = "0.15.3" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63c2174d43a0de99f863c98a472370047a2bfa7d1e5cec8d9d647fb500905d9d" checksum = "ac2da3b3c1f94dadefcbe837aaa4aa119fcea37f7bdc5307eb05b4ede1921e24"
dependencies = [ dependencies = [
"ahash", "bevy_platform",
"bevy_utils_proc_macros",
"getrandom 0.2.16",
"hashbrown 0.14.5",
"thread_local", "thread_local",
"tracing",
"web-time",
]
[[package]]
name = "bevy_utils_proc_macros"
version = "0.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94847541f6dd2e28f54a9c2b0e857da5f2631e2201ebc25ce68781cdcb721391"
dependencies = [
"proc-macro2",
"quote",
"syn",
] ]
[[package]] [[package]]
@ -806,6 +829,9 @@ name = "bitflags"
version = "2.9.0" version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "block-buffer" name = "block-buffer"
@ -999,6 +1025,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
dependencies = [ dependencies = [
"crossbeam-utils", "crossbeam-utils",
"portable-atomic",
] ]
[[package]] [[package]]
@ -1017,26 +1044,6 @@ version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
[[package]]
name = "const-random"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359"
dependencies = [
"const-random-macro",
]
[[package]]
name = "const-random-macro"
version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
dependencies = [
"getrandom 0.2.16",
"once_cell",
"tiny-keccak",
]
[[package]] [[package]]
name = "cpufeatures" name = "cpufeatures"
version = "0.2.17" version = "0.2.17"
@ -1125,6 +1132,15 @@ dependencies = [
"crossbeam-utils", "crossbeam-utils",
] ]
[[package]]
name = "crossbeam-queue"
version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115"
dependencies = [
"crossbeam-utils",
]
[[package]] [[package]]
name = "crossbeam-utils" name = "crossbeam-utils"
version = "0.8.21" version = "0.8.21"
@ -1245,9 +1261,9 @@ checksum = "c9c272297e804878a2a4b707cfcfc6d2328b5bb936944613b4fdf2b9269afdfd"
[[package]] [[package]]
name = "downcast-rs" name = "downcast-rs"
version = "1.2.1" version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" checksum = "ea8a8b81cacc08888170eef4d13b775126db426d0b348bee9d18c2c1eaf123cf"
[[package]] [[package]]
name = "either" name = "either"
@ -1362,6 +1378,12 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "foldhash"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
[[package]] [[package]]
name = "form_urlencoded" name = "form_urlencoded"
version = "1.2.1" version = "1.2.1"
@ -1529,6 +1551,15 @@ version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
[[package]]
name = "glam"
version = "0.29.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "glob" name = "glob"
version = "0.3.2" version = "0.3.2"
@ -1546,14 +1577,12 @@ dependencies = [
] ]
[[package]] [[package]]
name = "hashbrown" name = "hash32"
version = "0.14.5" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"
dependencies = [ dependencies = [
"ahash", "byteorder",
"allocator-api2",
"serde",
] ]
[[package]] [[package]]
@ -1561,6 +1590,21 @@ name = "hashbrown"
version = "0.15.2" version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
dependencies = [
"equivalent",
"serde",
]
[[package]]
name = "heapless"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
dependencies = [
"hash32",
"portable-atomic",
"stable_deref_trait",
]
[[package]] [[package]]
name = "heck" name = "heck"
@ -1872,7 +1916,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown 0.15.2", "hashbrown",
] ]
[[package]] [[package]]
@ -2475,7 +2519,7 @@ version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
dependencies = [ dependencies = [
"zerocopy 0.8.24", "zerocopy",
] ]
[[package]] [[package]]
@ -3111,6 +3155,9 @@ name = "spin"
version = "0.9.8" version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
dependencies = [
"portable-atomic",
]
[[package]] [[package]]
name = "spki" name = "spki"
@ -3237,15 +3284,6 @@ dependencies = [
"once_cell", "once_cell",
] ]
[[package]]
name = "tiny-keccak"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
dependencies = [
"crunchy",
]
[[package]] [[package]]
name = "tinystr" name = "tinystr"
version = "0.7.6" version = "0.7.6"
@ -3531,13 +3569,15 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]] [[package]]
name = "uuid" name = "uuid"
version = "1.12.1" version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
dependencies = [ dependencies = [
"getrandom 0.2.16", "getrandom 0.3.2",
"js-sys",
"md-5", "md-5",
"serde", "serde",
"wasm-bindgen",
] ]
[[package]] [[package]]
@ -3546,6 +3586,17 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
[[package]]
name = "variadics_please"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41b6d82be61465f97d42bd1d15bf20f3b0a3a0905018f38f9d6f6962055b0b5c"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.5" version = "0.9.5"
@ -3686,6 +3737,19 @@ dependencies = [
"rustls-pki-types", "rustls-pki-types",
] ]
[[package]]
name = "wgpu-types"
version = "24.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c"
dependencies = [
"bitflags",
"js-sys",
"log",
"serde",
"web-sys",
]
[[package]] [[package]]
name = "widestring" name = "widestring"
version = "1.2.0" version = "1.2.0"
@ -4098,33 +4162,13 @@ dependencies = [
"synstructure", "synstructure",
] ]
[[package]]
name = "zerocopy"
version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
"zerocopy-derive 0.7.35",
]
[[package]] [[package]]
name = "zerocopy" name = "zerocopy"
version = "0.8.24" version = "0.8.24"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879"
dependencies = [ dependencies = [
"zerocopy-derive 0.8.24", "zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
"syn",
] ]
[[package]] [[package]]

View file

@ -30,14 +30,14 @@ repository = "https://github.com/azalea-rs/azalea"
[workspace.dependencies] [workspace.dependencies]
aes = "0.8.4" aes = "0.8.4"
anyhow = "1.0.97" anyhow = "1.0.98"
async-recursion = "1.1.1" async-recursion = "1.1.1"
base64 = "0.22.1" base64 = "0.22.1"
bevy_app = "0.15.3" bevy_app = "0.16.0"
bevy_ecs = { version = "0.15.3", default-features = false } bevy_ecs = { version = "0.16.0", default-features = false }
bevy_log = "0.15.3" bevy_log = "0.16.0"
bevy_tasks = "0.15.3" bevy_tasks = "0.16.0"
bevy_time = "0.15.3" bevy_time = "0.16.0"
byteorder = "1.5.0" byteorder = "1.5.0"
cfb8 = "0.8.1" cfb8 = "0.8.1"
chrono = { version = "0.4.40", default-features = false } chrono = { version = "0.4.40", default-features = false }
@ -54,7 +54,7 @@ nohash-hasher = "0.2.0"
num-bigint = "0.4.6" num-bigint = "0.4.6"
num-traits = "0.2.19" num-traits = "0.2.19"
parking_lot = "0.12.3" parking_lot = "0.12.3"
proc-macro2 = "1.0.94" proc-macro2 = "1.0.95"
quote = "1.0.40" quote = "1.0.40"
rand = "0.8.4" rand = "0.8.4"
regex = "1.11.1" regex = "1.11.1"
@ -71,11 +71,11 @@ socks5-impl = "0.6.2"
syn = "2.0.100" syn = "2.0.100"
thiserror = "2.0.12" thiserror = "2.0.12"
tokio = "1.44.2" tokio = "1.44.2"
tokio-util = "0.7.14" tokio-util = "0.7.15"
tracing = "0.1.41" tracing = "0.1.41"
tracing-subscriber = "0.3.19" tracing-subscriber = "0.3.19"
hickory-resolver = { version = "0.25.1", default-features = false, git = "https://github.com/hickory-dns/hickory-dns" } hickory-resolver = { version = "0.25.1", default-features = false, git = "https://github.com/hickory-dns/hickory-dns" }
uuid = "1.12" uuid = "1.16"
num-format = "0.4.4" num-format = "0.4.4"
indexmap = "2.9.0" indexmap = "2.9.0"
paste = "1.0.15" paste = "1.0.15"

View file

@ -7,12 +7,7 @@ use azalea_brigadier::{
context::CommandContext, context::CommandContext,
}; };
use bevy_app::App; use bevy_app::App;
use bevy_ecs::{ use bevy_ecs::{prelude::*, system::RunSystemOnce};
component::Component,
query::With,
system::{Query, Resource, RunSystemOnce},
world::{FromWorld, World},
};
use parking_lot::Mutex; use parking_lot::Mutex;
#[test] #[test]

View file

@ -32,12 +32,8 @@ use azalea_protocol::{
use azalea_world::{Instance, InstanceContainer, InstanceName, MinecraftEntityId, PartialInstance}; use azalea_world::{Instance, InstanceContainer, InstanceName, MinecraftEntityId, PartialInstance};
use bevy_app::{App, Plugin, PluginsState, Update}; use bevy_app::{App, Plugin, PluginsState, Update};
use bevy_ecs::{ use bevy_ecs::{
bundle::Bundle, prelude::*,
component::Component, schedule::{InternedScheduleLabel, LogLevel, ScheduleBuildSettings},
entity::Entity,
schedule::{InternedScheduleLabel, IntoSystemConfigs, LogLevel, ScheduleBuildSettings},
system::Resource,
world::World,
}; };
use parking_lot::{Mutex, RwLock}; use parking_lot::{Mutex, RwLock};
use simdnbt::owned::NbtCompound; use simdnbt::owned::NbtCompound;

View file

@ -35,7 +35,8 @@ impl Plugin for AttackPlugin {
update_attack_strength_scale.after(PhysicsSet), update_attack_strength_scale.after(PhysicsSet),
handle_attack_queued handle_attack_queued
.before(super::tick_end::game_tick_packet) .before(super::tick_end::game_tick_packet)
.after(super::movement::send_sprinting_if_needed), .after(super::movement::send_sprinting_if_needed)
.before(super::movement::send_position),
) )
.chain(), .chain(),
); );

View file

@ -10,12 +10,7 @@ use azalea_protocol::packets::game::{
c_system_chat::ClientboundSystemChat, c_system_chat::ClientboundSystemChat,
}; };
use bevy_app::{App, Plugin, Update}; use bevy_app::{App, Plugin, Update};
use bevy_ecs::{ use bevy_ecs::prelude::*;
entity::Entity,
event::{EventReader, EventWriter},
prelude::Event,
schedule::IntoSystemConfigs,
};
use handler::{SendChatKindEvent, handle_send_chat_kind_event}; use handler::{SendChatKindEvent, handle_send_chat_kind_event};
use uuid::Uuid; use uuid::Uuid;
@ -204,13 +199,13 @@ pub fn handle_send_chat_event(
) { ) {
for event in events.read() { for event in events.read() {
if event.content.starts_with('/') { if event.content.starts_with('/') {
send_chat_kind_events.send(SendChatKindEvent { send_chat_kind_events.write(SendChatKindEvent {
entity: event.entity, entity: event.entity,
content: event.content[1..].to_string(), content: event.content[1..].to_string(),
kind: ChatKind::Command, kind: ChatKind::Command,
}); });
} else { } else {
send_chat_kind_events.send(SendChatKindEvent { send_chat_kind_events.write(SendChatKindEvent {
entity: event.entity, entity: event.entity,
content: event.content.clone(), content: event.content.clone(),
kind: ChatKind::Message, kind: ChatKind::Message,

View file

@ -3,15 +3,7 @@
use azalea_chat::FormattedText; use azalea_chat::FormattedText;
use azalea_entity::{EntityBundle, InLoadedChunk, LocalEntity, metadata::PlayerMetadataBundle}; use azalea_entity::{EntityBundle, InLoadedChunk, LocalEntity, metadata::PlayerMetadataBundle};
use bevy_app::{App, Plugin, PostUpdate}; use bevy_app::{App, Plugin, PostUpdate};
use bevy_ecs::{ use bevy_ecs::prelude::*;
component::Component,
entity::Entity,
event::{EventReader, EventWriter},
prelude::Event,
query::{Changed, With},
schedule::IntoSystemConfigs,
system::{Commands, Query},
};
use derive_more::Deref; use derive_more::Deref;
use tracing::info; use tracing::info;
@ -101,7 +93,7 @@ fn disconnect_on_connection_dead(
) { ) {
for (entity, &is_connection_alive) in &query { for (entity, &is_connection_alive) in &query {
if !*is_connection_alive { if !*is_connection_alive {
disconnect_events.send(DisconnectEvent { disconnect_events.write(DisconnectEvent {
entity, entity,
reason: None, reason: None,
}); });

View file

@ -9,14 +9,7 @@ use azalea_entity::{Dead, InLoadedChunk};
use azalea_protocol::packets::game::c_player_combat_kill::ClientboundPlayerCombatKill; use azalea_protocol::packets::game::c_player_combat_kill::ClientboundPlayerCombatKill;
use azalea_world::{InstanceName, MinecraftEntityId}; use azalea_world::{InstanceName, MinecraftEntityId};
use bevy_app::{App, Plugin, PreUpdate, Update}; use bevy_app::{App, Plugin, PreUpdate, Update};
use bevy_ecs::{ use bevy_ecs::prelude::*;
component::Component,
entity::Entity,
event::EventReader,
query::{Added, With, Without},
schedule::IntoSystemConfigs,
system::{Commands, Query},
};
use derive_more::{Deref, DerefMut}; use derive_more::{Deref, DerefMut};
use tokio::sync::mpsc; use tokio::sync::mpsc;

View file

@ -19,15 +19,7 @@ use azalea_protocol::packets::game::{
}; };
use azalea_world::{Instance, InstanceContainer, InstanceName}; use azalea_world::{Instance, InstanceContainer, InstanceName};
use bevy_app::{App, Plugin, Update}; use bevy_app::{App, Plugin, Update};
use bevy_ecs::{ use bevy_ecs::prelude::*;
component::Component,
entity::Entity,
event::{Event, EventReader},
observer::Trigger,
query::{Changed, With},
schedule::IntoSystemConfigs,
system::{Commands, Query, Res},
};
use derive_more::{Deref, DerefMut}; use derive_more::{Deref, DerefMut};
use tracing::warn; use tracing::warn;

View file

@ -16,14 +16,7 @@ use azalea_protocol::packets::game::{
}; };
use azalea_registry::MenuKind; use azalea_registry::MenuKind;
use bevy_app::{App, Plugin, Update}; use bevy_app::{App, Plugin, Update};
use bevy_ecs::{ use bevy_ecs::prelude::*;
component::Component,
entity::Entity,
event::EventReader,
prelude::{Event, EventWriter},
schedule::{IntoSystemConfigs, SystemSet},
system::{Commands, Query},
};
use tracing::{error, warn}; use tracing::{error, warn};
use crate::{ use crate::{
@ -628,7 +621,7 @@ fn handle_container_close_event(
container_id: inventory.id, container_id: inventory.id,
}, },
)); ));
client_side_events.send(ClientSideCloseContainerEvent { client_side_events.write(ClientSideCloseContainerEvent {
entity: event.entity, entity: event.entity,
}); });
} }

View file

@ -27,7 +27,7 @@ fn handle_receive_hello_event(trigger: Trigger<ReceiveHelloEvent>, mut commands:
let account = trigger.account.clone(); let account = trigger.account.clone();
let packet = trigger.packet.clone(); let packet = trigger.packet.clone();
let player = trigger.entity(); let player = trigger.target();
let task = task_pool.spawn(auth_with_account(account, packet)); let task = task_pool.spawn(auth_with_account(account, packet));
commands.entity(player).insert(AuthTask(task)); commands.entity(player).insert(AuthTask(task));

View file

@ -127,12 +127,12 @@ fn handle_auto_mine(
)) ))
&& !hit_result_component.miss && !hit_result_component.miss
{ {
start_mining_block_event.send(StartMiningBlockEvent { start_mining_block_event.write(StartMiningBlockEvent {
entity, entity,
position: block_pos, position: block_pos,
}); });
} else if mining.is_some() && hit_result_component.miss { } else if mining.is_some() && hit_result_component.miss {
stop_mining_block_event.send(StopMiningBlockEvent { entity }); stop_mining_block_event.write(StopMiningBlockEvent { entity });
} }
} }
} }
@ -168,7 +168,7 @@ fn handle_start_mining_block_event(
// we're not looking at the block, arbitrary direction // we're not looking at the block, arbitrary direction
Direction::Down Direction::Down
}; };
start_mining_events.send(StartMiningBlockWithDirectionEvent { start_mining_events.write(StartMiningBlockWithDirectionEvent {
entity: event.entity, entity: event.entity,
position: event.position, position: event.position,
direction, direction,
@ -236,7 +236,7 @@ fn handle_start_mining_block_with_direction_event(
if game_mode.current == GameMode::Creative { if game_mode.current == GameMode::Creative {
*sequence_number += 1; *sequence_number += 1;
finish_mining_events.send(FinishMiningBlockEvent { finish_mining_events.write(FinishMiningBlockEvent {
entity: event.entity, entity: event.entity,
position: event.position, position: event.position,
}); });
@ -283,7 +283,7 @@ fn handle_start_mining_block_with_direction_event(
if block_is_solid && **mine_progress == 0. { if block_is_solid && **mine_progress == 0. {
// interact with the block (like note block left click) here // interact with the block (like note block left click) here
attack_block_events.send(AttackBlockEvent { attack_block_events.write(AttackBlockEvent {
entity: event.entity, entity: event.entity,
position: event.position, position: event.position,
}); });
@ -303,7 +303,7 @@ fn handle_start_mining_block_with_direction_event(
) >= 1. ) >= 1.
{ {
// block was broken instantly // block was broken instantly
finish_mining_events.send(FinishMiningBlockEvent { finish_mining_events.write(FinishMiningBlockEvent {
entity: event.entity, entity: event.entity,
position: event.position, position: event.position,
}); });
@ -316,7 +316,7 @@ fn handle_start_mining_block_with_direction_event(
**current_mining_item = held_item; **current_mining_item = held_item;
**mine_progress = 0.; **mine_progress = 0.;
**mine_ticks = 0.; **mine_ticks = 0.;
mine_block_progress_events.send(MineBlockProgressEvent { mine_block_progress_events.write(MineBlockProgressEvent {
entity: event.entity, entity: event.entity,
position: event.position, position: event.position,
destroy_stage: mine_progress.destroy_stage(), destroy_stage: mine_progress.destroy_stage(),
@ -502,7 +502,7 @@ pub fn handle_stop_mining_block_event(
)); ));
commands.entity(event.entity).remove::<Mining>(); commands.entity(event.entity).remove::<Mining>();
**mine_progress = 0.; **mine_progress = 0.;
mine_block_progress_events.send(MineBlockProgressEvent { mine_block_progress_events.write(MineBlockProgressEvent {
entity: event.entity, entity: event.entity,
position: mine_block_pos, position: mine_block_pos,
destroy_stage: None, destroy_stage: None,
@ -558,7 +558,7 @@ pub fn continue_mining_block(
if game_mode.current == GameMode::Creative { if game_mode.current == GameMode::Creative {
// TODO: worldborder check // TODO: worldborder check
**mine_delay = 5; **mine_delay = 5;
finish_mining_events.send(FinishMiningBlockEvent { finish_mining_events.write(FinishMiningBlockEvent {
entity, entity,
position: mining.pos, position: mining.pos,
}); });
@ -572,7 +572,7 @@ pub fn continue_mining_block(
sequence: **sequence_number, sequence: **sequence_number,
}, },
)); ));
swing_arm_events.send(SwingArmEvent { entity }); swing_arm_events.write(SwingArmEvent { entity });
} else if is_same_mining_target( } else if is_same_mining_target(
mining.pos, mining.pos,
inventory, inventory,
@ -604,7 +604,7 @@ pub fn continue_mining_block(
if **mine_progress >= 1. { if **mine_progress >= 1. {
commands.entity(entity).remove::<Mining>(); commands.entity(entity).remove::<Mining>();
*sequence_number += 1; *sequence_number += 1;
finish_mining_events.send(FinishMiningBlockEvent { finish_mining_events.write(FinishMiningBlockEvent {
entity, entity,
position: mining.pos, position: mining.pos,
}); });
@ -622,20 +622,20 @@ pub fn continue_mining_block(
**mine_delay = 0; **mine_delay = 0;
} }
mine_block_progress_events.send(MineBlockProgressEvent { mine_block_progress_events.write(MineBlockProgressEvent {
entity, entity,
position: mining.pos, position: mining.pos,
destroy_stage: mine_progress.destroy_stage(), destroy_stage: mine_progress.destroy_stage(),
}); });
swing_arm_events.send(SwingArmEvent { entity }); swing_arm_events.write(SwingArmEvent { entity });
} else { } else {
start_mining_events.send(StartMiningBlockWithDirectionEvent { start_mining_events.write(StartMiningBlockWithDirectionEvent {
entity, entity,
position: mining.pos, position: mining.pos,
direction: mining.dir, direction: mining.dir,
}); });
} }
swing_arm_events.send(SwingArmEvent { entity }); swing_arm_events.write(SwingArmEvent { entity });
} }
} }

View file

@ -17,13 +17,7 @@ use azalea_protocol::packets::{
}; };
use azalea_world::{MinecraftEntityId, MoveEntityError}; use azalea_world::{MinecraftEntityId, MoveEntityError};
use bevy_app::{App, Plugin, Update}; use bevy_app::{App, Plugin, Update};
use bevy_ecs::prelude::Event; use bevy_ecs::prelude::*;
use bevy_ecs::schedule::SystemSet;
use bevy_ecs::system::Commands;
use bevy_ecs::{
component::Component, entity::Entity, event::EventReader, query::With,
schedule::IntoSystemConfigs, system::Query,
};
use thiserror::Error; use thiserror::Error;
use crate::client::Client; use crate::client::Client;

View file

@ -82,7 +82,7 @@ impl ConfigPacketHandler<'_> {
pub fn disconnect(&mut self, p: &ClientboundDisconnect) { pub fn disconnect(&mut self, p: &ClientboundDisconnect) {
warn!("Got disconnect packet {p:?}"); warn!("Got disconnect packet {p:?}");
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(DisconnectEvent { events.write(DisconnectEvent {
entity: self.player, entity: self.player,
reason: Some(p.reason.clone()), reason: Some(p.reason.clone()),
}); });
@ -124,7 +124,7 @@ impl ConfigPacketHandler<'_> {
); );
as_system::<(Commands, EventWriter<_>)>(self.ecs, |(mut commands, mut events)| { as_system::<(Commands, EventWriter<_>)>(self.ecs, |(mut commands, mut events)| {
events.send(KeepAliveEvent { events.write(KeepAliveEvent {
entity: self.player, entity: self.player,
id: p.id, id: p.id,
}); });
@ -147,7 +147,7 @@ impl ConfigPacketHandler<'_> {
debug!("Got resource pack push packet {p:?}"); debug!("Got resource pack push packet {p:?}");
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(ResourcePackEvent { events.write(ResourcePackEvent {
entity: self.player, entity: self.player,
id: p.id, id: p.id,
url: p.url.to_owned(), url: p.url.to_owned(),

View file

@ -249,7 +249,7 @@ impl GamePacketHandler<'_> {
dimension_data.min_y, dimension_data.min_y,
&instance_holder.instance.read().registries, &instance_holder.instance.read().registries,
); );
instance_loaded_events.send(InstanceLoadedEvent { instance_loaded_events.write(InstanceLoadedEvent {
entity: self.player, entity: self.player,
name: new_instance_name.clone(), name: new_instance_name.clone(),
instance: Arc::downgrade(&weak_instance), instance: Arc::downgrade(&weak_instance),
@ -339,7 +339,7 @@ impl GamePacketHandler<'_> {
debug!("Got chunk batch start"); debug!("Got chunk batch start");
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(chunks::ChunkBatchStartEvent { events.write(chunks::ChunkBatchStartEvent {
entity: self.player, entity: self.player,
}); });
}); });
@ -349,7 +349,7 @@ impl GamePacketHandler<'_> {
debug!("Got chunk batch finished {p:?}"); debug!("Got chunk batch finished {p:?}");
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(chunks::ChunkBatchFinishedEvent { events.write(chunks::ChunkBatchFinishedEvent {
entity: self.player, entity: self.player,
batch_size: p.batch_size, batch_size: p.batch_size,
}); });
@ -390,7 +390,7 @@ impl GamePacketHandler<'_> {
warn!("Got disconnect packet {p:?}"); warn!("Got disconnect packet {p:?}");
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(DisconnectEvent { events.write(DisconnectEvent {
entity: self.player, entity: self.player,
reason: Some(p.reason.clone()), reason: Some(p.reason.clone()),
}); });
@ -532,7 +532,7 @@ impl GamePacketHandler<'_> {
display_name: updated_info.display_name.clone(), display_name: updated_info.display_name.clone(),
}; };
tab_list.insert(updated_info.profile.uuid, info.clone()); tab_list.insert(updated_info.profile.uuid, info.clone());
add_player_events.send(AddPlayerEvent { add_player_events.write(AddPlayerEvent {
entity: self.player, entity: self.player,
info, info,
}); });
@ -548,7 +548,7 @@ impl GamePacketHandler<'_> {
if p.actions.update_display_name { if p.actions.update_display_name {
info.display_name.clone_from(&updated_info.display_name); info.display_name.clone_from(&updated_info.display_name);
} }
update_player_events.send(UpdatePlayerEvent { update_player_events.write(UpdatePlayerEvent {
entity: self.player, entity: self.player,
info: info.clone(), info: info.clone(),
}); });
@ -577,7 +577,7 @@ impl GamePacketHandler<'_> {
for uuid in &p.profile_ids { for uuid in &p.profile_ids {
if let Some(info) = tab_list.remove(uuid) { if let Some(info) = tab_list.remove(uuid) {
remove_player_events.send(RemovePlayerEvent { remove_player_events.write(RemovePlayerEvent {
entity: self.player, entity: self.player,
info, info,
}); });
@ -611,7 +611,7 @@ impl GamePacketHandler<'_> {
debug!("Got chunk with light packet {} {}", p.x, p.z); debug!("Got chunk with light packet {} {}", p.x, p.z);
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(chunks::ReceiveChunkEvent { events.write(chunks::ReceiveChunkEvent {
entity: self.player, entity: self.player,
packet: p.clone(), packet: p.clone(),
}); });
@ -1032,7 +1032,7 @@ impl GamePacketHandler<'_> {
as_system::<(EventWriter<KeepAliveEvent>, Commands)>( as_system::<(EventWriter<KeepAliveEvent>, Commands)>(
self.ecs, self.ecs,
|(mut keepalive_events, mut commands)| { |(mut keepalive_events, mut commands)| {
keepalive_events.send(KeepAliveEvent { keepalive_events.write(KeepAliveEvent {
entity: self.player, entity: self.player,
id: p.id, id: p.id,
}); });
@ -1084,7 +1084,7 @@ impl GamePacketHandler<'_> {
debug!("Got player chat packet {p:?}"); debug!("Got player chat packet {p:?}");
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(ChatReceivedEvent { events.write(ChatReceivedEvent {
entity: self.player, entity: self.player,
packet: ChatPacket::Player(Arc::new(p.clone())), packet: ChatPacket::Player(Arc::new(p.clone())),
}); });
@ -1095,7 +1095,7 @@ impl GamePacketHandler<'_> {
debug!("Got system chat packet {p:?}"); debug!("Got system chat packet {p:?}");
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(ChatReceivedEvent { events.write(ChatReceivedEvent {
entity: self.player, entity: self.player,
packet: ChatPacket::System(Arc::new(p.clone())), packet: ChatPacket::System(Arc::new(p.clone())),
}); });
@ -1106,7 +1106,7 @@ impl GamePacketHandler<'_> {
debug!("Got disguised chat packet {p:?}"); debug!("Got disguised chat packet {p:?}");
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(ChatReceivedEvent { events.write(ChatReceivedEvent {
entity: self.player, entity: self.player,
packet: ChatPacket::Disguised(Arc::new(p.clone())), packet: ChatPacket::Disguised(Arc::new(p.clone())),
}); });
@ -1217,7 +1217,7 @@ impl GamePacketHandler<'_> {
} }
} }
} else { } else {
events.send(SetContainerContentEvent { events.write(SetContainerContentEvent {
entity: self.player, entity: self.player,
slots: p.items.clone(), slots: p.items.clone(),
container_id: p.container_id, container_id: p.container_id,
@ -1283,7 +1283,7 @@ impl GamePacketHandler<'_> {
debug!("Got container close packet {p:?}"); debug!("Got container close packet {p:?}");
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(ClientSideCloseContainerEvent { events.write(ClientSideCloseContainerEvent {
entity: self.player, entity: self.player,
}); });
}); });
@ -1300,7 +1300,7 @@ impl GamePacketHandler<'_> {
as_system::<EventWriter<_>>(self.ecs, |mut knockback_events| { as_system::<EventWriter<_>>(self.ecs, |mut knockback_events| {
if let Some(knockback) = p.knockback { if let Some(knockback) = p.knockback {
knockback_events.send(KnockbackEvent { knockback_events.write(KnockbackEvent {
entity: self.player, entity: self.player,
knockback: KnockbackType::Set(knockback), knockback: KnockbackType::Set(knockback),
}); });
@ -1334,7 +1334,7 @@ impl GamePacketHandler<'_> {
debug!("Got open screen packet {p:?}"); debug!("Got open screen packet {p:?}");
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(MenuOpenedEvent { events.write(MenuOpenedEvent {
entity: self.player, entity: self.player,
window_id: p.container_id, window_id: p.container_id,
menu_type: p.menu_type, menu_type: p.menu_type,
@ -1371,7 +1371,7 @@ impl GamePacketHandler<'_> {
if *entity_id == p.player_id && dead.is_none() { if *entity_id == p.player_id && dead.is_none() {
commands.entity(self.player).insert(Dead); commands.entity(self.player).insert(Dead);
events.send(DeathEvent { events.write(DeathEvent {
entity: self.player, entity: self.player,
packet: Some(p.clone()), packet: Some(p.clone()),
}); });
@ -1387,7 +1387,7 @@ impl GamePacketHandler<'_> {
debug!("Got resource pack packet {p:?}"); debug!("Got resource pack packet {p:?}");
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(ResourcePackEvent { events.write(ResourcePackEvent {
entity: self.player, entity: self.player,
id: p.id, id: p.id,
url: p.url.to_owned(), url: p.url.to_owned(),
@ -1439,7 +1439,7 @@ impl GamePacketHandler<'_> {
dimension_data.min_y, dimension_data.min_y,
&instance_holder.instance.read().registries, &instance_holder.instance.read().registries,
); );
events.send(InstanceLoadedEvent { events.write(InstanceLoadedEvent {
entity: self.player, entity: self.player,
name: new_instance_name.clone(), name: new_instance_name.clone(),
instance: Arc::downgrade(&weak_instance), instance: Arc::downgrade(&weak_instance),

View file

@ -72,7 +72,7 @@ impl LoginPacketHandler<'_> {
debug!("Got disconnect {:?}", p); debug!("Got disconnect {:?}", p);
as_system::<EventWriter<_>>(self.ecs, |mut events| { as_system::<EventWriter<_>>(self.ecs, |mut events| {
events.send(DisconnectEvent { events.write(DisconnectEvent {
entity: self.player, entity: self.player,
reason: Some(p.reason.clone()), reason: Some(p.reason.clone()),
}); });
@ -121,7 +121,7 @@ impl LoginPacketHandler<'_> {
debug!("Got custom query {p:?}"); debug!("Got custom query {p:?}");
as_system::<EventWriter<ReceiveCustomQueryEvent>>(self.ecs, |mut events| { as_system::<EventWriter<ReceiveCustomQueryEvent>>(self.ecs, |mut events| {
events.send(ReceiveCustomQueryEvent { events.write(ReceiveCustomQueryEvent {
entity: self.player, entity: self.player,
packet: p.clone(), packet: p.clone(),
disabled: false, disabled: false,

View file

@ -20,7 +20,7 @@ pub fn death_event_on_0_health(
) { ) {
for (entity, health) in query.iter() { for (entity, health) in query.iter() {
if **health == 0. { if **health == 0. {
death_events.send(DeathEvent { death_events.write(DeathEvent {
entity, entity,
packet: None, packet: None,
}); });

View file

@ -24,14 +24,14 @@ impl Plugin for PongPlugin {
pub fn reply_to_game_ping(trigger: Trigger<PingEvent>, mut commands: Commands) { pub fn reply_to_game_ping(trigger: Trigger<PingEvent>, mut commands: Commands) {
commands.trigger(SendPacketEvent::new( commands.trigger(SendPacketEvent::new(
trigger.entity(), trigger.target(),
azalea_protocol::packets::game::ServerboundPong { id: trigger.0.id }, azalea_protocol::packets::game::ServerboundPong { id: trigger.0.id },
)); ));
} }
pub fn reply_to_config_ping(trigger: Trigger<ConfigPingEvent>, mut commands: Commands) { pub fn reply_to_config_ping(trigger: Trigger<ConfigPingEvent>, mut commands: Commands) {
commands.trigger(SendConfigPacketEvent::new( commands.trigger(SendConfigPacketEvent::new(
trigger.entity(), trigger.target(),
azalea_protocol::packets::config::ServerboundPong { id: trigger.0.id }, azalea_protocol::packets::config::ServerboundPong { id: trigger.0.id },
)); ));
} }

View file

@ -3,7 +3,7 @@
use std::marker::PhantomData; use std::marker::PhantomData;
use bevy_app::{App, Last, Plugin}; use bevy_app::{App, Last, Plugin};
use bevy_ecs::system::{NonSend, Resource}; use bevy_ecs::prelude::*;
use bevy_tasks::{ use bevy_tasks::{
AsyncComputeTaskPool, ComputeTaskPool, IoTaskPool, TaskPoolBuilder, AsyncComputeTaskPool, ComputeTaskPool, IoTaskPool, TaskPoolBuilder,
tick_global_task_pools_on_main_thread, tick_global_task_pools_on_main_thread,

View file

@ -20,6 +20,7 @@ use azalea_registry::{DimensionType, EntityKind};
use azalea_world::palette::{PalettedContainer, PalettedContainerKind}; use azalea_world::palette::{PalettedContainer, PalettedContainerKind};
use azalea_world::{Chunk, Instance, MinecraftEntityId, Section}; use azalea_world::{Chunk, Instance, MinecraftEntityId, Section};
use bevy_app::App; use bevy_app::App;
use bevy_ecs::component::Mutable;
use bevy_ecs::{prelude::*, schedule::ExecutorKind}; use bevy_ecs::{prelude::*, schedule::ExecutorKind};
use parking_lot::RwLock; use parking_lot::RwLock;
use simdnbt::owned::{NbtCompound, NbtTag}; use simdnbt::owned::{NbtCompound, NbtTag};
@ -109,7 +110,10 @@ impl Simulation {
pub fn has_component<T: Component>(&self) -> bool { pub fn has_component<T: Component>(&self) -> bool {
self.app.world().get::<T>(self.entity).is_some() self.app.world().get::<T>(self.entity).is_some()
} }
pub fn with_component_mut<T: Component>(&mut self, f: impl FnOnce(&mut T)) { pub fn with_component_mut<T: Component<Mutability = Mutable>>(
&mut self,
f: impl FnOnce(&mut T),
) {
f(&mut self f(&mut self
.app .app
.world_mut() .world_mut()

View file

@ -7,12 +7,7 @@ use std::{
use azalea_core::position::ChunkPos; use azalea_core::position::ChunkPos;
use azalea_world::{Instance, InstanceContainer, InstanceName, MinecraftEntityId}; use azalea_world::{Instance, InstanceContainer, InstanceName, MinecraftEntityId};
use bevy_ecs::{ use bevy_ecs::prelude::*;
component::Component,
entity::Entity,
query::{Added, Changed, Without},
system::{Commands, Query, Res, ResMut, Resource},
};
use derive_more::{Deref, DerefMut}; use derive_more::{Deref, DerefMut};
use nohash_hasher::IntMap; use nohash_hasher::IntMap;
use tracing::{debug, trace, warn}; use tracing::{debug, trace, warn};

View file

@ -18,12 +18,7 @@
use std::sync::Arc; use std::sync::Arc;
use azalea_world::{MinecraftEntityId, PartialInstance}; use azalea_world::{MinecraftEntityId, PartialInstance};
use bevy_ecs::{ use bevy_ecs::prelude::*;
prelude::{Component, Entity},
query::With,
system::{EntityCommand, Query},
world::{EntityWorldMut, World},
};
use derive_more::{Deref, DerefMut}; use derive_more::{Deref, DerefMut};
use parking_lot::RwLock; use parking_lot::RwLock;
use tracing::warn; use tracing::warn;
@ -68,19 +63,17 @@ impl RelativeEntityUpdate {
pub struct UpdatesReceived(u32); pub struct UpdatesReceived(u32);
impl EntityCommand for RelativeEntityUpdate { impl EntityCommand for RelativeEntityUpdate {
fn apply(self, entity: Entity, world: &mut World) { fn apply(self, mut entity: EntityWorldMut) {
let partial_entity_infos = &mut self.partial_world.write().entity_infos; let partial_entity_infos = &mut self.partial_world.write().entity_infos;
let mut entity_mut = world.entity_mut(entity); if Some(entity.id()) == partial_entity_infos.owner_entity {
if Some(entity) == partial_entity_infos.owner_entity {
// if the entity owns this partial world, it's always allowed to update itself // if the entity owns this partial world, it's always allowed to update itself
(self.update)(&mut entity_mut); (self.update)(&mut entity);
return; return;
}; };
let entity_id = *entity_mut.get::<MinecraftEntityId>().unwrap(); let entity_id = *entity.get::<MinecraftEntityId>().unwrap();
if entity_mut.contains::<LocalEntity>() { if entity.contains::<LocalEntity>() {
// a client tried to update another client, which isn't allowed // a client tried to update another client, which isn't allowed
return; return;
} }
@ -90,7 +83,7 @@ impl EntityCommand for RelativeEntityUpdate {
.get(&entity_id) .get(&entity_id)
.copied(); .copied();
let can_update = if let Some(updates_received) = entity_mut.get::<UpdatesReceived>() { let can_update = if let Some(updates_received) = entity.get::<UpdatesReceived>() {
this_client_updates_received.unwrap_or(1) == **updates_received this_client_updates_received.unwrap_or(1) == **updates_received
} else { } else {
// no UpdatesReceived means the entity was just spawned // no UpdatesReceived means the entity was just spawned
@ -102,9 +95,8 @@ impl EntityCommand for RelativeEntityUpdate {
.updates_received .updates_received
.insert(entity_id, new_updates_received); .insert(entity_id, new_updates_received);
entity_mut.insert(UpdatesReceived(new_updates_received)); entity.insert(UpdatesReceived(new_updates_received));
let mut entity = world.entity_mut(entity);
(self.update)(&mut entity); (self.update)(&mut entity);
} }
} }

View file

@ -20,13 +20,7 @@ use azalea_entity::{
}; };
use azalea_world::{Instance, InstanceContainer, InstanceName}; use azalea_world::{Instance, InstanceContainer, InstanceName};
use bevy_app::{App, Plugin}; use bevy_app::{App, Plugin};
use bevy_ecs::{ use bevy_ecs::prelude::*;
entity::Entity,
query::With,
schedule::{IntoSystemConfigs, SystemSet},
system::{Query, Res},
world::Mut,
};
use clip::box_traverse_blocks; use clip::box_traverse_blocks;
use collision::{ use collision::{
BLOCK_SHAPE, BlockWithShape, MoverType, VoxelShape, BLOCK_SHAPE, BlockWithShape, MoverType, VoxelShape,

View file

@ -4,7 +4,7 @@ use std::{
}; };
use azalea_core::{registry_holder::RegistryHolder, resource_location::ResourceLocation}; use azalea_core::{registry_holder::RegistryHolder, resource_location::ResourceLocation};
use bevy_ecs::{component::Component, system::Resource}; use bevy_ecs::{component::Component, resource::Resource};
use derive_more::{Deref, DerefMut}; use derive_more::{Deref, DerefMut};
use nohash_hasher::IntMap; use nohash_hasher::IntMap;
use parking_lot::RwLock; use parking_lot::RwLock;

View file

@ -48,7 +48,7 @@ fn look_at_everything(
look_target.y += **eye_height as f64; look_target.y += **eye_height as f64;
} }
look_at_event.send(LookAtEvent { look_at_event.write(LookAtEvent {
entity: bot_id, entity: bot_id,
position: look_target, position: look_target,
}); });

View file

@ -26,7 +26,7 @@ fn auto_respawn(
mut perform_respawn_events: EventWriter<PerformRespawnEvent>, mut perform_respawn_events: EventWriter<PerformRespawnEvent>,
) { ) {
for event in events.read() { for event in events.read() {
perform_respawn_events.send(PerformRespawnEvent { perform_respawn_events.write(PerformRespawnEvent {
entity: event.entity, entity: event.entity,
}); });
} }

View file

@ -11,8 +11,7 @@ use azalea_entity::{
}; };
use azalea_physics::PhysicsSet; use azalea_physics::PhysicsSet;
use bevy_app::Update; use bevy_app::Update;
use bevy_ecs::prelude::Event; use bevy_ecs::prelude::*;
use bevy_ecs::schedule::IntoSystemConfigs;
use futures_lite::Future; use futures_lite::Future;
use tracing::trace; use tracing::trace;

View file

@ -34,7 +34,7 @@ use bevy_ecs::{
/// continue; /// continue;
/// }; /// };
/// ///
/// chat_events.send(SendChatEvent { /// chat_events.write(SendChatEvent {
/// entity: bot_id, /// entity: bot_id,
/// content: String::from("Ahhh!"), /// content: String::from("Ahhh!"),
/// }); /// });

View file

@ -32,9 +32,7 @@ use azalea_entity::{Physics, Position};
use azalea_physics::PhysicsSet; use azalea_physics::PhysicsSet;
use azalea_world::{InstanceContainer, InstanceName}; use azalea_world::{InstanceContainer, InstanceName};
use bevy_app::{PreUpdate, Update}; use bevy_app::{PreUpdate, Update};
use bevy_ecs::prelude::Event; use bevy_ecs::prelude::*;
use bevy_ecs::query::Changed;
use bevy_ecs::schedule::IntoSystemConfigs;
use bevy_tasks::{AsyncComputeTaskPool, Task}; use bevy_tasks::{AsyncComputeTaskPool, Task};
use futures_lite::future; use futures_lite::future;
use goals::BlockPosGoal; use goals::BlockPosGoal;
@ -477,7 +475,7 @@ pub fn handle_tasks(
for (entity, mut task) in &mut transform_tasks { for (entity, mut task) in &mut transform_tasks {
if let Some(optional_path_found_event) = future::block_on(future::poll_once(&mut task.0)) { if let Some(optional_path_found_event) = future::block_on(future::poll_once(&mut task.0)) {
if let Some(path_found_event) = optional_path_found_event { if let Some(path_found_event) = optional_path_found_event {
path_found_events.send(path_found_event); path_found_events.write(path_found_event);
} }
// Task is complete, so remove task component from entity // Task is complete, so remove task component from entity
@ -698,7 +696,7 @@ pub fn check_node_reached(
if executing_path.path.is_empty() { if executing_path.path.is_empty() {
info!("the path we just swapped to was empty, so reached end of path"); info!("the path we just swapped to was empty, so reached end of path");
walk_events.send(StartWalkEvent { walk_events.write(StartWalkEvent {
entity, entity,
direction: WalkDirection::None, direction: WalkDirection::None,
}); });
@ -712,7 +710,7 @@ pub fn check_node_reached(
if executing_path.path.is_empty() { if executing_path.path.is_empty() {
debug!("pathfinder path is now empty"); debug!("pathfinder path is now empty");
walk_events.send(StartWalkEvent { walk_events.write(StartWalkEvent {
entity, entity,
direction: WalkDirection::None, direction: WalkDirection::None,
}); });
@ -923,7 +921,7 @@ pub fn recalculate_near_end_of_path(
"recalculate_near_end_of_path executing_path.is_path_partial: {}", "recalculate_near_end_of_path executing_path.is_path_partial: {}",
executing_path.is_path_partial executing_path.is_path_partial
); );
goto_events.send(GotoEvent { goto_events.write(GotoEvent {
entity, entity,
goal, goal,
successors_fn, successors_fn,
@ -947,7 +945,7 @@ pub fn recalculate_near_end_of_path(
info!( info!(
"the path we just swapped to was empty, so reached end of path" "the path we just swapped to was empty, so reached end of path"
); );
walk_events.send(StartWalkEvent { walk_events.write(StartWalkEvent {
entity, entity,
direction: WalkDirection::None, direction: WalkDirection::None,
}); });
@ -955,7 +953,7 @@ pub fn recalculate_near_end_of_path(
break; break;
} }
} else { } else {
walk_events.send(StartWalkEvent { walk_events.write(StartWalkEvent {
entity, entity,
direction: WalkDirection::None, direction: WalkDirection::None,
}); });
@ -966,7 +964,7 @@ pub fn recalculate_near_end_of_path(
_ => { _ => {
if executing_path.path.is_empty() { if executing_path.path.is_empty() {
// idk when this can happen but stop moving just in case // idk when this can happen but stop moving just in case
walk_events.send(StartWalkEvent { walk_events.write(StartWalkEvent {
entity, entity,
direction: WalkDirection::None, direction: WalkDirection::None,
}); });
@ -1033,7 +1031,7 @@ pub fn recalculate_if_has_goal_but_no_path(
if pathfinder.goal.is_some() && !pathfinder.is_calculating { if pathfinder.goal.is_some() && !pathfinder.is_calculating {
if let Some(goal) = pathfinder.goal.as_ref().cloned() { if let Some(goal) = pathfinder.goal.as_ref().cloned() {
debug!("Recalculating path because it has a goal but no ExecutingPath"); debug!("Recalculating path because it has a goal but no ExecutingPath");
goto_events.send(GotoEvent { goto_events.write(GotoEvent {
entity, entity,
goal, goal,
successors_fn: pathfinder.successors_fn.unwrap(), successors_fn: pathfinder.successors_fn.unwrap(),
@ -1081,7 +1079,7 @@ pub fn handle_stop_pathfinding_event(
} }
if executing_path.path.is_empty() { if executing_path.path.is_empty() {
walk_events.send(StartWalkEvent { walk_events.write(StartWalkEvent {
entity: event.entity, entity: event.entity,
direction: WalkDirection::None, direction: WalkDirection::None,
}); });
@ -1098,7 +1096,7 @@ pub fn stop_pathfinding_on_instance_change(
if !executing_path.path.is_empty() { if !executing_path.path.is_empty() {
debug!("instance changed, clearing path"); debug!("instance changed, clearing path");
executing_path.path.clear(); executing_path.path.clear();
stop_pathfinding_events.send(StopPathfindingEvent { stop_pathfinding_events.write(StopPathfindingEvent {
entity, entity,
force: true, force: true,
}); });

View file

@ -68,7 +68,7 @@ pub struct ExecuteCtx<'w1, 'w2, 'w3, 'w4, 'w5, 'w6, 'a> {
impl ExecuteCtx<'_, '_, '_, '_, '_, '_, '_> { impl ExecuteCtx<'_, '_, '_, '_, '_, '_, '_> {
pub fn look_at(&mut self, position: Vec3) { pub fn look_at(&mut self, position: Vec3) {
self.look_at_events.send(LookAtEvent { self.look_at_events.write(LookAtEvent {
entity: self.entity, entity: self.entity,
position: Vec3 { position: Vec3 {
x: position.x, x: position.x,
@ -80,28 +80,28 @@ impl ExecuteCtx<'_, '_, '_, '_, '_, '_, '_> {
} }
pub fn look_at_exact(&mut self, position: Vec3) { pub fn look_at_exact(&mut self, position: Vec3) {
self.look_at_events.send(LookAtEvent { self.look_at_events.write(LookAtEvent {
entity: self.entity, entity: self.entity,
position, position,
}); });
} }
pub fn sprint(&mut self, direction: SprintDirection) { pub fn sprint(&mut self, direction: SprintDirection) {
self.sprint_events.send(StartSprintEvent { self.sprint_events.write(StartSprintEvent {
entity: self.entity, entity: self.entity,
direction, direction,
}); });
} }
pub fn walk(&mut self, direction: WalkDirection) { pub fn walk(&mut self, direction: WalkDirection) {
self.walk_events.send(StartWalkEvent { self.walk_events.write(StartWalkEvent {
entity: self.entity, entity: self.entity,
direction, direction,
}); });
} }
pub fn jump(&mut self) { pub fn jump(&mut self) {
self.jump_events.send(JumpEvent { self.jump_events.write(JumpEvent {
entity: self.entity, entity: self.entity,
}); });
} }
@ -137,7 +137,7 @@ impl ExecuteCtx<'_, '_, '_, '_, '_, '_, '_> {
let best_tool_result = best_tool_in_hotbar_for_block(block_state, &self.menu); let best_tool_result = best_tool_in_hotbar_for_block(block_state, &self.menu);
self.set_selected_hotbar_slot_events self.set_selected_hotbar_slot_events
.send(SetSelectedHotbarSlotEvent { .write(SetSelectedHotbarSlotEvent {
entity: self.entity, entity: self.entity,
slot: best_tool_result.index as u8, slot: best_tool_result.index as u8,
}); });
@ -146,7 +146,7 @@ impl ExecuteCtx<'_, '_, '_, '_, '_, '_, '_> {
self.walk(WalkDirection::None); self.walk(WalkDirection::None);
self.look_at_exact(block.center()); self.look_at_exact(block.center());
self.start_mining_events.send(StartMiningBlockEvent { self.start_mining_events.write(StartMiningBlockEvent {
entity: self.entity, entity: self.entity,
position: block, position: block,
}); });

View file

@ -6,7 +6,7 @@ pub use azalea_core::tick::GameTick;
// this is necessary to make the macros that reference bevy_ecs work // this is necessary to make the macros that reference bevy_ecs work
pub use crate::ecs as bevy_ecs; pub use crate::ecs as bevy_ecs;
pub use crate::ecs::{component::Component, system::Resource}; pub use crate::ecs::{component::Component, resource::Resource};
pub use crate::{ pub use crate::{
ClientBuilder, bot::BotClientExt, container::ContainerClientExt, ClientBuilder, bot::BotClientExt, container::ContainerClientExt,
pathfinder::PathfinderClientExt, pathfinder::PathfinderClientExt,

View file

@ -20,12 +20,7 @@ use bevy_app::{App, Plugin, Update};
use bevy_ecs::prelude::Event; use bevy_ecs::prelude::Event;
use super::{Swarm, SwarmEvent}; use super::{Swarm, SwarmEvent};
use crate::ecs::{ use crate::ecs::prelude::*;
component::Component,
event::{EventReader, EventWriter},
schedule::IntoSystemConfigs,
system::{Commands, Query, Res, ResMut, Resource},
};
#[derive(Clone)] #[derive(Clone)]
pub struct SwarmChatPlugin; pub struct SwarmChatPlugin;
@ -99,7 +94,7 @@ fn chat_listener(
if !found { if !found {
// didn't find the message, so fire the swarm event and add to the queue // didn't find the message, so fire the swarm event and add to the queue
new_chat_messages_events.send(NewChatMessageEvent(event.packet.clone())); new_chat_messages_events.write(NewChatMessageEvent(event.packet.clone()));
global_chat_state.chat_queue.push_back(event.packet.clone()); global_chat_state.chat_queue.push_back(event.packet.clone());
client_chat_index = client_chat_index =
global_chat_state.chat_queue.len() + global_chat_state.chat_min_index; global_chat_state.chat_queue.len() + global_chat_state.chat_min_index;

View file

@ -38,5 +38,5 @@ fn check_ready(
// all the players are in the world, so we're ready // all the players are in the world, so we're ready
**is_swarm_ready = true; **is_swarm_ready = true;
ready_events.send(SwarmReadyEvent); ready_events.write(SwarmReadyEvent);
} }

View file

@ -24,7 +24,7 @@ use azalea_client::{
use azalea_protocol::{ServerAddress, resolver}; use azalea_protocol::{ServerAddress, resolver};
use azalea_world::InstanceContainer; use azalea_world::InstanceContainer;
use bevy_app::{App, PluginGroup, PluginGroupBuilder, Plugins}; use bevy_app::{App, PluginGroup, PluginGroupBuilder, Plugins};
use bevy_ecs::{component::Component, entity::Entity, system::Resource, world::World}; use bevy_ecs::prelude::*;
use futures::future::{BoxFuture, join_all}; use futures::future::{BoxFuture, join_all};
use parking_lot::{Mutex, RwLock}; use parking_lot::{Mutex, RwLock};
use tokio::sync::mpsc; use tokio::sync::mpsc;