diff --git a/assets/examples/side_effects.rhai b/assets/examples/side_effects.rhai new file mode 100644 index 0000000..fbd0c56 --- /dev/null +++ b/assets/examples/side_effects.rhai @@ -0,0 +1 @@ +spawn_entity(); diff --git a/examples/side_effects.rs b/examples/side_effects.rs new file mode 100644 index 0000000..772fc47 --- /dev/null +++ b/examples/side_effects.rs @@ -0,0 +1,51 @@ +use bevy::{app::AppExit, ecs::event::ManualEventReader, prelude::*}; +use bevy_scriptum::{prelude::*, Script}; + +#[derive(Component)] +struct Comp; + +fn main() { + App::new() + // This is just needed for headless console app, not needed for a regular bevy game + // that uses a winit window + .set_runner(move |mut app: App| { + let mut app_exit_event_reader = ManualEventReader::::default(); + loop { + if let Some(app_exit_events) = app.world.get_resource_mut::>() { + if app_exit_event_reader + .iter(&app_exit_events) + .last() + .is_some() + { + break; + } + } + app.update(); + } + }) + .add_plugins(DefaultPlugins) + .add_plugins(ScriptingPlugin::default()) + .add_systems(Startup, startup) + .add_systems(Update, print_entity_names_and_quit) + .add_script_function(String::from("spawn_entity"), spawn_entity) + .run(); +} + +fn spawn_entity(mut commands: Commands) { + commands.spawn(Name::new("SpawnedEntity")); +} + +fn startup(mut commands: Commands, assets_server: Res) { + commands.spawn((Script::new( + assets_server.load("examples/side_effects.rhai"), + ),)); +} + +fn print_entity_names_and_quit(query: Query<&Name>, mut exit: EventWriter) { + if !query.is_empty() { + for e in &query { + println!("{}", e); + } + exit.send(AppExit); + } +} diff --git a/src/callback.rs b/src/callback.rs index 88cfea9..de11a8d 100644 --- a/src/callback.rs +++ b/src/callback.rs @@ -57,7 +57,9 @@ where let mut inner_system = IntoSystem::into_system(self); inner_system.initialize(world); let system_fn = move |_args: In>, world: &mut World| { - Dynamic::from(inner_system.run((), world)) + let result = inner_system.run((), world); + inner_system.apply_deferred(world); + Dynamic::from(result) }; let system = IntoSystem::into_system(system_fn); CallbackSystem {