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<RepliconChannels>| {
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!");
});
}
}