From b0eadd5420855cd105c0fbf6e72e8463ef75c645 Mon Sep 17 00:00:00 2001 From: Magnus von Wachenfeldt Date: Tue, 9 Aug 2022 15:30:47 +0200 Subject: [PATCH] network code and stuff --- Cargo.lock | 805 ++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 2 +- client/Cargo.toml | 5 + client/src/main.rs | 293 ++++++++++++++--- server/Cargo.toml | 9 +- server/src/main.rs | 304 +++++++++++++++-- shared/Cargo.toml | 11 + shared/src/lib.rs | 170 ++++++++++ 8 files changed, 1510 insertions(+), 89 deletions(-) create mode 100644 shared/Cargo.toml create mode 100644 shared/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index efdfcf6..99bbb2c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,6 +30,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array", + "rand_core", +] + [[package]] name = "ahash" version = "0.7.6" @@ -123,6 +133,25 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arboard" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc120354d1b5ec6d7aaf4876b602def75595937b5e15d356eb554ab5177e08bb" +dependencies = [ + "clipboard-win", + "core-graphics 0.22.3", + "image 0.23.14", + "log", + "objc", + "objc-foundation", + "objc_id", + "parking_lot 0.12.1", + "thiserror", + "winapi", + "x11rb", +] + [[package]] name = "arrayvec" version = "0.7.2" @@ -169,6 +198,12 @@ version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" +[[package]] +name = "atomic_refcell" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b5e5f48b927f04e952dedc932f31995a65a0bf65ec971c74436e51bf6e970d" + [[package]] name = "autocfg" version = "1.1.0" @@ -355,6 +390,19 @@ dependencies = [ "syn", ] +[[package]] +name = "bevy_egui" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ab46f07c3f360507fae9bc3b9c000c583e0d67661f0dd6dd5a24a709775b1e" +dependencies = [ + "arboard", + "bevy", + "egui", + "thread_local", + "webbrowser", +] + [[package]] name = "bevy_encase_derive" version = "0.8.0" @@ -541,6 +589,19 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d92d5679e89602a18682a37846573dcd1979410179e14204280460ba9fb8713a" +[[package]] +name = "bevy_rapier2d" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e941caacdd45fcfc0fe0be661d5aaca0392dabfa6595a96ef7f18716587195f" +dependencies = [ + "bevy", + "bitflags", + "log", + "nalgebra", + "rapier2d", +] + [[package]] name = "bevy_reflect" version = "0.8.0" @@ -604,7 +665,7 @@ dependencies = [ "futures-lite", "hex", "hexasphere", - "image", + "image 0.24.3", "naga", "once_cell", "parking_lot 0.12.1", @@ -628,6 +689,16 @@ dependencies = [ "syn", ] +[[package]] +name = "bevy_renet" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c596a1512ffb72e81e51dec376c5a85a60a91d5d7365b811389f993fe7c0461a" +dependencies = [ + "bevy", + "renet", +] + [[package]] name = "bevy_scene" version = "0.8.0" @@ -817,6 +888,15 @@ dependencies = [ "winit", ] +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bindgen" version = "0.59.2" @@ -900,6 +980,9 @@ name = "bytes" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" +dependencies = [ + "serde", +] [[package]] name = "cache-padded" @@ -949,6 +1032,40 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +[[package]] +name = "chacha20" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" +dependencies = [ + "cfg-if 1.0.0", + "cipher", + "cpufeatures", + "zeroize", +] + +[[package]] +name = "chacha20poly1305" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + [[package]] name = "clang-sys" version = "1.3.3" @@ -960,6 +1077,17 @@ dependencies = [ "libloading", ] +[[package]] +name = "clipboard-win" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4ab1b92798304eedc095b53942963240037c0516452cb11aeba709d420b2219" +dependencies = [ + "error-code", + "str-buf", + "winapi", +] + [[package]] name = "cocoa" version = "0.24.0" @@ -1175,6 +1303,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.3.2" @@ -1184,6 +1321,20 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "crossbeam" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + [[package]] name = "crossbeam-channel" version = "0.5.6" @@ -1194,6 +1345,41 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "crossbeam-utils", + "memoffset", + "once_cell", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd42583b04998a5363558e5f9291ee5a5ff6b49944332103f251e7479a82aa7" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.11" @@ -1226,11 +1412,36 @@ name = "daggmask" version = "0.1.0" dependencies = [ "bevy", + "bevy_egui", + "bevy_renet", + "bincode", + "daggmask-shared", + "renet_visualizer", ] [[package]] name = "daggmask-server" version = "0.1.0" +dependencies = [ + "bevy", + "bevy_egui", + "bevy_rapier2d", + "bevy_renet", + "bincode", + "daggmask-shared", + "renet_visualizer", +] + +[[package]] +name = "daggmask-shared" +version = "0.1.0" +dependencies = [ + "bevy", + "bevy_egui", + "bevy_rapier2d", + "bevy_renet", + "serde", +] [[package]] name = "darling" @@ -1267,6 +1478,16 @@ dependencies = [ "syn", ] +[[package]] +name = "deflate" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +dependencies = [ + "adler32", + "byteorder", +] + [[package]] name = "deflate" version = "1.0.0" @@ -1288,6 +1509,32 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +[[package]] +name = "egui" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb095a8b9feb9b7ff8f00b6776dffcef059538a3f4a91238e03c900e9c9ad9a2" +dependencies = [ + "ahash", + "epaint", + "nohash-hasher", +] + +[[package]] +name = "either" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" + +[[package]] +name = "emath" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c223f58c7e38abe1770f367b969f1b3fbd4704b67666bcb65dbb1adb0980ba72" +dependencies = [ + "bytemuck", +] + [[package]] name = "encase" version = "0.3.0" @@ -1330,6 +1577,21 @@ dependencies = [ "regex", ] +[[package]] +name = "epaint" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c29567088888e8ac3e8f61bbb2ddc820207ebb8d69eefde5bcefa06d65e4e89" +dependencies = [ + "ab_glyph", + "ahash", + "atomic_refcell", + "bytemuck", + "emath", + "nohash-hasher", + "parking_lot 0.12.1", +] + [[package]] name = "erased-serde" version = "0.3.22" @@ -1339,6 +1601,16 @@ dependencies = [ "serde", ] +[[package]] +name = "error-code" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +dependencies = [ + "libc", + "str-buf", +] + [[package]] name = "euclid" version = "0.22.7" @@ -1402,6 +1674,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + [[package]] name = "fsevent-sys" version = "4.1.0" @@ -1447,6 +1729,26 @@ dependencies = [ "byteorder", ] +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "getrandom" version = "0.2.7" @@ -1693,6 +1995,33 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "image" +version = "0.23.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-iter", + "num-rational 0.3.2", + "num-traits", + "png 0.16.8", + "tiff", +] + [[package]] name = "image" version = "0.24.3" @@ -1702,9 +2031,9 @@ dependencies = [ "bytemuck", "byteorder", "color_quant", - "num-rational", + "num-rational 0.4.1", "num-traits", - "png", + "png 0.17.5", "scoped_threadpool", ] @@ -1807,6 +2136,12 @@ dependencies = [ "libc", ] +[[package]] +name = "jpeg-decoder" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" + [[package]] name = "js-sys" version = "0.3.59" @@ -1886,6 +2221,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "libm" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da83a57f3f5ba3680950aa3cbc806fc297bc0b289d42e8942ed528ace71b8145" + [[package]] name = "libudev-sys" version = "0.1.4" @@ -1942,6 +2283,21 @@ dependencies = [ "regex-automata", ] +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "matrixmultiply" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add85d4dd35074e6fedc608f8c8f513a3548619a9024b751949ef0e8e45a4d84" +dependencies = [ + "rawpointer", +] + [[package]] name = "memchr" version = "2.5.0" @@ -1977,6 +2333,25 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" +dependencies = [ + "adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.5.3" @@ -2020,6 +2395,34 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "nalgebra" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e0a04ce089f9401aac565c740ed30c46291260f27d4911fdbaa6ca65fa3044" +dependencies = [ + "approx", + "glam", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational 0.4.1", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ndk" version = "0.5.0" @@ -2111,6 +2514,19 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset", +] + [[package]] name = "nix" version = "0.23.1" @@ -2135,6 +2551,12 @@ dependencies = [ "libc", ] +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + [[package]] name = "nom" version = "7.1.1" @@ -2163,6 +2585,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-complex" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" +dependencies = [ + "num-traits", +] + [[package]] name = "num-derive" version = "0.3.3" @@ -2184,6 +2615,28 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-rational" version = "0.4.1" @@ -2202,6 +2655,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2245,6 +2699,17 @@ dependencies = [ "objc_exception", ] +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + [[package]] name = "objc_exception" version = "0.1.2" @@ -2254,6 +2719,15 @@ dependencies = [ "cc", ] +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + [[package]] name = "oboe" version = "0.4.6" @@ -2292,6 +2766,18 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "optional" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978aa494585d3ca4ad74929863093e87cac9790d81fe7aba2b3dc2890643a0fc" + [[package]] name = "owned_ttf_parser" version = "0.15.1" @@ -2355,6 +2841,33 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "parry2d" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2841cebc29aaf7c69058b242742853d9b106c5245ed946090a75d941d23a6f5e" +dependencies = [ + "approx", + "arrayvec", + "bitflags", + "downcast-rs", + "either", + "nalgebra", + "num-derive", + "num-traits", + "rustc-hash", + "simba", + "slab", + "smallvec", + "spade", +] + +[[package]] +name = "paste" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9423e2b32f7a043629287a536f21951e8c6a82482d0acb1eeebfc90bc2225b22" + [[package]] name = "peeking_take_while" version = "0.1.2" @@ -2389,6 +2902,18 @@ version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" +[[package]] +name = "png" +version = "0.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +dependencies = [ + "bitflags", + "crc32fast", + "deflate 0.8.6", + "miniz_oxide 0.3.7", +] + [[package]] name = "png" version = "0.17.5" @@ -2397,8 +2922,19 @@ checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba" dependencies = [ "bitflags", "crc32fast", - "deflate", - "miniz_oxide", + "deflate 1.0.0", + "miniz_oxide 0.5.3", +] + +[[package]] +name = "poly1305" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", ] [[package]] @@ -2410,6 +2946,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + [[package]] name = "proc-macro-crate" version = "1.2.0" @@ -2451,12 +2993,51 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17fd96390ed3feda12e1dfe2645ed587e0bea749e319333f104a33ff62f77a0b" +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + [[package]] name = "range-alloc" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6" +[[package]] +name = "rapier2d" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7e798266018ec9194a6ca931ae6520c0bf5f7dbdbcb5f1d8bb0d9c075ea24" +dependencies = [ + "approx", + "arrayvec", + "bit-vec", + "bitflags", + "crossbeam", + "downcast-rs", + "nalgebra", + "num-derive", + "num-traits", + "parry2d", + "rustc-hash", + "simba", +] + [[package]] name = "raw-window-handle" version = "0.4.3" @@ -2466,6 +3047,24 @@ dependencies = [ "cty", ] +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rechannel" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd5e81291adbf597712daa54f9224b2737db44011298ab16df4727ab0af748c" +dependencies = [ + "bincode", + "bytes", + "log", + "serde", +] + [[package]] name = "rectangle-pack" version = "0.4.2" @@ -2513,6 +3112,45 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157" +[[package]] +name = "renet" +version = "0.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c4353bd792e79509c02f55d4df54e58f6197ee9b299b593139beba17d79e995" +dependencies = [ + "log", + "rechannel", + "renetcode", +] + +[[package]] +name = "renet_visualizer" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "371df249e9cade11302df9f0a96f82f1033378aaa582781f0d786a1f0716f217" +dependencies = [ + "egui", + "renet", +] + +[[package]] +name = "renetcode" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce99d5663e75ba91d1aeff0cd31e0a52469abec5241a7d5d5ce798a9da4edb91" +dependencies = [ + "aead", + "chacha20poly1305", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "robust" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5864e7ef1a6b7bcf1d6ca3f655e65e724ed3b52546a0d0a663c991522f552ea" + [[package]] name = "rodio" version = "0.15.0" @@ -2557,6 +3195,15 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +[[package]] +name = "safe_arch" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "794821e4ccb0d9f979512f9c1973480123f9bd62a90d74ab0f9426fcf8f4a529" +dependencies = [ + "bytemuck", +] + [[package]] name = "same-file" version = "1.0.6" @@ -2624,6 +3271,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +[[package]] +name = "simba" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c48e45e5961033db030b56ad67aef22e9c908c493a6e8348c0a0f6b93433cd77" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + [[package]] name = "slab" version = "0.4.7" @@ -2651,6 +3311,18 @@ dependencies = [ "serde", ] +[[package]] +name = "spade" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "333b8c21ebd9a45c5e955f3d7a1f0c4a2214847dd7e8e1abb69f34ec9b88882d" +dependencies = [ + "num-traits", + "optional", + "robust", + "smallvec", +] + [[package]] name = "spirv" version = "0.2.0+1.5.4" @@ -2667,12 +3339,24 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef5430c8e36b713e13b48a9f709cc21e046723fe44ce34587b73a830203b533e" +[[package]] +name = "str-buf" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" + [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + [[package]] name = "svg_fmt" version = "0.4.1" @@ -2741,6 +3425,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tiff" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" +dependencies = [ + "jpeg-decoder", + "miniz_oxide 0.4.4", + "weezl", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -2850,12 +3545,27 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + [[package]] name = "unicode-ident" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" +[[package]] +name = "unicode-normalization" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-width" version = "0.1.9" @@ -2868,6 +3578,28 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + [[package]] name = "uuid" version = "1.1.2" @@ -2995,6 +3727,26 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webbrowser" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a3cffdb686fbb24d9fb8f03a213803277ed2300f11026a3afe1f108dc021b" +dependencies = [ + "jni", + "ndk-glue 0.6.2", + "url", + "web-sys", + "widestring", + "winapi", +] + +[[package]] +name = "weezl" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" + [[package]] name = "wgpu" version = "0.13.1" @@ -3089,6 +3841,22 @@ dependencies = [ "bitflags", ] +[[package]] +name = "wide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3aba2d1dac31ac7cae82847ac5b8be822aee8f99a4e100f279605016b185c5f" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "widestring" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + [[package]] name = "winapi" version = "0.3.9" @@ -3114,6 +3882,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "winapi-wsapoll" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -3204,8 +3981,26 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "x11rb" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e99be55648b3ae2a52342f9a870c0e138709a3493261ce9b469afe6e4df6d8a" +dependencies = [ + "gethostname", + "nix 0.22.3", + "winapi", + "winapi-wsapoll", +] + [[package]] name = "xi-unicode" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" + +[[package]] +name = "zeroize" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" diff --git a/Cargo.toml b/Cargo.toml index dc28830..aaf8c02 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] resolver = "2" -members = ["client", "server"] +members = ["client", "server", "shared"] diff --git a/client/Cargo.toml b/client/Cargo.toml index 23d7b54..1205467 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -5,6 +5,11 @@ edition = "2021" [dependencies] bevy = "0.8" +bevy_renet = "0.0.5" +bevy_egui = "0.15.0" +renet_visualizer = "0.0.2" +bincode = "1.3.1" +daggmask-shared = { path = "../shared" } # Enable a small amount of optimization in debug mode [profile.dev] diff --git a/client/src/main.rs b/client/src/main.rs index db2ca13..ce57a29 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -1,59 +1,246 @@ -use bevy::prelude::*; +use std::{collections::HashMap, net::UdpSocket, time::SystemTime}; -fn main() { - App::new() - .add_plugins(DefaultPlugins) - .add_startup_system(setup) - .add_startup_system(spawn_player) - .add_system(move_player) - .run(); +use bevy::{ + diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}, + prelude::*, +}; + +use bevy_egui::{EguiContext, EguiPlugin}; +use bevy_renet::{ + renet::{ClientAuthentication, RenetClient, RenetError}, + run_if_client_connected, RenetClientPlugin, +}; + +use daggmask_shared::{ + client_connection_config, setup_level, ClientChannel, NetworkFrame, PlayerCommand, PlayerInput, + ServerChannel, ServerMessages, PROTOCOL_ID, +}; + +use renet_visualizer::{RenetClientVisualizer, RenetVisualizerStyle}; + +#[derive(Component)] +struct ControlledPlayer; + +#[derive(Default)] +struct NetworkMapping(HashMap); + +#[derive(Debug)] +struct PlayerInfo { + client_entity: Entity, + server_entity: Entity, } -fn setup(mut commands: Commands) { - info!("hehe"); - let mut camera_bundle = Camera2dBundle::default(); - camera_bundle.projection.scale = 1. / 50.; - commands.spawn_bundle(camera_bundle); +#[derive(Debug, Default)] +struct ClientLobby { + players: HashMap, +} + +#[derive(Debug)] +struct MostRecentTick(Option); + +fn new_renet_client() -> RenetClient { + let server_addr = "127.0.0.1:5000".parse().unwrap(); + let socket = UdpSocket::bind("127.0.0.1:0").unwrap(); + let connection_config = client_connection_config(); + let current_time = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap(); + let client_id = current_time.as_millis() as u64; + let authentication = ClientAuthentication::Unsecure { + client_id, + protocol_id: PROTOCOL_ID, + server_addr, + user_data: None, + }; + + RenetClient::new(current_time, socket, 1, connection_config, authentication).unwrap() +} + +fn main() { + let mut app = App::new(); + app.add_plugins(DefaultPlugins); + app.add_plugin(RenetClientPlugin); + app.add_plugin(TransformPlugin); + app.add_plugin(FrameTimeDiagnosticsPlugin::default()); + app.add_plugin(LogDiagnosticsPlugin::default()); + app.add_plugin(EguiPlugin); + + app.add_event::(); + + app.insert_resource(ClientLobby::default()); + app.insert_resource(PlayerInput::default()); + app.insert_resource(MostRecentTick(None)); + app.insert_resource(new_renet_client()); + app.insert_resource(RenetClientVisualizer::<200>::new( + RenetVisualizerStyle::default(), + )); + app.insert_resource(NetworkMapping::default()); + + app.add_system(player_input); + app.add_system(client_send_input.with_run_criteria(run_if_client_connected)); + app.add_system(client_send_player_commands.with_run_criteria(run_if_client_connected)); + app.add_system(client_sync_players.with_run_criteria(run_if_client_connected)); + app.add_system(update_visulizer_system); + + app.add_startup_system(setup_level); + app.add_system(panic_on_error_system); + + app.run(); +} + +// If any error is found we just panic +fn panic_on_error_system(mut renet_error: EventReader) { + for e in renet_error.iter() { + panic!("{}", e); + } +} + +fn update_visulizer_system( + mut egui_context: ResMut, + mut visualizer: ResMut>, + client: Res, + mut show_visualizer: Local, + keyboard_input: Res>, +) { + visualizer.add_network_info(client.network_info()); + if keyboard_input.just_pressed(KeyCode::F1) { + *show_visualizer = !*show_visualizer; + } + if *show_visualizer { + visualizer.show_window(egui_context.ctx_mut()); + } +} + +fn player_input( + keyboard_input: Res>, + mut player_input: ResMut, + mouse_button_input: Res>, + target_query: Query<&Transform, With>, + mut player_commands: EventWriter, + most_recent_tick: Res, +) { + player_input.left = keyboard_input.pressed(KeyCode::A) || keyboard_input.pressed(KeyCode::Left); + player_input.right = + keyboard_input.pressed(KeyCode::D) || keyboard_input.pressed(KeyCode::Right); + player_input.up = keyboard_input.pressed(KeyCode::W) || keyboard_input.pressed(KeyCode::Up); + player_input.down = keyboard_input.pressed(KeyCode::S) || keyboard_input.pressed(KeyCode::Down); + player_input.most_recent_tick = most_recent_tick.0; + + if mouse_button_input.just_pressed(MouseButton::Left) { + player_commands.send(PlayerCommand::BasicAttack { + cast_at: Vec2::default(), // TODO: spawn projectiles correctly + }); + } +} + +fn client_send_input(player_input: Res, mut client: ResMut) { + let input_message = bincode::serialize(&*player_input).unwrap(); + + client.send_message(ClientChannel::Input.id(), input_message); +} + +fn client_send_player_commands( + mut player_commands: EventReader, + mut client: ResMut, +) { + for command in player_commands.iter() { + let command_message = bincode::serialize(command).unwrap(); + client.send_message(ClientChannel::Command.id(), command_message); + } +} + +fn client_sync_players( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, + mut client: ResMut, + mut lobby: ResMut, + mut network_mapping: ResMut, + mut most_recent_tick: ResMut, +) { + let client_id = client.client_id(); + while let Some(message) = client.receive_message(ServerChannel::ServerMessages.id()) { + let server_message = bincode::deserialize(&message).unwrap(); + match server_message { + ServerMessages::PlayerCreate { + id, + translation, + entity, + } => { + println!("Player {} connected.", id); + let mut client_entity = commands.spawn_bundle(PbrBundle { + mesh: meshes.add(Mesh::from(shape::Capsule::default())), + material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()), + transform: Transform::from_xyz(translation[0], translation[1], translation[2]), + ..Default::default() + }); + + if client_id == id { + client_entity.insert(ControlledPlayer); + } + + let player_info = PlayerInfo { + server_entity: entity, + client_entity: client_entity.id(), + }; + lobby.players.insert(id, player_info); + network_mapping.0.insert(entity, client_entity.id()); + } + ServerMessages::PlayerRemove { id } => { + println!("Player {} disconnected.", id); + if let Some(PlayerInfo { + server_entity, + client_entity, + }) = lobby.players.remove(&id) + { + commands.entity(client_entity).despawn(); + network_mapping.0.remove(&server_entity); + } + } + ServerMessages::SpawnProjectile { + entity, + location, + direction, + } => { + let projectile_entity = commands.spawn_bundle(SpriteBundle { + sprite: Sprite { + color: Color::rgb(0.25, 0.25, 0.75), + custom_size: Some(Vec2::new(50.0, 100.0)), + ..default() + }, + ..default() + }); + + network_mapping.0.insert(entity, projectile_entity.id()); + } + ServerMessages::DespawnProjectile { entity } => { + if let Some(entity) = network_mapping.0.remove(&entity) { + commands.entity(entity).despawn(); + } + } + } + } + + while let Some(message) = client.receive_message(ServerChannel::NetworkFrame.id()) { + let frame: NetworkFrame = bincode::deserialize(&message).unwrap(); + match most_recent_tick.0 { + None => most_recent_tick.0 = Some(frame.tick), + Some(tick) if tick < frame.tick => most_recent_tick.0 = Some(frame.tick), + _ => continue, + } + + for i in 0..frame.entities.entities.len() { + if let Some(entity) = network_mapping.0.get(&frame.entities.entities[i]) { + let translation = frame.entities.translations[i].into(); + let transform = Transform { + translation, + ..Default::default() + }; + commands.entity(*entity).insert(transform); + } + } + } } #[derive(Component)] -struct Player; - -fn spawn_player(mut commands: Commands) { - commands - .spawn_bundle(SpriteBundle { - sprite: Sprite { - color: Color::rgb(0., 0.47, 1.), - custom_size: Some(Vec2::new(1., 1.)), - ..Default::default() - }, - ..Default::default() - }) - .insert(Player); -} - -fn move_player(keys: Res>, mut player_query: Query<&mut Transform, With>) { - let mut direction = Vec2::ZERO; - if keys.any_pressed([KeyCode::Up, KeyCode::W]) { - direction.y += 1.; - } - if keys.any_pressed([KeyCode::Down, KeyCode::S]) { - direction.y -= 1.; - } - if keys.any_pressed([KeyCode::Right, KeyCode::D]) { - direction.x += 1.; - } - if keys.any_pressed([KeyCode::Left, KeyCode::A]) { - direction.x -= 1.; - } - if direction == Vec2::ZERO { - return; - } - - let move_speed = 0.13; - let move_delta = (direction * move_speed).extend(0.); - - for mut transform in player_query.iter_mut() { - transform.translation += move_delta; - } -} +struct Target; diff --git a/server/Cargo.toml b/server/Cargo.toml index c35b7dc..06dd0c3 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -3,5 +3,12 @@ name = "daggmask-server" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[dependencies] +bevy = "0.8.0" +bevy_renet = "0.0.5" +bevy_egui = "0.15.0" +bevy_rapier2d = "0.16.0" +renet_visualizer = "0.0.2" +bincode = "1.3.1" +daggmask-shared = { path = "../shared" } diff --git a/server/src/main.rs b/server/src/main.rs index d3aab5b..923008b 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,45 +1,291 @@ -use std::net::UdpSocket; +use std::{collections::HashMap, net::UdpSocket, time::SystemTime}; -fn main() -> std::io::Result<()> { - // replace xxxx with your desired port - // replace S.S.S.S with your server address - let socket = UdpSocket::bind("S.S.S.S:xxxx")?; - let mut peers: Vec = vec![]; +use bevy::{ + diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}, + prelude::*, +}; - loop { - let mut buf = [0; 1024]; - let (_, src) = socket.recv_from(&mut buf)?; - let stringified_buff = String::from_utf8(buf.to_vec()).unwrap(); - let stringified_buff = stringified_buff.trim_matches(char::from(0)); +use bevy_egui::{EguiContext, EguiPlugin}; +use bevy_rapier2d::prelude::*; +use bevy_renet::{ + renet::{RenetServer, ServerAuthentication, ServerConfig, ServerEvent}, + RenetServerPlugin, +}; - println!("[NEW MESSAGE]{:?} => {:?}", src, stringified_buff); +use daggmask_shared::{ + server_connection_config, setup_level, spawn_projectile, ClientChannel, NetworkFrame, Player, + PlayerCommand, PlayerInput, Projectile, ServerChannel, ServerMessages, PROTOCOL_ID, +}; - if stringified_buff != "register" { - continue; +use renet_visualizer::RenetServerVisualizer; + +#[derive(Debug, Default)] +pub struct ServerLobby { + pub players: HashMap, +} + +#[derive(Debug, Default)] +struct NetworkTick(u32); + +// Clients last received ticks +#[derive(Debug, Default)] +struct ClientTicks(HashMap>); + +const PLAYER_MOVE_SPEED: f32 = 5.0; + +fn new_renet_server() -> RenetServer { + let server_addr = "127.0.0.1:5000".parse().unwrap(); + let socket = UdpSocket::bind(server_addr).unwrap(); + let connection_config = server_connection_config(); + let server_config = + ServerConfig::new(64, PROTOCOL_ID, server_addr, ServerAuthentication::Unsecure); + let current_time = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap(); + RenetServer::new(current_time, server_config, connection_config, socket).unwrap() +} + +fn main() { + let mut app = App::new(); + app.add_plugins(DefaultPlugins); + + app.add_plugin(RenetServerPlugin); + app.add_plugin(RapierPhysicsPlugin::::default()); + app.add_plugin(RapierDebugRenderPlugin::default()); + app.add_plugin(FrameTimeDiagnosticsPlugin::default()); + app.add_plugin(LogDiagnosticsPlugin::default()); + app.add_plugin(EguiPlugin); + + app.insert_resource(ServerLobby::default()); + app.insert_resource(NetworkTick(0)); + app.insert_resource(ClientTicks::default()); + app.insert_resource(new_renet_server()); + app.insert_resource(RenetServerVisualizer::<200>::default()); + + app.add_system(server_update_system); + app.add_system(server_network_sync); + app.add_system(move_players_system); + app.add_system(update_projectiles_system); + app.add_system(update_visulizer_system); + app.add_system(despawn_projectile_system); + app.add_system_to_stage(CoreStage::PostUpdate, projectile_on_removal_system); + + app.add_startup_system(setup_level); + app.add_startup_system(setup_simple_camera); + + app.run(); +} + +#[allow(clippy::too_many_arguments)] +fn server_update_system( + mut server_events: EventReader, + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, + mut lobby: ResMut, + mut server: ResMut, + mut visualizer: ResMut>, + mut client_ticks: ResMut, + players: Query<(Entity, &Player, &Transform)>, +) { + for event in server_events.iter() { + match event { + ServerEvent::ClientConnected(id, _) => { + println!("Player {} connected.", id); + visualizer.add_client(*id); + + // Initialize other players for this new client + for (entity, player, transform) in players.iter() { + let translation: [f32; 3] = transform.translation.into(); + let message = bincode::serialize(&ServerMessages::PlayerCreate { + id: player.id, + entity, + translation, + }) + .unwrap(); + server.send_message(*id, ServerChannel::ServerMessages.id(), message); + } + + // Spawn new player + let transform = Transform::from_xyz(0., 0.51, 0.); + let player_entity = commands + .spawn_bundle(PbrBundle { + mesh: meshes.add(Mesh::from(shape::Capsule::default())), + material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()), + transform, + ..Default::default() + }) + .insert(RigidBody::Dynamic) + .insert(LockedAxes::ROTATION_LOCKED | LockedAxes::TRANSLATION_LOCKED_Y) + .insert(Collider::capsule_y(0.5, 0.5)) + .insert(PlayerInput::default()) + .insert(Velocity::default()) + .insert(Player { + id: *id, + location: Vec2::new(10., 10.), + }) + .id(); + + lobby.players.insert(*id, player_entity); + + let translation: [f32; 3] = transform.translation.into(); + let message = bincode::serialize(&ServerMessages::PlayerCreate { + id: *id, + entity: player_entity, + translation, + }) + .unwrap(); + + server.broadcast_message(ServerChannel::ServerMessages.id(), message); + } + ServerEvent::ClientDisconnected(id) => { + println!("Player {} disconnected.", id); + visualizer.remove_client(*id); + client_ticks.0.remove(id); + if let Some(player_entity) = lobby.players.remove(id) { + commands.entity(player_entity).despawn(); + } + + let message = + bincode::serialize(&ServerMessages::PlayerRemove { id: *id }).unwrap(); + server.broadcast_message(ServerChannel::ServerMessages.id(), message); + } + } + } + + for client_id in server.clients_id().into_iter() { + while let Some(message) = server.receive_message(client_id, ClientChannel::Command.id()) { + let command: PlayerCommand = bincode::deserialize(&message).unwrap(); + match command { + PlayerCommand::BasicAttack { mut cast_at } => { + println!( + "Received basic attack from client {}: {:?}", + client_id, cast_at + ); + + if let Some(player_entity) = lobby.players.get(&client_id) { + if let Ok((_, _, player_transform)) = players.get(*player_entity) { + cast_at[1] = player_transform.translation[1]; + + let projectile_entity = + spawn_projectile(&mut commands, cast_at, cast_at); + + let message = ServerMessages::SpawnProjectile { + entity: projectile_entity, + location: cast_at, + direction: cast_at, + }; + + let message = bincode::serialize(&message).unwrap(); + server.broadcast_message(ServerChannel::ServerMessages.id(), message); + } + } + } + } } - if !peers.contains(&format!("{}", src)) { - peers.push(format!("{}", src)); - } + while let Some(message) = server.receive_message(client_id, ClientChannel::Input.id()) { + let input: PlayerInput = bincode::deserialize(&message).unwrap(); + client_ticks.0.insert(client_id, input.most_recent_tick); - for p in &peers { - let filtered_peers = filter_peers(&peers, p); - - if !filtered_peers.is_empty() { - socket.send_to(filtered_peers.join(",").as_bytes(), p)?; + if let Some(player_entity) = lobby.players.get(&client_id) { + commands.entity(*player_entity).insert(input); } } } } -fn filter_peers(peers: &Vec, filter: &String) -> Vec { - let mut new_peers: Vec = vec![]; +fn update_projectiles_system( + mut commands: Commands, + mut projectiles: Query<(Entity, &mut Projectile)>, + time: Res