worked on networking

This commit is contained in:
Iaphetes 2025-11-01 15:45:44 +01:00
parent 7df4e86afb
commit c9a7e071cd
8 changed files with 409 additions and 16 deletions

View file

@ -9,6 +9,9 @@ rand = "0.9.1"
# rusqlite = "0.37.0"
statrs = "0.18.0"
orthros_network = {path = "../orthros-network"}
bevy_matchbox = "0.13"
bevy_matchbox = {version = "0.13", features= ["signaling"]}
serde = { version = "1.0", features = ["derive"] }
rmp-serde = "1.3.0"
[[bin]]
name = "orthros-server"

View file

@ -4,17 +4,26 @@ use bevy::{
render::{RenderPlugin, settings::WgpuSettings, view::Hdr},
time::common_conditions::on_timer,
};
use bevy_matchbox::prelude::*;
use orthros_network::starchart::star::{STARS, StarClass, StarInfo, star_diameter_range};
use bevy_matchbox::{matchbox_signaling::SignalingServer, prelude::*};
use orthros_network::{
generic::EntityID,
starchart::star::{STARS, StarClass, StarInfo, star_diameter_range},
};
use rand::{
Rng,
distr::{Distribution, Uniform},
rng,
};
use std::time::Duration;
use std::{
collections::HashSet,
net::{Ipv4Addr, SocketAddrV4},
time::Duration,
};
const CHANNEL_ID: usize = 0;
#[derive(Component)]
struct StarInfoComp(StarInfo);
struct NetworkObject;
#[derive(Component)]
struct Changed;
fn main() {
App::new()
.add_plugins((DefaultPlugins.set(RenderPlugin {
@ -25,7 +34,14 @@ fn main() {
.into(),
..default()
}),))
.add_systems(Startup, (setup_scene, start_socket))
.add_systems(
Startup,
(
start_signaling_server,
start_socket.after(start_signaling_server),
setup_scene.after(start_socket),
),
)
.add_systems(
Update,
(
@ -35,8 +51,29 @@ fn main() {
)
.run();
}
fn start_signaling_server(mut commands: Commands) {
info!("Starting signaling server");
let addr = SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 3536);
let signaling_server = MatchboxServer::from(
SignalingServer::client_server_builder(addr)
.on_connection_request(|connection| {
info!("Connecting: {connection:?}");
Ok(true) // Allow all connections
})
.on_id_assignment(|(socket, id)| info!("{socket} received {id}"))
.on_host_connected(|id| info!("Host joined: {id}"))
.on_host_disconnected(|id| info!("Host left: {id}"))
.on_client_connected(|id| info!("Client joined: {id}"))
.on_client_disconnected(|id| info!("Client left: {id}"))
.cors()
.trace()
.build(),
);
commands.insert_resource(signaling_server);
}
fn setup_scene(mut commands: Commands) {
fn setup_scene(mut commands: Commands, mut socket: ResMut<MatchboxSocket>) {
let mut spawned_ids: HashSet<u32> = HashSet::new();
for _ in 0..4 {
let x = Uniform::try_from(-2000..2000).unwrap().sample(&mut rng());
let z = Uniform::try_from(-8000..8000).unwrap().sample(&mut rng());
@ -46,22 +83,36 @@ fn setup_scene(mut commands: Commands) {
2 => StarClass::GType,
_ => todo!(),
};
let mut id: u32 = rng().random();
while spawned_ids.contains(&id) {
id = rng().random();
}
spawned_ids.insert(id);
info!("{:?}", star_diameter_range(&star_class));
let star_info = StarInfo {
id: EntityID(id),
name: STARS[(rng().random_range(0..100)) as usize].to_string(),
diameter: rng().random_range(star_diameter_range(&star_class)),
class: star_class,
transform: Transform::from_xyz(x as f32 / 100.0, z as f32 / 20000.0, z as f32 / 100.0),
};
commands.spawn((
Transform::from_xyz(x as f32 / 100.0, z as f32 / 20000.0, z as f32 / 100.0),
StarInfoComp(star_info),
));
commands.spawn((StarInfoComp(star_info), NetworkObject, Changed));
let peers: Vec<_> = socket.connected_peers().collect();
for peer in peers {
let message = "Hello";
info!("Sending message: {message:?} to {peer}");
socket
.channel_mut(CHANNEL_ID)
.send(message.as_bytes().into(), peer);
}
}
}
fn on_client_connect(mut socket: ResMut<MatchboxSocket>, Query<&StarInfo>)
fn start_socket(mut commands: Commands) {
let socket = MatchboxSocket::new_reliable("ws://localhost:3536/hello");
info!("Created socket");
commands.insert_resource(socket);
}