diff --git a/src/duck/instance.rs b/src/duck/instance.rs index eb90622..e13d57e 100644 --- a/src/duck/instance.rs +++ b/src/duck/instance.rs @@ -30,21 +30,17 @@ impl DefaultAsset { commands.insert_resource(DefaultAsset(handle)); } } -fn world<'w>(lua: &Lua) -> std::result::Result<&'w mut World, mlua::Error> { +pub(crate) fn world<'w>(lua: &Lua) -> std::result::Result<&'w mut World, mlua::Error> { lua.app_data_mut::<&World>() .ok_or_else(Error("Direct world access not available here!".into())) .map_err(LuaError::external).deref_mut() } -impl LuaUserData for Transform { - -} - -pub struct Instance(Entity); +pub struct Instance(pub Entity); impl FromLua for Instance { - fn from_lua(value: mlua::Value, _: &Lua) -> mlua::Result { + fn from_lua(value: Value, _: &Lua) -> mlua::Result { match value { - mlua::Value::UserData(ud) => Ok(*ud.borrow::()?), + Value::UserData(instance) => Ok(Self(instance.borrow::()?.0)), _ => unreachable!(), } } @@ -64,29 +60,44 @@ impl LuaUserData for Instance { } Ok(()) }); - fields.add_field_method_get("transform",|lua: Lua, this| { - Ok(world(&lua)?.get::(this.0).unwrap()) - }); - fields.add_field_method_set("transform",|lua: Lua, this| { - Ok() - }) crate::script::add_fields(fields); crate::part::add_fields(fields); } fn add_methods>(methods: &mut M) { methods.add_method("despawn",|lua: Lua, this| { - let world = world(lua).map_err(LuaError::external)?; + let world = world(&lua).map_err(LuaError::external)?; world.get_entity(this).map_err(LuaError::external)?; Ok(()) }); crate::script::add_methods(methods); - crate::part::add_fields(methods); + crate::part::add_fields(fields); } } impl Instance { fn world_access(&self, lua: &Lua) -> std::result::Result { world(lua)?.get_entity_mut(self.0).map_err(LuaError::external) } + fn new(&self) { + T::add(self.spawn()); + } + + pub fn of(entity: Entity) -> Self { + Instance(entity) + } +} + +pub trait Duck { + fn add(entity: &mut EntityCommands); +} + +trait InstanceCommands { + fn new() -> { + + } +} + +impl InstanceCommands for Commands { + } pub fn setup(app: &mut App) { diff --git a/src/duck/part.rs b/src/duck/part.rs index 9fd1bed..f4670cb 100644 --- a/src/duck/part.rs +++ b/src/duck/part.rs @@ -1,12 +1,12 @@ use std::marker::PhantomData; use bevy::prelude::*; -use mlua::{UserDataFields, UserDataMethods}; -use mlua::prelude::{LuaUserDataFields, LuaUserDataMethods}; +use mlua::{FromLua, Lua, UserDataFields, UserDataMethods, Value}; +use mlua::prelude::{LuaUserData, LuaUserDataFields, LuaUserDataMethods}; use crate::duck::instance::*; pub struct Part; -impl Class for Part { - fn add_to(entity: &mut EntityCommands) -> Instance { +impl Duck for Part { + fn add(entity: &mut EntityCommands) { let id = entity.id(); entity.commands().run_system_cached_with(move | In(id): In, @@ -18,7 +18,6 @@ impl Class for Part { entity.insert((Mesh3d(mesh.clone()),MeshMaterial3d(mat.clone()))); } },id); - Instance::Part(Object::::of(entity.id())) } } @@ -36,6 +35,25 @@ pub fn setup(app: &mut App) { } pub(crate) fn add_fields>(fields: &mut F) { + fields.add_field_method_get("transform",|lua: Lua, this| { + Ok(world(&lua)?.get::(this.0).unwrap()) + }); + fields.add_field_method_set("transform",|lua: Lua, this,transform: Transform| { + Ok(()) + }); +} + +impl FromLua for Transform { + fn from_lua(value: Value, lua: &Lua) -> mlua::Result { + match value { + Value::UserData(ud) => Ok(*ud.borrow::()?), + _ => unreachable!(), + } + } +} + +struct Transform(bevy::prelude::Transform); +impl LuaUserData for Transform { } diff --git a/src/duck/script.rs b/src/duck/script.rs index 35c89d6..a9a0ecc 100644 --- a/src/duck/script.rs +++ b/src/duck/script.rs @@ -40,10 +40,9 @@ impl AssetLoader for ScriptAssetLoader { } #[derive(Component)] -struct ScriptHandle(Handle); +struct Script(Handle); -pub struct Script; -impl Class for Script { +impl Duck for Script { fn add_to(entity: &mut EntityCommands) -> Instance { let id = entity.id(); entity.commands().run_system_cached_with(| // Get commands -> defer a system @@ -52,17 +51,9 @@ impl Class for Script { script: Res> // The default script asset to load it with | { if let Ok(mut entity) = commands.get_entity(id) { - entity.insert(ScriptHandle(script.clone())); + entity.insert(Script(script.clone())); } },id); - Self::run(entity); - Instance::Script(Object::