diff --git a/crates/bevy_mod_scripting_core/src/bindings/script_system.rs b/crates/bevy_mod_scripting_core/src/bindings/script_system.rs
index e6cd8390a6..e54fca8503 100644
--- a/crates/bevy_mod_scripting_core/src/bindings/script_system.rs
+++ b/crates/bevy_mod_scripting_core/src/bindings/script_system.rs
@@ -247,11 +247,10 @@ impl<'w, P: IntoScriptPluginParams> DynamicHandlerContext<'w, P> {
};
// call the script
- let runtime = P::readonly_configuration(guard.id()).runtime;
let mut context = context.lock();
- P::handle(payload, context_key, label, &mut context, runtime, guard)
+ P::handle(payload, context_key, label, &mut context, guard)
}
}
diff --git a/crates/bevy_mod_scripting_core/src/context.rs b/crates/bevy_mod_scripting_core/src/context.rs
index 2a50e29374..b9b65b9131 100644
--- a/crates/bevy_mod_scripting_core/src/context.rs
+++ b/crates/bevy_mod_scripting_core/src/context.rs
@@ -1,5 +1,7 @@
//! Traits and types for managing script contexts.
+use bevy_ecs::world::WorldId;
+
use crate::{
IntoScriptPluginParams,
bindings::{ThreadWorldContainer, WorldContainer, WorldGuard},
@@ -26,9 +28,7 @@ pub type ContextPreHandlingInitializer
=
pub type ContextLoadFn
= fn(
attachment: &ScriptAttachment,
content: &[u8],
- context_initializers: &[ContextInitializer
],
- pre_handling_initializers: &[ContextPreHandlingInitializer
],
- runtime: &
::R,
+ world_id: WorldId,
) -> Result<
::C, ScriptError>;
/// A strategy for reloading contexts
@@ -36,9 +36,7 @@ pub type ContextReloadFn
= fn(
attachment: &ScriptAttachment,
content: &[u8],
previous_context: &mut
::C,
- context_initializers: &[ContextInitializer
],
- pre_handling_initializers: &[ContextPreHandlingInitializer
],
- runtime: &
::R,
+ world_id: WorldId,
) -> Result<(), ScriptError>;
/// A utility trait for types implementing `IntoScriptPluginParams`.
@@ -70,13 +68,7 @@ impl ScriptingLoader for P {
WorldGuard::with_existing_static_guard(world.clone(), |world| {
let world_id = world.id();
ThreadWorldContainer.set_world(world)?;
- Self::context_loader()(
- attachment,
- content,
- P::readonly_configuration(world_id).context_initialization_callbacks,
- P::readonly_configuration(world_id).pre_handling_callbacks,
- P::readonly_configuration(world_id).runtime,
- )
+ Self::context_loader()(attachment, content, world_id)
})
}
@@ -89,14 +81,7 @@ impl ScriptingLoader for P {
WorldGuard::with_existing_static_guard(world, |world| {
let world_id = world.id();
ThreadWorldContainer.set_world(world)?;
- Self::context_reloader()(
- attachment,
- content,
- previous_context,
- P::readonly_configuration(world_id).context_initialization_callbacks,
- P::readonly_configuration(world_id).pre_handling_callbacks,
- P::readonly_configuration(world_id).runtime,
- )
+ Self::context_reloader()(attachment, content, previous_context, world_id)
})
}
}
diff --git a/crates/bevy_mod_scripting_core/src/extractors.rs b/crates/bevy_mod_scripting_core/src/extractors.rs
index 253a7c5adc..8d0d8235e4 100644
--- a/crates/bevy_mod_scripting_core/src/extractors.rs
+++ b/crates/bevy_mod_scripting_core/src/extractors.rs
@@ -103,12 +103,9 @@ impl HandlerContext {
return Err(InteropError::missing_context(context_key.clone()).into());
};
- // call the script
- let runtime = P::readonly_configuration(guard.id()).runtime;
-
let mut context = context.lock();
- P::handle(payload, context_key, label, &mut context, runtime, guard)
+ P::handle(payload, context_key, label, &mut context, guard)
}
/// Invoke a callback in a script immediately.
diff --git a/crates/bevy_mod_scripting_core/src/handler.rs b/crates/bevy_mod_scripting_core/src/handler.rs
index 589768f0e9..df6478db85 100644
--- a/crates/bevy_mod_scripting_core/src/handler.rs
+++ b/crates/bevy_mod_scripting_core/src/handler.rs
@@ -1,4 +1,6 @@
//! Contains the logic for handling script callback events
+use bevy_ecs::world::WorldId;
+
use {
bevy_ecs::{
event::EventCursor,
@@ -15,7 +17,6 @@ use crate::{
ThreadWorldContainer, WorldAccessGuard, WorldContainer, WorldGuard,
pretty_print::DisplayWithWorld, script_value::ScriptValue,
},
- context::ContextPreHandlingInitializer,
error::ScriptError,
event::{
CallbackLabel, IntoCallbackLabel, ScriptCallbackEvent, ScriptCallbackResponseEvent,
@@ -31,8 +32,7 @@ pub type HandlerFn
= fn(
context_key: &ScriptAttachment,
callback: &CallbackLabel,
context: &mut
::C,
- pre_handling_initializers: &[ContextPreHandlingInitializer
],
- runtime: &
::R,
+ world_id: WorldId,
) -> Result;
/// A utility trait, implemented for all types implementing `IntoScriptPluginParams`.
@@ -46,7 +46,6 @@ pub trait ScriptingHandler {
context_key: &ScriptAttachment,
callback: &CallbackLabel,
script_ctxt: &mut P::C,
- runtime: &P::R,
world: WorldGuard,
) -> Result;
}
@@ -58,20 +57,12 @@ impl ScriptingHandler for P {
context_key: &ScriptAttachment,
callback: &CallbackLabel,
script_ctxt: &mut P::C,
- runtime: &P::R,
world: WorldGuard,
) -> Result {
WorldGuard::with_existing_static_guard(world.clone(), |world| {
let world_id = world.id();
ThreadWorldContainer.set_world(world)?;
- Self::handler()(
- args,
- context_key,
- callback,
- script_ctxt,
- P::readonly_configuration(world_id).pre_handling_callbacks,
- runtime,
- )
+ Self::handler()(args, context_key, callback, script_ctxt, world_id)
})
}
}
diff --git a/crates/languages/bevy_mod_scripting_lua/src/lib.rs b/crates/languages/bevy_mod_scripting_lua/src/lib.rs
index 5b8da7e627..3c7ca7df7f 100644
--- a/crates/languages/bevy_mod_scripting_lua/src/lib.rs
+++ b/crates/languages/bevy_mod_scripting_lua/src/lib.rs
@@ -5,6 +5,7 @@ use ::{
bevy_ecs::{entity::Entity, world::World},
};
use bevy_app::App;
+use bevy_ecs::world::WorldId;
use bevy_log::trace;
use bevy_mod_scripting_core::{
IntoScriptPluginParams, ScriptingPlugin,
@@ -14,7 +15,6 @@ use bevy_mod_scripting_core::{
globals::AppScriptGlobalsRegistry, script_value::ScriptValue,
},
config::{GetPluginThreadConfig, ScriptingPluginConfiguration},
- context::{ContextInitializer, ContextPreHandlingInitializer},
error::ScriptError,
event::CallbackLabel,
make_plugin_config_static,
@@ -177,9 +177,11 @@ fn load_lua_content_into_context(
context: &mut Lua,
context_key: &ScriptAttachment,
content: &[u8],
- initializers: &[ContextInitializer],
- pre_handling_initializers: &[ContextPreHandlingInitializer],
+ world_id: WorldId,
) -> Result<(), ScriptError> {
+ let config = LuaScriptingPlugin::readonly_configuration(world_id);
+ let initializers = config.context_initialization_callbacks;
+ let pre_handling_initializers = config.pre_handling_callbacks;
initializers
.iter()
.try_for_each(|init| init(context_key, context))?;
@@ -201,22 +203,14 @@ fn load_lua_content_into_context(
pub fn lua_context_load(
context_key: &ScriptAttachment,
content: &[u8],
- initializers: &[ContextInitializer],
- pre_handling_initializers: &[ContextPreHandlingInitializer],
- _: &(),
+ world_id: WorldId,
) -> Result {
#[cfg(feature = "unsafe_lua_modules")]
let mut context = unsafe { Lua::unsafe_new() };
#[cfg(not(feature = "unsafe_lua_modules"))]
let mut context = Lua::new();
- load_lua_content_into_context(
- &mut context,
- context_key,
- content,
- initializers,
- pre_handling_initializers,
- )?;
+ load_lua_content_into_context(&mut context, context_key, content, world_id)?;
Ok(context)
}
@@ -226,17 +220,9 @@ pub fn lua_context_reload(
context_key: &ScriptAttachment,
content: &[u8],
old_ctxt: &mut Lua,
- initializers: &[ContextInitializer],
- pre_handling_initializers: &[ContextPreHandlingInitializer],
- _: &(),
+ world_id: WorldId,
) -> Result<(), ScriptError> {
- load_lua_content_into_context(
- old_ctxt,
- context_key,
- content,
- initializers,
- pre_handling_initializers,
- )?;
+ load_lua_content_into_context(old_ctxt, context_key, content, world_id)?;
Ok(())
}
@@ -248,10 +234,12 @@ pub fn lua_handler(
context_key: &ScriptAttachment,
callback_label: &CallbackLabel,
context: &mut Lua,
- pre_handling_initializers: &[ContextPreHandlingInitializer],
- _: &(),
+ world_id: WorldId,
) -> Result {
- pre_handling_initializers
+ let config = LuaScriptingPlugin::readonly_configuration(world_id);
+
+ config
+ .pre_handling_callbacks
.iter()
.try_for_each(|init| init(context_key, context))?;
@@ -288,8 +276,6 @@ mod test {
#[test]
fn test_reload_doesnt_overwrite_old_context() {
let lua = Lua::new();
- let initializers = vec![];
- let pre_handling_initializers = vec![];
let mut old_ctxt = lua.clone();
let handle = Handle::Weak(AssetId::from(AssetIndex::from_bits(0)));
let context_key = ScriptAttachment::EntityScript(Entity::from_raw(1), handle);
@@ -300,9 +286,7 @@ mod test {
end"
.as_bytes(),
- &initializers,
- &pre_handling_initializers,
- &(),
+ WorldId::new().unwrap(),
)
.unwrap();
@@ -313,9 +297,7 @@ mod test {
end"
.as_bytes(),
&mut old_ctxt,
- &initializers,
- &pre_handling_initializers,
- &(),
+ WorldId::new().unwrap(),
)
.unwrap();
diff --git a/crates/languages/bevy_mod_scripting_rhai/src/lib.rs b/crates/languages/bevy_mod_scripting_rhai/src/lib.rs
index 266713fe21..f25023f7a6 100644
--- a/crates/languages/bevy_mod_scripting_rhai/src/lib.rs
+++ b/crates/languages/bevy_mod_scripting_rhai/src/lib.rs
@@ -8,6 +8,7 @@ use ::{
bevy_ecs::{entity::Entity, world::World},
};
use bevy_app::App;
+use bevy_ecs::world::WorldId;
use bevy_log::trace;
use bevy_mod_scripting_core::{
IntoScriptPluginParams, ScriptingPlugin,
@@ -17,7 +18,6 @@ use bevy_mod_scripting_core::{
globals::AppScriptGlobalsRegistry, script_value::ScriptValue,
},
config::{GetPluginThreadConfig, ScriptingPluginConfiguration},
- context::{ContextInitializer, ContextPreHandlingInitializer},
error::ScriptError,
event::CallbackLabel,
make_plugin_config_static,
@@ -206,11 +206,12 @@ fn load_rhai_content_into_context(
context: &mut RhaiScriptContext,
context_key: &ScriptAttachment,
content: &[u8],
- initializers: &[ContextInitializer],
- pre_handling_initializers: &[ContextPreHandlingInitializer],
- runtime: &RhaiRuntime,
+ world_id: WorldId,
) -> Result<(), ScriptError> {
- let runtime = runtime.read();
+ let config = RhaiScriptingPlugin::readonly_configuration(world_id);
+ let initializers = config.context_initialization_callbacks;
+ let pre_handling_initializers = config.pre_handling_callbacks;
+ let runtime = config.runtime.read();
context.ast = runtime.compile(std::str::from_utf8(content)?)?;
context
@@ -233,23 +234,14 @@ fn load_rhai_content_into_context(
pub fn rhai_context_load(
context_key: &ScriptAttachment,
content: &[u8],
- initializers: &[ContextInitializer],
- pre_handling_initializers: &[ContextPreHandlingInitializer],
- runtime: &RhaiRuntime,
+ world_id: WorldId,
) -> Result {
let mut context = RhaiScriptContext {
// Using an empty AST as a placeholder.
ast: AST::empty(),
scope: Scope::new(),
};
- load_rhai_content_into_context(
- &mut context,
- context_key,
- content,
- initializers,
- pre_handling_initializers,
- runtime,
- )?;
+ load_rhai_content_into_context(&mut context, context_key, content, world_id)?;
Ok(context)
}
@@ -258,18 +250,9 @@ pub fn rhai_context_reload(
context_key: &ScriptAttachment,
content: &[u8],
context: &mut RhaiScriptContext,
- initializers: &[ContextInitializer],
- pre_handling_initializers: &[ContextPreHandlingInitializer],
- runtime: &RhaiRuntime,
+ world_id: WorldId,
) -> Result<(), ScriptError> {
- load_rhai_content_into_context(
- context,
- context_key,
- content,
- initializers,
- pre_handling_initializers,
- runtime,
- )
+ load_rhai_content_into_context(context, context_key, content, world_id)
}
#[allow(clippy::too_many_arguments)]
@@ -279,9 +262,11 @@ pub fn rhai_callback_handler(
context_key: &ScriptAttachment,
callback: &CallbackLabel,
context: &mut RhaiScriptContext,
- pre_handling_initializers: &[ContextPreHandlingInitializer],
- runtime: &RhaiRuntime,
+ world_id: WorldId,
) -> Result {
+ let config = RhaiScriptingPlugin::readonly_configuration(world_id);
+ let pre_handling_initializers = config.pre_handling_callbacks;
+
pre_handling_initializers
.iter()
.try_for_each(|init| init(context_key, context))?;
@@ -297,7 +282,7 @@ pub fn rhai_callback_handler(
"Calling callback {} in context {} with args: {:?}",
callback, context_key, args
);
- let runtime = runtime.read();
+ let runtime = config.runtime.read();
match runtime.call_fn_with_options::(
options,
diff --git a/crates/testing_crates/test_utils/src/test_plugin.rs b/crates/testing_crates/test_utils/src/test_plugin.rs
index c4c71ed79b..670c9deccc 100644
--- a/crates/testing_crates/test_utils/src/test_plugin.rs
+++ b/crates/testing_crates/test_utils/src/test_plugin.rs
@@ -33,7 +33,9 @@ macro_rules! make_test_plugin {
}
fn handler() -> $ident::HandlerFn {
- (|args, context_key, callback, script_ctxt, pre_handling_initializers, runtime| {
+ (|args, context_key, callback, script_ctxt, world_id| {
+ let config = TestPlugin::readonly_configuration(world_id);
+ let runtime = config.runtime;
runtime
.invocations
.lock()
@@ -43,7 +45,7 @@ macro_rules! make_test_plugin {
}
fn context_loader() -> $ident::ContextLoadFn {
- (|attachment, content, context_initializers, pre_handling_initializers, runtime| {
+ (|attachment, content, world_id| {
Ok(TestContext {
invocations: vec![],
})
@@ -51,12 +53,7 @@ macro_rules! make_test_plugin {
}
fn context_reloader() -> $ident::ContextReloadFn {
- (|attachment,
- content,
- previous_context,
- context_initializers,
- pre_handling_initializers,
- runtime| {
+ (|attachment, content, previous_context, world_id| {
previous_context.invocations.clear();
Ok(())
})