From 7f6c00b5d665151905c1f79090af063ad20bd5d1 Mon Sep 17 00:00:00 2001 From: PROMETHIA-27 <42193387+PROMETHIA-27@users.noreply.github.com> Date: Mon, 25 Aug 2025 03:41:28 -0400 Subject: [PATCH] Input replication (#62) --- Cargo.toml | 1 + crates/client/src/client.rs | 15 +- crates/client/src/main.rs | 2 +- crates/shared/src/abilities/mod.rs | 42 +++-- crates/shared/src/abilities/thrown.rs | 8 +- crates/shared/src/backpack/backpack_ui.rs | 92 +++++------ crates/shared/src/backpack/mod.rs | 15 +- crates/shared/src/cash_heal.rs | 40 ++--- crates/shared/src/character.rs | 2 +- .../shared/src/control/controller_common.rs | 61 ++++--- .../shared/src/control/controller_flying.rs | 19 ++- .../shared/src/control/controller_running.rs | 30 ++-- crates/shared/src/control/controls.rs | 149 ++++++++---------- crates/shared/src/control/mod.rs | 20 ++- crates/shared/src/head_drop.rs | 4 +- crates/shared/src/heads/mod.rs | 51 +++--- crates/shared/src/npc.rs | 46 ++++-- crates/shared/src/player.rs | 14 +- crates/shared/src/protocol.rs | 10 +- crates/shared/src/utils/commands.rs | 4 +- 20 files changed, 345 insertions(+), 280 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b7aba75..772de66 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,7 @@ happy_feet = { git = "https://github.com/atornity/happy_feet.git", rev = "1b24ed "serde", ] } lightyear = { version = "0.22.4", default-features = false, features = [ + "input_native", "interpolation", "netcode", "prediction", diff --git a/crates/client/src/client.rs b/crates/client/src/client.rs index b55a43f..25afb8f 100644 --- a/crates/client/src/client.rs +++ b/crates/client/src/client.rs @@ -2,9 +2,12 @@ use bevy::prelude::*; use lightyear::{ connection::client::ClientState, netcode::Key, - prelude::{client::NetcodeConfig, *}, + prelude::{client::NetcodeConfig, input::native::InputMarker, *}, +}; +use shared::{ + GameState, control::ControlState, global_observer, heads_database::HeadsDatabase, + player::Player, tb_entities::SpawnPoint, }; -use shared::{GameState, heads_database::HeadsDatabase, tb_entities::SpawnPoint}; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; pub fn plugin(app: &mut App) { @@ -13,6 +16,8 @@ pub fn plugin(app: &mut App) { FixedUpdate, spawn_disconnected_player.run_if(in_state(GameState::Playing)), ); + + global_observer!(app, temp_give_player_marker); } fn temp_connect_on_startup(mut commands: Commands) -> Result { @@ -68,3 +73,9 @@ fn spawn_disconnected_player( shared::player::spawn(commands, Entity::PLACEHOLDER, query, asset_server, heads_db) } } + +fn temp_give_player_marker(trigger: Trigger, mut commands: Commands) { + commands + .entity(trigger.target()) + .insert(InputMarker::::default()); +} diff --git a/crates/client/src/main.rs b/crates/client/src/main.rs index e9395da..67d4a47 100644 --- a/crates/client/src/main.rs +++ b/crates/client/src/main.rs @@ -47,7 +47,7 @@ fn main() { ..default() }) .set(bevy::log::LogPlugin { - filter: "info,lightyear_replication=warn".into(), + filter: "info,lightyear_replication=off".into(), level: bevy::log::Level::INFO, // provide custom log layer to receive logging events custom_layer: bevy_debug_log::log_capture_layer, diff --git a/crates/shared/src/abilities/mod.rs b/crates/shared/src/abilities/mod.rs index 50f851f..3f913c0 100644 --- a/crates/shared/src/abilities/mod.rs +++ b/crates/shared/src/abilities/mod.rs @@ -9,6 +9,7 @@ use crate::{ GameState, aim::AimTarget, character::CharacterHierarchy, + control::ControlState, global_observer, head::ActiveHead, heads::ActiveHeads, @@ -17,23 +18,18 @@ use crate::{ physics_layers::GameLayer, player::{Player, PlayerBodyMesh}, sounds::PlaySound, - utils::{billboards::Billboard, sprite_3d_animation::AnimationTimer}, + utils::{billboards::Billboard, commands::IsServer, sprite_3d_animation::AnimationTimer}, }; use bevy::{pbr::NotShadowCaster, prelude::*}; use bevy_sprite3d::{Sprite3dBuilder, Sprite3dParams}; pub use healing::Healing; use healing::HealingStateChanged; +use lightyear::{ + connection::client::ClientState, + prelude::{Client, input::native::ActionState}, +}; use serde::{Deserialize, Serialize}; -#[derive(Event, Reflect)] -pub enum TriggerState { - Active, - Inactive, -} - -#[derive(Event, Reflect)] -pub struct TriggerCashHeal; - #[derive(Debug, Copy, Clone, PartialEq, Reflect, Default, Serialize, Deserialize)] pub enum HeadAbility { #[default] @@ -117,22 +113,34 @@ pub fn plugin(app: &mut App) { Update, (update, update_heal_ability).run_if(in_state(GameState::Playing)), ); + app.add_systems( + FixedUpdate, + on_trigger_state.run_if(in_state(GameState::Playing)), + ); - global_observer!(app, on_trigger_state); global_observer!(app, build_explosion_sprite); } fn on_trigger_state( - trigger: Trigger, mut res: ResMut, - player_head: Single<&ActiveHead, With>, + player: Query<(&ActiveHead, &ActionState), With>, headdb: Res, time: Res