Skip to content

Commit debaa16

Browse files
committed
Re-implement changes to rhai and rune, and fix event recipients example
1 parent 0b9e277 commit debaa16

File tree

18 files changed

+787
-666
lines changed

18 files changed

+787
-666
lines changed

.github/workflows/bevy_mod_scripting.yml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@ jobs:
2626
strategy:
2727
matrix:
2828
run_args: [
29-
{label: Windows - All Features, os: windows-latest, features: "lua54,rhai,teal,lua_script_api,rhai_script_api,rune", cross: x86_64-pc-windows-msvc },
30-
{label: MacOS - All Features, os: macOS-latest, features: "lua54,rhai,teal,lua_script_api,rhai_script_api,rune", cross: x86_64-apple-darwin },
31-
{label: Ubuntu - All Features, os: ubuntu-latest, features: "lua54,lua_script_api,rhai,teal,rhai_script_api,rune", cross: x86_64-unknown-linux-gnu },
32-
{label: Ubuntu Aarch64 - All Features, os: ubuntu-latest, features: "lua54,rhai,teal,lua_script_api,rhai_script_api,rune", cross: aarch64-unknown-linux-gnu },
33-
{label: Ubuntu - Lua51, os: ubuntu-latest, features: "lua51,lua_script_api", cross: x86_64-unknown-linux-gnu },
34-
{label: Ubuntu - Lua52, os: ubuntu-latest, features: "lua52,lua_script_api", cross: x86_64-unknown-linux-gnu },
35-
{label: Ubuntu - Lua53, os: ubuntu-latest, features: "lua53,lua_script_api", cross: x86_64-unknown-linux-gnu },
36-
{label: Ubuntu - Luajit, os: ubuntu-latest, features: "luajit,lua_script_api", cross: x86_64-unknown-linux-gnu },
37-
{label: Ubuntu - Luajit52, os: ubuntu-latest, features: "luajit52,lua_script_api", cross: x86_64-unknown-linux-gnu }
29+
{label: Windows - All Features, os: windows-latest, features: "lua54,rhai,teal,rune", cross: x86_64-pc-windows-msvc },
30+
{label: MacOS - All Features, os: macOS-latest, features: "lua54,rhai,teal,rune", cross: x86_64-apple-darwin },
31+
{label: Ubuntu - All Features, os: ubuntu-latest, features: "lua54,rhai,teal,rune", cross: x86_64-unknown-linux-gnu },
32+
{label: Ubuntu Aarch64 - All Features, os: ubuntu-latest, features: "lua54,rhai,teal,rune", cross: aarch64-unknown-linux-gnu },
33+
{label: Ubuntu - Lua51, os: ubuntu-latest, features: "lua51", cross: x86_64-unknown-linux-gnu },
34+
{label: Ubuntu - Lua52, os: ubuntu-latest, features: "lua52", cross: x86_64-unknown-linux-gnu },
35+
{label: Ubuntu - Lua53, os: ubuntu-latest, features: "lua53", cross: x86_64-unknown-linux-gnu },
36+
{label: Ubuntu - Luajit, os: ubuntu-latest, features: "luajit", cross: x86_64-unknown-linux-gnu },
37+
{label: Ubuntu - Luajit52, os: ubuntu-latest, features: "luajit52", cross: x86_64-unknown-linux-gnu }
3838
]
3939
steps:
4040
- if: runner.os == 'linux'
@@ -94,7 +94,7 @@ jobs:
9494
- uses: actions-rs/cargo@v1
9595
with:
9696
command: clippy
97-
args: --features=lua54,rhai,teal,lua_script_api,rhai_script_api,rune --profile=ephemeral-build -- -D warnings
97+
args: --features=lua54,rhai,teal,rune --profile=ephemeral-build -- -D warnings
9898
tests:
9999
name: Tests
100100
runs-on: ubuntu-latest
@@ -114,7 +114,7 @@ jobs:
114114
- uses: actions-rs/cargo@v1
115115
with:
116116
command: test
117-
args: --workspace --features=lua54,rhai,teal,lua_script_api,rhai_script_api,rune --profile=ephemeral-build
117+
args: --workspace --features=lua54,rhai,teal,rune --profile=ephemeral-build
118118
docs:
119119
name: Docs
120120
runs-on: ubuntu-latest

.github/workflows/doc_gen.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
- uses: actions-rs/cargo@v1
3333
with:
3434
command: run
35-
args: --features=lua54,lua_script_api lua
35+
args: --features=lua54 lua
3636
- run: cat ./assets/scripts/doc/tealr_doc_gen_config.json
3737
- name: Push to pages
3838
uses: cpina/github-action-push-to-another-repository@main

