From 4c9c8a619b504aa5cf7a4d4b9b90d55b477737bb Mon Sep 17 00:00:00 2001 From: Friedel Ziegelmayer Date: Thu, 4 Jul 2024 02:06:31 +0200 Subject: [PATCH] feat: update to bones with increase network player limit (#1005) matching PR to https://github.com/fishfolk/bones/pull/407 --------- Co-authored-by: Max Whitehead --- Cargo.lock | 26 ++++++++++++------------ src/core.rs | 6 +++--- src/core/elements/flappy_jellyfish.rs | 3 ++- src/core/elements/player_spawner.rs | 2 +- src/core/input.rs | 4 ++-- src/core/item.rs | 6 +++--- src/core/player.rs | 2 +- src/core/player/state/stage.rs | 3 ++- src/input.rs | 2 +- src/ui/main_menu/map_select.rs | 2 +- src/ui/main_menu/player_select.rs | 29 +++++++++++++++------------ src/ui/network_game.rs | 4 ++-- src/ui/scoring.rs | 6 +++--- 13 files changed, 50 insertions(+), 45 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d98be78e64..ddebe171d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1246,7 +1246,7 @@ dependencies = [ [[package]] name = "bones_asset" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "anyhow", "append-only-vec", @@ -1277,7 +1277,7 @@ dependencies = [ [[package]] name = "bones_bevy_renderer" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "anyhow", "bevy", @@ -1294,7 +1294,7 @@ dependencies = [ [[package]] name = "bones_ecs" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "anyhow", "atomicell", @@ -1311,7 +1311,7 @@ dependencies = [ [[package]] name = "bones_ecs_macros" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "bones_ecs_macros_core", "proc-macro2", @@ -1320,7 +1320,7 @@ dependencies = [ [[package]] name = "bones_ecs_macros_core" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "proc-macro2", "quote", @@ -1330,7 +1330,7 @@ dependencies = [ [[package]] name = "bones_framework" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "anyhow", "async-channel", @@ -1379,7 +1379,7 @@ dependencies = [ [[package]] name = "bones_lib" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "bones_ecs", "instant", @@ -1388,7 +1388,7 @@ dependencies = [ [[package]] name = "bones_matchmaker_proto" version = "0.2.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "iroh-net", "serde", @@ -1397,7 +1397,7 @@ dependencies = [ [[package]] name = "bones_schema" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "append-only-vec", "bones_schema_macros", @@ -1415,7 +1415,7 @@ dependencies = [ [[package]] name = "bones_schema_macros" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "proc-macro2", "quote", @@ -1425,7 +1425,7 @@ dependencies = [ [[package]] name = "bones_scripting" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "async-channel", "bevy_tasks", @@ -1442,7 +1442,7 @@ dependencies = [ [[package]] name = "bones_utils" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "bones_utils_macros", "branches", @@ -1463,7 +1463,7 @@ dependencies = [ [[package]] name = "bones_utils_macros" version = "0.3.0" -source = "git+https://github.com/fishfolk/bones#0d827379a723dde974529589b3e2132b197ee4c8" +source = "git+https://github.com/fishfolk/bones#6a55dc2b7f45365a316afb372b026cc8fb0a4439" dependencies = [ "quote", "venial", diff --git a/src/core.rs b/src/core.rs index 3fd05877d4..3728561471 100644 --- a/src/core.rs +++ b/src/core.rs @@ -24,7 +24,7 @@ pub mod win_indicator; pub const FPS: f32 = 60.0; /// The maximum number of players per match. -pub const MAX_PLAYERS: usize = 4; +pub const MAX_PLAYERS: u32 = 4; use std::time::Duration; @@ -52,7 +52,7 @@ pub fn game_plugin(game: &mut Game) { pub struct MatchPlugin { pub maps: MapPool, - pub player_info: [PlayerInput; MAX_PLAYERS], + pub player_info: [PlayerInput; MAX_PLAYERS as usize], /// The lua plugins to enable for this match. pub plugins: Arc>>, @@ -150,7 +150,7 @@ impl SessionRunner for JumpyDefaultMatchRunner { let input = self.input_collector.get_current_controls(); { let mut player_inputs = world.resource_mut::(); - (0..MAX_PLAYERS).for_each(|i| { + (0..MAX_PLAYERS as usize).for_each(|i| { let player_input = &mut player_inputs.players[i]; let Some(source) = &player_input.control_source else { return; diff --git a/src/core/elements/flappy_jellyfish.rs b/src/core/elements/flappy_jellyfish.rs index 99afd93137..d9328b35b8 100644 --- a/src/core/elements/flappy_jellyfish.rs +++ b/src/core/elements/flappy_jellyfish.rs @@ -234,7 +234,8 @@ fn explode_flappy_jellyfish( mut dehydrate_jellyfish: CompMut, ) { // Collect the hitboxes of all players - let mut player_hitboxes = SmallVec::<[Rect; MAX_PLAYERS]>::with_capacity(MAX_PLAYERS); + let mut player_hitboxes = + SmallVec::<[Rect; MAX_PLAYERS as usize]>::with_capacity(MAX_PLAYERS as usize); player_hitboxes.extend( entities .iter_with((&player_indexes, &transforms, &bodies)) diff --git a/src/core/elements/player_spawner.rs b/src/core/elements/player_spawner.rs index 26f1841f6d..52a8efd266 100644 --- a/src/core/elements/player_spawner.rs +++ b/src/core/elements/player_spawner.rs @@ -72,7 +72,7 @@ fn update( .collect::>(); // For every player - for i in 0..MAX_PLAYERS as u32 { + for i in 0..MAX_PLAYERS { let player = &player_inputs.players[i as usize]; // If the player is active, but not alive diff --git a/src/core/input.rs b/src/core/input.rs index 745af0e571..1470411833 100644 --- a/src/core/input.rs +++ b/src/core/input.rs @@ -13,7 +13,7 @@ pub fn install(session: &mut Session) { /// The inputs for each player in this simulation frame. #[derive(Clone, Debug, HasSchema)] pub struct MatchInputs { - pub players: [PlayerInput; MAX_PLAYERS], + pub players: [PlayerInput; MAX_PLAYERS as usize], } impl Default for MatchInputs { @@ -30,7 +30,7 @@ impl PlayerControls<'_, PlayerControl> for MatchInputs { type InputCollector = PlayerInputCollector; fn update_controls(&mut self, collector: &mut PlayerInputCollector) { - (0..MAX_PLAYERS).for_each(|i| { + (0..MAX_PLAYERS as usize).for_each(|i| { let player_input = &mut self.players[i]; if let Some(source) = &player_input.control_source { player_input.control = *collector.get_control(i, *source); diff --git a/src/core/item.rs b/src/core/item.rs index 21be37290f..e9c2912976 100644 --- a/src/core/item.rs +++ b/src/core/item.rs @@ -44,7 +44,7 @@ pub struct Inv { /// System param that can be used to conveniently get the inventory of each player. #[derive(Deref, DerefMut, Debug)] -pub struct PlayerInventories<'a>(&'a [Option; MAX_PLAYERS]); +pub struct PlayerInventories<'a>(&'a [Option; MAX_PLAYERS as usize]); impl PlayerInventories<'_> { pub fn find_item(&self, item: Entity) -> Option { @@ -55,7 +55,7 @@ impl PlayerInventories<'_> { } impl<'a> SystemParam for PlayerInventories<'a> { - type State = [Option; MAX_PLAYERS]; + type State = [Option; MAX_PLAYERS as usize]; type Param<'s> = PlayerInventories<'s>; fn get_state(world: &World) -> Self::State { @@ -63,7 +63,7 @@ impl<'a> SystemParam for PlayerInventories<'a> { |entities: Res, player_indexes: Comp, inventories: Comp| { - let mut player_inventories = [None; MAX_PLAYERS]; + let mut player_inventories = [None; MAX_PLAYERS as usize]; for (player, (idx, inventory)) in entities.iter_with((&player_indexes, &inventories)) { diff --git a/src/core/player.rs b/src/core/player.rs index e98eb571a5..66e33b7afc 100644 --- a/src/core/player.rs +++ b/src/core/player.rs @@ -569,7 +569,7 @@ fn player_ai_system( #[derive(Debug, Clone, HasSchema, Default)] struct PlayersHaveSpawned { /// For each player, whether they have spawned before. - pub players: [bool; MAX_PLAYERS], + pub players: [bool; MAX_PLAYERS as usize], } /// Marker component for a player hat. diff --git a/src/core/player/state/stage.rs b/src/core/player/state/stage.rs index be557cfafd..37e2cd753b 100644 --- a/src/core/player/state/stage.rs +++ b/src/core/player/state/stage.rs @@ -45,7 +45,8 @@ impl SystemStage for PlayerStateStageImpl { |entities: Res, player_indexes: Comp, player_states: Comp| { - let mut states: [Option; MAX_PLAYERS] = std::array::from_fn(|_| None); + let mut states: [Option; MAX_PLAYERS as usize] = + std::array::from_fn(|_| None); for (_ent, (idx, state)) in entities.iter_with((&player_indexes, &player_states)) { diff --git a/src/input.rs b/src/input.rs index e2e46c2032..9efc17cedd 100644 --- a/src/input.rs +++ b/src/input.rs @@ -197,7 +197,7 @@ impl Default for PlayerInputCollector { // We always have the keyboard controls "plugged in" m.insert(ControlSource::Keyboard1, default()); m.insert(ControlSource::Keyboard2, default()); - for i in 0..MAX_PLAYERS as u32 { + for i in 0..MAX_PLAYERS { m.insert(ControlSource::Gamepad(i), default()); } m diff --git a/src/ui/main_menu/map_select.rs b/src/ui/main_menu/map_select.rs index 234bb4bcd1..ad81e6ec18 100644 --- a/src/ui/main_menu/map_select.rs +++ b/src/ui/main_menu/map_select.rs @@ -119,7 +119,7 @@ fn handle_match_setup_messages( asset_server: &AssetServer, ) -> Option { if let Some(socket) = socket { - let datas: Vec<(usize, Vec)> = socket.recv_reliable(); + let datas: Vec<(u32, Vec)> = socket.recv_reliable(); for (_player, data) in datas { match postcard::from_bytes::(&data) { diff --git a/src/ui/main_menu/player_select.rs b/src/ui/main_menu/player_select.rs index 0de43ec483..c847994a38 100644 --- a/src/ui/main_menu/player_select.rs +++ b/src/ui/main_menu/player_select.rs @@ -10,7 +10,7 @@ use super::*; #[derive(Default, Clone, Debug, HasSchema)] pub struct PlayerSelectState { - pub slots: [PlayerSlot; MAX_PLAYERS], + pub slots: [PlayerSlot; MAX_PLAYERS as usize], /// Cache of available players from the game and packs. pub players: Vec>, /// Cache of available hats from the game and packs. @@ -177,9 +177,12 @@ pub fn widget( ui.vertical_centered(|ui| { ui.set_width(ui.available_width() - normal_button_style.font.size * 2.0); - ui.columns(MAX_PLAYERS, |columns| { + ui.columns(MAX_PLAYERS as usize, |columns| { for (i, ui) in columns.iter_mut().enumerate() { - world.run_system(player_select_panel, (ui, i, &mut state)) + world.run_system( + player_select_panel, + (ui, u32::try_from(i).unwrap(), &mut state), + ) } }); }); @@ -197,21 +200,21 @@ fn handle_match_setup_messages( player_select_state: &mut PlayerSelectState, asset_server: &AssetServer, ) { - let datas: Vec<(usize, Vec)> = network_socket.recv_reliable(); + let datas: Vec<(u32, Vec)> = network_socket.recv_reliable(); for (player, data) in datas { match postcard::from_bytes::(&data) { Ok(message) => match message { PlayerSelectMessage::SelectPlayer(player_handle) => { let player_handle = player_handle.into_handle(asset_server); - player_select_state.slots[player].selected_player = player_handle; + player_select_state.slots[player as usize].selected_player = player_handle; } PlayerSelectMessage::ConfirmSelection(confirmed) => { - player_select_state.slots[player].confirmed = confirmed; + player_select_state.slots[player as usize].confirmed = confirmed; } PlayerSelectMessage::SelectHat(hat) => { let hat = hat.map(|hat| hat.into_handle(asset_server)); - player_select_state.slots[player].selected_hat = hat; + player_select_state.slots[player as usize].selected_hat = hat; } }, Err(e) => warn!("Ignoring network message that was not understood: {e}"), @@ -220,7 +223,7 @@ fn handle_match_setup_messages( } fn player_select_panel( - mut params: In<(&mut egui::Ui, usize, &mut PlayerSelectState)>, + mut params: In<(&mut egui::Ui, u32, &mut PlayerSelectState)>, meta: Root, controls: Res, asset_server: Res, @@ -259,7 +262,7 @@ fn player_select_panel( } #[cfg(target_arch = "wasm32")] - let network_local_player_slot: Option = None; + let network_local_player_slot: Option = None; #[cfg(target_arch = "wasm32")] let is_network = false; @@ -272,7 +275,7 @@ fn player_select_panel( if *slot_id + 1 > socket.player_count() { return; } else { - state.slots[*slot_id].active = true; + state.slots[*slot_id as usize].active = true; } } @@ -280,10 +283,10 @@ fn player_select_panel( .slots .iter() .enumerate() - .any(|(i, slot)| (!slot.active && i == *slot_id)); + .any(|(i, slot)| (!slot.active && u32::try_from(i).unwrap() == *slot_id)); #[cfg(not(target_arch = "wasm32"))] - let mut network_local_player_slot: Option = None; + let mut network_local_player_slot: Option = None; #[cfg(not(target_arch = "wasm32"))] let slot_allows_new_player = if is_network { @@ -332,7 +335,7 @@ fn player_select_panel( sources }; - let slot = &mut state.slots[*slot_id]; + let slot = &mut state.slots[*slot_id as usize]; let player_handle = &mut slot.selected_player; // If the handle is empty diff --git a/src/ui/network_game.rs b/src/ui/network_game.rs index 884c196044..0751ecb066 100644 --- a/src/ui/network_game.rs +++ b/src/ui/network_game.rs @@ -17,13 +17,13 @@ pub enum LanMode { Join, Host { service_name: String, - player_count: usize, + player_count: u32, }, } #[derive(Eq, PartialEq, Clone)] pub struct OnlineState { - player_count: usize, + player_count: u32, matchmaking_server: String, search_state: SearchState, } diff --git a/src/ui/scoring.rs b/src/ui/scoring.rs index 73ec6a056c..37d4ac071d 100644 --- a/src/ui/scoring.rs +++ b/src/ui/scoring.rs @@ -420,13 +420,13 @@ fn handle_scoring_messages( state: &mut ScoringMenuState, ) { // TODO handle disconnects - let datas: Vec<(usize, Vec)> = network_socket.recv_reliable(); - let local_players = network_socket.player_is_local(); + let datas: Vec<(u32, Vec)> = network_socket.recv_reliable(); + let local_player_idx = network_socket.player_idx(); for (_, data) in datas { match postcard::from_bytes::(&data) { Ok(message) => match message.data { ScoringMessageEnum::PlayerReady(player) => { - if message.magic == SCORING_MESSAGE_MAGIC && !local_players[player as usize] { + if message.magic == SCORING_MESSAGE_MAGIC && player != local_player_idx { state.ready_players.insert(PlayerIdx(player)); debug!("Received message player {} ready", player); }