use std::collections::HashMap; use std::sync::OnceLock; use std::sync::atomic::{AtomicU32, AtomicUsize, Ordering}; use std::time::Instant; use aeronet_transport::Transport; use aeronet_transport::lane::LaneIndex; use aeronet_websocket::tungstenite::Bytes; use avian2d::prelude::{AngularInertia, AngularVelocity, Collider, LinearVelocity, Mass, Position, Rotation}; use bevy::ecs::entity::MapEntities; use bevy::ecs::system::SystemState; use bevy::prelude::*; use postcard::{from_bytes, to_allocvec, to_slice, to_vec}; use crate::prelude::{App, Message}; //use bevy_replicon::prelude::*; use serde::{Deserialize, Serialize}; use crate::shared::attachment::{Joint, JointOf, PartInShip, Peer, Ship, SnapOf, SnapOfJoint}; use crate::shared::config::planet::{Planet, PlanetSpring, PlanetSpringJoint}; use crate::shared::ecs::{CanCraft, Drill, Part, Player, PlayerStorage, SingleStorage, Temperature}; use crate::shared::ecs::thruster::{Thruster, ThrusterOfPart}; /*pub fn register_replication(app: &mut App) { app .add_mapped_server_message::(Channel::Ordered) .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::() .replicate::(); }*/ pub fn register_net(app: &mut App) { /*app .add_message::>() .add_message::() .add_systems(Update, send_hi_to_client);*/ } pub fn setup_net(app: &mut App) { app.insert_resource(MessageRegistry::default()); app.add_systems(PostUpdate, recv_from_server); } #[derive(Message, Deserialize, Serialize, TypePath, MapEntities)] pub struct Hi { #[entities] pub you_are: Entity, pub time_offset: f64, } #[derive(Message, Deref, Deserialize, Serialize)] pub struct ToClients { #[deref] pub message: T, pub targets: SendTargets, } #[derive(Deserialize, Serialize)] pub enum SendTargets { All, Single(ClientId), } #[derive(Deserialize, Serialize)] pub enum ClientId { Server, Client(Entity), } #[derive(Resource, Default)] pub struct MessageRegistry { forward: HashMap, reverse: HashMap, &mut World)>, } static COUNTER: AtomicU32 = AtomicU32::new(0); fn get_lane_index() -> LaneIndex { LaneIndex::new(COUNTER.fetch_add(1, Ordering::Relaxed)) } pub trait NetAppExt { fn add_server_message Deserialize<'a>>(&mut self) -> &mut Self; } impl NetAppExt for App { fn add_server_message Deserialize<'a>>(&mut self) -> &mut Self { self .add_message::>() .add_message::() .add_systems(Startup, register_message::) .add_systems(Update, send_to_client::) } } fn register_message Deserialize<'a>>(mut registry: ResMut) { registry.forward.insert(T::type_path().to_string(), get_lane_index()); registry.reverse.insert(get_lane_index(), |payload: Vec, world: &mut World| { let message = from_bytes::(&payload).expect(&format!("Failed to deserialize message of type {}", T::type_path())); world.write_message(message).expect("Could not send message to game"); }); } fn send_to_client( mut messages: MessageReader>, mut clients: Query<(Entity, &mut Transport), With>, message_registry: Res, ) { for message in messages.read() { match &message.targets { SendTargets::All => { for (client_entity, mut transport) in &mut clients { transport.send.push( *message_registry.forward.get(M::type_path()) .expect("Failed to get message lane; the message likely isn't serialized yet"), to_allocvec(&message).expect("Failed to serialize message").into(), Instant::now(), ).expect("Failed to send message"); } } SendTargets::Single(client) => { for (client_entity, mut transport) in &mut clients { if let ClientId::Client(client) = client && client_entity == *client { transport.send.push( *message_registry.forward.get(M::type_path()) .expect("Failed to get message lane; the message likely isn't serialized yet"), to_allocvec(&message).expect("Failed to serialize message").into(), Instant::now(), ).expect("Failed to send message"); } } } } } } fn recv_from_server( world: &mut World ) { let mut system_state: SystemState<( Query<&mut Transport, Without>, Res, )> = SystemState::new(world); let (mut sessions, message_registry) = system_state.get_mut(world); let mut messages = Vec::new(); for mut transport in sessions.iter_mut() { for message in transport.recv.msgs.drain() { let payload = message.payload; let message_fn = message_registry.reverse.get(&message.lane).expect("Packet was sent across a lane that didn't have a message assigned to it yet"); messages.push((*message_fn, payload)); } for _ in transport.recv.acks.drain() { } } for (message_fn, payload) in messages { message_fn(payload, world); } }