diff --git a/src/runner/instance.rs b/src/runner/instance.rs index 0d70efb..7ea4079 100644 --- a/src/runner/instance.rs +++ b/src/runner/instance.rs @@ -261,6 +261,46 @@ impl mlua::UserData for Instance{ Some(&rbx_types::Variant::Vector3(v))=>return Ok(Into::::into(v).into_lua(lua)), _=>(), } + //find a function with a matching name + if let Some(ret)=class_functions_mut(lua,|cf|{ + let class_str=instance.class.as_str(); + Ok(match cf.classes.entry(class_str){ + std::collections::hash_map::Entry::Occupied(occupied_entry)=>{ + match occupied_entry.get().entry(index_str){ + std::collections::hash_map::Entry::Occupied(occupied_entry)=>{ + Some(occupied_entry.get()) + }, + std::collections::hash_map::Entry::Vacant(vacant_entry)=>{ + match CLASS_FUNCTION_DATABASE.get(class_str) + .and_then(|class_functions| + class_functions.get(index_str) + ) + { + Some(f_pointer)=>Some(&*vacant_entry.insert(lua.create_function(f_pointer)?)), + None=>None, + } + }, + } + }, + std::collections::hash_map::Entry::Vacant(vacant_entry)=>{ + match CLASS_FUNCTION_DATABASE.get(class_str) + .and_then(|class_functions| + class_functions.get(index_str) + ) + { + Some(f_pointer)=>{ + let mut h=HashMap::new(); + let lua_f=h.entry(index_str).or_insert(lua.create_function(f_pointer)?); + vacant_entry.insert(h); + Some(&*lua_f) + }, + None=>None, + } + }, + }) + })?{ + return Ok(ret.into_lua(lua)); + } //find a child with a matching name Ok( find_first_child(dom,instance,index_str)