.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"build",
2626
"--example=game_of_life_lua",
2727
"--package=bevy_mod_scripting",
28-
"--features=lua54,teal,lua_script_api",
28+
"--features=lua54,teal",
2929
],
3030
"filter": {
3131
"name": "game_of_life_lua",

Cargo.toml

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,7 @@ name = "bevy_mod_scripting"
2121
path = "src/lib.rs"
2222

2323
[package.metadata."docs.rs"]
24-
features = [
25-
"lua",
26-
"lua54",
27-
"rhai",
28-
"lua_script_api",
29-
"rhai_script_api",
30-
"teal",
31-
"rune",
32-
]
24+
features = ["lua", "lua54", "rhai", "teal", "rune"]
3325

3426
[features]
3527
## core
@@ -46,7 +38,6 @@ luajit = ["bevy_mod_scripting_lua/luajit", "lua"]
4638
luajit52 = ["bevy_mod_scripting_lua/luajit52", "lua"]
4739

4840
# optional
49-
lua_script_api = ["bevy_script_api/lua"]
5041
unsafe_lua_modules = ["bevy_mod_scripting_lua/unsafe_lua_modules"]
5142
teal = ["bevy_mod_scripting_lua/teal"]
5243
mlua_serialize = ["bevy_mod_scripting_lua/mlua_serialize"]
@@ -55,7 +46,6 @@ mlua_async = ["bevy_mod_scripting_lua/mlua_async"]
5546

5647
## rhai
5748
rhai = ["bevy_mod_scripting_rhai"]
58-
rhai_script_api = ["bevy_script_api/rhai"]
5949

6050
## rune
6151
rune = ["bevy_mod_scripting_rune"]
@@ -66,7 +56,6 @@ bevy_mod_scripting_core = { workspace = true }
6656
bevy_mod_scripting_lua = { path = "crates/languages/bevy_mod_scripting_lua", version = "0.8.0-alpha.1", optional = true }
6757
bevy_mod_scripting_rhai = { path = "crates/languages/bevy_mod_scripting_rhai", version = "0.8.0-alpha.1", optional = true }
6858
bevy_mod_scripting_rune = { path = "crates/languages/bevy_mod_scripting_rune", version = "0.8.0-alpha.1", optional = true }
69-
bevy_script_api = { path = "crates/bevy_script_api", version = "0.8.0-alpha.1", optional = true }
7059

7160

7261
[workspace.dependencies]
@@ -86,7 +75,6 @@ rhai-rand = "0.1"
8675
members = [
8776
"crates/bevy_mod_scripting_core",
8877
"crates/bevy_event_priority",
89-
"crates/bevy_script_api",
9078
"crates/languages/bevy_mod_scripting_lua",
9179
"crates/languages/bevy_mod_scripting_lua_derive",
9280
"crates/languages/bevy_mod_scripting_rhai",
@@ -120,7 +108,7 @@ debug = false
120108
# path = "examples/lua/console_integration.rs"
121109
# required-features = [
122110
# "lua54",
123-
# "lua_script_api",
111+
#
124112
# "bevy/file_watcher",
125113
# "bevy/multi_threaded",
126114
# ]
@@ -130,7 +118,7 @@ debug = false
130118
# path = "examples/rhai/console_integration.rs"
131119
# required-features = [
132120
# "rhai",
133-
# "rhai_script_api",
121+
# ,
134122
# "bevy/file_watcher",
135123
# "bevy/multi_threaded",
136124
# ]
@@ -143,32 +131,22 @@ required-features = ["lua54"]
143131
[[example]]
144132
name = "dynamic_queries_lua"
145133
path = "examples/lua/dynamic_queries.rs"
146-
required-features = ["lua54", "lua_script_api"]
134+
required-features = ["lua54"]
147135

148136
[[example]]
149137
name = "dynamic_queries_rhai"
150138
path = "examples/rhai/dynamic_queries.rs"
151-
required-features = ["rhai", "rhai_script_api"]
139+
required-features = ["rhai"]
152140

153141
[[example]]
154142
name = "game_of_life_lua"
155143
path = "examples/lua/game_of_life.rs"
156-
required-features = [
157-
"lua54",
158-
"lua_script_api",
159-
"bevy/file_watcher",
160-
"bevy/multi_threaded",
161-
]
144+
required-features = ["lua54", "bevy/file_watcher", "bevy/multi_threaded"]
162145

163146
[[example]]
147+
required-features = ["rhai", "bevy/file_watcher", "bevy/multi_threaded"]
164148
name = "game_of_life_rhai"
165149
path = "examples/rhai/game_of_life.rs"
166-
required-features = [
167-
"rhai",
168-
"rhai_script_api",
169-
"bevy/file_watcher",
170-
"bevy/multi_threaded",
171-
]
172150

173151
[[example]]
174152
name = "event_recipients_lua"
@@ -183,22 +161,22 @@ required-features = ["lua54"]
183161
[[example]]
184162
name = "documentation_gen_lua"
185163
path = "examples/lua/documentation_gen.rs"
186-
required-features = ["lua54", "teal", "lua_script_api"]
164+
required-features = ["lua54", "teal"]
187165

188166
[[example]]
189167
name = "bevy_api_lua"
190168
path = "examples/lua/bevy_api.rs"
191-
required-features = ["lua54", "lua_script_api"]
169+
required-features = ["lua54"]
192170

193171
[[example]]
194172
name = "bevy_api_rhai"
195173
path = "examples/rhai/bevy_api.rs"
196-
required-features = ["rhai", "rhai_script_api"]
174+
required-features = ["rhai"]
197175

198176
[[example]]
199177
name = "wrappers"
200178
path = "examples/wrappers.rs"
201-
required-features = ["lua54", "lua_script_api"]
179+
required-features = ["lua54"]
202180

203181
[[example]]
204182
name = "minimal_rune"

assets/scripts/event_recipients.lua

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
function on_event(id)
2-
print(string.format("on_event, script_id: %d, Handling:", script_id))
3-
print(string.format("\t-> id: %d", id))
2+
print(string.format("on_event, script_id: %s, Handling:", script_id))
3+
print(string.format("\t-> id : %d", id))
4+
print(string.format("\t-> entity : %s", entity))
5+
46
end

check.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ CURRENT_DIR=$(basename "$PWD")
66
if [[ "$CURRENT_DIR" == "bevy_api_gen" ]]; then
77
cargo +nightly-2024-11-05 clippy --all-targets --message-format=json
88
else
9-
cargo clippy --workspace --all-targets --message-format=json --features="lua54 lua_script_api rhai rhai_script_api teal rune bevy/file_watcher bevy/multi_threaded"
9+
cargo clippy --workspace --all-targets --message-format=json --features="lua54 rhai teal rune bevy/file_watcher bevy/multi_threaded"
1010
fi

crates/bevy_mod_scripting_core/src/commands.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,12 @@ impl<C: Context, R: Runtime> Command for CreateOrUpdateScript<C, R> {
106106
// If None assign new context ID, otherwise assign the old one
107107
// If re-loading and different from the previous one, the old one will be removed
108108
let current_context_id = (assigner.assign)(script.as_deref(), &self.id, &self.content, &mut contexts);
109+
debug!("Context assigned: {:?}", current_context_id);
110+
109111
let current_context_id = if let Some(id) = current_context_id {
110112
id
111113
} else {
112-
let ctxt = (builder.load)(&self.id, &self.content, &settings.context_initializers, &settings.context_pre_handling_initializers, world, runtime.runtime.as_mut().unwrap()).unwrap();
114+
let ctxt = (builder.load)(&self.id, &self.content, &settings.context_initializers, &settings.context_pre_handling_initializers, world, &mut runtime.runtime).unwrap();
113115
contexts.insert(ctxt)
114116
};
115117

crates/bevy_mod_scripting_core/src/context.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ pub struct ContextAssigner<C: Context> {
136136
impl<C: Context> Default for ContextAssigner<C> {
137137
fn default() -> Self {
138138
Self {
139-
assign: |_, _, _, c| Some(c.allocate_id()),
139+
assign: |old, _, _, _| old.map(|s| s.context_id),
140140
remove: |id, _, c| _ = c.remove(id),
141141
}
142142
}

crates/bevy_mod_scripting_core/src/lib.rs

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,12 @@ pub mod prelude {
3434
pub use {crate::docs::*, crate::error::*, crate::event::*, crate::systems::*, crate::*};
3535
}
3636

37-
#[derive(Default)]
3837
/// Bevy plugin enabling scripting within the bevy mod scripting framework
3938
pub struct ScriptingPlugin<A: Args, C: Context, R: Runtime> {
4039
/// Callback for initiating the runtime
41-
pub runtime_builder: Option<fn() -> R>,
40+
pub runtime_builder: fn() -> R,
41+
/// Settings for the runtime
42+
pub runtime_settings: Option<RuntimeSettings<R>>,
4243
/// The handler used for executing callbacks in scripts
4344
pub callback_handler: Option<HandlerFn<A, C, R>>,
4445
/// The context builder for loading contexts
@@ -47,6 +48,18 @@ pub struct ScriptingPlugin<A: Args, C: Context, R: Runtime> {
4748
pub context_assigner: Option<ContextAssigner<C>>,
4849
}
4950

51+
impl<A: Args, C: Context, R: Runtime + Default> Default for ScriptingPlugin<A, C, R> {
52+
fn default() -> Self {
53+
Self {
54+
runtime_builder: R::default,
55+
runtime_settings: Default::default(),
56+
callback_handler: Default::default(),
57+
context_builder: Default::default(),
58+
context_assigner: Default::default(),
59+
}
60+
}
61+
}
62+
5063
impl<A: Args, C: Context, R: Runtime> Plugin for ScriptingPlugin<A, C, R> {
5164
fn build(&self, app: &mut bevy::prelude::App) {
5265
app.add_event::<ScriptErrorEvent>()
@@ -60,11 +73,10 @@ impl<A: Args, C: Context, R: Runtime> Plugin for ScriptingPlugin<A, C, R> {
6073
extensions: &[],
6174
preprocessor: None,
6275
})
63-
// not every script host will have a runtime, for convenience we add a dummy runtime
76+
.insert_resource(self.runtime_settings.as_ref().cloned().unwrap_or_default())
6477
.insert_non_send_resource::<RuntimeContainer<R>>(RuntimeContainer {
65-
runtime: self.runtime_builder.map(|f| f()),
78+
runtime: (self.runtime_builder)(),
6679
})
67-
.init_non_send_resource::<RuntimeContainer<R>>()
6880
.init_non_send_resource::<ScriptContexts<C>>()
6981
.insert_resource::<CallbackSettings<A, C, R>>(CallbackSettings {
7082
callback_handler: self.callback_handler,
@@ -86,7 +98,9 @@ pub trait AddRuntimeInitializer<R: Runtime> {
8698

8799
impl<R: Runtime> AddRuntimeInitializer<R> for App {
88100
fn add_runtime_initializer(&mut self, initializer: RuntimeInitializer<R>) -> &mut Self {
89-
self.world_mut().init_resource::<RuntimeSettings<R>>();
101+
if !self.world_mut().contains_resource::<RuntimeSettings<R>>() {
102+
self.world_mut().init_resource::<RuntimeSettings<R>>();
103+
}
90104
self.world_mut()
91105
.resource_mut::<RuntimeSettings<R>>()
92106
.as_mut()
@@ -180,3 +194,32 @@ impl<D: DocumentationFragment> StoreDocumentation<D> for App {
180194
top_fragment.gen_docs()
181195
}
182196
}
197+
198+
#[cfg(test)]
199+
mod test {
200+
use super::*;
201+
202+
#[test]
203+
fn test_default_scripting_plugin_initializes_all_resources_correctly() {
204+
let mut app = App::new();
205+
#[derive(Default, Clone)]
206+
struct A;
207+
#[derive(Default, Clone)]
208+
struct C;
209+
#[derive(Default, Clone)]
210+
struct R;
211+
app.add_plugins(AssetPlugin::default());
212+
app.add_plugins(ScriptingPlugin::<A, C, R>::default());
213+
214+
assert!(app.world().contains_resource::<Scripts>());
215+
assert!(app.world().contains_resource::<ReflectAllocator>());
216+
assert!(app.world().contains_resource::<ScriptAssetSettings>());
217+
assert!(app.world().contains_resource::<RuntimeSettings<R>>());
218+
assert!(app.world().contains_resource::<CallbackSettings<A, C, R>>());
219+
assert!(app
220+
.world()
221+
.contains_resource::<ContextLoadingSettings<C, R>>());
222+
assert!(app.world().contains_non_send::<RuntimeContainer<R>>());
223+
assert!(app.world().contains_non_send::<ScriptContexts<C>>());
224+
}
225+
}

crates/bevy_mod_scripting_core/src/runtime.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ impl<T: 'static> Runtime for T {}
88

99
pub type RuntimeInitializer<R> = fn(&mut R);
1010

11-
#[derive(Clone, Resource)]
11+
#[derive(Resource)]
1212
pub struct RuntimeSettings<R: Runtime> {
1313
pub initializers: Vec<RuntimeInitializer<R>>,
1414
}
@@ -21,16 +21,16 @@ impl<R: Runtime> Default for RuntimeSettings<R> {
2121
}
2222
}
2323

24-
/// Stores a particular runtime.
25-
#[derive(Resource)]
26-
pub struct RuntimeContainer<R: Runtime> {
27-
pub runtime: Option<R>,
28-
}
29-
30-
impl<T: Runtime> Default for RuntimeContainer<T> {
31-
fn default() -> Self {
24+
impl<R: Runtime> Clone for RuntimeSettings<R> {
25+
fn clone(&self) -> Self {
3226
Self {
33-
runtime: Default::default(),
27+
initializers: self.initializers.clone(),
3428
}
3529
}
3630
}
31+
32+
/// Stores a particular runtime.
33+
#[derive(Resource)]
34+
pub struct RuntimeContainer<R: Runtime> {
35+
pub runtime: R,
36+
}

0 commit comments

Comments
 (0)