2023-10-07 20:46:24 +02:00
|
|
|
use log::{info, trace};
|
2023-10-27 21:14:34 +02:00
|
|
|
use std::net::{SocketAddr, UdpSocket, IpAddr, Ipv4Addr};
|
2023-10-07 20:46:24 +02:00
|
|
|
use std::time::{Duration, Instant, SystemTime};
|
|
|
|
|
|
2023-10-27 21:14:34 +02:00
|
|
|
use renet::{
|
|
|
|
|
transport::{
|
|
|
|
|
NetcodeServerTransport, ServerAuthentication, ServerConfig, NETCODE_USER_DATA_BYTES,
|
|
|
|
|
},
|
|
|
|
|
ConnectionConfig, DefaultChannel, RenetClient, RenetServer, ServerEvent,
|
|
|
|
|
};
|
|
|
|
|
|
2023-10-07 20:46:24 +02:00
|
|
|
// Only clients that can provide the same PROTOCOL_ID that the server is using will be able to connect.
|
|
|
|
|
// This can be used to make sure players use the most recent version of the client for instance.
|
|
|
|
|
pub const PROTOCOL_ID: u64 = 2878;
|
|
|
|
|
|
2022-12-01 18:04:03 +01:00
|
|
|
fn main() {
|
2023-10-07 20:46:24 +02:00
|
|
|
env_logger::init();
|
|
|
|
|
|
2023-10-27 21:14:34 +02:00
|
|
|
let mut server = RenetServer::new(ConnectionConfig::default());
|
|
|
|
|
|
|
|
|
|
// Setup transport layer
|
|
|
|
|
const SERVER_ADDR: SocketAddr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 5000);
|
|
|
|
|
let socket: UdpSocket = UdpSocket::bind(SERVER_ADDR).unwrap();
|
|
|
|
|
let server_config = ServerConfig {
|
|
|
|
|
max_clients: 2,
|
|
|
|
|
protocol_id: PROTOCOL_ID,
|
|
|
|
|
public_addr: SERVER_ADDR,
|
|
|
|
|
authentication: ServerAuthentication::Unsecure,
|
|
|
|
|
};
|
|
|
|
|
let current_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap();
|
|
|
|
|
let mut transport = NetcodeServerTransport::new(current_time, server_config, socket).unwrap();
|
|
|
|
|
|
|
|
|
|
trace!("❂ TricTrac server listening on {}", SERVER_ADDR);
|
2023-10-07 20:46:24 +02:00
|
|
|
|
|
|
|
|
let mut last_updated = Instant::now();
|
|
|
|
|
loop {
|
|
|
|
|
// Update server time
|
|
|
|
|
let now = Instant::now();
|
2023-10-27 21:14:34 +02:00
|
|
|
let delta_time = now - last_updated;
|
|
|
|
|
server.update(delta_time);
|
|
|
|
|
transport.update(delta_time, &mut server).unwrap();
|
2023-10-07 20:46:24 +02:00
|
|
|
last_updated = now;
|
|
|
|
|
|
|
|
|
|
// Receive connection events from clients
|
|
|
|
|
while let Some(event) = server.get_event() {
|
|
|
|
|
match event {
|
2023-10-27 21:14:34 +02:00
|
|
|
ServerEvent::ClientConnected { client_id } => {
|
|
|
|
|
info!("🎉 Client {} connected.", client_id);
|
2023-10-07 20:46:24 +02:00
|
|
|
}
|
2023-10-27 21:14:34 +02:00
|
|
|
ServerEvent::ClientDisconnected { client_id, reason } => {
|
|
|
|
|
info!("👋 Client {} disconnected", client_id);
|
2023-10-07 20:46:24 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
std::thread::sleep(Duration::from_millis(50));
|
|
|
|
|
}
|
2022-12-01 18:04:03 +01:00
|
|
|
}
|