distributed_physics_test/src/net/io.rs
Michael Bradley 3dfeae14f7
All checks were successful
CI / Formatting (push) Successful in 42s
Initial change propagation work
2025-10-26 00:44:30 -04:00

70 lines
2.1 KiB
Rust

use bevy::prelude::*;
use uuid::Uuid;
use super::{
packet::{InboundPacket, OutboundPacket, Packet},
peer::{PeerChangeMessage, PeerData, PeerMap, PeerReceiveTiming, PeerSendTiming},
queues::{NetworkReceive, NetworkSend},
};
#[derive(Debug, Resource)]
pub struct Config {
pub id: Uuid,
}
impl Default for Config {
fn default() -> Self {
Self { id: Uuid::new_v4() }
}
}
pub fn format_message(peer: Uuid, entity: Uuid, data: &Vec<u8>) -> Vec<u8> {
[peer.as_bytes(), entity.as_bytes(), data.as_slice()].concat()
}
pub fn handle_network_input(
from_socket: Res<NetworkReceive>,
peer_map: Res<PeerMap>,
mut peers: Query<(&PeerData, &mut PeerReceiveTiming)>,
mut to_app: MessageWriter<InboundPacket>,
time: Res<Time>,
mut change_peer: MessageWriter<PeerChangeMessage>,
) -> Result {
for (message, address) in from_socket.iter() {
match Packet::try_from(message) {
Ok(packet) => {
if !packet.message.is_empty() {
to_app.write(packet.clone().into());
}
if let Some(peer_id) = peer_map.get(&packet.peer) {
let (peer, mut last) = peers.get_mut(*peer_id)?;
last.update(&time);
if address == peer.addr {
continue;
}
}
change_peer.write(PeerChangeMessage::new(packet.peer, Some(address)));
}
Err(err) => warn!("Error reading packet: {:?}", err),
}
}
Ok(())
}
pub fn handle_network_output(
mut from_app: MessageReader<OutboundPacket>,
peer_map: Res<PeerMap>,
mut peers: Query<(&PeerData, &mut PeerSendTiming)>,
config: Res<Config>,
to_socket: Res<NetworkSend>,
time: Res<Time>,
) -> Result {
for OutboundPacket(packet) in from_app.read() {
let peer_id = peer_map.try_get(&packet.peer)?;
let (peer, mut last) = peers.get_mut(*peer_id)?;
let message = format_message(config.id, packet.entity, &packet.message);
to_socket.send(message, peer.addr.into())?;
last.update(&time);
}
Ok(())
}