pub mod client;
pub mod client_plugins;
pub mod config;
pub mod ecs;
pub mod server;
pub mod server_plugins;
pub mod shared_plugins;
use crate::client_plugins::ClientPluginGroup;
use crate::server_plugins::ServerPluginGroup;
use crate::shared_plugins::SharedPluginGroup;
use bevy::log::{Level, tracing_subscriber};
use bevy::prelude::*;
use clap::Parser;
use std::net::SocketAddr;
use std::process::exit;
use tracing_subscriber::EnvFilter;
use tracing_subscriber::util::SubscriberInitExt;
#[derive(Parser, Debug)]
#[command(version, about)]
enum Cli {
Client {
#[cfg(target_arch = "wasm32")]
#[arg(short, long)]
server: url::Url,
#[cfg(not(target_arch = "wasm32"))]
#[arg(short, long)]
server: SocketAddr,
},
Server {
#[arg(short = 'w', long)]
bind_ws: SocketAddr,
#[arg(short = 'u', long)]
bind_native: SocketAddr,
#[arg(short = 'r', long)]
tick_rate: f64,
#[arg(short = 'C', long)]
max_clients: usize,
},
}
fn main() -> AppExit {
let cli = Cli::parse();
let mut app = App::new();
tracing_subscriber::fmt()
.with_env_filter(
EnvFilter::builder()
.with_default_directive(Level::INFO.into())
.from_env_lossy()
.add_directive("bevy_app::plugin_group=error".parse().unwrap())
.add_directive("bevy_app::app=error".parse().unwrap())
.add_directive("bevy_replicon=warn".parse().unwrap())
.add_directive("bevy_replicon_renet2=warn".parse().unwrap())
.add_directive("naga=warn".parse().unwrap())
.add_directive("wgpu_hal::vulkan=error".parse().unwrap()),
)
.finish()
.init();
match cli {
Cli::Client { server } => {
app.add_plugins(ClientPluginGroup { server });
}
Cli::Server {
bind_ws,
bind_native,
tick_rate,
max_clients,
} => {
if cfg!(target_family = "wasm") {
eprintln!("the server cannot run on webassembly");
exit(1);
}
app.add_plugins(ServerPluginGroup {
bind_ws,
bind_native,
tick_rate,
max_clients,
});
}
}
app.add_plugins(SharedPluginGroup);
app.run()
}