pub mod server_plugins;
pub mod shared_plugins;
pub mod server;
pub mod client;
pub mod ecs;
pub mod client_plugins;
pub mod config;
use std::net::SocketAddr;
use std::process::exit;
use bevy::log::{tracing_subscriber, Level, LogPlugin};
use clap::Parser;
use bevy::prelude::*;
use tracing_subscriber::EnvFilter;
use tracing_subscriber::filter::Directive;
use tracing_subscriber::util::SubscriberInitExt;
use crate::client_plugins::ClientPluginGroup;
use crate::server_plugins::ServerPluginGroup;
use crate::shared_plugins::SharedPluginGroup;
#[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()
}