~starkingdoms/starkingdoms

05fbfecfb41273eb861531bc69beed8f4f72f026 — core 5 months ago 6f80f62
feat(netcode): aeronet
M Cargo.lock => Cargo.lock +330 -188
@@ 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]]


@@ 575,6 656,29 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 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",


@@ 1903,19 2007,6 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1934,18 2025,6 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 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",


@@ 2461,6 2540,29 @@ dependencies = [

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f"


@@ 2862,30 2964,6 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 2940,7 3018,6 @@ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
dependencies = [
 "crypto-common",
 "inout",
 "zeroize",
]

[[package]]


@@ 2995,6 3072,15 @@ 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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 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]]


@@ 3549,6 3643,18 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 3662,6 3768,12 @@ 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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 4140,6 4252,12 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 4764,12 4882,6 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 5325,6 5437,12 @@ 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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 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"


@@ 6574,6 6695,16 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 6756,17 6887,6 @@ 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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 7145,6 7265,19 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 7249,61 7382,6 @@ 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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 7344,6 7422,17 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 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",


@@ 7459,6 7549,18 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 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",


@@ 7553,6 7656,15 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 7578,6 7690,29 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 7692,15 7827,6 @@ 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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 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",


@@ 8748,6 8878,26 @@ 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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 8832,16 8982,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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 8875,16 9015,9 @@ 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"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 10379,6 10512,15 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"

M crates/unified/Cargo.toml => crates/unified/Cargo.toml +7 -4
@@ 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

M crates/unified/src/client/mod.rs => crates/unified/src/client/mod.rs +11 -78
@@ 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<RepliconChannels>| {
                    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)

A crates/unified/src/client/net.rs => crates/unified/src/client/net.rs +43 -0
@@ 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<OnAdd, SessionEndpoint>, 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<OnAdd, Session>, 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<Disconnected>, 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

M crates/unified/src/client_plugins.rs => crates/unified/src/client_plugins.rs +5 -8
@@ 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::<Self>()
            .add_group(DefaultPlugins.build().disable::<LogPlugin>())
            .add_group(RepliconPlugins)
            .add(RepliconRenetClientPlugin)
            .add(WebSocketClientPlugin)
            .add(AeronetRepliconClientPlugin)
            .add(ClientPlugin {
                server: self.server,
            })

M crates/unified/src/lib.rs => crates/unified/src/lib.rs +2 -2
@@ 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

M crates/unified/src/main.rs => crates/unified/src/main.rs +5 -13
@@ 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,
            });

M crates/unified/src/server/gravity.rs => crates/unified/src/server/gravity.rs +2 -0
@@ 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;

M crates/unified/src/server/mod.rs => crates/unified/src/server/mod.rs +87 -72
@@ 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<RepliconChannels>| {
                    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<OnAdd, Server>, 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<OnAdd, Session>,
    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<Disconnected>, 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

M crates/unified/src/server/player.rs => crates/unified/src/server/player.rs +10 -7
@@ 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<Entity, Added<ConnectedClient>>,
    q_new_clients: Query<Entity, Added<ConnectedGameEntity>>,
    world_config: Res<WorldConfigResource>,
    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<FromClient<ThrustEvent>>,
    world_config: Res<WorldConfigResource>,
) {
    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 {

M crates/unified/src/server_plugins.rs => crates/unified/src/server_plugins.rs +6 -6
@@ 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::<GlobalWorldConfig>::new(&["wc.toml"]))
            .add(TomlAssetPlugin::<PlanetConfigCollection>::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,
            })
    }

M crates/unified/src/shared_plugins.rs => crates/unified/src/shared_plugins.rs +1 -0
@@ 23,6 23,7 @@ pub fn register_everything(app: &mut App) {
        .replicate::<Ball>()
        .replicate::<Ground>()
        .replicate::<Collider>()
        .replicate::<RigidBody>()
        .replicate::<Planet>()
        .replicate::<Part>()
        .replicate::<Player>();

M crates/unified/src/wasm_entrypoint.rs => crates/unified/src/wasm_entrypoint.rs +4 -4
@@ 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!");