diff --git a/lib/roblox_emulator/src/runner/instance/instance.rs b/lib/roblox_emulator/src/runner/instance/instance.rs index 8e24d87..36df0dd 100644 --- a/lib/roblox_emulator/src/runner/instance/instance.rs +++ b/lib/roblox_emulator/src/runner/instance/instance.rs @@ -286,17 +286,14 @@ impl mlua::UserData for Instance{ ).ok_or_else(|| mlua::Error::runtime(format!("Property '{index_str}' missing on class '{}'",class.name)) )?; - // the index is known to be a real property at this point - // allow creating a permanent ustr (memory leak) - let index_ustr=rbx_dom_weak::ustr(index_str); - match &property.data_type{ + let value=match &property.data_type{ rbx_reflection::DataType::Value(rbx_types::VariantType::Vector3)=>{ let typed_value:Vector3=*value.as_userdata().ok_or_else(||mlua::Error::runtime("Expected Userdata"))?.borrow()?; - instance.properties.insert(index_ustr,rbx_types::Variant::Vector3(typed_value.into())); + rbx_types::Variant::Vector3(typed_value.into()) }, rbx_reflection::DataType::Value(rbx_types::VariantType::Float32)=>{ let typed_value:f32=coerce_float32(&value).ok_or_else(||mlua::Error::runtime("Expected f32"))?; - instance.properties.insert(index_ustr,rbx_types::Variant::Float32(typed_value)); + rbx_types::Variant::Float32(typed_value) }, rbx_reflection::DataType::Enum(enum_name)=>{ let typed_value=match &value{ @@ -312,30 +309,34 @@ impl mlua::UserData for Instance{ }, _=>Err(mlua::Error::runtime("Expected Enum")), }?; - instance.properties.insert(index_ustr,rbx_types::Variant::Enum(typed_value)); + rbx_types::Variant::Enum(typed_value) }, rbx_reflection::DataType::Value(rbx_types::VariantType::Color3)=>{ let typed_value:crate::runner::color3::Color3=*value.as_userdata().ok_or_else(||mlua::Error::runtime("Expected Color3"))?.borrow()?; - instance.properties.insert(index_ustr,rbx_types::Variant::Color3(typed_value.into())); + rbx_types::Variant::Color3(typed_value.into()) }, rbx_reflection::DataType::Value(rbx_types::VariantType::Bool)=>{ let typed_value=value.as_boolean().ok_or_else(||mlua::Error::runtime("Expected boolean"))?; - instance.properties.insert(index_ustr,rbx_types::Variant::Bool(typed_value)); + rbx_types::Variant::Bool(typed_value) }, rbx_reflection::DataType::Value(rbx_types::VariantType::String)=>{ let typed_value=value.as_str().ok_or_else(||mlua::Error::runtime("Expected boolean"))?; - instance.properties.insert(index_ustr,rbx_types::Variant::String(typed_value.to_owned())); + rbx_types::Variant::String(typed_value.to_owned()) }, rbx_reflection::DataType::Value(rbx_types::VariantType::NumberSequence)=>{ let typed_value:crate::runner::number_sequence::NumberSequence=*value.as_userdata().ok_or_else(||mlua::Error::runtime("Expected NumberSequence"))?.borrow()?; - instance.properties.insert(index_ustr,rbx_types::Variant::NumberSequence(typed_value.into())); + rbx_types::Variant::NumberSequence(typed_value.into()) }, rbx_reflection::DataType::Value(rbx_types::VariantType::ColorSequence)=>{ let typed_value:crate::runner::color_sequence::ColorSequence=*value.as_userdata().ok_or_else(||mlua::Error::runtime("Expected ColorSequence"))?.borrow()?; - instance.properties.insert(index_ustr,rbx_types::Variant::ColorSequence(typed_value.into())); + rbx_types::Variant::ColorSequence(typed_value.into()) }, other=>return Err(mlua::Error::runtime(format!("Unimplemented property type: {other:?}"))), - } + }; + // the index is known to be a real property at this point + // allow creating a permanent ustr (memory leak) + let index_ustr=rbx_dom_weak::ustr(index_str); + instance.properties.insert(index_ustr,value); Ok(()) }) });