Compare commits
2 Commits
3ad9d45452
...
5726e70582
Author | SHA1 | Date | |
---|---|---|---|
5726e70582 | |||
3f71ead5f1 |
@ -47,12 +47,8 @@ impl Context{
|
||||
}
|
||||
|
||||
pub fn find_services(&self)->Option<Services>{
|
||||
Some(Services{
|
||||
workspace:*self.dom.root().children().iter().find(|&&r|
|
||||
self.dom.get_by_ref(r).is_some_and(|instance|instance.class=="Workspace")
|
||||
)?,
|
||||
game:self.dom.root_ref(),
|
||||
})
|
||||
//nil instances isn't real, it doesn't exist in real roblox places
|
||||
None
|
||||
}
|
||||
pub fn convert_into_place(&mut self)->Services{
|
||||
//snapshot root instances
|
||||
@ -74,6 +70,15 @@ impl Context{
|
||||
game.properties.insert("Workspace".to_owned(),rbx_types::Variant::Ref(workspace));
|
||||
}
|
||||
self.dom.insert(game,InstanceBuilder::new("Lighting"));
|
||||
// Special nonexistent class that holds instances parented to nil,
|
||||
// which can still be referenced by scripts.
|
||||
// Using a sentinel value as a ref because global variables are hard.
|
||||
let nil=self.dom.insert(
|
||||
game,InstanceBuilder::new("Nil")
|
||||
.with_referent(
|
||||
<Ref as std::str::FromStr>::from_str("ffffffffffffffffffffffffffffffff").unwrap()
|
||||
)
|
||||
);
|
||||
|
||||
//transfer original root instances into workspace
|
||||
for instance in children{
|
||||
@ -83,6 +88,7 @@ impl Context{
|
||||
Services{
|
||||
game,
|
||||
workspace,
|
||||
nil,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -90,4 +96,5 @@ impl Context{
|
||||
pub struct Services{
|
||||
pub game:Ref,
|
||||
pub workspace:Ref,
|
||||
pub nil:Ref,
|
||||
}
|
||||
|
@ -16,9 +16,8 @@ pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table)->Result<(),mlua::Error>{
|
||||
instance_table.raw_set("new",
|
||||
lua.create_function(|lua,(class_name,parent):(mlua::String,Option<Instance>)|{
|
||||
let class_name_str=&*class_name.to_str()?;
|
||||
let parent=parent.ok_or(mlua::Error::runtime("Nil Parent not yet supported"))?;
|
||||
let parent=parent.unwrap_or(Instance::nil());
|
||||
dom_mut(lua,|dom|{
|
||||
//TODO: Nil instances
|
||||
Ok(Instance::new(dom.insert(parent.referent,InstanceBuilder::new(class_name_str))))
|
||||
})
|
||||
})?
|
||||
@ -91,6 +90,12 @@ impl Instance{
|
||||
pub const fn new(referent:Ref)->Self{
|
||||
Self{referent}
|
||||
}
|
||||
// Using a sentinel value as a ref for nil instances because global variables are hard.
|
||||
pub fn nil()->Self{
|
||||
Self{
|
||||
referent:<Ref as std::str::FromStr>::from_str("ffffffffffffffffffffffffffffffff").unwrap()
|
||||
}
|
||||
}
|
||||
pub fn get<'a>(&self,dom:&'a WeakDom)->mlua::Result<&'a rbx_dom_weak::Instance>{
|
||||
dom.get_by_ref(self.referent).ok_or(mlua::Error::runtime("Instance missing"))
|
||||
}
|
||||
@ -124,11 +129,12 @@ impl mlua::UserData for Instance{
|
||||
fields.add_field_method_get("Parent",|lua,this|{
|
||||
dom_mut(lua,|dom|{
|
||||
let instance=this.get(dom)?;
|
||||
//TODO: return nil when parent is Nil instances
|
||||
Ok(Instance::new(instance.parent()))
|
||||
})
|
||||
});
|
||||
fields.add_field_method_set("Parent",|lua,this,val:Option<Instance>|{
|
||||
let parent=val.ok_or(mlua::Error::runtime("Nil Parent not yet supported"))?;
|
||||
let parent=val.unwrap_or(Instance::nil());
|
||||
dom_mut(lua,|dom|{
|
||||
dom.transfer_within(this.referent,parent.referent);
|
||||
Ok(())
|
||||
@ -218,7 +224,7 @@ impl mlua::UserData for Instance{
|
||||
);
|
||||
methods.add_method("Destroy",|lua,this,()|
|
||||
dom_mut(lua,|dom|{
|
||||
dom.destroy(this.referent);
|
||||
dom.transfer_within(this.referent,Instance::nil().referent);
|
||||
Ok(())
|
||||
})
|
||||
);
|
||||
@ -247,7 +253,23 @@ impl mlua::UserData for Instance{
|
||||
Some(&rbx_types::Variant::Ref(val))=>return Instance::new(val).into_lua(lua),
|
||||
Some(&rbx_types::Variant::CFrame(cf))=>return Into::<super::cframe::CFrame>::into(cf).into_lua(lua),
|
||||
Some(&rbx_types::Variant::Vector3(v))=>return Into::<super::vector3::Vector3>::into(v).into_lua(lua),
|
||||
None=>(),
|
||||
None=>{
|
||||
//hack to make .Position work
|
||||
if let Some((property_str,dumb_thing))=match index_str{
|
||||
"Position"=>Some(("CFrame",|c:&rbx_types::Variant|{
|
||||
let c=match c{
|
||||
rbx_types::Variant::CFrame(c)=>c,
|
||||
_=>return Err(mlua::Error::runtime("Not a CFrame")),
|
||||
};
|
||||
Into::<super::vector3::Vector3>::into(c.position).into_lua(lua)
|
||||
})),
|
||||
_=>None,
|
||||
}{
|
||||
if let Some(thing)=instance.properties.get(property_str).map(dumb_thing){
|
||||
return thing;
|
||||
}
|
||||
}
|
||||
},
|
||||
other=>return Err(mlua::Error::runtime(format!("Instance.__index Unsupported property type instance={} index={index_str} value={other:?}",instance.name))),
|
||||
}
|
||||
//find a function with a matching name
|
||||
|
Loading…
Reference in New Issue
Block a user