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%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
--]]