use bevy::{app::ScheduleRunnerPlugin, prelude::*};
use std::time::Duration;
use suon_chunk::ChunkPlugin;
use suon_lua::LuaPlugin;
use suon_movement::prelude::MovementPlugins;
use suon_network::NetworkPlugins;
pub use settings::Settings;
pub use suon_chunk;
pub use suon_lua;
pub use suon_movement;
pub use suon_network;
pub use suon_observability::{self, ObservabilityPlugin, ObservabilitySettings};
pub use suon_position;
pub use suon_task;
mod settings;
pub mod prelude {
pub use crate::{ObservabilityPlugin, ObservabilitySettings, Settings, SuonPlugin};
pub use suon_chunk::{Chunk, ChunkPlugin, chunks::Chunks, content::AtChunk};
pub use suon_lua::{AppLuaExt, LuaCommands, LuaComponent, LuaPlugin, LuaScript};
pub use suon_movement::prelude::*;
pub use suon_network::NetworkPlugins;
pub use suon_position::{
direction::Direction, floor::Floor, position::Position, previous_floor::PreviousFloor,
previous_position::PreviousPosition,
};
}
pub struct SuonPlugin;
impl Plugin for SuonPlugin {
fn build(&self, app: &mut App) {
let settings = Settings::load_or_default().expect("Failed to load Suon settings.");
let minimal_plugins = MinimalPlugins.set(TaskPoolPlugin {
task_pool_options: TaskPoolOptions::with_num_threads(settings.threads),
});
let minimal_plugins = if settings.schedule_runner {
minimal_plugins.set(ScheduleRunnerPlugin::run_loop(Duration::from_secs_f64(
settings.event_loop,
)))
} else {
minimal_plugins
};
app.add_plugins(minimal_plugins);
app.insert_resource(settings);
app.insert_resource(Time::<Fixed>::from_seconds(settings.fixed_event_loop));
app.add_plugins((
ObservabilityPlugin,
ChunkPlugin,
MovementPlugins,
NetworkPlugins,
));
app.add_plugins(LuaPlugin);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn should_keep_suon_plugin_zero_sized() {
assert_eq!(std::mem::size_of::<SuonPlugin>(), 0);
}
}