if _G.ToSave == nil then _G.ToSave = game.Players.LocalPlayer.Character -- Welcome loadstring haters, put the path of what you want to save here end --[[ If you're seeing this, you're probably not using the loadstring! It's probably better to use this version instead: --------------------------- _G.ToSave = game.Players.LocalPlayer.Character -- Put the path of the thing you want to save here loadstring(game:HttpGet(('https://raw.githubusercontent.com/Aidez/MISC/main/save_specific_instance'),true))() --------------------------- MASSIVE CREDIT TO https://v3rmillion.net/showthread.php?tid=1032423 MOST OF THIS SCRIPT IS REPURPOSED CODE FROM THEIR SCRIPT --]] local newline = tostring("\n") local Xml = { start = ''..newline..'true'..newline..'null'..newline..'nil', finish = '' } local Property = {} function Property:convert(p1, p2, p3, p4) local p4_gsub = { double = "number", int = "number", int32 = "number", int64 = "number", float = "number", float32 = "number", float64 = "number", bool = "boolean", CreatorType = "EnumItem", MeshType = "EnumItem", CameraType = "EnumItem", RenderFidelity = "EnumItem", Color3uint8 = "Fault", SystemAddress = "Fault", Camera = "Ref", BasePart = "Ref", Workspace = "Ref", Instance = "Ref", Player = "Ref", GuiObject = "Ref", LocalizationTable = "Ref" } local Convert_Types = { number = function() local p3 = p3[1] local isInteger = p3 % 1 == 0 local ConversionType = isInteger and "int" or "float" local Conversion_Format = [[<%s name="%s">%s]] return string.format(Conversion_Format, ConversionType, p2, p3, ConversionType) end, NumberRange = function() local p3 = p3[1] local Conversion_Format = [[%s]] return string.format(Conversion_Format, p2, p3.Min.." "..p3.Max) end, NumberSequence = function() local p3 = p3[1] local Conversion_Format = [[%s]] local ConvertedArray = {} for _, Keypoints in next, p3.Keypoints do --table.insert(ConvertedArray, unpack(Keypoints)) table.insert(ConvertedArray, Keypoints.Envelope) table.insert(ConvertedArray, Keypoints.Time) table.insert(ConvertedArray, Keypoints.Value) end return string.format(Conversion_Format, p2, tostring(unpack(ConvertedArray))) end, ColorSequence = function() local p3 = p3[1] local Conversion_Format = [[%s]] local ConvertedArray = {} for _, Keypoints in next, p3.Keypoints do --table.insert(ConvertedArray, unpack(Keypoints)) table.insert(ConvertedArray, Keypoints.Time) table.insert(ConvertedArray, Keypoints.Value) end return string.format(Conversion_Format, p2, tostring(unpack(ConvertedArray))) end, string = function() local p3 = p3[1] local Conversion_Format if string.find(p3,"rbxassetid") or string.find(p3,"roblox.com/asset") then Conversion_Format = [[%s]] else Conversion_Format = [[%s]] end return string.format(Conversion_Format, p2, p3) end, BinaryString = function() local p3 = p3[1] local Conversion_Format = '' local Raw_Conversion_Format = '%s' local isNilValue = tostring(p3) == "nil" return string.format(isNilValue and Raw_Conversion_Format or Conversion_Format, p2, isNilValue and "" or p3) end, ProtectedString = function() local p3 = p3[1] local Conversion_Format = '' return string.format(Conversion_Format, p2, p3) end, Content = function() local p3 = p3[1] local Conversion_Format = p4 ~= nil and [[%s]] or [[]] return string.format(Conversion_Format, p2, p3) end, Ray = function() local p3 = p3[1] local Conversion_Format = [[ %s %s %s %s %s %s ]] return string.format(Conversion_Format, p2, p3.Origin.X, p3.Origin.Y, p3.Origin.Z, p3.Direction.X, p3.Direction.Y, p3.Direction.Z) end, boolean = function() local p3 = p3[1] local Conversion_Format = [[%s]] return string.format(Conversion_Format, p2, tostring(p3)) end, EnumItem = function() local p3 = p3[1] local Conversion_Format = [[%s]] return string.format(Conversion_Format, p2, p3.Value) end, CFrame = function() local p3 = p3[1] local Conversion_Format = [[ %s %s %s %s %s %s %s %s %s %s %s %s ]] return string.format(Conversion_Format, p2, p3.X, p3.Y, p3.Z, p3.RightVector.X, p3.RightVector.Y, p3.RightVector.Z, p3.UpVector.X, p3.UpVector.Y, p3.UpVector.Z, p3.LookVector.X, p3.LookVector.Y, p3.LookVector.Z) end, Vector3 = function() local p3 = p3[1] local Conversion_Format = [[ %s %s %s ]] return string.format(Conversion_Format, p2, p3.X, p3.Y, p3.Z) end, Vector2 = function() local p3 = p3[1] local Conversion_Format = [[ %s %s ]] return string.format(Conversion_Format, p2, p3.X, p3.Y) end, UDim = function() local p3 = p3[1] local Conversion_Format = [[ %s %s ]] return string.format(Conversion_Format, p2, p3.Scale, p3.Offset) end, UDim2 = function() local p3 = p3[1] local Conversion_Format = [[ %s %s %s %s ]] return string.format(Conversion_Format, p2, p3.X.Scale, p3.X.Offset, p3.Y.Scale, p3.Y.Offset) end, Rect = function() local p3 = p3[1] local Conversion_Format = [[ %s %s %s %s ]] return string.format(Conversion_Format, p2, p3.Min.X, p3.Min.Y, p3.Max.X, p3.Max.Y) end, Color3 = function() local p3 = p3[1] local Conversion_Format = [[ %s %s %s ]] return string.format(Conversion_Format, p2, p3.R, p3.G, p3.B) end, PhysicalProperties = function() local Conversion_Format = [[ false ]] return string.format(Conversion_Format, p2) end, Axes = function() local Conversion_Format = [[ 7 ]] return string.format(Conversion_Format, p2) end, Ref = function() local Conversion_Format = [[null]] return string.format(Conversion_Format, p2) end, Fault = function() return '' end, Faces = function() return "" end, Region3int16 = function() return "" end, Vector3int16 = function() return "" end, Vector2int16 = function() return "" end, BrickColor = function() return "" end } p4 = p4_gsub[p4] and p4_gsub[p4] or p4 if Convert_Types[p4] then return Convert_Types[p4]() else return "" end end function Property:get(p1, p2, Value) local SpecialProperties = { CustomPhysicalProperties = { function() return PhysicalProperties.new(.7,.3,.5,1,1) end, {}, "PhysicalProperties" }, Source = { decompile, { p1 }, "ProtectedString" }, ChildData = { readbinarystring, { p1, "ChildData" }, "BinaryString" }, PhysicsData = { readbinarystring, { p1, "PhysicsData" }, "BinaryString" }, MeshData = { readbinarystring, { p1, "MeshData" }, "BinaryString" }, SmoothGrid = { readbinarystring, { p1, "SmoothGrid" }, "BinaryString" }, PhysicsGrid = { readbinarystring, { p1, "PhysicsGrid" }, "BinaryString" }, MaterialColors = { readbinarystring, { p1, "MaterialColors" }, "BinaryString" }, Tags = { readbinarystring, { p1, "Tags" }, "BinaryString" }, AttributesReplicate = { readbinarystring, { p1, "AttributesReplicate" }, "BinaryString" }, AttributesSerialize = { readbinarystring, { p1, "AttributesSerialize" }, "BinaryString" }, RobloxLocked = { checkrbxlocked, { p1 }, "boolean" }, siz = { gethiddenproperty, { p1, "Size" }, "Vector3" }, shap = { gethiddenproperty, { p1, "Shape" }, "EnumItem" } } local SpecialData = SpecialProperties[p2] if SpecialData then local f = SpecialData[1] if f then local r1, r2 = f(unpack(SpecialData[2])) return self:convert(p1, p2, {r1, r2}, SpecialData[3]) end end local ValueType = "string" if Value ~= nil then ValueType = typeof(Value) elseif Value == nil then ValueType = Api.Dump.Properties[p1.ClassName][p2] end if type(ValueType) ~= "string" then ValueType = "string" Value = "" end return self:convert(p1, p2, {Value}, ValueType) end local Class = {} function Class:new(p1) local Referent = "RBX" for i = 1, 32 do local Random = math.random(36) Referent ..= string.sub("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", Random, Random) end return string.format('', p1, Referent), Referent end function Class:properties(p1, p2) local Properties = getproperties(p2) for Prop, Value in next, Properties do p1 ..= Property:get(p2, Prop, Value)..newline end return p1 end function Class:finish() return '' end ParseItem = function(p1,p2) local D = "" local A, B = Class:new(p1.ClassName) D ..= A..newline D ..= [[]]..newline D = Class:properties(D, p1) D ..= [[]]..newline D ..= ""..newline D ..= Class:finish()..newline local Comment = "" return D,B,Comment end writeinstance = function(p1, p2) local Descendants = p1:GetDescendants() game.StarterGui:SetCore("SendNotification", { Title = 'STARTED'; Text = "Saving your selected instance. \n("..tostring(#Descendants).." DESCENDANTS)"; Icon = "rbxassetid://2541869220"; Duration = 7; }) print() local Instances = {} for i,v in pairs(Descendants) do if i%50 == 0 then task.wait() end if not string.find(v.ClassName,"Script") then local XML,TAG,COMMENT = ParseItem(v,p2) local depth = #string.split(v:GetFullName(),".") if not Instances[depth] then Instances[depth] = {} end local Data = { ["object"] = v; ["parent"] = v.Parent; ["tag"] = TAG; ["xml"] = XML; ["comment"] = COMMENT; } table.insert(Instances[depth],Data) end end local D = Xml.start..newline local MAINXML,MAINTAG,MAINCOMMENT = ParseItem(p1,p2) D ..= MAINXML..newline local HighestDepth = 0 local LowestDepth = math.huge for i,v in pairs(Instances) do if i > HighestDepth then HighestDepth = i end if i < LowestDepth then LowestDepth = i end end for index = LowestDepth,HighestDepth do for i,v in pairs(Instances[index]) do if index == LowestDepth then D = string.gsub(D,"",newline..v.xml..newline..MAINCOMMENT..newline) else --for index2 = LowestDepth,index do for x,y in pairs(Instances[index-1]) do if x%50 == 0 then task.wait() end if v.object.Parent == y.object then local ToSet = string.gsub(v.xml,"%%","BIGBONER") D = string.gsub(D,"",newline..ToSet..newline..y.comment..newline) end end --end end end end D ..= [[]]..newline D ..= [[]]..newline D ..= Xml.finish D = string.gsub(D,"BIGBONER","%%") -- local C = MAINTAG.." ("..tostring(p1)..")."..p2 local C = p1:GetFullName().."."..p2 writefile(C, D) return C end local Success, Saved_As = pcall(writeinstance, _G.ToSave, "rbxmx") if Success then game.StarterGui:SetCore("SendNotification", { Title = 'SUCCESS'; Text = "Instance "..tostring(_G.ToSave).." was saved to your workspace folder."; Icon = "rbxassetid://2541869220"; Duration = 7; }) else game.StarterGui:SetCore("SendNotification", { Title = "ERROR"; Text = Saved_As; Icon = "rbxassetid://2541869220"; Duration = 7; }) end --[[ MASSIVE CREDIT TO https://v3rmillion.net/showthread.php?tid=1032423 MOST OF THIS SCRIPT IS REPURPOSED CODE FROM THEIR SCRIPT --]]