local function getSafeProps(inst) local allowed = ALLOWLIST[inst.ClassName] or {} local props = {} for _, prop in ipairs(allowed) do local success, val = pcall(function() return inst[prop] end) if success then -- convert Vector3, Color3, CFrame to tables if typeof(val) == "Vector3" then props[prop] = x=val.X,y=val.Y,z=val.Z elseif typeof(val) == "Color3" then props[prop] = r=val.R,g=val.G,b=val.B elseif typeof(val) == "CFrame" then local p = val.Position; local r = val:ToEulerAnglesXYZ() props[prop] = px=p.X,py=p.Y,pz=p.Z,rx=r[1],ry=r[2],rz=r[3] else props[prop] = val end end end return props end
Most modern executors provide a built-in saveinstance() function that handles the complexity. Roblox SaveInstance Script