use std::net::SocketAddr; use std::time::Duration; use bevy::app::{PluginGroup, PluginGroupBuilder, ScheduleRunnerPlugin, TaskPoolPlugin}; use bevy::asset::AssetPlugin; use bevy::diagnostic::FrameCountPlugin; use bevy::time::TimePlugin; use bevy_common_assets::toml::TomlAssetPlugin; use bevy_replicon::RepliconPlugins; use bevy_replicon_renet2::RepliconRenetServerPlugin; use crate::config::planet::{Planet, PlanetConfigCollection}; use crate::config::world::{GlobalWorldConfig, WorldConfig}; pub struct ServerPluginGroup { pub bind: SocketAddr, pub tick_rate: f64, pub max_clients: usize } impl PluginGroup for ServerPluginGroup { fn build(self) -> PluginGroupBuilder { PluginGroupBuilder::start::() .add(TaskPoolPlugin::default()) .add(FrameCountPlugin) .add(TimePlugin) .add(ScheduleRunnerPlugin::run_loop( Duration::from_secs_f64(1.0 / self.tick_rate) )) .add_group( RepliconPlugins ) .add( RepliconRenetServerPlugin ) /* Assets */ .add(AssetPlugin::default()) .add(TomlAssetPlugin::::new(&["wc.toml"])) .add(TomlAssetPlugin::::new(&["pc.toml"])) .add(crate::server::ServerPlugin { bind: self.bind, max_clients: self.max_clients, }) } }