From 982b74fbbd137c1932677cb5134048858c411668 Mon Sep 17 00:00:00 2001 From: Tim Irmler Date: Fri, 6 Oct 2023 12:26:07 +0200 Subject: [PATCH 1/8] mmm --- languages/bevy_mod_scripting_rhai/Cargo.toml | 2 +- languages/bevy_mod_scripting_rhai/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/languages/bevy_mod_scripting_rhai/Cargo.toml b/languages/bevy_mod_scripting_rhai/Cargo.toml index 1ea37c2f..b5e41ea1 100644 --- a/languages/bevy_mod_scripting_rhai/Cargo.toml +++ b/languages/bevy_mod_scripting_rhai/Cargo.toml @@ -23,5 +23,5 @@ path="src/lib.rs" [dependencies] bevy= { version = "0.11", default-features = false} -rhai = { version = "1.15.1", features = ["sync"] } +rhai = { version = "1.16", features = ["sync"] } bevy_mod_scripting_core = {path="../../bevy_mod_scripting_core", version = "0.3.0" } diff --git a/languages/bevy_mod_scripting_rhai/src/lib.rs b/languages/bevy_mod_scripting_rhai/src/lib.rs index 2ddf4d96..9a59d124 100644 --- a/languages/bevy_mod_scripting_rhai/src/lib.rs +++ b/languages/bevy_mod_scripting_rhai/src/lib.rs @@ -32,7 +32,7 @@ impl Default for RhaiScriptHost { let mut e = Engine::new(); // prevent shadowing of `state`,`world` and `entity` in variable in scripts e.on_def_var(|_, info, _| { - Ok(info.name != "state" && info.name != "world" && info.name != "entity") + Ok(info.name() != "state" && info.name() != "world" && info.name() != "entity") }); Self { From c153e7f6664ba589d2bfbc0d27620cb46c8d336c Mon Sep 17 00:00:00 2001 From: Tim Irmler Date: Fri, 6 Oct 2023 13:13:44 +0200 Subject: [PATCH 2/8] same behaviour as for lua --- languages/bevy_mod_scripting_rhai/src/lib.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/languages/bevy_mod_scripting_rhai/src/lib.rs b/languages/bevy_mod_scripting_rhai/src/lib.rs index 9a59d124..ab3343ff 100644 --- a/languages/bevy_mod_scripting_rhai/src/lib.rs +++ b/languages/bevy_mod_scripting_rhai/src/lib.rs @@ -148,11 +148,12 @@ impl ScriptHost for RhaiScriptHost< ctxs: impl Iterator, &'a mut Self::ScriptContext)>, providers: &mut APIProviders, ) { - ctxs.for_each(|(fd, ctx)| { - // safety: + // safety: // - we have &mut World access - // - we do not use world_ptr after we use the original reference again anywhere in this function - let world_ptr = unsafe { WorldPointer::new(world) }; + // - we do not use world_ptr after we use the original reference again anywhere in this function + let world_ptr = unsafe { WorldPointer::new(world) }; + + ctxs.for_each(|(fd, ctx)| { providers .setup_runtime_all(world_ptr.clone(), &fd, ctx) .expect("Failed to setup script runtime"); From a4743a668ada06063d0adf47e5d620788471855d Mon Sep 17 00:00:00 2001 From: Tim Irmler Date: Fri, 6 Oct 2023 13:14:21 +0200 Subject: [PATCH 3/8] some printing --- languages/bevy_mod_scripting_rhai/src/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/languages/bevy_mod_scripting_rhai/src/lib.rs b/languages/bevy_mod_scripting_rhai/src/lib.rs index ab3343ff..2db89b26 100644 --- a/languages/bevy_mod_scripting_rhai/src/lib.rs +++ b/languages/bevy_mod_scripting_rhai/src/lib.rs @@ -149,8 +149,8 @@ impl ScriptHost for RhaiScriptHost< providers: &mut APIProviders, ) { // safety: - // - we have &mut World access - // - we do not use world_ptr after we use the original reference again anywhere in this function + // - we have &mut World access + // - we do not use world_ptr after we use the original reference again anywhere in this function let world_ptr = unsafe { WorldPointer::new(world) }; ctxs.for_each(|(fd, ctx)| { @@ -161,6 +161,7 @@ impl ScriptHost for RhaiScriptHost< for event in events.iter() { // check if this script should handle this event if !event.recipients().is_recipient(&fd) { + println!("Skipping script, event amount: {}", events.len()); return; }; From ec81e1183f660b85ff489d745dfa72db2f2f6d41 Mon Sep 17 00:00:00 2001 From: Tim Irmler Date: Fri, 6 Oct 2023 13:49:00 +0200 Subject: [PATCH 4/8] setup an example that demonstrates the issue --- Cargo.toml | 62 ++++----- assets/scripts/multiple_events_rhai.rhai | 8 ++ examples/rhai/multiple_events_rhai.rs | 133 +++++++++++++++++++ languages/bevy_mod_scripting_rhai/src/lib.rs | 1 - 4 files changed, 172 insertions(+), 32 deletions(-) create mode 100644 assets/scripts/multiple_events_rhai.rhai create mode 100644 examples/rhai/multiple_events_rhai.rs diff --git a/Cargo.toml b/Cargo.toml index cb4d047f..948a4ef5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ homepage = "https://github.com/makspll/bevy_mod_scripting" keywords = ["bevy", "gamedev", "scripting", "lua"] categories = ["game-development"] readme = "readme.md" -include= ["readme.md","/src","/examples","/assets","LICENSE"] +include = ["readme.md", "/src", "/examples", "/assets", "LICENSE"] [[bin]] name = "bevy_mod_scripting_doc_gen" @@ -21,15 +21,15 @@ name = "bevy_mod_scripting" path = "src/lib.rs" [package.metadata."docs.rs"] -features = ["lua","lua54","rhai","lua_script_api","rhai_script_api","teal"] +features = ["lua", "lua54", "rhai", "lua_script_api", "rhai_script_api", "teal"] [package.metadata.release] pre-release-replacements = [ - {file="Cargo.toml", search='^version\s*=\s*.*$', replace="version = \"{{version}}\"", exactly=1}, - {file="Cargo.toml", search='^(?Pbevy_mod_scripting_core\s*=.*)version\s*=\s*".*"(?P.*)$', replace="${h}version = \"{{version}}\"${t}", exactly=1}, - {file="Cargo.toml", search='^(?Pbevy_mod_scripting_lua\s*=.*)version\s*=\s*".*"(?P.*)$', replace="${h}version = \"{{version}}\"${t}", exactly=1}, - {file="Cargo.toml", search='^(?Pbevy_mod_scripting_rhai\s*=.*)version\s*=\s*".*"(?P.*)$', replace="${h}version = \"{{version}}\"${t}", exactly=1}, - {file="Cargo.toml", search='^(?Pbevy_script_api\s*=.*)version\s*=\s*".*"(?P.*)$', replace="${h}version = \"{{version}}\"${t}", exactly=1}, + { file = "Cargo.toml", search = '^version\s*=\s*.*$', replace = "version = \"{{version}}\"", exactly = 1 }, + { file = "Cargo.toml", search = '^(?Pbevy_mod_scripting_core\s*=.*)version\s*=\s*".*"(?P.*)$', replace = "${h}version = \"{{version}}\"${t}", exactly = 1 }, + { file = "Cargo.toml", search = '^(?Pbevy_mod_scripting_lua\s*=.*)version\s*=\s*".*"(?P.*)$', replace = "${h}version = \"{{version}}\"${t}", exactly = 1 }, + { file = "Cargo.toml", search = '^(?Pbevy_mod_scripting_rhai\s*=.*)version\s*=\s*".*"(?P.*)$', replace = "${h}version = \"{{version}}\"${t}", exactly = 1 }, + { file = "Cargo.toml", search = '^(?Pbevy_script_api\s*=.*)version\s*=\s*".*"(?P.*)$', replace = "${h}version = \"{{version}}\"${t}", exactly = 1 }, ] [features] @@ -47,8 +47,8 @@ luajit = ["bevy_mod_scripting_lua/luajit", "lua"] luajit52 = ["bevy_mod_scripting_lua/luajit52", "lua"] # optional -lua_script_api=["bevy_script_api/lua"] -unsafe_lua_modules=["bevy_mod_scripting_lua/unsafe_lua_modules"] +lua_script_api = ["bevy_script_api/lua"] +unsafe_lua_modules = ["bevy_mod_scripting_lua/unsafe_lua_modules"] teal = ["bevy_mod_scripting_lua/teal"] mlua_serialize = ["bevy_mod_scripting_lua/mlua_serialize"] mlua_macros = ["bevy_mod_scripting_lua/mlua_macros"] @@ -56,21 +56,21 @@ mlua_async = ["bevy_mod_scripting_lua/mlua_async"] ## rhai rhai = ["bevy_mod_scripting_rhai"] -rhai_script_api=["bevy_script_api/rhai"] +rhai_script_api = ["bevy_script_api/rhai"] [dependencies] -bevy = { version = "0.11", default-features = false} +bevy = { version = "0.11", default-features = false } bevy_mod_scripting_core = { path = "bevy_mod_scripting_core", version = "0.3.0" } bevy_mod_scripting_lua = { path = "languages/bevy_mod_scripting_lua", version = "0.3.0", optional = true } -bevy_mod_scripting_rhai = { path = "languages/bevy_mod_scripting_rhai", version = "0.3.0", optional = true} +bevy_mod_scripting_rhai = { path = "languages/bevy_mod_scripting_rhai", version = "0.3.0", optional = true } bevy_script_api = { path = "bevy_script_api", version = "0.3.0", optional = true } [dev-dependencies] -bevy = { version = "0.11"} -clap = { version = "4.1", features = ["derive"]} +bevy = { version = "0.11" } +clap = { version = "4.1", features = ["derive"] } rand = "0.8.5" bevy_console = "0.8.0" -rhai-rand = "0.1" +rhai-rand = "0.1" [workspace] resolver = "2" @@ -84,7 +84,7 @@ members = [ "languages/bevy_mod_scripting_lua_derive", "languages/bevy_mod_scripting_rhai", "languages/bevy_mod_scripting_rhai_derive", - "bevy_mod_scripting_common" + "bevy_mod_scripting_common", ] [profile.dev] @@ -97,60 +97,60 @@ opt-level = 3 [[example]] name = "console_integration_lua" path = "examples/lua/console_integration.rs" -required-features = ["lua54","lua_script_api"] - +required-features = ["lua54", "lua_script_api"] [[example]] name = "console_integration_rhai" path = "examples/rhai/console_integration.rs" -required-features = ["rhai","rhai_script_api"] +required-features = ["rhai", "rhai_script_api"] [[example]] name = "complex_game_loop_lua" path = "examples/lua/complex_game_loop.rs" -required-features=["lua54"] +required-features = ["lua54"] [[example]] name = "game_of_life_lua" path = "examples/lua/game_of_life.rs" -required-features=["lua54","teal","lua_script_api"] +required-features = ["lua54", "teal", "lua_script_api"] [[example]] name = "game_of_life_rhai" path = "examples/rhai/game_of_life.rs" -required-features=["rhai","rhai_script_api"] +required-features = ["rhai", "rhai_script_api"] [[example]] name = "event_recipients_lua" path = "examples/lua/event_recipients.rs" -required-features=["lua54"] +required-features = ["lua54"] [[example]] name = "coroutines_lua" path = "examples/lua/coroutines.rs" -required-features=["lua54"] +required-features = ["lua54"] [[example]] name = "documentation_gen_lua" path = "examples/lua/documentation_gen.rs" -required-features=["lua54","teal","lua_script_api"] +required-features = ["lua54", "teal", "lua_script_api"] [[example]] name = "bevy_api_lua" path = "examples/lua/bevy_api.rs" -required-features=["lua54","lua_script_api"] +required-features = ["lua54", "lua_script_api"] [[example]] name = "bevy_api_rhai" path = "examples/rhai/bevy_api.rs" -required-features=["rhai","rhai_script_api"] +required-features = ["rhai", "rhai_script_api"] +[[example]] +name = "multiple_events_rhai" +path = "examples/rhai/multiple_events_rhai.rs" +required-features = ["rhai", "rhai_script_api"] [[example]] name = "wrappers" path = "examples/wrappers.rs" -required-features=["lua54","lua_script_api"] - - - +required-features = ["lua54", "lua_script_api"] diff --git a/assets/scripts/multiple_events_rhai.rhai b/assets/scripts/multiple_events_rhai.rhai new file mode 100644 index 00000000..e4303610 --- /dev/null +++ b/assets/scripts/multiple_events_rhai.rhai @@ -0,0 +1,8 @@ +fn on_init(name) { + print(`Hello World! From "${name}" in Init`); +} + +fn on_update(name, delta) { + // print hello world from {name}: {time} + print(`Hello World! From "${name}" in Update: ${delta}`); +} \ No newline at end of file diff --git a/examples/rhai/multiple_events_rhai.rs b/examples/rhai/multiple_events_rhai.rs new file mode 100644 index 00000000..ae2a4a6a --- /dev/null +++ b/examples/rhai/multiple_events_rhai.rs @@ -0,0 +1,133 @@ +use bevy::{prelude::*, reflect::Reflect}; +use bevy_mod_scripting_core::{ + prelude::{APIProvider, PriorityEventWriter, Recipients, Script, ScriptCollection}, + AddScriptApiProvider, AddScriptHost, AddScriptHostHandler, ScriptingPlugin, +}; +use bevy_mod_scripting_rhai::{ + prelude::{RhaiDocFragment, RhaiFile}, + rhai::{Engine, FuncArgs}, + RhaiContext, RhaiEvent, RhaiScriptHost, +}; +use bevy_script_api::prelude::RhaiBevyAPIProvider; + +fn main() { + App::new() + .add_plugins((DefaultPlugins, ScriptingPlugin)) + .add_systems(Startup, setup_entities) + .add_systems(Update, (call_init, call_update)) + .add_script_host::>(PostUpdate) + .add_api_provider::>(Box::new(RhaiBevyAPIProvider)) + .add_script_handler::, 0, 10>(PostUpdate) + .run(); +} + +#[derive(Default)] +pub struct MyCustomAPI; + +impl APIProvider for MyCustomAPI { + type APITarget = Engine; + type ScriptContext = RhaiContext; + type DocTarget = RhaiDocFragment; + + fn attach_api( + &mut self, + api: &mut Self::APITarget, + ) -> Result<(), bevy_mod_scripting::prelude::ScriptError> { + api.set_max_expr_depths(0, 0); + + Ok(()) + } +} + +#[derive(Debug, Clone, Reflect, Default)] +struct ScriptArgs { + entity_name: Option, + delta_time: Option, +} + +impl FuncArgs for ScriptArgs { + fn parse>(self, args: &mut ARGS) { + if let Some(entity_name) = self.entity_name { + args.extend(vec![entity_name.into()]); + } + if let Some(delta_time) = self.delta_time { + args.extend(vec![delta_time.to_string().into()]); + } + } +} + +fn setup_entities(mut commands: Commands, asset_server: Res) { + let script_path = "scripts/multiple_events_rhai.rhai"; + + for i in 0..10 { + let entity_name = format!("Test Entity {}", i); + commands.spawn(( + NewlyAddedEntityCallInit, + Name::from(entity_name), + ScriptCollection:: { + scripts: vec![Script::new( + script_path.to_owned(), + asset_server.load(script_path), + )], + }, + )); + } +} + +#[derive(Debug, Clone, Copy, Reflect, Default, Component)] +#[reflect(Component)] +pub struct NewlyAddedEntityCallInit; + +fn call_update( + mut events: PriorityEventWriter>, + time: Res