From 05fbfecfb41273eb861531bc69beed8f4f72f026 Mon Sep 17 00:00:00 2001 From: core Date: Thu, 3 Jul 2025 20:31:11 -0400 Subject: [PATCH] feat(netcode): aeronet --- Cargo.lock | 518 ++++++++++++++++---------- crates/unified/Cargo.toml | 11 +- crates/unified/src/client/mod.rs | 89 +---- crates/unified/src/client/net.rs | 43 +++ crates/unified/src/client_plugins.rs | 13 +- crates/unified/src/lib.rs | 4 +- crates/unified/src/main.rs | 18 +- crates/unified/src/server/gravity.rs | 2 + crates/unified/src/server/mod.rs | 159 ++++---- crates/unified/src/server/player.rs | 17 +- crates/unified/src/server_plugins.rs | 12 +- crates/unified/src/shared_plugins.rs | 1 + crates/unified/src/wasm_entrypoint.rs | 8 +- 13 files changed, 513 insertions(+), 382 deletions(-) create mode 100644 crates/unified/src/client/net.rs diff --git a/Cargo.lock b/Cargo.lock index 54ea43b9ff253d0333247238dcae9d921419595a..d4e62114accb8bdddb7156ddbcad50122891144c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -151,13 +151,94 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] -name = "aead" -version = "0.5.2" +name = "aeronet" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +checksum = "20a622d503454e4252c1ea70ae684a8a92f04ea2be97d0723615dfe1f765b84d" dependencies = [ - "crypto-common", - "generic-array", + "aeronet_io", + "aeronet_transport", + "bevy_app 0.16.1", +] + +[[package]] +name = "aeronet_io" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7bb8c8b6d0843602f22cae4be6671d868b284ea2887e91b80f1ad2d87721fb" +dependencies = [ + "anyhow", + "bevy_app 0.16.1", + "bevy_ecs 0.16.1", + "bevy_platform", + "bevy_reflect 0.16.1", + "bytes", + "derive_more 2.0.1", + "log", +] + +[[package]] +name = "aeronet_replicon" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa8bd4fc72cfffaaa7a449d416c952293d0c48caa0324c23e727fca78b623e0d" +dependencies = [ + "aeronet_io", + "aeronet_transport", + "bevy_app 0.16.1", + "bevy_ecs 0.16.1", + "bevy_platform", + "bevy_reflect 0.16.1", + "bevy_replicon", + "log", +] + +[[package]] +name = "aeronet_transport" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea03d9f67dec95062edf7e94a5a3d04c3cf1dc8f8ab6eae9b1e715f1d574941" +dependencies = [ + "aeronet_io", + "bevy_app 0.16.1", + "bevy_ecs 0.16.1", + "bevy_platform", + "bevy_reflect 0.16.1", + "bevy_time 0.16.1", + "bit-vec 0.8.0", + "derive_more 2.0.1", + "either", + "log", + "octs", + "ringbuf", + "typesize", +] + +[[package]] +name = "aeronet_websocket" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bb8b0351838bbe79fea6be824a490f304724ab9155792446bd3d418efa771" +dependencies = [ + "aeronet_io", + "bevy_app 0.16.1", + "bevy_ecs 0.16.1", + "bevy_platform", + "bytes", + "cfg-if", + "derive_more 2.0.1", + "futures", + "js-sys", + "rcgen", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "tokio-tungstenite", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] @@ -574,6 +655,29 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "aws-lc-rs" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" +dependencies = [ + "bindgen 0.69.5", + "cc", + "cmake", + "dunce", + "fs_extra", +] + [[package]] name = "backtrace" version = "0.3.75" @@ -673,7 +777,7 @@ dependencies = [ "bevy_transform 0.16.1", "bevy_utils 0.16.1", "blake3", - "derive_more", + "derive_more 1.0.0", "downcast-rs 2.0.1", "either", "petgraph 0.7.1", @@ -779,7 +883,7 @@ dependencies = [ "bitflags 2.9.1", "blake3", "crossbeam-channel", - "derive_more", + "derive_more 1.0.0", "disqualified", "downcast-rs 2.0.1", "either", @@ -850,7 +954,7 @@ dependencies = [ "bevy_math 0.16.1", "bevy_reflect 0.16.1", "bytemuck", - "derive_more", + "derive_more 1.0.0", "encase 0.10.0", "serde", "thiserror 2.0.12", @@ -1028,7 +1132,7 @@ dependencies = [ "bevy_utils 0.15.3", "bitflags 2.9.1", "concurrent-queue", - "derive_more", + "derive_more 1.0.0", "disqualified", "fixedbitset 0.5.7", "nonmax", @@ -1052,7 +1156,7 @@ dependencies = [ "bitflags 2.9.1", "bumpalo", "concurrent-queue", - "derive_more", + "derive_more 1.0.0", "disqualified", "fixedbitset 0.5.7", "indexmap", @@ -1313,7 +1417,7 @@ dependencies = [ "bevy_platform", "bevy_reflect 0.16.1", "bevy_utils 0.16.1", - "derive_more", + "derive_more 1.0.0", "log", "serde", "smol_str", @@ -1502,7 +1606,7 @@ checksum = "68553e0090fe9c3ba066c65629f636bd58e4ebd9444fdba097b91af6cd3e243f" dependencies = [ "approx", "bevy_reflect 0.16.1", - "derive_more", + "derive_more 1.0.0", "glam 0.29.3", "itertools 0.14.0", "libm", @@ -1580,7 +1684,7 @@ dependencies = [ "bevy_window 0.16.1", "bitflags 2.9.1", "bytemuck", - "derive_more", + "derive_more 1.0.0", "fixedbitset 0.5.7", "nonmax", "offset-allocator", @@ -1707,7 +1811,7 @@ dependencies = [ "bevy_ptr 0.15.3", "bevy_reflect_derive 0.15.1", "bevy_utils 0.15.3", - "derive_more", + "derive_more 1.0.0", "disqualified", "downcast-rs 1.2.1", "erased-serde", @@ -1726,7 +1830,7 @@ dependencies = [ "bevy_ptr 0.16.1", "bevy_reflect_derive 0.16.1", "bevy_utils 0.16.1", - "derive_more", + "derive_more 1.0.0", "disqualified", "downcast-rs 2.0.1", "erased-serde", @@ -1852,7 +1956,7 @@ dependencies = [ "bitflags 2.9.1", "bytemuck", "codespan-reporting", - "derive_more", + "derive_more 1.0.0", "downcast-rs 2.0.1", "encase 0.10.0", "fixedbitset 0.5.7", @@ -1902,19 +2006,6 @@ dependencies = [ "syn 2.0.104", ] -[[package]] -name = "bevy_renet2" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d238ee38a3a9aa6dc2360fe27103ef93090d7107793da3ef1d6660d7b28e9e5a" -dependencies = [ - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", - "bevy_time 0.16.1", - "renet2", - "renet2_netcode", -] - [[package]] name = "bevy_replicon" version = "0.34.3" @@ -1933,18 +2024,6 @@ dependencies = [ "variadics_please", ] -[[package]] -name = "bevy_replicon_renet2" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbcacc0928f78601b7ce3f4c1d8b9314689d75fc93c9f7375a35af6bf16ba74" -dependencies = [ - "bevy 0.16.1", - "bevy_renet2", - "bevy_replicon", - "log", -] - [[package]] name = "bevy_scene" version = "0.13.2" @@ -1980,7 +2059,7 @@ dependencies = [ "bevy_render 0.16.1", "bevy_transform 0.16.1", "bevy_utils 0.16.1", - "derive_more", + "derive_more 1.0.0", "serde", "thiserror 2.0.12", "uuid", @@ -2035,7 +2114,7 @@ dependencies = [ "bevy_window 0.16.1", "bitflags 2.9.1", "bytemuck", - "derive_more", + "derive_more 1.0.0", "fixedbitset 0.5.7", "nonmax", "radsort", @@ -2111,7 +2190,7 @@ dependencies = [ "cfg-if", "concurrent-queue", "crossbeam-queue", - "derive_more", + "derive_more 1.0.0", "futures-channel", "futures-lite", "heapless", @@ -2207,7 +2286,7 @@ dependencies = [ "bevy_reflect 0.16.1", "bevy_tasks 0.16.1", "bevy_utils 0.16.1", - "derive_more", + "derive_more 1.0.0", "serde", "thiserror 2.0.12", ] @@ -2267,7 +2346,7 @@ dependencies = [ "bevy_utils 0.16.1", "bevy_window 0.16.1", "bytemuck", - "derive_more", + "derive_more 1.0.0", "nonmax", "serde", "smallvec", @@ -2459,6 +2538,29 @@ dependencies = [ "zip", ] +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.9.1", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.104", + "which", +] + [[package]] name = "bindgen" version = "0.70.1" @@ -2861,30 +2963,6 @@ dependencies = [ "libc", ] -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" -dependencies = [ - "aead", - "chacha20", - "cipher", - "poly1305", - "zeroize", -] - [[package]] name = "chrono" version = "0.4.41" @@ -2940,7 +3018,6 @@ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common", "inout", - "zeroize", ] [[package]] @@ -2994,6 +3071,15 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + [[package]] name = "cobs" version = "0.3.0" @@ -3431,7 +3517,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", - "rand_core 0.6.4", "typenum", ] @@ -3533,7 +3618,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" dependencies = [ - "derive_more-impl", + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", ] [[package]] @@ -3548,6 +3642,18 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "unicode-xid", +] + [[package]] name = "dialoguer" version = "0.10.4" @@ -3661,6 +3767,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "ecolor" version = "0.31.1" @@ -4139,6 +4251,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "fsevent-sys" version = "4.1.0" @@ -4763,12 +4881,6 @@ dependencies = [ "digest", ] -[[package]] -name = "hmac-sha256" -version = "1.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad6880c8d4a9ebf39c6e8b77007ce223f646a4d21ce29d99f70cb16420545425" - [[package]] name = "home" version = "0.5.11" @@ -5324,6 +5436,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "lebe" version = "0.5.2" @@ -6373,10 +6491,13 @@ dependencies = [ ] [[package]] -name = "octets" -version = "0.3.0" +name = "octs" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109983a091271ee8916076731ba5fdc9ee22fea871bc7c6ceab9bfd423eb1d99" +checksum = "d3beef54705459f4a421ff43b6c9b8381f5b84769e4ae69942783dd8918837b7" +dependencies = [ + "bytes", +] [[package]] name = "offset-allocator" @@ -6416,10 +6537,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] -name = "opaque-debug" -version = "0.3.1" +name = "openssl-probe" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "orbclient" @@ -6573,6 +6694,16 @@ dependencies = [ "hmac", ] +[[package]] +name = "pem" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +dependencies = [ + "base64 0.22.1", + "serde", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -6755,17 +6886,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" -[[package]] -name = "poly1305" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" -dependencies = [ - "cpufeatures", - "opaque-debug", - "universal-hash", -] - [[package]] name = "portable-atomic" version = "1.11.1" @@ -7144,6 +7264,19 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "rcgen" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" +dependencies = [ + "pem", + "ring", + "rustls-pki-types", + "time", + "yasna", +] + [[package]] name = "read-fonts" version = "0.29.3" @@ -7248,61 +7381,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" -[[package]] -name = "renet2" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6024b28b4d37cf4d4d0e0dc31d3a4ebb61880da278d77547bb94055a2a164f5" -dependencies = [ - "bevy_ecs 0.16.1", - "bytes", - "log", - "octets", -] - -[[package]] -name = "renet2_netcode" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee5d017932669cb57862c8c24ad5294d4fff877ace85487bc771b36ab958a054" -dependencies = [ - "anyhow", - "async-channel", - "bevy_ecs 0.16.1", - "bytes", - "crossbeam", - "futures", - "futures-channel", - "futures-util", - "hmac-sha256", - "http", - "js-sys", - "log", - "octets", - "renet2", - "renetcode2", - "serde", - "serde_json", - "tokio", - "tokio-tungstenite", - "tungstenite 0.26.2", - "url", - "urlencoding", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "renetcode2" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a232e1196d6bef6f57e02fbe83fadd88ceb894bfff369cbbe27044559d06d89a" -dependencies = [ - "chacha20poly1305", - "log", -] - [[package]] name = "resvg" version = "0.45.1" @@ -7343,6 +7421,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "ringbuf" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe47b720588c8702e34b5979cb3271a8b1842c7cb6f57408efa70c779363488c" +dependencies = [ + "crossbeam-utils", + "portable-atomic", + "portable-atomic-util", +] + [[package]] name = "rmp" version = "0.8.14" @@ -7449,6 +7538,7 @@ version = "0.23.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" dependencies = [ + "aws-lc-rs", "log", "once_cell", "ring", @@ -7458,6 +7548,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pki-types" version = "1.12.0" @@ -7473,6 +7575,7 @@ version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -7552,6 +7655,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -7577,6 +7689,29 @@ dependencies = [ "tiny-skia", ] +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "self_cell" version = "1.2.0" @@ -7691,15 +7826,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signal-hook-registry" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" -dependencies = [ - "libc", -] - [[package]] name = "simba" version = "0.8.1" @@ -7898,18 +8024,20 @@ checksum = "6eae92052b72ef70dafa16eddbabffc77e5ca3574be2f7bc1127b36f0a7ad7f2" name = "starkingdoms" version = "0.1.0" dependencies = [ + "aeronet", + "aeronet_replicon", + "aeronet_transport", + "aeronet_websocket", "bevy 0.16.1", "bevy_common_assets", "bevy_rapier2d 0.30.0", "bevy_replicon", - "bevy_replicon_renet2", "clap", "console_error_panic_hook", "getrandom 0.3.3", "log", "rand 0.9.1", "serde", - "tokio", "tracing-subscriber", "tracing-wasm", "url", @@ -8410,24 +8538,20 @@ dependencies = [ "io-uring", "libc", "mio", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "slab", "socket2", - "tokio-macros", "windows-sys 0.52.0", ] [[package]] -name = "tokio-macros" -version = "2.5.0" +name = "tokio-rustls" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", + "rustls", + "tokio", ] [[package]] @@ -8438,7 +8562,11 @@ checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" dependencies = [ "futures-util", "log", + "rustls", + "rustls-native-certs", + "rustls-pki-types", "tokio", + "tokio-rustls", "tungstenite 0.26.2", ] @@ -8724,6 +8852,8 @@ dependencies = [ "httparse", "log", "rand 0.9.1", + "rustls", + "rustls-pki-types", "sha1", "thiserror 2.0.12", "utf-8", @@ -8747,6 +8877,26 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "typesize" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da66c62c5b7017a2787e77373c03e6a5aafde77a73bff1ff96e91cd2e128179" +dependencies = [ + "typesize-derive", +] + +[[package]] +name = "typesize-derive" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "536b6812192bda8551cfa0e52524e328c6a951b48e66529ee4522d6c721243d6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "unicode-bidi" version = "0.3.18" @@ -8831,16 +8981,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - [[package]] name = "untrusted" version = "0.9.0" @@ -8875,15 +9015,8 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", - "serde", ] -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "usvg" version = "0.45.1" @@ -10378,6 +10511,15 @@ dependencies = [ "lzma-sys", ] +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + [[package]] name = "yazi" version = "0.2.1" diff --git a/crates/unified/Cargo.toml b/crates/unified/Cargo.toml index 3c9e10a31f1657b18d724f9e98a39a45787151fa..85758b5cfcdb0fc6b82b216ba1328b84c796037c 100644 --- a/crates/unified/Cargo.toml +++ b/crates/unified/Cargo.toml @@ -13,7 +13,6 @@ bevy_rapier2d = { version = "0.30", features = ["serde-serialize", "simd-stable" bevy_common_assets = { version = "0.13", features = ["toml"] } bevy_replicon = "0.34" -bevy_replicon_renet2 = { version = "0.10" } clap = { version = "4", features = ["derive", "cargo"] } url = "2" @@ -28,8 +27,12 @@ getrandom = { version = "0.3", features = [] } web-time = "1" +aeronet = "0.14" +aeronet_replicon = { version = "0.15", features = ["client"] } +aeronet_transport = "0.14" +aeronet_websocket = { version = "0.14", features = ["client"] } + [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -tokio = { version = "1", features = ["rt-multi-thread"] } [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = { version = "0.2" } @@ -38,5 +41,5 @@ console_error_panic_hook = "0.1" [features] default = ["native"] -native = ["bevy/file_watcher", "bevy_replicon_renet2/native_transport", "bevy_replicon_renet2/ws_server_transport"] -wasm = ["getrandom/wasm_js", "bevy_replicon_renet2/ws_client_transport"] \ No newline at end of file +native = ["bevy/file_watcher", "aeronet_websocket/server", "aeronet_replicon/server"] +wasm = ["getrandom/wasm_js"] \ No newline at end of file diff --git a/crates/unified/src/client/mod.rs b/crates/unified/src/client/mod.rs index efdd83f7d386d02dc114b7a921e8d7991a4ab8e2..a282e98c78ed8b4db679953aaaa1908ab658ef6b 100644 --- a/crates/unified/src/client/mod.rs +++ b/crates/unified/src/client/mod.rs @@ -2,7 +2,9 @@ mod incoming_parts; mod incoming_planets; mod key_input; mod starfield; +mod net; +use aeronet_websocket::client::WebSocketClient; use crate::client::incoming_parts::incoming_parts_plugin; use crate::client::incoming_planets::incoming_planets_plugin; use crate::client::key_input::key_input_plugin; @@ -13,94 +15,25 @@ use bevy::prelude::*; use bevy::window::PrimaryWindow; use bevy_replicon::prelude::RepliconChannels; use bevy_replicon::shared::server_entity_map::ServerEntityMap; -use bevy_replicon_renet2::RenetChannelsExt; -#[cfg(not(target_arch = "wasm32"))] -use bevy_replicon_renet2::netcode::NativeSocket; -use bevy_replicon_renet2::netcode::{ClientAuthentication, NetcodeClientTransport}; -#[cfg(target_arch = "wasm32")] -use bevy_replicon_renet2::netcode::{ClientSocket, WebSocketClient, WebSocketClientConfig}; -use bevy_replicon_renet2::renet2::{ConnectionConfig, RenetClient}; -#[cfg(not(target_arch = "wasm32"))] -use std::net::{IpAddr, SocketAddr, UdpSocket}; use web_time::SystemTime; pub struct ClientPlugin { - #[cfg(target_arch = "wasm32")] - pub server: url::Url, - #[cfg(not(target_arch = "wasm32"))] - pub server: SocketAddr, + pub server: String } impl Plugin for ClientPlugin { #[allow(clippy::clone_on_copy)] fn build(&self, app: &mut App) { let server = self.server.clone(); app.insert_resource(CursorWorldCoordinates(None)) - .add_systems( - Startup, - move |mut commands: Commands, channels: Res| { - let current_time = SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH) - .unwrap(); + .add_systems(Startup, move |mut commands: Commands| { + let config = net::websocket_config(); - #[cfg(target_arch = "wasm32")] - { - let socket_config = WebSocketClientConfig { - server_url: server.clone(), - }; - let socket = WebSocketClient::new(socket_config).unwrap(); - let client = RenetClient::new( - ConnectionConfig::from_channels( - channels.server_configs(), - channels.client_configs(), - ), - socket.is_reliable(), - ); - let authentication = ClientAuthentication::Unsecure { - socket_id: 1, - server_addr: socket.server_address(), - client_id: current_time.as_millis() as u64, - user_data: None, - protocol_id: 0, - }; - let transport = - NetcodeClientTransport::new(current_time, authentication, socket) - .unwrap(); - commands.insert_resource(client); - commands.insert_resource(transport); - } - #[cfg(not(target_arch = "wasm32"))] - { - let bind = match server.ip() { - IpAddr::V4(_) => "127.0.0.1:0", - IpAddr::V6(_) => "[::1]:0", - }; - let client_socket = - NativeSocket::new(UdpSocket::bind(bind).unwrap()).unwrap(); - let authentication = ClientAuthentication::Unsecure { - socket_id: 0, - server_addr: server, - client_id: current_time.as_millis() as u64, - user_data: None, - protocol_id: 0, - }; - let client = RenetClient::new( - ConnectionConfig::from_channels( - channels.server_configs(), - channels.client_configs(), - ), - false, - ); - let transport = NetcodeClientTransport::new( - current_time, - authentication, - client_socket, - ) - .unwrap(); - commands.insert_resource(client); - commands.insert_resource(transport); - } - }, - ) + commands.spawn(Name::new("default-session")) + .queue(WebSocketClient::connect(config, server.clone())); + }) + .add_observer(net::on_connecting) + .add_observer(net::on_connected) + .add_observer(net::on_disconnected) .add_systems(Startup, setup_graphics) .add_systems(Update, update_cursor_position) .add_systems(Update, follow_camera) diff --git a/crates/unified/src/client/net.rs b/crates/unified/src/client/net.rs new file mode 100644 index 0000000000000000000000000000000000000000..646f8f9a02f7e17df8d262adb8624e4c8e9098e6 --- /dev/null +++ b/crates/unified/src/client/net.rs @@ -0,0 +1,43 @@ +use aeronet::io::{Session, SessionEndpoint}; +use aeronet::io::connection::Disconnected; +use aeronet_replicon::client::AeronetRepliconClient; +use aeronet_transport::TransportConfig; +use bevy::prelude::*; + +pub fn on_connecting(trigger: Trigger, names: Query<&Name>, mut commands: Commands) { + let entity = trigger.target(); + let name = names.get(entity).unwrap(); + info!("{name} is connecting"); + + commands.entity(entity).insert(AeronetRepliconClient); +} +pub fn on_connected(trigger: Trigger, names: Query<&Name>, mut commands: Commands) { + let entity = trigger.target(); + let name = names.get(entity).unwrap(); + info!("{name} is connected"); +} +pub fn on_disconnected(trigger: Trigger, names: Query<&Name>) { + let session = trigger.target(); + let name = names.get(session).unwrap(); + + match &*trigger { + Disconnected::ByUser(reason) => { + info!(?name, ?reason, "session disconnected by user"); + }, + Disconnected::ByPeer(reason) => { + info!(?name, ?reason, "session disconnected by peer"); + }, + Disconnected::ByError(err) => { + warn!(?name, "session disconnected due to error: {err:?}"); + } + } +} + +#[cfg(target_family = "wasm")] +pub fn websocket_config() -> aeronet_websocket::client::ClientConfig { + aeronet_websocket::client::ClientConfig::default() +} +#[cfg(not(target_family = "wasm"))] +pub fn websocket_config() -> aeronet_websocket::client::ClientConfig { + aeronet_websocket::client::ClientConfig::builder().with_no_cert_validation() +} \ No newline at end of file diff --git a/crates/unified/src/client_plugins.rs b/crates/unified/src/client_plugins.rs index 0455621d6eceeba0e482ee6ab0a01af96a8a9743..595abed8f5d11d81b39717fedb35ac0028e3aeaf 100644 --- a/crates/unified/src/client_plugins.rs +++ b/crates/unified/src/client_plugins.rs @@ -1,24 +1,21 @@ +use aeronet_replicon::client::AeronetRepliconClientPlugin; +use aeronet_websocket::client::WebSocketClientPlugin; use crate::client::ClientPlugin; use bevy::DefaultPlugins; use bevy::app::{PluginGroup, PluginGroupBuilder}; use bevy::log::LogPlugin; use bevy_replicon::RepliconPlugins; -use bevy_replicon_renet2::RepliconRenetClientPlugin; -#[cfg(not(target_arch = "wasm32"))] -use std::net::SocketAddr; pub struct ClientPluginGroup { - #[cfg(target_arch = "wasm32")] - pub server: url::Url, - #[cfg(not(target_arch = "wasm32"))] - pub server: SocketAddr, + pub server: String } impl PluginGroup for ClientPluginGroup { fn build(self) -> PluginGroupBuilder { PluginGroupBuilder::start::() .add_group(DefaultPlugins.build().disable::()) .add_group(RepliconPlugins) - .add(RepliconRenetClientPlugin) + .add(WebSocketClientPlugin) + .add(AeronetRepliconClientPlugin) .add(ClientPlugin { server: self.server, }) diff --git a/crates/unified/src/lib.rs b/crates/unified/src/lib.rs index b96463e32ff90b8fdf5573fc548f6c64247e065d..1a0dbb85700949cd9cee983feefebd220b831c25 100644 --- a/crates/unified/src/lib.rs +++ b/crates/unified/src/lib.rs @@ -8,8 +8,8 @@ pub mod client; pub mod client_plugins; pub mod config; pub mod ecs; -#[cfg(not(target_arch = "wasm32"))] +#[cfg(all(not(target_arch = "wasm32"), feature = "native"))] pub mod server; -#[cfg(not(target_arch = "wasm32"))] +#[cfg(all(not(target_arch = "wasm32"), feature = "native"))] pub mod server_plugins; pub mod shared_plugins; \ No newline at end of file diff --git a/crates/unified/src/main.rs b/crates/unified/src/main.rs index 9798ba64dd982b7406493e3dbccd0b6bb639f459..5fb82e9ba65bcfd0af5a094fb919bfde1eaeac86 100644 --- a/crates/unified/src/main.rs +++ b/crates/unified/src/main.rs @@ -15,19 +15,13 @@ use tracing_subscriber::util::SubscriberInitExt; #[command(version, about)] enum Cli { Client { - #[cfg(target_arch = "wasm32")] #[arg(short, long)] - server: url::Url, - #[cfg(not(target_arch = "wasm32"))] - #[arg(short, long)] - server: SocketAddr, + server: String, }, #[cfg(not(target_arch = "wasm32"))] Server { - #[arg(short = 'w', long)] - bind_ws: SocketAddr, - #[arg(short = 'u', long)] - bind_native: SocketAddr, + #[arg(short = 'b', long)] + bind: SocketAddr, #[arg(short = 'r', long)] tick_rate: f64, #[arg(short = 'C', long)] @@ -54,8 +48,7 @@ fn main() -> AppExit { } #[cfg(not(target_arch = "wasm32"))] Cli::Server { - bind_ws, - bind_native, + bind, tick_rate, max_clients, } => { @@ -65,8 +58,7 @@ fn main() -> AppExit { } app.add_plugins(ServerPluginGroup { - bind_ws, - bind_native, + bind, tick_rate, max_clients, }); diff --git a/crates/unified/src/server/gravity.rs b/crates/unified/src/server/gravity.rs index 55f2c45af658f179bfba148812a7bcc691ba4a85..13b08f484ba1397516e3feaf5931ee42535983e5 100644 --- a/crates/unified/src/server/gravity.rs +++ b/crates/unified/src/server/gravity.rs @@ -30,6 +30,8 @@ fn update_gravity( let part_mass = part_mass.mass; let part_translation = part_transform.translation; + debug!(?part_transform, "part transform"); + for (planet_transform, planet_mass) in &planet_query { let planet_mass = planet_mass.mass; let planet_translation = planet_transform.translation; diff --git a/crates/unified/src/server/mod.rs b/crates/unified/src/server/mod.rs index fbc7ababaf1b2a464113f784d2bbf74883e9bac8..878f7434be196b889f6ac1011280cf2fd622d8de 100644 --- a/crates/unified/src/server/mod.rs +++ b/crates/unified/src/server/mod.rs @@ -3,96 +3,111 @@ pub mod planets; pub mod player; mod world_config; +use std::net::SocketAddr; +use aeronet::io::connection::{Disconnected, LocalAddr}; +use aeronet::io::server::Server; +use aeronet::io::Session; +use aeronet_replicon::server::AeronetRepliconServer; +use aeronet_websocket::server::WebSocketServer; +use bevy::asset::AssetContainer; use bevy::prelude::*; -use bevy_replicon::prelude::RepliconChannels; -use bevy_replicon_renet2::netcode::{BoxedSocket, NetcodeServerTransport, ServerAuthentication, ServerSetupConfig, ServerSocket}; -use std::net::{SocketAddr, UdpSocket}; -use web_time::{SystemTime, UNIX_EPOCH}; - -#[cfg(not(target_arch = "wasm32"))] -use bevy_replicon_renet2::netcode::{ - NativeSocket, WebSocketAcceptor, WebSocketServer, WebSocketServerConfig, -}; - +use bevy_replicon::prelude::Replicated; use crate::server::gravity::newtonian_gravity_plugin; use crate::server::planets::planets_plugin; use crate::server::player::player_management_plugin; use crate::server::world_config::world_config_plugin; -use bevy_replicon_renet2::RenetChannelsExt; -use bevy_replicon_renet2::renet2::{ConnectionConfig, RenetServer}; -use tokio::runtime::Runtime; - -#[derive(Resource)] -pub struct RtResource { - rt: Runtime -} pub struct ServerPlugin { - pub bind_ws: SocketAddr, - pub bind_native: SocketAddr, + pub bind: SocketAddr, pub max_clients: usize, } impl Plugin for ServerPlugin { fn build(&self, app: &mut App) { - let bind_ws = self.bind_ws; - let bind_native = self.bind_native; - let max_clients = self.max_clients; + let config = self.websocket_config(); app.add_systems(FixedPreUpdate, bevy_replicon::server::increment_tick) // !!important!! do not remove or move - .add_systems( - Startup, - move |mut commands: Commands, channels: Res| { - let server = RenetServer::new(ConnectionConfig::from_channels( - channels.server_configs(), - channels.client_configs(), - )); - - - let rt = tokio::runtime::Runtime::new().unwrap(); + .add_systems(Startup, move |mut commands: Commands| { + let server = commands.spawn(Name::new("ws-server")) + .insert(AeronetRepliconServer) + .insert(Transform::from_xyz(0.0,0.0,0.0)) + .queue(WebSocketServer::open(config.clone())) + .id(); - let ws_config = WebSocketServerConfig { - acceptor: WebSocketAcceptor::Plain { - has_tls_proxy: true, - }, - listen: bind_ws, - max_clients, - }; - let ws_server = - WebSocketServer::new(ws_config, rt.handle().clone()).unwrap(); + info!(entity_id=?server, "opening websocket server"); + }) + .add_observer(on_opened) + .add_observer(on_connected) + .add_observer(on_disconnected) + .add_plugins(planets_plugin) + .add_plugins(world_config_plugin) + .add_plugins(newtonian_gravity_plugin) + .add_plugins(player_management_plugin); + } +} +impl ServerPlugin { + fn websocket_config(&self) -> aeronet_websocket::server::ServerConfig { + aeronet_websocket::server::ServerConfig::builder() + .with_bind_address(self.bind) + .with_no_encryption() + } +} - let native_socket = - NativeSocket::new(UdpSocket::bind(bind_native).unwrap()).unwrap(); +#[derive(Component)] +pub struct ConnectedGameEntity { + pub network_entity: Entity +} +#[derive(Component)] +pub struct ConnectedNetworkEntity { + pub game_entity: Entity +} - let server_config = ServerSetupConfig { - current_time: SystemTime::now().duration_since(UNIX_EPOCH).unwrap(), - max_clients, - protocol_id: 0, - authentication: ServerAuthentication::Unsecure, - socket_addresses: vec![ - vec![native_socket.addr().unwrap()], - vec![ws_server.addr().unwrap()], - ], - }; - let transport = NetcodeServerTransport::new_with_sockets( - server_config, - vec![BoxedSocket::new(native_socket), BoxedSocket::new(ws_server)], - ) - .unwrap(); +fn on_opened(trigger: Trigger, servers: Query<&LocalAddr>) { + let server = trigger.target(); + let local_addr = servers.get(server).unwrap(); + info!(server_entity=?server, "websocket server opened on {:?}", *local_addr); +} +fn on_connected( + trigger: Trigger, + clients: Query<&ChildOf>, + mut commands: Commands, +) { + let client = trigger.target(); + let Ok(&ChildOf(server)) = clients.get(client) else { + return; + }; + info!(?client, ?server, "client connected"); - commands.insert_resource(server); - commands.insert_resource(transport); - commands.insert_resource(RtResource { - rt - }); + // spawn the player - info!("websocket/native server listening"); + let player = commands.spawn(ConnectedGameEntity { + network_entity: client + }).id(); - }, - ) - .add_plugins(planets_plugin) - .add_plugins(world_config_plugin) - .add_plugins(newtonian_gravity_plugin) - .add_plugins(player_management_plugin); - } + commands.entity(client).insert(( + Replicated, + ConnectedNetworkEntity { + game_entity: player + }, + )); } +fn on_disconnected(trigger: Trigger, clients: Query<&ChildOf>, player_entity: Query<&ConnectedNetworkEntity>, mut commands: Commands) { + let client = trigger.target(); + let Ok(&ChildOf(server)) = clients.get(client) else { + return; + }; + match &*trigger { + Disconnected::ByUser(reason) => { + info!(?client, ?server, ?reason, "client disconnected by user"); + }, + Disconnected::ByPeer(reason) => { + info!(?client, ?server, ?reason, "client disconnected by peer"); + }, + Disconnected::ByError(err) => { + warn!(?client, ?server, "client disconnected with error: {err:?}"); + } + } + let Ok(other_entity) = player_entity.get(client) else { return }; + let Ok(mut commands) = commands.get_entity(other_entity.game_entity) else { return }; + commands.despawn(); +} \ No newline at end of file diff --git a/crates/unified/src/server/player.rs b/crates/unified/src/server/player.rs index 2d57b53ff21cf12f7e39f4c9fccffb3a508b43b6..5282b4f87e2cf2687c9bd7dd3119c538473e510a 100644 --- a/crates/unified/src/server/player.rs +++ b/crates/unified/src/server/player.rs @@ -8,6 +8,7 @@ use bevy_rapier2d::prelude::{ AdditionalMassProperties, Collider, ExternalForce, ExternalImpulse, MassProperties, }; use bevy_replicon::prelude::{ConnectedClient, FromClient, Replicated}; +use crate::server::{ConnectedGameEntity, ConnectedNetworkEntity}; pub fn player_management_plugin(app: &mut App) { app.add_systems(PreUpdate, reset_movement) @@ -24,7 +25,7 @@ fn reset_movement(mut players: Query<(&mut ExternalForce, &mut ExternalImpulse)> fn handle_new_players( mut commands: Commands, - q_new_clients: Query>, + q_new_clients: Query>, world_config: Res, planets: Query<(&Transform, &Planet)>, ) { @@ -32,6 +33,7 @@ fn handle_new_players( return; }; for joined_player in &q_new_clients { + info!(?joined_player, "detected joined player!"); // find earth let (earth_pos, earth_planet) = planets .iter() @@ -44,6 +46,8 @@ fn handle_new_players( new_transform.rotate_z(angle); new_transform.translation += earth_pos.translation; + info!(?new_transform, "set player's position!"); + commands .entity(joined_player) .insert(PartBundle { @@ -77,16 +81,15 @@ fn handle_new_players( fn player_thrust( mut players: Query<(&Transform, &mut ExternalForce, &mut PlayerThrust)>, + mut clients: Query<&ConnectedNetworkEntity>, mut thrust_event: EventReader>, world_config: Res, ) { use ThrustEvent::*; - for event in thrust_event.read() { - let FromClient { - client_entity, - event, - } = event; - let Ok((_, _, mut thrust)) = players.get_mut(*client_entity) else { + for FromClient { client_entity, event } in thrust_event.read() { + let ConnectedNetworkEntity { game_entity } = clients.get(*client_entity).unwrap(); + + let Ok((_, _, mut thrust)) = players.get_mut(*game_entity) else { continue; }; match *event { diff --git a/crates/unified/src/server_plugins.rs b/crates/unified/src/server_plugins.rs index d85d043e0ed0a46e78488dd0211e709c6ac7f29a..3beff17129243641f3b85578cca193dacb9729eb 100644 --- a/crates/unified/src/server_plugins.rs +++ b/crates/unified/src/server_plugins.rs @@ -6,13 +6,13 @@ use bevy::diagnostic::FrameCountPlugin; use bevy::time::TimePlugin; use bevy_common_assets::toml::TomlAssetPlugin; use bevy_replicon::RepliconPlugins; -use bevy_replicon_renet2::RepliconRenetServerPlugin; use std::net::SocketAddr; use std::time::Duration; +use aeronet_replicon::server::AeronetRepliconServerPlugin; +use aeronet_websocket::server::WebSocketServerPlugin; pub struct ServerPluginGroup { - pub bind_ws: SocketAddr, - pub bind_native: SocketAddr, + pub bind: SocketAddr, pub tick_rate: f64, pub max_clients: usize, } @@ -26,14 +26,14 @@ impl PluginGroup for ServerPluginGroup { 1.0 / self.tick_rate, ))) .add_group(RepliconPlugins) - .add(RepliconRenetServerPlugin) + .add(WebSocketServerPlugin) + .add(AeronetRepliconServerPlugin) /* Assets */ .add(AssetPlugin::default()) .add(TomlAssetPlugin::::new(&["wc.toml"])) .add(TomlAssetPlugin::::new(&["pc.toml"])) .add(crate::server::ServerPlugin { - bind_ws: self.bind_ws, - bind_native: self.bind_native, + bind: self.bind, max_clients: self.max_clients, }) } diff --git a/crates/unified/src/shared_plugins.rs b/crates/unified/src/shared_plugins.rs index 1485692b33c7fc8e8350dec47c0b104e2fa03e3f..b8fa497a906de9e3f772e94ca05bc43a153a6509 100644 --- a/crates/unified/src/shared_plugins.rs +++ b/crates/unified/src/shared_plugins.rs @@ -23,6 +23,7 @@ pub fn register_everything(app: &mut App) { .replicate::() .replicate::() .replicate::() + .replicate::() .replicate::() .replicate::() .replicate::(); diff --git a/crates/unified/src/wasm_entrypoint.rs b/crates/unified/src/wasm_entrypoint.rs index 4a953b7413e9dfc78eaac1a1de16351df705b7a2..622e45571e9b5988b6e07198b65bd8e3052c5604 100644 --- a/crates/unified/src/wasm_entrypoint.rs +++ b/crates/unified/src/wasm_entrypoint.rs @@ -1,4 +1,5 @@ -use bevy::app::App; +use aeronet_websocket::client::WebSocketClient; +use bevy::app::{App, Startup}; use url::Url; use wasm_bindgen::prelude::*; use crate::client_plugins::ClientPluginGroup; @@ -9,13 +10,12 @@ pub fn play(server: &str) -> Result<(), JsValue> { console_error_panic_hook::set_once(); tracing_wasm::set_as_global_default(); - let u = Url::parse(server).map_err(|e| JsValue::from(e.to_string()))?; - let mut app = App::new(); app.add_plugins(ClientPluginGroup { - server: u.clone(), + server: server.to_string(), }); app.add_plugins(SharedPluginGroup); + app.run(); bevy::prelude::info!("goodbye!");