diff --git a/Cargo.toml b/Cargo.toml index c6d27f7..a3d2b31 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -86,6 +86,11 @@ name = "side_effects_rhai" path = "examples/rhai/side_effects.rs" required-features = ["rhai"] +[[example]] +name = "function_return_value_rhai" +path = "examples/rhai/function_return_value.rs" +required-features = ["rhai"] + [[example]] name = "call_function_from_rust_lua" path = "examples/lua/call_function_from_rust.rs" @@ -141,6 +146,11 @@ name = "side_effects_lua" path = "examples/lua/side_effects.rs" required-features = ["lua"] +[[example]] +name = "function_return_value_lua" +path = "examples/lua/function_return_value.rs" +required-features = ["lua"] + [dev-dependencies] tracing-subscriber = "0.3.18" mlua = { version = "0.9.8", features = ["luajit", "vendored", "send"] } diff --git a/assets/examples/lua/function_return_value.lua b/assets/examples/lua/function_return_value.lua new file mode 100644 index 0000000..9bee5d2 --- /dev/null +++ b/assets/examples/lua/function_return_value.lua @@ -0,0 +1,3 @@ +function get_value() + return 42 +end diff --git a/assets/examples/rhai/function_return_value.rhai b/assets/examples/rhai/function_return_value.rhai new file mode 100644 index 0000000..2f97c46 --- /dev/null +++ b/assets/examples/rhai/function_return_value.rhai @@ -0,0 +1,3 @@ +fn get_value() { + 42 +} diff --git a/examples/lua/function_return_value.rs b/examples/lua/function_return_value.rs new file mode 100644 index 0000000..e2393bc --- /dev/null +++ b/examples/lua/function_return_value.rs @@ -0,0 +1,42 @@ +use bevy::{app::AppExit, prelude::*}; +use bevy_scriptum::prelude::*; +use bevy_scriptum::runtimes::lua::prelude::*; + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, startup) + .add_systems(Update, call_lua_on_update_from_rust) + .add_scripting::(|runtime| { + runtime.add_function(String::from("quit"), |mut exit: EventWriter| { + exit.write(AppExit::Success); + }); + }) + .run(); +} + +fn startup(mut commands: Commands, assets_server: Res) { + commands.spawn(Script::::new( + assets_server.load("examples/lua/function_return_value.lua"), + )); +} + +fn call_lua_on_update_from_rust( + mut scripted_entities: Query<(Entity, &mut LuaScriptData)>, + scripting_runtime: ResMut, + mut exit: EventWriter, +) { + for (entity, mut script_data) in &mut scripted_entities { + let val = scripting_runtime + .call_fn("get_value", &mut script_data, entity, ()) + .unwrap() + .0; + scripting_runtime.with_engine(|engine| { + println!( + "script returned: {}", + engine.registry_value::(&val).unwrap() + ); + }); + exit.write(AppExit::Success); + } +} diff --git a/examples/rhai/function_return_value.rs b/examples/rhai/function_return_value.rs new file mode 100644 index 0000000..f5072e9 --- /dev/null +++ b/examples/rhai/function_return_value.rs @@ -0,0 +1,37 @@ +use bevy::{app::AppExit, prelude::*}; +use bevy_scriptum::prelude::*; +use bevy_scriptum::runtimes::rhai::prelude::*; + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, startup) + .add_systems(Update, call_rhai_on_update_from_rust) + .add_scripting::(|runtime| { + runtime.add_function(String::from("quit"), |mut exit: EventWriter| { + exit.write(AppExit::Success); + }); + }) + .run(); +} + +fn startup(mut commands: Commands, assets_server: Res) { + commands.spawn(Script::::new( + assets_server.load("examples/rhai/function_return_value.rhai"), + )); +} + +fn call_rhai_on_update_from_rust( + mut scripted_entities: Query<(Entity, &mut RhaiScriptData)>, + scripting_runtime: ResMut, + mut exit: EventWriter, +) { + for (entity, mut script_data) in &mut scripted_entities { + let val = scripting_runtime + .call_fn("get_value", &mut script_data, entity, ()) + .unwrap() + .0; + println!("script returned: {}", val); + exit.write(AppExit::Success); + } +} diff --git a/src/runtimes/lua.rs b/src/runtimes/lua.rs index 43d852b..5613ba2 100644 --- a/src/runtimes/lua.rs +++ b/src/runtimes/lua.rs @@ -1,6 +1,6 @@ use bevy::{ asset::Asset, - ecs::{component::Component, entity::Entity, schedule::ScheduleLabel, resource::Resource}, + ecs::{component::Component, entity::Entity, resource::Resource, schedule::ScheduleLabel}, math::Vec3, reflect::TypePath, }; @@ -21,7 +21,7 @@ use crate::{ type LuaEngine = Arc>; #[derive(Clone)] -pub struct LuaValue(Arc); +pub struct LuaValue(pub Arc); impl LuaValue { fn new<'a, T: IntoLua<'a>>(engine: &'a Lua, value: T) -> Self { diff --git a/src/runtimes/rhai.rs b/src/runtimes/rhai.rs index 5515501..c293364 100644 --- a/src/runtimes/rhai.rs +++ b/src/runtimes/rhai.rs @@ -2,7 +2,7 @@ use std::fmt::Debug; use bevy::{ asset::Asset, - ecs::{component::Component, entity::Entity, schedule::ScheduleLabel, resource::Resource}, + ecs::{component::Component, entity::Entity, resource::Resource, schedule::ScheduleLabel}, math::Vec3, reflect::TypePath, }; @@ -48,7 +48,7 @@ pub struct RhaiScriptData { } #[derive(Debug, Clone)] -pub struct RhaiValue(rhai::Dynamic); +pub struct RhaiValue(pub rhai::Dynamic); impl Runtime for RhaiRuntime { type Schedule = RhaiSchedule;