From 53fe3333f09ca5c9a58a8dbe4fb8f15e713b90fe Mon Sep 17 00:00:00 2001 From: Michael Bradley Date: Mon, 13 Oct 2025 01:06:31 -0400 Subject: [PATCH] More complete Peer distribution Slightly better implementation of peers, still need to create a more generic system for deciding which components to distribute where and then use that for Peers. --- src/game/net.rs | 11 +- src/game/plugin.rs | 30 ++++-- src/game/seed.rs | 2 +- src/game/ui.rs | 55 +++++++--- src/lib.rs | 4 +- src/main.rs | 4 +- src/net/distribution.rs | 30 ++---- src/net/heartbeat.rs | 77 ++++++++++++++ src/net/io.rs | 99 +++++++----------- src/net/mod.rs | 7 +- src/net/packet.rs | 80 +++++++++++++- src/net/peer.rs | 226 +++++++++++++++++++++++----------------- src/net/plugin.rs | 70 ++++++------- src/net/state.rs | 8 -- 14 files changed, 438 insertions(+), 265 deletions(-) create mode 100644 src/net/heartbeat.rs delete mode 100644 src/net/state.rs diff --git a/src/game/net.rs b/src/game/net.rs index 8e43e3f..c52f85f 100644 --- a/src/game/net.rs +++ b/src/game/net.rs @@ -2,13 +2,16 @@ use bevy::prelude::*; use crate::net::prelude::*; -pub fn handle_new_peer(new_peers: Query<&Peer, Added>) { +pub fn handle_new_peer(new_peers: Query<&PeerID, Added>) { for peer in new_peers { info!("Peer {} was added", peer.id); } } -pub fn handle_deleted_peer(mut old_peers: RemovedComponents, peers: Query<&Peer>) -> Result { +pub fn handle_deleted_peer( + mut old_peers: RemovedComponents, + peers: Query<&PeerID>, +) -> Result { for entity in old_peers.read() { if let Ok(peer) = peers.get(entity) { info!("Peer {} was removed", peer.id); @@ -20,7 +23,7 @@ pub fn handle_deleted_peer(mut old_peers: RemovedComponents, peers: Query< } pub fn handle_incoming_packets(mut packets: EventReader) { - for packet in packets.read() { - info!("Packet received: {:?}", packet.0.message); + for InboundPacket(packet) in packets.read() { + info!("Packet received: {:?}", packet.message); } } diff --git a/src/game/plugin.rs b/src/game/plugin.rs index d879c20..a7fdf48 100644 --- a/src/game/plugin.rs +++ b/src/game/plugin.rs @@ -13,7 +13,10 @@ use super::{ check_for_seed, setup_balls, setup_camera, setup_from_seed, setup_player, setup_walls, }, state::AppState, - ui::{setup_peer_ui, setup_seed_ui, update_peer_ui, update_peer_ui_timings, update_seed_ui}, + ui::{ + setup_peer_ui, setup_potential_peer_ui, setup_seed_ui, update_peer_ui, + update_peer_ui_timings, update_potential_peer_ui, update_seed_ui, + }, }; #[derive(Debug, Clone, Copy)] @@ -55,11 +58,20 @@ impl GamePlugin { impl Plugin for GamePlugin { fn build(&self, app: &mut App) { app.add_plugins(( - NetIOPlugin::new(self.port, self.source.try_to_address()), + NetIOPlugin::maybe_peer(self.port, self.source.try_to_address()), + distribution_plugin::, PhysicsPlugins::default().with_length_unit(50.0), )) .init_state::() - .add_systems(Startup, (setup_camera, setup_seed_ui, setup_peer_ui)) + .add_systems( + Startup, + ( + setup_camera, + setup_seed_ui, + setup_peer_ui, + setup_potential_peer_ui, + ), + ) .add_systems( OnEnter(AppState::InGame), ( @@ -75,8 +87,7 @@ impl Plugin for GamePlugin { handle_new_peer, handle_deleted_peer, handle_incoming_packets, - ) - .run_if(in_state(NetworkState::MultiPlayer)), + ), ), ) .add_systems( @@ -85,14 +96,15 @@ impl Plugin for GamePlugin { ((move_player, move_camera).chain(), zoom_camera) .run_if(in_state(AppState::InGame)), update_seed_ui, - (update_peer_ui, update_peer_ui_timings) - .run_if(in_state(NetworkState::MultiPlayer)), + ( + update_peer_ui, + update_peer_ui_timings, + update_potential_peer_ui, + ), quit.run_if(input_pressed(KeyCode::KeyQ)), ), ); - Seed::register(app); - match self.source { DataSource::Address(peer) => { info!("Will retrieve seed from peer => {peer}"); diff --git a/src/game/seed.rs b/src/game/seed.rs index 085c10c..d95a957 100644 --- a/src/game/seed.rs +++ b/src/game/seed.rs @@ -61,7 +61,7 @@ impl From for Vec { impl TryFrom> for Seed { type Error = TryFromSliceError; - fn try_from(value: Vec) -> Result { + fn try_from(value: Vec) -> std::result::Result { Ok(TryInto::<[u8; 8]>::try_into(value.as_slice())?.into()) } } diff --git a/src/game/ui.rs b/src/game/ui.rs index 391a39f..60f17a1 100644 --- a/src/game/ui.rs +++ b/src/game/ui.rs @@ -1,6 +1,6 @@ use bevy::prelude::*; -use crate::net::prelude::{Peer, PeerReceiveTiming, PeerSendTiming}; +use crate::net::prelude::{Peer, PeerID, PeerReceiveTiming, PeerSendTiming, PotentialPeers}; use super::seed::Seed; @@ -54,11 +54,11 @@ pub fn setup_peer_ui(mut commands: Commands) { } #[derive(Component)] -pub struct PeerID(Entity); +pub struct UIPeerID(Entity); pub fn update_peer_ui( ui: Query<(Entity, &Children), With>, - rows: Query<&PeerID>, + rows: Query<&UIPeerID>, added: Query>, mut removed: RemovedComponents, mut commands: Commands, @@ -67,14 +67,14 @@ pub fn update_peer_ui( for addition in added { commands .entity(table) - .with_child((Text::new("---- ---- ----"), PeerID(addition))); + .with_child((Text::new("---- ---- ----"), UIPeerID(addition))); } for removal in removed.read() { for child in children { - if let Ok(id) = rows.get(*child) { - if id.0 == removal { - commands.entity(*child).despawn(); - } + if let Ok(&UIPeerID(id)) = rows.get(*child) + && id == removal + { + commands.entity(*child).despawn(); } } } @@ -82,12 +82,12 @@ pub fn update_peer_ui( } pub fn update_peer_ui_timings( - rows: Query<(&mut Text, &PeerID)>, - peers: Query<(&Peer, &PeerReceiveTiming, &PeerSendTiming)>, + rows: Query<(&mut Text, &UIPeerID)>, + peers: Query<(&PeerID, &PeerReceiveTiming, &PeerSendTiming)>, time: Res