pub mod planets; pub mod player; mod world_config; mod gravity; use std::net::{SocketAddr, UdpSocket}; use std::time::{SystemTime, UNIX_EPOCH}; use bevy::prelude::*; use bevy_rapier2d::prelude::{Collider, Restitution, RigidBody, Velocity}; use bevy_replicon::prelude::{FromClient, Replicated, RepliconChannels}; use bevy_replicon_renet2::netcode::{NativeSocket, NetcodeServerTransport, ServerAuthentication, ServerSetupConfig}; use bevy_replicon_renet2::renet2::{ConnectionConfig, RenetServer}; use bevy_replicon_renet2::RenetChannelsExt; use crate::ecs::{Ball, Ground, SendBallHere}; use crate::server::gravity::newtonian_gravity_plugin; use crate::server::planets::planets_plugin; use crate::server::player::player_management_plugin; use crate::server::world_config::world_config_plugin; pub struct ServerPlugin { pub bind: SocketAddr, pub max_clients: usize, } impl Plugin for ServerPlugin { fn build(&self, app: &mut App) { let bind = self.bind.clone(); let max_clients = self.max_clients.clone(); app .add_systems(FixedPreUpdate, bevy_replicon::server::increment_tick) // !!important!! do not remove or move .add_systems(Startup, move |mut commands: Commands, channels: Res| { let server = RenetServer::new(ConnectionConfig::from_channels( channels.server_configs(), channels.client_configs() )); let server_config = ServerSetupConfig { current_time: SystemTime::now().duration_since(UNIX_EPOCH).unwrap(), max_clients: max_clients, protocol_id: 0, authentication: ServerAuthentication::Unsecure, socket_addresses: vec![vec![bind]] }; let socket = UdpSocket::bind(bind).unwrap(); let transport = NetcodeServerTransport::new(server_config, NativeSocket::new(socket).unwrap()).unwrap(); commands.insert_resource(server); commands.insert_resource(transport); info!("websocket server listening"); }) .add_plugins(planets_plugin) .add_plugins(world_config_plugin) .add_plugins(newtonian_gravity_plugin) .add_plugins(player_management_plugin); } }