From 7cfae285ed9f187b7360cbe2fffcd25d93530b8f Mon Sep 17 00:00:00 2001 From: extrawurst <776816+extrawurst@users.noreply.github.com> Date: Thu, 18 Dec 2025 18:31:22 +0100 Subject: [PATCH] Crate unification (#88) * move client/server/config into shared * move platforms into shared * move head drops into shared * move tb_entities to shared * reduce server to just a call into shared * get solo play working * fix server opening window * fix fmt * extracted a few more modules from client * near completely migrated client * fixed duplicate CharacterInputEnabled definition * simplify a few things related to builds * more simplifications * fix warnings/check * ci update * address comments * try fixing macos steam build * address comments * address comments * CI tweaks with default client feature --------- Co-authored-by: PROMETHIA-27 --- .github/workflows/archive_steamos.yml | 7 +- .github/workflows/archive_win.yml | 7 +- .github/workflows/ci.yml | 10 +- .github/workflows/ci_debug.yml | 8 +- .github/workflows/steam_alpha.yml | 27 +- Cargo.lock | 438 ++---------------- Cargo.toml | 7 +- crates/client/src/main.rs | 214 --------- crates/{client => hedz_reloaded}/Cargo.toml | 35 +- crates/{client => hedz_reloaded}/build.rs | 0 .../src/abilities/arrow.rs | 0 .../src/abilities/curver.rs | 0 .../src/abilities/gun.rs | 0 .../src/abilities/healing.rs | 0 .../src/abilities/missile.rs | 0 .../src/abilities/mod.rs | 12 +- .../src/abilities/thrown.rs | 0 .../{shared => hedz_reloaded}/src/ai/mod.rs | 0 .../src/aim/marker.rs | 0 .../{shared => hedz_reloaded}/src/aim/mod.rs | 0 .../src/aim/target_ui.rs | 0 .../src/animation.rs | 0 .../src/backpack/backpack_ui.rs | 0 .../src/backpack/mod.rs | 0 .../src/backpack/ui_head_state.rs | 0 .../src/bin/hedz_reloaded_server.rs | 3 + .../{shared => hedz_reloaded}/src/camera.rs | 0 crates/{shared => hedz_reloaded}/src/cash.rs | 11 +- .../src/cash_heal.rs | 0 .../src/character.rs | 0 .../{client => hedz_reloaded}/src/client.rs | 172 ++----- .../src/client}/backpack/backpack_ui.rs | 14 +- .../src/client}/backpack/mod.rs | 0 .../src/client}/control/controller_flying.rs | 6 +- .../src/client}/control/controls.rs | 17 +- .../src/client}/control/mod.rs | 3 +- .../src => hedz_reloaded/src/client}/debug.rs | 1 + .../src => hedz_reloaded/src/client}/enemy.rs | 4 +- .../src/client}/heal_effect.rs | 6 +- .../src/client}/player.rs | 12 +- crates/hedz_reloaded/src/client/setup.rs | 90 ++++ .../src/client}/sounds.rs | 3 +- .../src => hedz_reloaded/src/client}/steam.rs | 23 +- .../src/client}/ui/mod.rs | 0 .../src/client}/ui/pause.rs | 6 +- .../{client => hedz_reloaded}/src/config.rs | 14 +- .../src/control/controller_common.rs | 0 .../src/control/controller_flying.rs | 0 .../src/control/controller_running.rs | 11 +- .../src/control/mod.rs | 19 +- .../{shared => hedz_reloaded}/src/cutscene.rs | 0 crates/{shared => hedz_reloaded}/src/gates.rs | 0 crates/{shared => hedz_reloaded}/src/head.rs | 0 .../src/head_drop.rs | 111 ++++- .../src/heads/heads_ui.rs | 19 +- .../src/heads/mod.rs | 6 +- .../src/heads_database.rs | 0 .../src/hitpoints.rs | 18 +- crates/{shared => hedz_reloaded}/src/keys.rs | 0 crates/hedz_reloaded/src/lib.rs | 229 +++++++++ .../src/loading_assets.rs | 2 + .../src/loading_map.rs | 8 +- crates/hedz_reloaded/src/main.rs | 3 + .../{shared => hedz_reloaded}/src/movables.rs | 0 crates/{shared => hedz_reloaded}/src/npc.rs | 26 +- .../src/physics_layers.rs | 0 .../src/platforms.rs | 37 +- crates/hedz_reloaded/src/player.rs | 242 ++++++++++ .../src/protocol/components.rs | 0 .../src/protocol/events.rs | 0 .../src/protocol/messages.rs | 0 .../src/protocol/mod.rs | 21 +- .../{server => hedz_reloaded}/src/server.rs | 95 +--- .../src/tb_entities.rs | 41 +- crates/{shared => hedz_reloaded}/src/tick.rs | 0 .../src/utils/auto_rotate.rs | 0 .../src/utils/billboards.rs | 0 .../src/utils/explosions.rs | 0 .../src/utils/mod.rs | 0 crates/hedz_reloaded/src/utils/observers.rs | 56 +++ .../src/utils/one_shot_force.rs | 0 .../src/utils/run_conditions.rs | 0 .../src/utils/sprite_3d_animation.rs | 0 .../src/utils/squish_animation.rs | 0 .../src/utils/trail.rs | 0 crates/{shared => hedz_reloaded}/src/water.rs | 0 crates/server/Cargo.toml | 26 -- crates/server/src/config.rs | 20 - crates/server/src/main.rs | 137 ------ crates/server/src/platforms.rs | 38 -- crates/server/src/player.rs | 130 ------ crates/server/src/tb_entities.rs | 45 -- crates/server/src/utils.rs | 37 -- crates/shared/Cargo.toml | 32 -- crates/shared/src/head_drop.rs | 91 ---- crates/shared/src/lib.rs | 56 --- crates/shared/src/player.rs | 118 ----- crates/shared/src/steam.rs | 25 - crates/shared/src/utils/observers.rs | 25 - justfile | 16 +- 100 files changed, 1099 insertions(+), 1791 deletions(-) delete mode 100644 crates/client/src/main.rs rename crates/{client => hedz_reloaded}/Cargo.toml (56%) rename crates/{client => hedz_reloaded}/build.rs (100%) rename crates/{shared => hedz_reloaded}/src/abilities/arrow.rs (100%) rename crates/{shared => hedz_reloaded}/src/abilities/curver.rs (100%) rename crates/{shared => hedz_reloaded}/src/abilities/gun.rs (100%) rename crates/{shared => hedz_reloaded}/src/abilities/healing.rs (100%) rename crates/{shared => hedz_reloaded}/src/abilities/missile.rs (100%) rename crates/{shared => hedz_reloaded}/src/abilities/mod.rs (98%) rename crates/{shared => hedz_reloaded}/src/abilities/thrown.rs (100%) rename crates/{shared => hedz_reloaded}/src/ai/mod.rs (100%) rename crates/{shared => hedz_reloaded}/src/aim/marker.rs (100%) rename crates/{shared => hedz_reloaded}/src/aim/mod.rs (100%) rename crates/{shared => hedz_reloaded}/src/aim/target_ui.rs (100%) rename crates/{shared => hedz_reloaded}/src/animation.rs (100%) rename crates/{shared => hedz_reloaded}/src/backpack/backpack_ui.rs (100%) rename crates/{shared => hedz_reloaded}/src/backpack/mod.rs (100%) rename crates/{shared => hedz_reloaded}/src/backpack/ui_head_state.rs (100%) create mode 100644 crates/hedz_reloaded/src/bin/hedz_reloaded_server.rs rename crates/{shared => hedz_reloaded}/src/camera.rs (100%) rename crates/{shared => hedz_reloaded}/src/cash.rs (89%) rename crates/{shared => hedz_reloaded}/src/cash_heal.rs (100%) rename crates/{shared => hedz_reloaded}/src/character.rs (100%) rename crates/{client => hedz_reloaded}/src/client.rs (58%) rename crates/{client/src => hedz_reloaded/src/client}/backpack/backpack_ui.rs (95%) rename crates/{client/src => hedz_reloaded/src/client}/backpack/mod.rs (100%) rename crates/{client/src => hedz_reloaded/src/client}/control/controller_flying.rs (95%) rename crates/{client/src => hedz_reloaded/src/client}/control/controls.rs (99%) rename crates/{client/src => hedz_reloaded/src/client}/control/mod.rs (90%) rename crates/{client/src => hedz_reloaded/src/client}/debug.rs (95%) rename crates/{client/src => hedz_reloaded/src/client}/enemy.rs (74%) rename crates/{client/src => hedz_reloaded/src/client}/heal_effect.rs (96%) rename crates/{client/src => hedz_reloaded/src/client}/player.rs (93%) create mode 100644 crates/hedz_reloaded/src/client/setup.rs rename crates/{client/src => hedz_reloaded/src/client}/sounds.rs (95%) rename crates/{client/src => hedz_reloaded/src/client}/steam.rs (76%) rename crates/{client/src => hedz_reloaded/src/client}/ui/mod.rs (100%) rename crates/{client/src => hedz_reloaded/src/client}/ui/pause.rs (97%) rename crates/{client => hedz_reloaded}/src/config.rs (56%) rename crates/{shared => hedz_reloaded}/src/control/controller_common.rs (100%) rename crates/{shared => hedz_reloaded}/src/control/controller_flying.rs (100%) rename crates/{shared => hedz_reloaded}/src/control/controller_running.rs (89%) rename crates/{shared => hedz_reloaded}/src/control/mod.rs (93%) rename crates/{shared => hedz_reloaded}/src/cutscene.rs (100%) rename crates/{shared => hedz_reloaded}/src/gates.rs (100%) rename crates/{shared => hedz_reloaded}/src/head.rs (100%) rename crates/{server => hedz_reloaded}/src/head_drop.rs (60%) rename crates/{shared => hedz_reloaded}/src/heads/heads_ui.rs (95%) rename crates/{shared => hedz_reloaded}/src/heads/mod.rs (98%) rename crates/{shared => hedz_reloaded}/src/heads_database.rs (100%) rename crates/{shared => hedz_reloaded}/src/hitpoints.rs (88%) rename crates/{shared => hedz_reloaded}/src/keys.rs (100%) create mode 100644 crates/hedz_reloaded/src/lib.rs rename crates/{shared => hedz_reloaded}/src/loading_assets.rs (99%) rename crates/{shared => hedz_reloaded}/src/loading_map.rs (85%) create mode 100644 crates/hedz_reloaded/src/main.rs rename crates/{shared => hedz_reloaded}/src/movables.rs (100%) rename crates/{shared => hedz_reloaded}/src/npc.rs (90%) rename crates/{shared => hedz_reloaded}/src/physics_layers.rs (100%) rename crates/{shared => hedz_reloaded}/src/platforms.rs (51%) create mode 100644 crates/hedz_reloaded/src/player.rs rename crates/{shared => hedz_reloaded}/src/protocol/components.rs (100%) rename crates/{shared => hedz_reloaded}/src/protocol/events.rs (100%) rename crates/{shared => hedz_reloaded}/src/protocol/messages.rs (100%) rename crates/{shared => hedz_reloaded}/src/protocol/mod.rs (92%) rename crates/{server => hedz_reloaded}/src/server.rs (60%) rename crates/{shared => hedz_reloaded}/src/tb_entities.rs (84%) rename crates/{shared => hedz_reloaded}/src/tick.rs (100%) rename crates/{shared => hedz_reloaded}/src/utils/auto_rotate.rs (100%) rename crates/{shared => hedz_reloaded}/src/utils/billboards.rs (100%) rename crates/{shared => hedz_reloaded}/src/utils/explosions.rs (100%) rename crates/{shared => hedz_reloaded}/src/utils/mod.rs (100%) create mode 100644 crates/hedz_reloaded/src/utils/observers.rs rename crates/{shared => hedz_reloaded}/src/utils/one_shot_force.rs (100%) rename crates/{shared => hedz_reloaded}/src/utils/run_conditions.rs (100%) rename crates/{shared => hedz_reloaded}/src/utils/sprite_3d_animation.rs (100%) rename crates/{shared => hedz_reloaded}/src/utils/squish_animation.rs (100%) rename crates/{shared => hedz_reloaded}/src/utils/trail.rs (100%) rename crates/{shared => hedz_reloaded}/src/water.rs (100%) delete mode 100644 crates/server/Cargo.toml delete mode 100644 crates/server/src/config.rs delete mode 100644 crates/server/src/main.rs delete mode 100644 crates/server/src/platforms.rs delete mode 100644 crates/server/src/player.rs delete mode 100644 crates/server/src/tb_entities.rs delete mode 100644 crates/server/src/utils.rs delete mode 100644 crates/shared/Cargo.toml delete mode 100644 crates/shared/src/head_drop.rs delete mode 100644 crates/shared/src/lib.rs delete mode 100644 crates/shared/src/player.rs delete mode 100644 crates/shared/src/steam.rs delete mode 100644 crates/shared/src/utils/observers.rs diff --git a/.github/workflows/archive_steamos.yml b/.github/workflows/archive_steamos.yml index 5be80e2..f7823b9 100644 --- a/.github/workflows/archive_steamos.yml +++ b/.github/workflows/archive_steamos.yml @@ -23,13 +23,12 @@ jobs: - name: Build run: | - cargo build --release --locked --target=x86_64-unknown-linux-gnu --bin hedz_reloaded --no-default-features --features shared/client - cargo build --release --locked --target=x86_64-unknown-linux-gnu --bin server --no-default-features --features shared/server + cargo build --release --locked --target=x86_64-unknown-linux-gnu --bin hedz_reloaded - name: Archive run: | - cp target/x86_64-unknown-linux-gnu/release/hedz_reloaded target/x86_64-unknown-linux-gnu/release/server ./ - tar -czf steamos.tar.gz hedz_reloaded server + cp target/x86_64-unknown-linux-gnu/release/hedz_reloaded ./ + tar -czf steamos.tar.gz hedz_reloaded - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/archive_win.yml b/.github/workflows/archive_win.yml index f368c65..59d78af 100644 --- a/.github/workflows/archive_win.yml +++ b/.github/workflows/archive_win.yml @@ -27,14 +27,13 @@ jobs: - name: Build binaries (Windows) run: | - cargo xwin build --locked --release --target=x86_64-pc-windows-msvc --bin hedz_reloaded --no-default-features --features shared/client - cargo xwin build --locked --release --target=x86_64-pc-windows-msvc --bin server --no-default-features --features shared/server + cargo xwin build --locked --release --target=x86_64-pc-windows-msvc --bin hedz_reloaded - name: Archive run: | ls -lisa target/x86_64-pc-windows-msvc/release/ - cp target/x86_64-pc-windows-msvc/release/hedz_reloaded.exe target/x86_64-pc-windows-msvc/release/server.exe ./ - tar -czf win.tar.gz hedz_reloaded.exe server.exe + cp target/x86_64-pc-windows-msvc/release/hedz_reloaded.exe ./ + tar -czf win.tar.gz hedz_reloaded.exe - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 73bd977..d05fe6d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,12 +38,10 @@ jobs: - name: Build run: | - cargo build --bin hedz_reloaded --no-default-features --features shared/client - cargo build --bin server --no-default-features --features shared/server + cargo build --bin hedz_reloaded + cargo build --bin hedz_reloaded_server --no-default-features - name: Tests run: | - cargo test --lib shared --no-default-features --features client - cargo test --lib shared --no-default-features --features server - cargo test --bin hedz_reloaded --no-default-features --features shared/client - cargo test --bin server --no-default-features --features shared/server + cargo test --lib hedz_reloaded + cargo test --lib hedz_reloaded --no-default-features diff --git a/.github/workflows/ci_debug.yml b/.github/workflows/ci_debug.yml index a590442..735b4ca 100644 --- a/.github/workflows/ci_debug.yml +++ b/.github/workflows/ci_debug.yml @@ -23,11 +23,11 @@ jobs: - name: Build client run: | - cargo build --locked --target=x86_64-unknown-linux-gnu --bin hedz_reloaded --no-default-features --features shared/client + cargo build --locked --target=x86_64-unknown-linux-gnu --bin hedz_reloaded - name: Build server run: | - cargo build --locked --target=x86_64-unknown-linux-gnu --bin server --no-default-features --features shared/server + cargo build --locked --target=x86_64-unknown-linux-gnu --bin hedz_reloaded_server --no-default-features - name: Lints run: | @@ -35,8 +35,8 @@ jobs: - name: Archive run: | - cp target/x86_64-unknown-linux-gnu/debug/hedz_reloaded target/x86_64-unknown-linux-gnu/debug/server ./ - tar -czf steamos-debug.tar.gz hedz_reloaded server + cp target/x86_64-unknown-linux-gnu/debug/hedz_reloaded target/x86_64-unknown-linux-gnu/debug/hedz_reloaded_server ./ + tar -czf steamos-debug.tar.gz hedz_reloaded hedz_reloaded_server - uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/steam_alpha.yml b/.github/workflows/steam_alpha.yml index b00dfdf..74d7b19 100644 --- a/.github/workflows/steam_alpha.yml +++ b/.github/workflows/steam_alpha.yml @@ -22,17 +22,14 @@ jobs: - name: Build (lipo) run: | - cargo build --release --target=x86_64-apple-darwin --bin hedz_reloaded --no-default-features --features shared/client - cargo build --release --target=x86_64-apple-darwin --bin server --no-default-features --features shared/server - cargo build --release --target=aarch64-apple-darwin --bin hedz_reloaded --no-default-features --features shared/client - cargo build --release --target=aarch64-apple-darwin --bin server --no-default-features --features shared/server + cargo build --release --target=x86_64-apple-darwin --bin hedz_reloaded + cargo build --release --target=aarch64-apple-darwin --bin hedz_reloaded lipo -create -output target/release/hedz_reloaded target/aarch64-apple-darwin/release/hedz_reloaded target/x86_64-apple-darwin/release/hedz_reloaded - lipo -create -output target/release/server target/aarch64-apple-darwin/release/server target/x86_64-apple-darwin/release/server - name: Archive run: | - cp target/release/hedz_reloaded target/release/server ./ - tar -czf hedz-macos.tar.gz hedz_reloaded server + cp target/release/hedz_reloaded ./ + tar -czf hedz-macos.tar.gz hedz_reloaded ls -lisah hedz-macos.tar.gz - uses: actions/upload-artifact@v4 @@ -63,7 +60,7 @@ jobs: rm -rf $APP_ROOT/* | true mkdir -p $APP_ROOT/assets cp -r assets/* $APP_ROOT/assets - cp hedz_reloaded server $APP_ROOT/ + cp hedz_reloaded $APP_ROOT/ cp build/macos/libsteam_api.dylib $APP_ROOT/ - uses: ./.github/actions/steamcmd @@ -114,13 +111,12 @@ jobs: - name: Build run: | - cargo build --locked --release --target=x86_64-unknown-linux-gnu --bin hedz_reloaded --no-default-features --features shared/client - cargo build --locked --release --target=x86_64-unknown-linux-gnu --bin server --no-default-features --features shared/server + cargo build --locked --release --target=x86_64-unknown-linux-gnu --bin hedz_reloaded - name: Archive run: | - cp target/x86_64-unknown-linux-gnu/release/hedz_reloaded target/x86_64-unknown-linux-gnu/release/server ./ - tar -czf steamos.tar.gz hedz_reloaded server + cp target/x86_64-unknown-linux-gnu/release/hedz_reloaded ./ + tar -czf steamos.tar.gz hedz_reloaded - uses: actions/upload-artifact@v4 with: @@ -130,7 +126,7 @@ jobs: - name: Copy Binary for SteamOS run: | mkdir -p build/steamos/content - cp target/x86_64-unknown-linux-gnu/release/hedz_reloaded target/x86_64-unknown-linux-gnu/release/server build/steamos/content/ + cp target/x86_64-unknown-linux-gnu/release/hedz_reloaded build/steamos/content/ - name: Install SteamCMD run: | @@ -196,13 +192,12 @@ jobs: - name: Build binaries (Windows) run: | - cargo xwin build --locked --release --target=x86_64-pc-windows-msvc --bin hedz_reloaded --no-default-features --features shared/client - cargo xwin build --locked --release --target=x86_64-pc-windows-msvc --bin server --no-default-features --features shared/server + cargo xwin build --locked --release --target=x86_64-pc-windows-msvc --bin hedz_reloaded - name: Move binary run: | ls -lisa target/x86_64-pc-windows-msvc/release/ - cp target/x86_64-pc-windows-msvc/release/hedz_reloaded.exe target/x86_64-pc-windows-msvc/release/server.exe build/win/ + cp target/x86_64-pc-windows-msvc/release/hedz_reloaded.exe build/win/ - uses: ./.github/actions/steamcmd with: diff --git a/Cargo.lock b/Cargo.lock index 1c6a37d..08d1b2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -102,7 +102,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -268,7 +267,7 @@ dependencies = [ "objc2-foundation 0.3.2", "parking_lot", "percent-encoding", - "windows-sys 0.60.2", + "windows-sys 0.59.0", "x11rb", ] @@ -568,7 +567,7 @@ dependencies = [ "bevy_utils", "blake3", "derive_more", - "downcast-rs 2.0.2", + "downcast-rs", "either", "petgraph", "ron 0.10.1", @@ -628,7 +627,7 @@ dependencies = [ "cfg-if", "console_error_panic_hook", "ctrlc", - "downcast-rs 2.0.2", + "downcast-rs", "log", "thiserror 2.0.17", "variadics_please", @@ -659,7 +658,7 @@ dependencies = [ "crossbeam-channel", "derive_more", "disqualified", - "downcast-rs 2.0.2", + "downcast-rs", "either", "futures-io", "futures-lite", @@ -731,7 +730,6 @@ dependencies = [ "bevy_reflect", "bevy_transform", "coreaudio-sys", - "cpal", "rodio", "tracing", ] @@ -763,7 +761,7 @@ dependencies = [ "bevy_utils", "bevy_window", "derive_more", - "downcast-rs 2.0.2", + "downcast-rs", "serde", "smallvec", "thiserror 2.0.17", @@ -1166,7 +1164,6 @@ dependencies = [ "bevy_pbr", "bevy_picking", "bevy_platform", - "bevy_post_process", "bevy_ptr", "bevy_reflect", "bevy_render", @@ -1383,36 +1380,6 @@ dependencies = [ "web-time", ] -[[package]] -name = "bevy_post_process" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b857972f5d56b43b0dce2c843b75b64d5fbbd0f6177f6ecccd75e7e41f72deb" -dependencies = [ - "bevy_app", - "bevy_asset", - "bevy_camera", - "bevy_color", - "bevy_core_pipeline", - "bevy_derive", - "bevy_ecs", - "bevy_image", - "bevy_math", - "bevy_platform", - "bevy_reflect", - "bevy_render", - "bevy_shader", - "bevy_transform", - "bevy_utils", - "bevy_window", - "bitflags 2.10.0", - "nonmax", - "radsort", - "smallvec", - "thiserror 2.0.17", - "tracing", -] - [[package]] name = "bevy_ptr" version = "0.17.3" @@ -1432,7 +1399,7 @@ dependencies = [ "bevy_utils", "derive_more", "disqualified", - "downcast-rs 2.0.2", + "downcast-rs", "erased-serde", "foldhash 0.2.0", "glam 0.30.9", @@ -1491,7 +1458,7 @@ dependencies = [ "bitflags 2.10.0", "bytemuck", "derive_more", - "downcast-rs 2.0.2", + "downcast-rs", "encase", "fixedbitset", "image", @@ -2081,9 +2048,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "bytemuck" @@ -2140,18 +2107,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "calloop-wayland-source" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" -dependencies = [ - "calloop", - "rustix 0.38.44", - "wayland-backend", - "wayland-client", -] - [[package]] name = "cc" version = "1.2.49" @@ -2864,12 +2819,6 @@ dependencies = [ "litrs", ] -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - [[package]] name = "downcast-rs" version = "2.0.2" @@ -3349,7 +3298,7 @@ dependencies = [ "vec_map", "wasm-bindgen", "web-sys", - "windows 0.62.2", + "windows 0.61.3", ] [[package]] @@ -3622,7 +3571,7 @@ dependencies = [ [[package]] name = "happy_feet" version = "0.1.0" -source = "git+https://github.com/PROMETHIA-27/happy_feet.git?rev=48a96cc#48a96cc9aedd417448d0a0b82011a66827112740" +source = "git+https://github.com/PROMETHIA-27/happy_feet.git?rev=27609d89be74561a3971b1fc7d8c04cdd3e05731#27609d89be74561a3971b1fc7d8c04cdd3e05731" dependencies = [ "avian3d", "bevy", @@ -3707,7 +3656,6 @@ dependencies = [ "rand 0.8.5", "ron 0.8.1", "serde", - "shared", "steamworks", "vergen-gitcl", ] @@ -4074,13 +4022,13 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" dependencies = [ "bitflags 2.10.0", "libc", - "redox_syscall 0.5.18", + "redox_syscall 0.6.0", ] [[package]] @@ -4217,9 +4165,9 @@ dependencies = [ [[package]] name = "moxcms" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80986bbbcf925ebd3be54c26613d861255284584501595cf418320c078945608" +checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" dependencies = [ "num-traits", "pxfm", @@ -4996,7 +4944,7 @@ dependencies = [ "approx", "arrayvec", "bitflags 2.10.0", - "downcast-rs 2.0.2", + "downcast-rs", "either", "ena", "foldhash 0.2.0", @@ -5027,7 +4975,7 @@ dependencies = [ "approx", "arrayvec", "bitflags 2.10.0", - "downcast-rs 2.0.2", + "downcast-rs", "either", "ena", "foldhash 0.2.0", @@ -5313,15 +5261,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" -[[package]] -name = "quick-xml" -version = "0.37.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" -dependencies = [ - "memchr", -] - [[package]] name = "quote" version = "1.0.42" @@ -5490,6 +5429,15 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "redox_syscall" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5" +dependencies = [ + "bitflags 2.10.0", +] + [[package]] name = "regex" version = "1.12.2" @@ -5733,31 +5681,12 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sctk-adwaita" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" -dependencies = [ - "ab_glyph", - "log", - "memmap2", - "smithay-client-toolkit", - "tiny-skia", -] - [[package]] name = "self_cell" version = "1.2.1" @@ -5837,28 +5766,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "server" -version = "0.1.0" -dependencies = [ - "avian3d", - "bevy", - "bevy-steamworks", - "bevy_common_assets", - "bevy_replicon", - "bevy_replicon_renet", - "bevy_sprite3d", - "bevy_trenchbroom", - "bevy_trenchbroom_avian", - "clap", - "happy_feet", - "rand 0.8.5", - "ron 0.8.1", - "serde", - "shared", - "steamworks", -] - [[package]] name = "sharded-slab" version = "0.1.7" @@ -5868,29 +5775,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shared" -version = "0.1.0" -dependencies = [ - "avian3d", - "bevy", - "bevy-inspector-egui", - "bevy-steamworks", - "bevy_asset_loader", - "bevy_ballistic", - "bevy_common_assets", - "bevy_debug_log", - "bevy_replicon", - "bevy_sprite3d", - "bevy_trenchbroom", - "happy_feet", - "nil 0.14.0", - "rand 0.8.5", - "ron 0.8.1", - "serde", - "steamworks", -] - [[package]] name = "shlex" version = "1.3.0" @@ -5967,31 +5851,6 @@ dependencies = [ "syn", ] -[[package]] -name = "smithay-client-toolkit" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" -dependencies = [ - "bitflags 2.10.0", - "calloop", - "calloop-wayland-source", - "cursor-icon", - "libc", - "log", - "memmap2", - "rustix 0.38.44", - "thiserror 1.0.69", - "wayland-backend", - "wayland-client", - "wayland-csd-frame", - "wayland-cursor", - "wayland-protocols", - "wayland-protocols-wlr", - "wayland-scanner", - "xkeysym", -] - [[package]] name = "smol_str" version = "0.2.2" @@ -6071,12 +5930,6 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42862065c9e685d08cc3d9f6c609d4b46bd9684ec7e9420688eb979213469582" -[[package]] -name = "strict-num" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" - [[package]] name = "strsim" version = "0.10.0" @@ -6296,31 +6149,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tiny-skia" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" -dependencies = [ - "arrayref", - "arrayvec", - "bytemuck", - "cfg-if", - "log", - "tiny-skia-path", -] - -[[package]] -name = "tiny-skia-path" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" -dependencies = [ - "arrayref", - "bytemuck", - "strict-num", -] - [[package]] name = "tinystr" version = "0.8.2" @@ -6795,114 +6623,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wayland-backend" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" -dependencies = [ - "cc", - "downcast-rs 1.2.1", - "rustix 1.1.2", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" -dependencies = [ - "bitflags 2.10.0", - "rustix 1.1.2", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-csd-frame" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" -dependencies = [ - "bitflags 2.10.0", - "cursor-icon", - "wayland-backend", -] - -[[package]] -name = "wayland-cursor" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" -dependencies = [ - "rustix 1.1.2", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" -dependencies = [ - "bitflags 2.10.0", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-plasma" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" -dependencies = [ - "bitflags 2.10.0", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-wlr" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" -dependencies = [ - "bitflags 2.10.0", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" -dependencies = [ - "proc-macro2", - "quick-xml", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" -dependencies = [ - "dlib", - "log", - "pkg-config", -] - [[package]] name = "web-sys" version = "0.3.83" @@ -7160,23 +6880,11 @@ version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ - "windows-collections 0.2.0", + "windows-collections", "windows-core 0.61.2", - "windows-future 0.2.1", + "windows-future", "windows-link 0.1.3", - "windows-numerics 0.2.0", -] - -[[package]] -name = "windows" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" -dependencies = [ - "windows-collections 0.3.2", - "windows-core 0.62.2", - "windows-future 0.3.2", - "windows-numerics 0.3.1", + "windows-numerics", ] [[package]] @@ -7188,15 +6896,6 @@ dependencies = [ "windows-core 0.61.2", ] -[[package]] -name = "windows-collections" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" -dependencies = [ - "windows-core 0.62.2", -] - [[package]] name = "windows-core" version = "0.54.0" @@ -7233,19 +6932,6 @@ dependencies = [ "windows-strings 0.4.2", ] -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - [[package]] name = "windows-future" version = "0.2.1" @@ -7254,18 +6940,7 @@ checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ "windows-core 0.61.2", "windows-link 0.1.3", - "windows-threading 0.1.0", -] - -[[package]] -name = "windows-future" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" -dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", - "windows-threading 0.2.1", + "windows-threading", ] [[package]] @@ -7334,16 +7009,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-numerics" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" -dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", -] - [[package]] name = "windows-result" version = "0.1.2" @@ -7371,15 +7036,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link 0.2.1", -] - [[package]] name = "windows-strings" version = "0.1.0" @@ -7399,15 +7055,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link 0.2.1", -] - [[package]] name = "windows-sys" version = "0.45.0" @@ -7510,15 +7157,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-threading" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" -dependencies = [ - "windows-link 0.2.1", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -7663,7 +7301,6 @@ version = "0.30.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" dependencies = [ - "ahash", "android-activity", "atomic-waker", "bitflags 2.10.0", @@ -7678,7 +7315,6 @@ dependencies = [ "dpi", "js-sys", "libc", - "memmap2", "ndk 0.9.0", "objc2 0.5.2", "objc2-app-kit 0.2.2", @@ -7690,17 +7326,11 @@ dependencies = [ "raw-window-handle", "redox_syscall 0.4.1", "rustix 0.38.44", - "sctk-adwaita", - "smithay-client-toolkit", "smol_str", "tracing", "unicode-segmentation", "wasm-bindgen", "wasm-bindgen-futures", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-plasma", "web-sys", "web-time", "windows-sys 0.52.0", @@ -7771,12 +7401,6 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" -[[package]] -name = "xcursor" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" - [[package]] name = "xkbcommon-dl" version = "0.4.2" diff --git a/Cargo.toml b/Cargo.toml index 6885806..85819f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,19 +34,20 @@ bevy = { version = "0.17.0", default-features = false, features = [ "bevy_state", "bevy_text", "bevy_ui", + "bevy_ui_render", "bevy_ui_picking_backend", - "custom_cursor", "default_font", "hdr", "multi_threaded", "png", + "reflect_auto_register", "smaa_luts", "std", "sysinfo_plugin", "tonemapping_luts", "vorbis", "webgl2", - "x11", + "zstd_rust", "track_location", ] } bevy-inspector-egui = "0.34" @@ -63,7 +64,7 @@ bevy_trenchbroom = { version = "0.10", default-features = false, features = [ ] } bevy_trenchbroom_avian = "0.10" clap = { version = "=4.5.47", features = ["derive"] } -happy_feet = { git = "https://github.com/PROMETHIA-27/happy_feet.git", rev = "48a96cc", features = [ +happy_feet = { git = "https://github.com/PROMETHIA-27/happy_feet.git", rev = "27609d89be74561a3971b1fc7d8c04cdd3e05731", features = [ "serde", ] } nil = "0.14.0" diff --git a/crates/client/src/main.rs b/crates/client/src/main.rs deleted file mode 100644 index 46b84e1..0000000 --- a/crates/client/src/main.rs +++ /dev/null @@ -1,214 +0,0 @@ -mod backpack; -mod client; -mod config; -mod control; -mod debug; -mod enemy; -mod heal_effect; -mod player; -mod sounds; -mod steam; -mod ui; - -use avian3d::prelude::*; -use bevy::{ - audio::{PlaybackMode, Volume}, - core_pipeline::tonemapping::Tonemapping, - prelude::*, - render::view::ColorGrading, -}; -use bevy_common_assets::ron::RonAssetPlugin; -use bevy_sprite3d::Sprite3dPlugin; -use bevy_trenchbroom::prelude::*; -use bevy_trenchbroom_avian::AvianPhysicsBackend; -use camera::MainCamera; -use heads_database::HeadDatabaseAsset; -use loading_assets::AudioAssets; -use shared::*; - -fn main() { - let mut app = App::new(); - - app.register_type::() - .register_type::(); - app.insert_resource(DebugVisuals { - unlit: false, - tonemapping: Tonemapping::None, - exposure: 1., - shadows: true, - cam_follow: true, - }); - - app.add_plugins( - DefaultPlugins - .set(WindowPlugin { - primary_window: Some(Window { - title: "HEDZ Reloaded".into(), - // resolution: (1024., 768.).into(), - ..default() - }), - ..default() - }) - .set(bevy::log::LogPlugin { - filter: "info,lightyear_replication=off,bevy_ecs::hierarchy=off".into(), - level: bevy::log::Level::INFO, - // provide custom log layer to receive logging events - custom_layer: bevy_debug_log::log_capture_layer, - ..default() - }), - ); - - app.add_plugins(steam::plugin); - - app.add_plugins( - bevy_debug_log::LogViewerPlugin::default() - .auto_open_threshold(bevy::log::tracing::level_filters::LevelFilter::OFF), - ); - app.add_plugins(PhysicsPlugins::default()); - app.add_plugins(Sprite3dPlugin); - app.add_plugins(TrenchBroomPlugins( - TrenchBroomConfig::new("hedz") - .icon(None) - .default_solid_spawn_hooks(|| SpawnHooks::new().convex_collider()), - )); - app.add_plugins(TrenchBroomPhysicsPlugin::new(AvianPhysicsBackend)); - app.add_plugins(RonAssetPlugin::::new(&["headsdb.ron"])); - - #[cfg(feature = "dbg")] - { - app.add_plugins(bevy_inspector_egui::bevy_egui::EguiPlugin::default()); - app.add_plugins(bevy_inspector_egui::quick::WorldInspectorPlugin::new()); - app.add_plugins(PhysicsDebugPlugin::default()); - - // app.add_plugins(bevy::pbr::wireframe::WireframePlugin) - // .insert_resource(bevy::pbr::wireframe::WireframeConfig { - // global: true, - // default_color: bevy::color::palettes::css::WHITE.into(), - // }); - } - - app.add_plugins(shared::ai::plugin); - app.add_plugins(shared::animation::plugin); - app.add_plugins(shared::character::plugin); - app.add_plugins(shared::cash::plugin); - app.add_plugins(shared::player::plugin); - app.add_plugins(shared::gates::plugin); - app.add_plugins(shared::platforms::plugin); - app.add_plugins(shared::movables::plugin); - app.add_plugins(shared::utils::billboards::plugin); - app.add_plugins(shared::aim::plugin); - app.add_plugins(shared::npc::plugin); - app.add_plugins(shared::keys::plugin); - app.add_plugins(shared::utils::squish_animation::plugin); - app.add_plugins(shared::cutscene::plugin); - app.add_plugins(shared::control::plugin); - app.add_plugins(shared::camera::plugin); - app.add_plugins(shared::backpack::plugin); - app.add_plugins(shared::loading_assets::LoadingPlugin); - app.add_plugins(shared::loading_map::plugin); - app.add_plugins(shared::utils::sprite_3d_animation::plugin); - app.add_plugins(shared::abilities::plugin); - app.add_plugins(shared::heads::plugin); - app.add_plugins(shared::hitpoints::plugin); - app.add_plugins(shared::cash_heal::plugin); - app.add_plugins(shared::utils::plugin); - app.add_plugins(shared::water::plugin); - app.add_plugins(shared::head_drop::plugin); - app.add_plugins(shared::utils::trail::plugin); - app.add_plugins(shared::utils::auto_rotate::plugin); - app.add_plugins(shared::tb_entities::plugin); - app.add_plugins(shared::tick::plugin); - app.add_plugins(shared::utils::explosions::plugin); - - // Networking - // The client/server plugin must go before the protocol, or else `ProtocolHasher` will not be available. - app.add_plugins(client::plugin); - app.add_plugins(shared::protocol::plugin); - - app.add_plugins(backpack::plugin); - app.add_plugins(config::plugin); - app.add_plugins(control::plugin); - app.add_plugins(debug::plugin); - app.add_plugins(enemy::plugin); - app.add_plugins(heal_effect::plugin); - app.add_plugins(player::plugin); - app.add_plugins(sounds::plugin); - app.add_plugins(ui::plugin); - - app.init_state::(); - - app.insert_resource(AmbientLight { - color: Color::WHITE, - brightness: 400., - ..Default::default() - }); - app.insert_resource(ClearColor(Color::BLACK)); - //TODO: let user control this - app.insert_resource(GlobalVolume::new(Volume::Linear(0.4))); - - app.add_systems(Startup, write_trenchbroom_config); - app.add_systems(OnEnter(GameState::Playing), music); - app.add_systems(Update, (set_materials_unlit, set_tonemapping, set_shadows)); - - app.run(); -} - -fn music(assets: Res, mut commands: Commands) { - commands.spawn(( - Name::new("sfx-music"), - AudioPlayer::new(assets.music.clone()), - PlaybackSettings { - mode: PlaybackMode::Loop, - volume: Volume::Linear(0.6), - ..default() - }, - )); - - commands.spawn(( - Name::new("sfx-ambient"), - AudioPlayer::new(assets.ambient.clone()), - PlaybackSettings { - mode: PlaybackMode::Loop, - volume: Volume::Linear(0.8), - ..default() - }, - )); -} - -fn write_trenchbroom_config(server: Res, type_registry: Res) { - if let Err(e) = server - .config - .write_game_config("trenchbroom/hedz", &type_registry.read()) - { - warn!("Failed to write trenchbroom config: {}", e); - } -} - -fn set_tonemapping( - mut cams: Query<(&mut Tonemapping, &mut ColorGrading), With>, - visuals: Res, -) { - for (mut tm, mut color) in cams.iter_mut() { - *tm = visuals.tonemapping; - color.global.exposure = visuals.exposure; - } -} - -fn set_materials_unlit( - mut materials: ResMut>, - visuals: Res, -) { - if !materials.is_changed() { - return; - } - - for (_, material) in materials.iter_mut() { - material.unlit = visuals.unlit; - } -} - -fn set_shadows(mut lights: Query<&mut DirectionalLight>, visuals: Res) { - for mut l in lights.iter_mut() { - l.shadows_enabled = visuals.shadows; - } -} diff --git a/crates/client/Cargo.toml b/crates/hedz_reloaded/Cargo.toml similarity index 56% rename from crates/client/Cargo.toml rename to crates/hedz_reloaded/Cargo.toml index 32187fa..9d5f779 100644 --- a/crates/client/Cargo.toml +++ b/crates/hedz_reloaded/Cargo.toml @@ -4,27 +4,37 @@ version = "0.1.0" edition = "2024" build = "build.rs" +[[bin]] +name = "hedz_reloaded_server" + [features] -default = ["shared/client"] -dbg = ["avian3d/debug-plugin", "dep:bevy-inspector-egui", "shared/dbg"] +default = ["client"] +client = [ + "bevy/bevy_audio", + "bevy/bevy_window", + # depend on `winit` + "bevy/bevy_winit", + "bevy/x11", + "bevy/custom_cursor", + "bevy_replicon/client", + "bevy_replicon_renet/client", + "bevy_trenchbroom/client", +] +dbg = ["avian3d/debug-plugin", "dep:bevy-inspector-egui"] [dependencies] avian3d = { workspace = true } -bevy = { workspace = true, default-features = false, features = [ - "bevy_audio", - "bevy_window", - "bevy_winit", -] } +bevy = { workspace = true } bevy-inspector-egui = { workspace = true, optional = true } bevy-steamworks = { workspace = true } bevy_asset_loader = { workspace = true } bevy_ballistic = { workspace = true } bevy_common_assets = { workspace = true } bevy_debug_log = { workspace = true } -bevy_replicon = { workspace = true, features = ["client"] } -bevy_replicon_renet = { workspace = true, features = ["client"] } +bevy_replicon = { workspace = true } +bevy_replicon_renet = { workspace = true } bevy_sprite3d = { workspace = true } -bevy_trenchbroom = { workspace = true, features = ["client"] } +bevy_trenchbroom = { workspace = true } bevy_trenchbroom_avian = { workspace = true } clap = { workspace = true } happy_feet = { workspace = true } @@ -32,8 +42,11 @@ nil = { workspace = true } rand = { workspace = true } ron = { workspace = true } serde = { workspace = true } -shared = { workspace = true } steamworks = { workspace = true } [build-dependencies] vergen-gitcl = "1.0" + +[lints.clippy] +too_many_arguments = "allow" +type_complexity = "allow" diff --git a/crates/client/build.rs b/crates/hedz_reloaded/build.rs similarity index 100% rename from crates/client/build.rs rename to crates/hedz_reloaded/build.rs diff --git a/crates/shared/src/abilities/arrow.rs b/crates/hedz_reloaded/src/abilities/arrow.rs similarity index 100% rename from crates/shared/src/abilities/arrow.rs rename to crates/hedz_reloaded/src/abilities/arrow.rs diff --git a/crates/shared/src/abilities/curver.rs b/crates/hedz_reloaded/src/abilities/curver.rs similarity index 100% rename from crates/shared/src/abilities/curver.rs rename to crates/hedz_reloaded/src/abilities/curver.rs diff --git a/crates/shared/src/abilities/gun.rs b/crates/hedz_reloaded/src/abilities/gun.rs similarity index 100% rename from crates/shared/src/abilities/gun.rs rename to crates/hedz_reloaded/src/abilities/gun.rs diff --git a/crates/shared/src/abilities/healing.rs b/crates/hedz_reloaded/src/abilities/healing.rs similarity index 100% rename from crates/shared/src/abilities/healing.rs rename to crates/hedz_reloaded/src/abilities/healing.rs diff --git a/crates/shared/src/abilities/missile.rs b/crates/hedz_reloaded/src/abilities/missile.rs similarity index 100% rename from crates/shared/src/abilities/missile.rs rename to crates/hedz_reloaded/src/abilities/missile.rs diff --git a/crates/shared/src/abilities/mod.rs b/crates/hedz_reloaded/src/abilities/mod.rs similarity index 98% rename from crates/shared/src/abilities/mod.rs rename to crates/hedz_reloaded/src/abilities/mod.rs index 0ab8727..97c837f 100644 --- a/crates/shared/src/abilities/mod.rs +++ b/crates/hedz_reloaded/src/abilities/mod.rs @@ -6,17 +6,19 @@ pub mod missile; pub mod thrown; use crate::{ - GameState, global_observer, + GameState, + aim::AimTarget, + character::CharacterHierarchy, + control::Inputs, + global_observer, + heads::ActiveHeads, + heads_database::HeadsDatabase, loading_assets::GameAssets, physics_layers::GameLayer, player::Player, protocol::PlaySound, utils::{billboards::Billboard, explosions::Explosion, sprite_3d_animation::AnimationTimer}, }; -use crate::{ - aim::AimTarget, character::CharacterHierarchy, control::Inputs, heads::ActiveHeads, - heads_database::HeadsDatabase, -}; use bevy::{light::NotShadowCaster, prelude::*}; use bevy_replicon::prelude::{SendMode, ServerTriggerExt, Signature, ToClients}; use bevy_sprite3d::Sprite3d; diff --git a/crates/shared/src/abilities/thrown.rs b/crates/hedz_reloaded/src/abilities/thrown.rs similarity index 100% rename from crates/shared/src/abilities/thrown.rs rename to crates/hedz_reloaded/src/abilities/thrown.rs diff --git a/crates/shared/src/ai/mod.rs b/crates/hedz_reloaded/src/ai/mod.rs similarity index 100% rename from crates/shared/src/ai/mod.rs rename to crates/hedz_reloaded/src/ai/mod.rs diff --git a/crates/shared/src/aim/marker.rs b/crates/hedz_reloaded/src/aim/marker.rs similarity index 100% rename from crates/shared/src/aim/marker.rs rename to crates/hedz_reloaded/src/aim/marker.rs diff --git a/crates/shared/src/aim/mod.rs b/crates/hedz_reloaded/src/aim/mod.rs similarity index 100% rename from crates/shared/src/aim/mod.rs rename to crates/hedz_reloaded/src/aim/mod.rs diff --git a/crates/shared/src/aim/target_ui.rs b/crates/hedz_reloaded/src/aim/target_ui.rs similarity index 100% rename from crates/shared/src/aim/target_ui.rs rename to crates/hedz_reloaded/src/aim/target_ui.rs diff --git a/crates/shared/src/animation.rs b/crates/hedz_reloaded/src/animation.rs similarity index 100% rename from crates/shared/src/animation.rs rename to crates/hedz_reloaded/src/animation.rs diff --git a/crates/shared/src/backpack/backpack_ui.rs b/crates/hedz_reloaded/src/backpack/backpack_ui.rs similarity index 100% rename from crates/shared/src/backpack/backpack_ui.rs rename to crates/hedz_reloaded/src/backpack/backpack_ui.rs diff --git a/crates/shared/src/backpack/mod.rs b/crates/hedz_reloaded/src/backpack/mod.rs similarity index 100% rename from crates/shared/src/backpack/mod.rs rename to crates/hedz_reloaded/src/backpack/mod.rs diff --git a/crates/shared/src/backpack/ui_head_state.rs b/crates/hedz_reloaded/src/backpack/ui_head_state.rs similarity index 100% rename from crates/shared/src/backpack/ui_head_state.rs rename to crates/hedz_reloaded/src/backpack/ui_head_state.rs diff --git a/crates/hedz_reloaded/src/bin/hedz_reloaded_server.rs b/crates/hedz_reloaded/src/bin/hedz_reloaded_server.rs new file mode 100644 index 0000000..ec3d6f8 --- /dev/null +++ b/crates/hedz_reloaded/src/bin/hedz_reloaded_server.rs @@ -0,0 +1,3 @@ +pub fn main() { + hedz_reloaded::launch(); +} diff --git a/crates/shared/src/camera.rs b/crates/hedz_reloaded/src/camera.rs similarity index 100% rename from crates/shared/src/camera.rs rename to crates/hedz_reloaded/src/camera.rs diff --git a/crates/shared/src/cash.rs b/crates/hedz_reloaded/src/cash.rs similarity index 89% rename from crates/shared/src/cash.rs rename to crates/hedz_reloaded/src/cash.rs index 3d0e887..6f847fb 100644 --- a/crates/shared/src/cash.rs +++ b/crates/hedz_reloaded/src/cash.rs @@ -1,6 +1,7 @@ -use crate::{GameState, HEDZ_GREEN, loading_assets::UIAssets}; -#[cfg(feature = "server")] -use crate::{global_observer, protocol::PlaySound}; +use crate::{ + GameState, HEDZ_GREEN, global_observer, loading_assets::UIAssets, protocol::PlaySound, + server_observer, +}; use avian3d::prelude::Rotation; use bevy::prelude::*; use serde::{Deserialize, Serialize}; @@ -29,11 +30,9 @@ pub fn plugin(app: &mut App) { (rotate, update_ui).run_if(in_state(GameState::Playing)), ); - #[cfg(feature = "server")] - global_observer!(app, on_cash_collect); + server_observer!(app, on_cash_collect); } -#[cfg(feature = "server")] fn on_cash_collect( _trigger: On, mut commands: Commands, diff --git a/crates/shared/src/cash_heal.rs b/crates/hedz_reloaded/src/cash_heal.rs similarity index 100% rename from crates/shared/src/cash_heal.rs rename to crates/hedz_reloaded/src/cash_heal.rs diff --git a/crates/shared/src/character.rs b/crates/hedz_reloaded/src/character.rs similarity index 100% rename from crates/shared/src/character.rs rename to crates/hedz_reloaded/src/character.rs diff --git a/crates/client/src/client.rs b/crates/hedz_reloaded/src/client.rs similarity index 58% rename from crates/client/src/client.rs rename to crates/hedz_reloaded/src/client.rs index 3b0bd6e..b7af419 100644 --- a/crates/client/src/client.rs +++ b/crates/hedz_reloaded/src/client.rs @@ -1,55 +1,60 @@ -use crate::config::ClientConfig; -use avian3d::prelude::{ - Collider, ColliderAabb, ColliderDensity, ColliderMarker, ColliderOf, ColliderTransform, - CollisionEventsEnabled, CollisionLayers, Sensor, -}; -use bevy::{ - ecs::bundle::BundleFromComponents, platform::cell::SyncCell, prelude::*, scene::SceneInstance, -}; -use bevy_replicon::{ - RepliconPlugins, - client::{ClientSystems, confirm_history::ConfirmHistory}, - prelude::{ClientState, ClientTriggerExt, RepliconChannels}, -}; -use bevy_replicon_renet::{ - RenetChannelsExt, RepliconRenetPlugins, - netcode::{ClientAuthentication, NetcodeClientTransport, NetcodeError}, - renet::{ConnectionConfig, RenetClient}, -}; -use bevy_trenchbroom::geometry::Brushes; -use nil::prelude::Mutex; -use shared::{ - GameState, global_observer, +use crate::{ + GameState, + config::NetworkingConfig, protocol::{ ClientEnteredPlaying, TbMapEntityId, TbMapEntityMapping, messages::DespawnTbMapEntity, }, tb_entities::{Movable, Platform, PlatformTarget}, }; +use avian3d::prelude::{ + Collider, ColliderAabb, ColliderDensity, ColliderMarker, ColliderOf, ColliderTransform, + CollisionEventsEnabled, CollisionLayers, Sensor, +}; +use bevy::{ecs::bundle::BundleFromComponents, prelude::*, scene::SceneInstance}; +use bevy_replicon::{ + client::{ClientSystems, confirm_history::ConfirmHistory}, + prelude::{ClientState, ClientTriggerExt, RepliconChannels}, +}; +use bevy_replicon_renet::{ + RenetChannelsExt, + netcode::{ClientAuthentication, NetcodeClientTransport, NetcodeError}, + renet::{ConnectionConfig, RenetClient}, +}; +use bevy_trenchbroom::geometry::Brushes; use std::{ - env::current_exe, - fs::File, - io::{BufRead, BufReader}, net::{Ipv4Addr, UdpSocket}, - process::Stdio, - sync::{LazyLock, mpsc}, time::SystemTime, }; -/// Cache of server processes to be cleared at process exit -static SERVER_PROCESSES: LazyLock>> = LazyLock::new(Mutex::default); +pub mod backpack; +pub mod control; +pub mod debug; +pub mod enemy; +pub mod heal_effect; +pub mod player; +pub mod setup; +pub mod sounds; +pub mod steam; +pub mod ui; pub fn plugin(app: &mut App) { - app.add_plugins((RepliconPlugins, RepliconRenetPlugins)); + app.add_plugins(( + backpack::plugin, + control::plugin, + debug::plugin, + enemy::plugin, + heal_effect::plugin, + player::plugin, + setup::plugin, + sounds::plugin, + steam::plugin, + ui::plugin, + )); app.add_systems( OnEnter(GameState::Connecting), - connect_to_server.run_if(|config: Res| config.server.is_some()), + connect_to_server.run_if(|config: Res| config.server.is_some()), ); - app.add_systems( - Update, - parse_local_server_stdout.run_if(resource_exists::), - ); - app.add_systems(Last, close_server_processes); app.add_systems(Update, despawn_absent_map_entities); app.add_systems( PreUpdate, @@ -58,15 +63,8 @@ pub fn plugin(app: &mut App) { .after(ClientSystems::Receive), ); - // TODO: migrate this to connect_on_local_server_started app.add_systems(OnEnter(ClientState::Connected), on_connected_state); app.add_systems(OnExit(ClientState::Connected), on_disconnect); - app.add_systems( - OnEnter(GameState::Connecting), - host_local_server.run_if(|config: Res| config.server.is_none()), - ); - - global_observer!(app, connect_on_local_server_started); } // @@ -74,6 +72,7 @@ pub fn plugin(app: &mut App) { // fn on_connected_state(mut commands: Commands, mut game_state: ResMut>) { + info!("sent entered playing signal"); commands.client_trigger(ClientEnteredPlaying); game_state.set(GameState::Playing); } @@ -82,24 +81,13 @@ fn on_disconnect() { info!("disconnected from the server"); } -fn close_server_processes(mut app_exit: MessageReader) { - if app_exit.read().next().is_some() { - let mut lock = SERVER_PROCESSES.lock(); - for mut process in lock.drain(..) { - if let Err(err) = process.wait() { - error!("{err}"); - } - } - } -} - // // Renet // fn connect_to_server( mut commands: Commands, - config: Res, + config: Res, channels: Res, ) -> Result { let server_channels_config = channels.server_configs(); @@ -117,12 +105,12 @@ fn connect_to_server( Ok(()) } -fn client_transport(config: &ClientConfig) -> Result { +fn client_transport(config: &NetworkingConfig) -> Result { let current_time = SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .unwrap(); let client_id = current_time.as_millis() as u64; - let socket = UdpSocket::bind((Ipv4Addr::UNSPECIFIED, config.port))?; + let socket = UdpSocket::bind((Ipv4Addr::UNSPECIFIED, 0))?; let server_addr = config .server .flatten() @@ -138,76 +126,6 @@ fn client_transport(config: &ClientConfig) -> Result>); - -fn host_local_server(mut commands: Commands) -> Result { - // the server executable is assumed to be adjacent to the client executable - let mut exe_path = current_exe().expect("failed to get path of client executable"); - exe_path.set_file_name("server"); - let server_log_file = File::create("server.log")?; - let mut server_process = std::process::Command::new(exe_path) - .args(["--timeout", "60", "--close-on-client-disconnect"]) - .env("NO_COLOR", "1") - .stdin(Stdio::null()) - .stdout(Stdio::piped()) - .stderr(server_log_file) - .spawn() - .expect("failed to start server"); - let server_stdout = server_process.stdout.take().unwrap(); - SERVER_PROCESSES.lock().push(server_process); - - let (tx, rx) = std::sync::mpsc::channel(); - - let stdout = BufReader::new(server_stdout).lines(); - - std::thread::spawn(move || { - for line in stdout { - match line { - Ok(line) => { - tx.send(line).unwrap(); - } - Err(error) => { - error!("error reading local server stdout: `{error}`"); - } - } - } - }); - - commands.insert_resource(LocalServerStdout(SyncCell::new(rx))); - - Ok(()) -} - -#[derive(Event)] -struct LocalServerStarted; - -fn parse_local_server_stdout(mut commands: Commands, mut stdout: ResMut) { - let stdout: &mut LocalServerStdout = &mut stdout; - - while let Ok(line) = stdout.0.get().try_recv() { - if let "hedz.server_started" = &line[..] { - commands.trigger(LocalServerStarted); - } else { - info!("SERVER: {line}"); - } - } -} - -fn connect_on_local_server_started( - _: On, - commands: Commands, - state: Res>, - channels: Res, - config: Res, -) -> Result<()> { - if *state == GameState::Connecting { - connect_to_server(commands, config, channels)?; - } - - Ok(()) -} - #[allow(clippy::type_complexity)] fn migrate_remote_entities( query: Query<(Entity, &TbMapEntityId), (Added, With)>, diff --git a/crates/client/src/backpack/backpack_ui.rs b/crates/hedz_reloaded/src/client/backpack/backpack_ui.rs similarity index 95% rename from crates/client/src/backpack/backpack_ui.rs rename to crates/hedz_reloaded/src/client/backpack/backpack_ui.rs index eedb6d5..154b2d3 100644 --- a/crates/client/src/backpack/backpack_ui.rs +++ b/crates/hedz_reloaded/src/client/backpack/backpack_ui.rs @@ -1,9 +1,13 @@ -use crate::{GameState, HEDZ_GREEN, heads::HeadsImages, loading_assets::UIAssets}; -use bevy::{ecs::spawn::SpawnIter, prelude::*}; -use shared::backpack::backpack_ui::{ - BACKPACK_HEAD_SLOTS, BackpackCountText, BackpackMarker, BackpackUiState, HeadDamage, HeadImage, - HeadSelector, +use crate::{ + GameState, HEDZ_GREEN, + backpack::backpack_ui::{ + BACKPACK_HEAD_SLOTS, BackpackCountText, BackpackMarker, BackpackUiState, HeadDamage, + HeadImage, HeadSelector, + }, + heads::HeadsImages, + loading_assets::UIAssets, }; +use bevy::{ecs::spawn::SpawnIter, prelude::*}; pub fn plugin(app: &mut App) { app.add_systems(OnEnter(GameState::Playing), setup); diff --git a/crates/client/src/backpack/mod.rs b/crates/hedz_reloaded/src/client/backpack/mod.rs similarity index 100% rename from crates/client/src/backpack/mod.rs rename to crates/hedz_reloaded/src/client/backpack/mod.rs diff --git a/crates/client/src/control/controller_flying.rs b/crates/hedz_reloaded/src/client/control/controller_flying.rs similarity index 95% rename from crates/client/src/control/controller_flying.rs rename to crates/hedz_reloaded/src/client/control/controller_flying.rs index 25fc301..20b5129 100644 --- a/crates/client/src/control/controller_flying.rs +++ b/crates/hedz_reloaded/src/client/control/controller_flying.rs @@ -1,16 +1,16 @@ -use bevy::prelude::*; -use shared::{ +use crate::{ GameState, control::{ControllerSet, Inputs, LookDirMovement}, player::{LocalPlayer, PlayerBodyMesh}, }; +use bevy::prelude::*; use std::f32::consts::PI; pub fn plugin(app: &mut App) { app.add_systems( FixedUpdate, rotate_rig - .before(shared::control::controller_flying::apply_controls) + .before(crate::control::controller_flying::apply_controls) .in_set(ControllerSet::ApplyControlsFly) .run_if(in_state(GameState::Playing)), ); diff --git a/crates/client/src/control/controls.rs b/crates/hedz_reloaded/src/client/control/controls.rs similarity index 99% rename from crates/client/src/control/controls.rs rename to crates/hedz_reloaded/src/client/control/controls.rs index bfda575..a276396 100644 --- a/crates/client/src/control/controls.rs +++ b/crates/hedz_reloaded/src/client/control/controls.rs @@ -1,4 +1,12 @@ -use crate::{GameState, control::CharacterInputEnabled}; +use crate::{ + GameState, + client::control::CharacterInputEnabled, + control::{ + BackpackButtonPress, CashHealPressed, ClientInputs, ControllerSet, Inputs, LocalInputs, + LookDirMovement, SelectLeftPressed, SelectRightPressed, + }, + player::{LocalPlayer, PlayerBodyMesh}, +}; use bevy::{ input::{ gamepad::{GamepadConnection, GamepadEvent}, @@ -7,13 +15,6 @@ use bevy::{ prelude::*, }; use bevy_replicon::client::ClientSystems; -use shared::{ - control::{ - BackpackButtonPress, CashHealPressed, ClientInputs, ControllerSet, Inputs, LocalInputs, - LookDirMovement, SelectLeftPressed, SelectRightPressed, - }, - player::{LocalPlayer, PlayerBodyMesh}, -}; pub fn plugin(app: &mut App) { app.add_systems( diff --git a/crates/client/src/control/mod.rs b/crates/hedz_reloaded/src/client/control/mod.rs similarity index 90% rename from crates/client/src/control/mod.rs rename to crates/hedz_reloaded/src/client/control/mod.rs index acfc450..8874672 100644 --- a/crates/client/src/control/mod.rs +++ b/crates/hedz_reloaded/src/client/control/mod.rs @@ -1,7 +1,6 @@ -use crate::GameState; +use crate::{GameState, control::ControllerSet}; use bevy::prelude::*; use bevy_replicon::client::ClientSystems; -use shared::control::ControllerSet; mod controller_flying; pub mod controls; diff --git a/crates/client/src/debug.rs b/crates/hedz_reloaded/src/client/debug.rs similarity index 95% rename from crates/client/src/debug.rs rename to crates/hedz_reloaded/src/client/debug.rs index 8e01139..bdea67b 100644 --- a/crates/client/src/debug.rs +++ b/crates/hedz_reloaded/src/client/debug.rs @@ -1,6 +1,7 @@ use bevy::prelude::*; use bevy_debug_log::LogViewerVisibility; +// Is supplied by a build script via vergen_gitcl pub const GIT_HASH: &str = env!("VERGEN_GIT_SHA"); pub fn plugin(app: &mut App) { diff --git a/crates/client/src/enemy.rs b/crates/hedz_reloaded/src/client/enemy.rs similarity index 74% rename from crates/client/src/enemy.rs rename to crates/hedz_reloaded/src/client/enemy.rs index b824dac..aac5eec 100644 --- a/crates/client/src/enemy.rs +++ b/crates/hedz_reloaded/src/client/enemy.rs @@ -1,8 +1,8 @@ +use crate::{GameState, tb_entities::EnemySpawn}; use bevy::prelude::*; -use shared::{GameState, tb_entities::EnemySpawn}; pub fn plugin(app: &mut App) { - app.add_systems(OnExit(GameState::MapLoading), despawn_enemy_spawns); + app.add_systems(OnEnter(GameState::Connecting), despawn_enemy_spawns); } /// Despawn enemy spawners because only the server will ever spawn enemies with them, and they have a diff --git a/crates/client/src/heal_effect.rs b/crates/hedz_reloaded/src/client/heal_effect.rs similarity index 96% rename from crates/client/src/heal_effect.rs rename to crates/hedz_reloaded/src/client/heal_effect.rs index c0b753d..eac3922 100644 --- a/crates/client/src/heal_effect.rs +++ b/crates/hedz_reloaded/src/client/heal_effect.rs @@ -1,9 +1,11 @@ use crate::{ - GameState, abilities::Healing, loading_assets::GameAssets, utils::billboards::Billboard, + GameState, + abilities::Healing, + loading_assets::{AudioAssets, GameAssets}, + utils::{billboards::Billboard, observers::global_observer}, }; use bevy::prelude::*; use rand::{Rng, thread_rng}; -use shared::{loading_assets::AudioAssets, utils::observers::global_observer}; // Should not be a relationship because lightyear will silently track state for all relationships // and break if one end of the relationship isn't replicated and is despawned diff --git a/crates/client/src/player.rs b/crates/hedz_reloaded/src/client/player.rs similarity index 93% rename from crates/client/src/player.rs rename to crates/hedz_reloaded/src/client/player.rs index 6ee3b1f..cdfdce9 100644 --- a/crates/client/src/player.rs +++ b/crates/hedz_reloaded/src/client/player.rs @@ -2,12 +2,10 @@ use crate::{ global_observer, heads_database::{HeadControls, HeadsDatabase}, loading_assets::AudioAssets, + player::{LocalPlayer, PlayerBodyMesh}, + protocol::{ClientHeadChanged, PlaySound, PlayerId, messages::AssignClientPlayer}, }; use bevy::prelude::*; -use shared::{ - player::{LocalPlayer, PlayerBodyMesh}, - protocol::{PlaySound, PlayerId, events::ClientHeadChanged, messages::AssignClientPlayer}, -}; pub fn plugin(app: &mut App) { app.init_state::(); @@ -17,10 +15,10 @@ pub fn plugin(app: &mut App) { receive_player_id.run_if(not(in_state(PlayerAssignmentState::Confirmed))), ); - global_observer!(app, on_update_head_mesh); + global_observer!(app, on_client_update_head_mesh); } -fn receive_player_id( +pub fn receive_player_id( mut commands: Commands, mut client_assignments: MessageReader, mut next: ResMut>, @@ -61,7 +59,7 @@ pub enum PlayerAssignmentState { Confirmed, } -fn on_update_head_mesh( +fn on_client_update_head_mesh( trigger: On, mut commands: Commands, body_mesh: Single<(Entity, &Children), With>, diff --git a/crates/hedz_reloaded/src/client/setup.rs b/crates/hedz_reloaded/src/client/setup.rs new file mode 100644 index 0000000..773db24 --- /dev/null +++ b/crates/hedz_reloaded/src/client/setup.rs @@ -0,0 +1,90 @@ +use crate::{DebugVisuals, GameState, camera::MainCamera, loading_assets::AudioAssets}; +use bevy::{ + audio::{PlaybackMode, Volume}, + core_pipeline::tonemapping::Tonemapping, + prelude::*, + render::view::ColorGrading, +}; +use bevy_trenchbroom::TrenchBroomServer; + +pub fn plugin(app: &mut App) { + #[cfg(feature = "dbg")] + { + app.add_plugins(bevy_inspector_egui::bevy_egui::EguiPlugin::default()); + app.add_plugins(bevy_inspector_egui::quick::WorldInspectorPlugin::new()); + app.add_plugins(avian3d::prelude::PhysicsDebugPlugin::default()); + } + + app.insert_resource(AmbientLight { + color: Color::WHITE, + brightness: 400., + ..Default::default() + }); + app.insert_resource(ClearColor(Color::BLACK)); + //TODO: let user control this + app.insert_resource(GlobalVolume::new(Volume::Linear(0.4))); + + app.add_systems(Startup, write_trenchbroom_config); + app.add_systems(OnEnter(GameState::Playing), music); + app.add_systems(Update, (set_materials_unlit, set_tonemapping, set_shadows)); +} + +fn music(assets: Res, mut commands: Commands) { + commands.spawn(( + Name::new("sfx-music"), + AudioPlayer::new(assets.music.clone()), + PlaybackSettings { + mode: PlaybackMode::Loop, + volume: Volume::Linear(0.6), + ..default() + }, + )); + + commands.spawn(( + Name::new("sfx-ambient"), + AudioPlayer::new(assets.ambient.clone()), + PlaybackSettings { + mode: PlaybackMode::Loop, + volume: Volume::Linear(0.8), + ..default() + }, + )); +} + +fn write_trenchbroom_config(server: Res, type_registry: Res) { + if let Err(e) = server + .config + .write_game_config("trenchbroom/hedz", &type_registry.read()) + { + warn!("Failed to write trenchbroom config: {}", e); + } +} + +fn set_tonemapping( + mut cams: Query<(&mut Tonemapping, &mut ColorGrading), With>, + visuals: Res, +) { + for (mut tm, mut color) in cams.iter_mut() { + *tm = visuals.tonemapping; + color.global.exposure = visuals.exposure; + } +} + +fn set_materials_unlit( + mut materials: ResMut>, + visuals: Res, +) { + if !materials.is_changed() { + return; + } + + for (_, material) in materials.iter_mut() { + material.unlit = visuals.unlit; + } +} + +fn set_shadows(mut lights: Query<&mut DirectionalLight>, visuals: Res) { + for mut l in lights.iter_mut() { + l.shadows_enabled = visuals.shadows; + } +} diff --git a/crates/client/src/sounds.rs b/crates/hedz_reloaded/src/client/sounds.rs similarity index 95% rename from crates/client/src/sounds.rs rename to crates/hedz_reloaded/src/client/sounds.rs index f3ead87..b4a1edb 100644 --- a/crates/client/src/sounds.rs +++ b/crates/hedz_reloaded/src/client/sounds.rs @@ -1,6 +1,5 @@ -use crate::{global_observer, loading_assets::AudioAssets}; +use crate::{global_observer, loading_assets::AudioAssets, protocol::PlaySound}; use bevy::prelude::*; -use shared::protocol::PlaySound; pub fn plugin(app: &mut App) { global_observer!(app, on_spawn_sounds); diff --git a/crates/client/src/steam.rs b/crates/hedz_reloaded/src/client/steam.rs similarity index 76% rename from crates/client/src/steam.rs rename to crates/hedz_reloaded/src/client/steam.rs index 698157e..7c4f87d 100644 --- a/crates/client/src/steam.rs +++ b/crates/hedz_reloaded/src/client/steam.rs @@ -1,9 +1,28 @@ use bevy::prelude::*; -use bevy_steamworks::{Client, FriendFlags, SteamworksEvent}; +use bevy_steamworks::{Client, FriendFlags, SteamworksEvent, SteamworksPlugin}; use std::io::{Read, Write}; pub fn plugin(app: &mut App) { - app.add_plugins(shared::steam::plugin); + let app_id = 1603000; + + // should only be done in production builds + #[cfg(not(debug_assertions))] + if steamworks::restart_app_if_necessary(app_id.into()) { + info!("Restarting app via steam"); + return; + } + + info!("steam app init: {app_id}"); + + match SteamworksPlugin::init_app(app_id) { + Ok(plugin) => { + info!("steam app init done"); + app.add_plugins(plugin); + } + Err(e) => { + warn!("steam init error: {e:?}"); + } + }; app.add_systems( Startup, diff --git a/crates/client/src/ui/mod.rs b/crates/hedz_reloaded/src/client/ui/mod.rs similarity index 100% rename from crates/client/src/ui/mod.rs rename to crates/hedz_reloaded/src/client/ui/mod.rs diff --git a/crates/client/src/ui/pause.rs b/crates/hedz_reloaded/src/client/ui/pause.rs similarity index 97% rename from crates/client/src/ui/pause.rs rename to crates/hedz_reloaded/src/client/ui/pause.rs index 2b2922b..ab55f70 100644 --- a/crates/client/src/ui/pause.rs +++ b/crates/hedz_reloaded/src/client/ui/pause.rs @@ -1,6 +1,8 @@ -use crate::{GameState, control::CharacterInputEnabled}; +use crate::{ + GameState, HEDZ_GREEN, HEDZ_PURPLE, client::control::CharacterInputEnabled, + loading_assets::UIAssets, +}; use bevy::{color::palettes::css::BLACK, prelude::*}; -use shared::{HEDZ_GREEN, HEDZ_PURPLE, loading_assets::UIAssets}; #[derive(States, Default, Clone, Eq, PartialEq, Debug, Hash)] #[states(scoped_entities)] diff --git a/crates/client/src/config.rs b/crates/hedz_reloaded/src/config.rs similarity index 56% rename from crates/client/src/config.rs rename to crates/hedz_reloaded/src/config.rs index 27585db..8d9970b 100644 --- a/crates/client/src/config.rs +++ b/crates/hedz_reloaded/src/config.rs @@ -3,21 +3,23 @@ use clap::Parser; use std::net::SocketAddr; pub fn plugin(app: &mut App) { - let config = ClientConfig::parse(); + let config = NetworkingConfig::parse(); app.insert_resource(config); } #[derive(Resource, Parser, Debug)] #[command(version, about, long_about = None)] -pub struct ClientConfig { - /// The port to use when connecting. - #[arg(long, default_value_t = 0)] - pub port: u16, +pub struct NetworkingConfig { /// The IP/port to connect to. /// If `None`, host a local server. /// If Some(None), connect to the default server (`127.0.0.1:31111`) - /// Otherwise, connect to the given server + /// Otherwise, connect to the given server. + /// Does nothing on the server. #[arg(long)] pub server: Option>, + /// Whether or not to open a port when opening the client, for other clients + /// to connect. Does nothing if `server` is set. + #[arg(long)] + pub host: bool, } diff --git a/crates/shared/src/control/controller_common.rs b/crates/hedz_reloaded/src/control/controller_common.rs similarity index 100% rename from crates/shared/src/control/controller_common.rs rename to crates/hedz_reloaded/src/control/controller_common.rs diff --git a/crates/shared/src/control/controller_flying.rs b/crates/hedz_reloaded/src/control/controller_flying.rs similarity index 100% rename from crates/shared/src/control/controller_flying.rs rename to crates/hedz_reloaded/src/control/controller_flying.rs diff --git a/crates/shared/src/control/controller_running.rs b/crates/hedz_reloaded/src/control/controller_running.rs similarity index 89% rename from crates/shared/src/control/controller_running.rs rename to crates/hedz_reloaded/src/control/controller_running.rs index b91378b..a05f8fe 100644 --- a/crates/shared/src/control/controller_running.rs +++ b/crates/hedz_reloaded/src/control/controller_running.rs @@ -2,6 +2,7 @@ use crate::{ GameState, animation::AnimationFlags, control::{ControllerSet, ControllerSettings, Inputs, controller_common::MovementSpeedFactor}, + protocol::is_server, }; #[cfg(feature = "client")] use crate::{ @@ -9,7 +10,6 @@ use crate::{ player::{LocalPlayer, PlayerBodyMesh}, }; use bevy::prelude::*; -use bevy_replicon::prelude::ClientState; use happy_feet::prelude::{Grounding, KinematicVelocity, MoveInput}; pub struct CharacterControllerPlugin; @@ -28,8 +28,7 @@ impl Plugin for CharacterControllerPlugin { FixedUpdate, apply_controls .in_set(ControllerSet::ApplyControlsRun) - .run_if(in_state(GameState::Playing)) - .run_if(in_state(ClientState::Disconnected)), + .run_if(in_state(GameState::Playing).and(is_server)), ); } } @@ -82,10 +81,8 @@ fn apply_controls( move_input.set(direction * move_factor.0); if inputs.jump && grounding.is_grounded() { - if cfg!(feature = "server") { - flags.jumping = true; - flags.jump_count += 1; - } + flags.jumping = true; + flags.jump_count += 1; happy_feet::movement::jump(settings.jump_force, &mut velocity, &mut grounding, Dir3::Y) } } diff --git a/crates/shared/src/control/mod.rs b/crates/hedz_reloaded/src/control/mod.rs similarity index 93% rename from crates/shared/src/control/mod.rs rename to crates/hedz_reloaded/src/control/mod.rs index 23df2ec..ac45f62 100644 --- a/crates/shared/src/control/mod.rs +++ b/crates/hedz_reloaded/src/control/mod.rs @@ -3,13 +3,10 @@ use crate::{ head::ActiveHead, heads_database::{HeadControls, HeadsDatabase}, player::Player, - protocol::ClientToController, + protocol::{ClientToController, is_server}, }; use bevy::{ecs::entity::MapEntities, prelude::*}; -use bevy_replicon::{ - client::ClientSystems, - prelude::{ClientState, FromClient}, -}; +use bevy_replicon::{client::ClientSystems, prelude::FromClient}; use serde::{Deserialize, Serialize}; pub mod controller_common; @@ -61,7 +58,7 @@ pub fn plugin(app: &mut App) { app.add_systems( PreUpdate, collect_player_inputs - .run_if(in_state(ClientState::Disconnected).and(in_state(GameState::Playing))) + .run_if(is_server.and(in_state(GameState::Playing))) .after(ClientSystems::Receive), ); app.add_systems(Update, head_change.run_if(in_state(GameState::Playing))); @@ -128,12 +125,6 @@ pub struct CashHealPressed; #[reflect(Resource)] pub struct LookDirMovement(pub Vec2); -#[derive(Resource, Debug, PartialEq, Eq)] -pub enum CharacterInputEnabled { - On, - Off, -} - #[derive(Component, Clone, PartialEq, Reflect, Serialize, Deserialize)] #[reflect(Component)] pub struct ControllerSettings { @@ -154,7 +145,9 @@ fn collect_player_inputs( ) { for msg in input_messages.read() { let player = clients.get_controller(msg.client_id); - let mut inputs = players.get_mut(player).unwrap(); + let Ok(mut inputs) = players.get_mut(player) else { + continue; + }; *inputs = msg.message.0; } diff --git a/crates/shared/src/cutscene.rs b/crates/hedz_reloaded/src/cutscene.rs similarity index 100% rename from crates/shared/src/cutscene.rs rename to crates/hedz_reloaded/src/cutscene.rs diff --git a/crates/shared/src/gates.rs b/crates/hedz_reloaded/src/gates.rs similarity index 100% rename from crates/shared/src/gates.rs rename to crates/hedz_reloaded/src/gates.rs diff --git a/crates/shared/src/head.rs b/crates/hedz_reloaded/src/head.rs similarity index 100% rename from crates/shared/src/head.rs rename to crates/hedz_reloaded/src/head.rs diff --git a/crates/server/src/head_drop.rs b/crates/hedz_reloaded/src/head_drop.rs similarity index 60% rename from crates/server/src/head_drop.rs rename to crates/hedz_reloaded/src/head_drop.rs index 734abef..fb4e915 100644 --- a/crates/server/src/head_drop.rs +++ b/crates/hedz_reloaded/src/head_drop.rs @@ -1,24 +1,108 @@ -use avian3d::prelude::*; -use bevy::{ - ecs::{relationship::RelatedSpawner, spawn::SpawnWith}, - prelude::*, -}; -use bevy_replicon::prelude::{Replicated, SendMode, ServerTriggerExt, ToClients}; -use shared::{ - global_observer, - head_drop::{HeadCollected, HeadDrop, HeadDropEnableTime, HeadDrops, SecretHeadMarker}, +use crate::{ + GameState, global_observer, heads_database::HeadsDatabase, physics_layers::GameLayer, player::Player, - protocol::{GltfSceneRoot, PlaySound}, + protocol::{GltfSceneRoot, NetworkEnv, PlaySound}, + server_observer, + tb_entities::SecretHead, utils::{ billboards::Billboard, one_shot_force::OneShotImpulse, squish_animation::SquishAnimation, }, }; +use avian3d::prelude::*; +use bevy::{ecs::relationship::RelatedSpawner, prelude::*}; +use bevy_replicon::prelude::{Replicated, SendMode, ServerTriggerExt, ToClients}; use std::f32::consts::PI; +#[derive(Event, Reflect)] +pub struct HeadDrops { + pub pos: Vec3, + pub head_id: usize, + pub impulse: bool, +} + +impl HeadDrops { + pub fn new(pos: Vec3, head_id: usize) -> Self { + Self { + pos, + head_id, + impulse: true, + } + } + + fn new_static(pos: Vec3, head_id: usize) -> Self { + Self { + pos, + head_id, + impulse: false, + } + } +} + +#[derive(Component, Reflect)] +#[reflect(Component)] +pub struct HeadDrop { + pub head_id: usize, +} + +#[derive(Component, Reflect)] +#[reflect(Component)] +pub struct HeadDropEnableTime(pub f32); + +#[derive(Component, Reflect)] +#[reflect(Component)] +pub struct SecretHeadMarker; + +#[derive(EntityEvent, Reflect)] +pub struct HeadCollected { + pub entity: Entity, + pub head: usize, +} + pub fn plugin(app: &mut App) { - global_observer!(app, on_head_drop); + app.register_type::(); + app.register_type::(); + app.register_type::(); + + app.add_systems( + Update, + enable_collectible.run_if(in_state(GameState::Playing)), + ); + + app.add_systems(OnEnter(GameState::Playing), spawn); + + server_observer!(app, on_head_drop); +} + +fn spawn(mut commands: Commands, query: Query<(Entity, &GlobalTransform, &SecretHead)>) { + for (e, t, head) in query { + commands.trigger(HeadDrops::new_static( + t.translation() + Vec3::new(0., 2., 0.), + head.head_id, + )); + + commands.entity(e).despawn(); + } +} + +fn enable_collectible( + mut commands: Commands, + query: Query<(Entity, &HeadDropEnableTime)>, + time: Res