use std::net::{SocketAddr, UdpSocket}; use std::time::SystemTime; use bevy::prelude::*; use bevy_replicon::prelude::RepliconChannels; use bevy_replicon_renet2::netcode::{ClientAuthentication, NetcodeClientTransport, NativeSocket}; use bevy_replicon_renet2::renet2::{ConnectionConfig, RenetClient}; use bevy_replicon_renet2::RenetChannelsExt; pub struct ClientPlugin { pub server: SocketAddr } impl Plugin for ClientPlugin { fn build(&self, app: &mut App) { let server = self.server.clone(); app .add_systems(Startup, move |mut commands: Commands, channels: Res| { let client = RenetClient::new( ConnectionConfig::from_channels(channels.server_configs(), channels.client_configs()), false ); let current_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap(); let client_id = current_time.as_millis() as u64; let socket = UdpSocket::bind(SocketAddr::new("::1".parse().unwrap(), 0)).unwrap(); let authentication = ClientAuthentication::Unsecure { client_id, protocol_id: 0, socket_id: 0, server_addr: server, user_data: None }; let transport = NetcodeClientTransport::new(current_time, authentication, NativeSocket::new(socket).unwrap()).unwrap(); commands.insert_resource(client); commands.insert_resource(transport); info!(?client_id, "connected!"); }); } }