saveinstance --[[ SaveInstance V3 - Swift THIS IS A SAVEINSTANCE CORE NOT A SAVEINSTANCE SCRIPT. THINK OF THIS AS A MOCK OF THE BUILT IN FUNCTION. ALL THIS DOES IT MAKE THE FUNCTION YOU NEED A COPIER SCRIPT THAT CALLS _G.SInstance(Instance, Name) FOR THIS TO WORK. You have three options of saveinstance that you can change by setting "saveMethod". 1 - Using the "writefile" function if you support it 2 - Using a webhost like v2 3 - Using the new create model method saveinstance How to dowload it? saveinstance NEW: If you just want to save the place right away, go to the "SAVE PLACE UI OPTIONS" and enable it. You also need to get one of your place's id and set "savePlaceId" to it. This is where your place will be exported to. Made by Pi and sad Moon :c --]] -- ========== MAIN SETTINGS ========== local saveMethod = 3 -- 1 = writefile, 2 = host, 3 = createmodel local debugMessages = true -- Debug messages local APIOverride = [==[]==] -- The JSON Api of Roblox if you have no TrustCheck saveinstance How to get it? saveinstance -- ========== FOR HOST OPTION ========== -- You need your host with the php set up on it for this to work. Make sure read/write permissions are enabled for php. -- You don't need it if you have a writefile function. Actually no setup if you have writefile ahaha. local host = "http://slowcomplicatedafmethod.com/Master.php" -- Your php file local splitSize = 800000 -- If your host supports bigger post size then change this (1mb default) -- ========== SAVE PLACE UI OPTIONS ========== local savePlaceId = 724225093 -- Put the PlaceID of ONE OF THE PLACES THAT YOU OWN here from https://www.roblox.com/develop which will be updated by this script. saveinstance How to dowload it? saveinstance local savePlaceExtra = true -- Nil Instances, PlayerGui, etc local savePlaceScripts = true -- If you have decompiler local savePlaceTerrain = true -- Opens Terrain Chunk Selector local savePlaceTerrainShowChunks = true -- Shows the selection boxes which are your selected chunks local savePlaceNilInstances = true -- Nil Instances local savePlaceUseWriteFile = false -- Writes the place file to your disk instead if you have a writefile function -- ========== DO NOT MODIFY BELOW ========== if saveMethod == 1 and not writefile then print("no writefile ending") return end saveinstance How to get it? saveinstance local http = game:GetService("HttpService") local API = {} local APIJson local LPlayer = game:GetService("Players").LocalPlayer local selectingTerrain = false local terrainChunks = {} local terrainChunksTemp = {} local terrainBeen = {} local placeMode = false saveinstance How to get it? saveinstance local instanceCount = 0 local saveString = "" local totalInstances = 1 local savedProps = {} local instanceRefs = {} local storedInstances = {} local splits = 0 saveinstance How to use it? saveinstance local globalName = "" local extraFolder = Instance.new("Folder") extraFolder.Name = "_IMPORTANT_AND_EXTRA_INSTANCES_" local terrainLoader = Instance.new("Script",extraFolder) terrainLoader.Name = "LoadTerrain" local terrainData = Instance.new("ModuleScript",terrainLoader) terrainData.Name = "Data" local consoleFunc = printconsole or writeconsole saveinstance How to get it? saveinstance local success,err = ypcall(function() if APIOverride and APIOverride ~= "" then APIJson = APIOverride else APIJson = game:HttpGetAsync("http://anaminus.github.io/rbx/json/api/latest.json") end end) if err then saveinstance How to use it? saveinstance if script:FindFirstChild("API") then APIJson = require(script.API) end end APIJson = http:JSONDecode(APIJson) for i,v in pairs(APIJson) do if v.type == "Class" then API[v.Name] = v saveinstance How to get it? saveinstance API[v.Name].Properties = {} elseif v.type == "Property" then local dontuse = false for i2,v2 in pairs(v.tags) do if v2 == "deprecated" or v2 == "hidden" or v2 == "readonly" then dontuse = true end end if not dontuse then table.insert(API[v.Class].Properties,v) saveinstance How to dowload it? saveinstance end end end local function getProperties(obj) if savedProps[obj.ClassName] then return savedProps[obj.ClassName] end local tempProps = {} local currentClass = obj.ClassName saveinstance How to get it? saveinstance while currentClass do for i,v in pairs(API[currentClass].Properties) do table.insert(tempProps,v) end currentClass = API[currentClass].Superclass end savedProps[obj.ClassName] = tempProps return tempProps end saveinstance How to get it? saveinstance local function appendToHost() game:HttpPostAsync(host,table.concat(storedInstances)) --http:PostAsync(host,http:JSONEncode({Option = "Append",Name = globalName,Data = table.concat(storedInstances)})) splits = splits + 1 if debugMessages then if consoleFunc then -- Stealth option is always better af consoleFunc("SaveAmounts: "..tostring(splits).." Progress = "..tostring(instanceCount/totalInstances*100).."%") else print("SaveAmounts: "..tostring(splits),"Progress = "..tostring(instanceCount/totalInstances*100).."%") end saveinstance How to get it? saveinstance end end local function submitSave() game:HttpPostAsync(host,http:JSONEncode({Option = "Submit",Name = globalName})) end local function clearAll() game:HttpPostAsync(host,http:JSONEncode({Option = "Clear"})) end saveinstance How to get it? saveinstance local function checkRef(obj) local check = instanceRefs[obj] if check then return tostring(check) end instanceRefs[obj] = instanceCount return tostring(instanceCount) end saveinstance How to get it? saveinstance local function setRef(obj) if obj == nil then return "null" end local check = instanceRefs[obj] if check then return "RBX"..tostring(check) end instanceCount = instanceCount + 1 instanceRefs[obj] = instanceCount return "RBX"..tostring(instanceCount) end saveinstance How to dowload it? saveinstance local function cleanUglyAf(str) if #str == 0 then return "" end local firstChar = str:sub(1,1) local firstByte = string.byte(firstChar) if firstByte >= 32 and firstByte <= 126 then return firstChar..cleanUglyAf(str:sub(2)) elseif firstByte == 9 or firstByte == 10 then saveinstance How to use it? saveinstance return firstChar..cleanUglyAf(str:sub(2)) else return cleanUglyAf(str:sub(2)) end end function CreateInstance(cls,props) local inst = Instance.new(cls) for i,v in pairs(props) do inst[i] = v saveinstance How to get it? saveinstance end return inst end local function createTerrainGui() local TerrainGui = CreateInstance("Frame",{Style=0,Active=false,AnchorPoint=Vector2.new(0,0),BackgroundColor3=Color3.new(0.10980392992496,0.16470588743687,0.22352942824364),BackgroundTransparency=0,BorderColor3=Color3.new(0.10588236153126,0.16470588743687,0.20784315466881),BorderSizePixel=1,ClipsDescendants=false,Draggable=false,Position=UDim2.new(0,0,0.5,0),Rotation=0,Selectable=false,Size=UDim2.new(0,150,0,150),SizeConstraint=0,Visible=false,ZIndex=1,Name="Main",}) local TerrainGui2 = CreateInstance("TextLabel",{Font=4,FontSize=5,Text="Terrain Chunk Selection",TextColor3=Color3.new(1,1,1),TextScaled=false,TextSize=14,TextStrokeColor3=Color3.new(0,0,0),TextStrokeTransparency=1,TextTransparency=0,TextWrapped=false,TextXAlignment=2,TextYAlignment=1,Active=false,AnchorPoint=Vector2.new(0,0),BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,BorderColor3=Color3.new(0.10588236153126,0.16470588743687,0.20784315466881),BorderSizePixel=1,ClipsDescendants=false,Draggable=false,Position=UDim2.new(0,0,0,0),Rotation=0,Selectable=false,Size=UDim2.new(1,0,0,20),SizeConstraint=0,Visible=true,ZIndex=1,Name="Title",Parent = TerrainGui}) local TerrainGui3 = CreateInstance("TextLabel",{Font=3,FontSize=5,Text="Use your mouse to click on all the terrain to save. When you are finished, press done.",TextColor3=Color3.new(1,1,1),TextScaled=false,TextSize=14,TextStrokeColor3=Color3.new(0,0,0),TextStrokeTransparency=1,TextTransparency=0,TextWrapped=true,TextXAlignment=2,TextYAlignment=1,Active=false,AnchorPoint=Vector2.new(0,0),BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,BorderColor3=Color3.new(0.10588236153126,0.16470588743687,0.20784315466881),BorderSizePixel=1,ClipsDescendants=false,Draggable=false,Position=UDim2.new(0,0,0,25),Rotation=0,Selectable=false,Size=UDim2.new(1,0,0,50),SizeConstraint=0,Visible=true,ZIndex=1,Name="Desc",Parent = TerrainGui}) local TerrainGui4 = CreateInstance("TextLabel",{Font=4,FontSize=5,Text="Chunks: 0",TextColor3=Color3.new(1,1,1),TextScaled=false,TextSize=14,TextStrokeColor3=Color3.new(0,0,0),TextStrokeTransparency=1,TextTransparency=0,TextWrapped=true,TextXAlignment=2,TextYAlignment=1,Active=false,AnchorPoint=Vector2.new(0,0),BackgroundColor3=Color3.new(1,1,1),BackgroundTransparency=1,BorderColor3=Color3.new(0.10588236153126,0.16470588743687,0.20784315466881),BorderSizePixel=1,ClipsDescendants=false,Draggable=false,Position=UDim2.new(0,0,0,80),Rotation=0,Selectable=false,Size=UDim2.new(1,0,0,20),SizeConstraint=0,Visible=true,ZIndex=1,Name="Chunks",Parent = TerrainGui}) local TerrainGui5 = CreateInstance("TextButton",{Font=4,FontSize=6,Text="Done",TextColor3=Color3.new(1,1,1),TextScaled=false,TextSize=18,TextStrokeColor3=Color3.new(0,0,0),TextStrokeTransparency=1,TextTransparency=0,TextWrapped=false,TextXAlignment=2,TextYAlignment=1,AutoButtonColor=true,Modal=false,Selected=false,Style=0,Active=true,AnchorPoint=Vector2.new(0,0),BackgroundColor3=Color3.new(0.17254902422428,0.22745099663734,0.28627452254295),BackgroundTransparency=0,BorderColor3=Color3.new(0.10588236153126,0.16470588743687,0.20784315466881),BorderSizePixel=1,ClipsDescendants=false,Draggable=false,Position=UDim2.new(0,5,1,-30),Rotation=0,Selectable=true,Size=UDim2.new(1,-10,0,25),SizeConstraint=0,Visible=true,ZIndex=1,Name="Done",Parent = TerrainGui}) saveinstance How to get it for free? saveinstance return TerrainGui end local terrainGui = createTerrainGui() terrainGui.Parent = game:GetService("CoreGui").RobloxGui local ignorePlaceClasses = { ["CoreGui"] = true, ["Players"] = true, ["Chat"] = true, saveinstance How to get it for free? saveinstance ["StarterPlayerScripts"] = true, ["StarterCharacterScripts"] = true } local function placeInstCheck(inst) return not ignorePlaceClasses[inst.ClassName] and not game:GetService("Players"):GetPlayerFromCharacter(inst) and inst ~= workspace.CurrentCamera end local propFunc = { ["bool"] = function(inst,prop) saveinstance How to use it? saveinstance saveString = saveString..'\n'..tostring(inst[prop])..'' end, ["float"] = function(inst,prop) saveString = saveString..'\n'..tostring(inst[prop])..'' end, ["int"] = function(inst,prop) saveString = saveString..'\n'..tostring(inst[prop])..'' end, ["string"] = function(inst,prop) local cleanName = inst[prop] saveinstance How to dowload it? saveinstance cleanName = string.gsub(cleanName,"&","&") cleanName = string.gsub(cleanName,"<","<") cleanName = string.gsub(cleanName,">",">") saveString = saveString..'\n'..cleanName..'' end, ["BrickColor"] = function(inst,prop) saveString = saveString..'\n'..tostring(inst[prop].Number)..'' end, ["Vector2"] = function(inst,prop) saveString = saveString..'\n' saveinstance How to get it? saveinstance saveString = saveString..'\n'..inst[prop].x..'' saveString = saveString..'\n'..inst[prop].y..'' saveString = saveString..'\n' end, ["Vector3"] = function(inst,prop) saveString = saveString..'\n' saveString = saveString..'\n'..inst[prop].x..'' saveString = saveString..'\n'..inst[prop].y..'' saveString = saveString..'\n'..inst[prop].z..'' saveString = saveString..'\n' saveinstance How to get it for free? saveinstance end, ["CoordinateFrame"] = function(inst,prop) local X,Y,Z,R00,R01,R02,R10,R11,R12,R20,R21,R22 = inst[prop]:components() saveString = saveString..'\n' saveString = saveString..'\n'..X..'' saveString = saveString..'\n'..Y..'' saveString = saveString..'\n'..Z..'' saveString = saveString..'\n'..R00..'' saveString = saveString..'\n'..R01..'' saveString = saveString..'\n'..R02..'' saveinstance How to use it? saveinstance saveString = saveString..'\n'..R10..'' saveString = saveString..'\n'..R11..'' saveString = saveString..'\n'..R12..'' saveString = saveString..'\n'..R20..'' saveString = saveString..'\n'..R21..'' saveString = saveString..'\n'..R22..'' saveString = saveString..'\n' end, ["Content"] = function(inst,prop) local cleanName = tostring(inst[prop]) saveinstance How to dowload it? saveinstance cleanName = string.gsub(cleanName,"&","&") cleanName = string.gsub(cleanName,"<","<") cleanName = string.gsub(cleanName,">",">") saveString = saveString..'\n'..cleanName..'' end, ["UDim2"] = function(inst,prop) saveString = saveString..'\n' saveString = saveString..'\n'..inst[prop].X.Scale..'' saveString = saveString..'\n'..inst[prop].X.Offset..'' saveString = saveString..'\n'..inst[prop].Y.Scale..'' saveinstance How to dowload it? saveinstance saveString = saveString..'\n'..inst[prop].Y.Offset..'' saveString = saveString..'\n' end, ["Color3"] = function(inst,prop) saveString = saveString..'\n' saveString = saveString..'\n'..inst[prop].r..'' saveString = saveString..'\n'..inst[prop].g..'' saveString = saveString..'\n'..inst[prop].b..'' saveString = saveString..'\n' end, saveinstance How to use it? saveinstance ["NumberRange"] = function(inst,prop) saveString = saveString..'\n'..tostring(inst[prop].Min).." "..tostring(inst[prop].Max).." "..'' end, ["NumberSequence"] = function(inst,prop) saveString = saveString..'\n' for i,v in pairs(inst[prop].Keypoints) do saveString = saveString..tostring(v.Time).." "..tostring(v.Value).." "..tostring(v.Envelope).." " end saveString = saveString..'' end, saveinstance PasteShr saveinstance ["ColorSequence"] = function(inst,prop) saveString = saveString..'\n' for i,v in pairs(inst[prop].Keypoints) do saveString = saveString..tostring(v.Time).." "..tostring(v.Value.r).." "..tostring(v.Value.g).." "..tostring(v.Value.b).." 0 " end saveString = saveString..'' end, ["Rect2D"] = function(inst,prop) saveString = saveString..'\n' saveString = saveString..'\n' saveinstance How to use it? saveinstance saveString = saveString..'\n'..tostring(inst[prop].Min.X)..'' saveString = saveString..'\n'..tostring(inst[prop].Min.Y)..'' saveString = saveString..'\n' saveString = saveString..'\n' saveString = saveString..'\n'..tostring(inst[prop].Max.X)..'' saveString = saveString..'\n'..tostring(inst[prop].Max.Y)..'' saveString = saveString..'\n' saveString = saveString..'\n' end, ["ProtectedString"] = function(inst,prop) saveinstance How to use it? saveinstance local prostr = inst[prop] if placeMode and decompile and (inst:IsA("LocalScript") or inst:IsA("ModuleScript")) and savePlaceScripts and inst.Source == "" then prostr = decompile(inst) end if inst == terrainData then prostr = "return [==["..table.concat(terrainChunks,"|").."]==]" terrainChunks = {} end saveString = saveString..'\n' end, ["Object"] = function(inst,prop) saveString = saveString..'\n'..setRef(inst[prop])..'' end } saveinstance How to get it? saveinstance local ignorePropNames = { ["Archivable"] = true, ["DataCost"] = true, ["ClassName"] = true, ["RobloxLocked"] = true, ["Parent"] = true } local function writeInstance(inst,altData) if API[inst.ClassName] and (placeMode and placeInstCheck(inst) or not placeMode) then saveinstance How to get it? saveinstance if saveMethod == 2 and string.len(table.concat(storedInstances)) >= splitSize then appendToHost() storedInstances = {} end instanceCount = instanceCount + 1 local props = getProperties(inst) saveString = saveString..'\n' saveString = saveString.."\n" for _,prop in pairs(props) do ypcall(function() saveinstance PasteShr saveinstance if ignorePropNames[prop.Name] then return end local propF = propFunc[prop.ValueType] if propF then propF(inst,prop.Name) elseif inst[prop.Name].Value then saveString = saveString..'\n'..inst[prop.Name].Value..'' end table.insert(storedInstances,saveString) saveString = "" end) saveinstance How to use it? saveinstance end if inst:IsA("UnionOperation") and ypcall(function()local lolaf = inst.AssetId end) then -- Had to do this, "BinaryString" type values were not in the API dump. local cleanName = tostring(inst.AssetId) cleanName = string.gsub(cleanName,"&","&") cleanName = string.gsub(cleanName,"<","<") cleanName = string.gsub(cleanName,">",">") saveString = saveString..'\n'..cleanName..'' saveString = saveString..'\n' saveString = saveString..'\n'..inst.InitialSize.x..'' saveString = saveString..'\n'..inst.InitialSize.y..'' saveinstance PasteShr saveinstance saveString = saveString..'\n'..inst.InitialSize.z..'' saveString = saveString..'\n' elseif inst:IsA("MeshPart") and ypcall(function()local lolaf = inst.MeshID end) then local cleanName = tostring(inst.MeshID) cleanName = string.gsub(cleanName,"&","&") cleanName = string.gsub(cleanName,"<","<") cleanName = string.gsub(cleanName,">",">") saveString = saveString..'\n'..cleanName..'' saveString = saveString..'\n' saveString = saveString..'\n'..inst.InitialSize.x..'' saveinstance How to dowload it? saveinstance saveString = saveString..'\n'..inst.InitialSize.y..'' saveString = saveString..'\n'..inst.InitialSize.z..'' saveString = saveString..'\n' end saveString = saveString.."\n" if inst == extraFolder then if getnilinstances and savePlaceNilInstances then local nilFolder = Instance.new("Folder",extraFolder) nilFolder.Name = "Nil Instances" saveinstance How to use it? saveinstance local nilledInstances = {} for i,v in pairs(getnilinstances()) do if v.Name ~= "_DexTrash_" and v ~= extraFolder then table.insert(nilledInstances,v) end end writeInstance(nilFolder,nilledInstances) end if savePlaceExtra then saveinstance PasteShr saveinstance local playerFolder = Instance.new("Folder",extraFolder) playerFolder.Name = "Instances In Player" writeInstance(playerFolder,LPlayer:GetChildren()) local playerGuiFolder = Instance.new("Folder",extraFolder) playerGuiFolder.Name = "Instances In PlayerGui" writeInstance(playerGuiFolder,LPlayer:FindFirstChildOfClass("PlayerGui"):GetChildren()) local cameraFolder = Instance.new("Folder",extraFolder) cameraFolder.Name = "Instances In Camera" saveinstance How to dowload it? saveinstance writeInstance(cameraFolder,workspace.CurrentCamera:GetChildren()) local chatFolder = Instance.new("Folder",extraFolder) chatFolder.Name = "Instances In Chat" writeInstance(chatFolder,game:GetService("Chat"):GetChildren()) local SPSFolder = Instance.new("Folder",extraFolder) SPSFolder.Name = "Instances In StarterPlayerScripts" writeInstance(SPSFolder,game:GetService("StarterPlayer"):FindFirstChildOfClass("StarterPlayerScripts"):GetChildren()) saveinstance How to dowload it? saveinstance local SCSFolder = Instance.new("Folder",extraFolder) SCSFolder.Name = "Instances In StarterCharacterScripts" writeInstance(SCSFolder,game:GetService("StarterPlayer"):FindFirstChildOfClass("StarterCharacterScripts"):GetChildren()) end local unionFixer = Instance.new("Script",extraFolder) unionFixer.Name = "Fix Union Collisions - READ" unionFixer.Source = '--[[\n THIS GUIDE WILL HELP YOU FIX THE COLLISIONS WITH UNIONS AND MESHPARTS IN THE MAP.\n \n Run this script in the command bar to select all the Unions and MeshParts in the map.\n \n After that, go to the properties frame and set the CollisionFidelity property to "Hull"\n \n Then, set them back to "Default"\n \n You have fixed all union collisions.\n \n \n - Credit to Jester for original instructions\n--]]\n\nlocal unions = {}\n\nfunction getUnions(root)\n for i,v in pairs(root:GetChildren()) do\n if v:IsA("UnionOperation") or v:IsA("MeshPart") then\n table.insert(unions,v)\n end\n getUnions(v)\n end\nend\n\ngetUnions(workspace)\n\ngame.Selection:Set(unions)' writeInstance(unionFixer) elseif altData then saveinstance How to get it for free? saveinstance for i,v in pairs(altData) do writeInstance(v) end else for i,v in pairs(inst:GetChildren()) do writeInstance(v) end end saveString = saveString.."\n" table.insert(storedInstances,saveString) saveinstance How to use it? saveinstance saveString = "" end end local function removeExtension(str) if string.find(str,".rbxm") then return string.sub(str,1,string.find(str,".rbxm")-1) elseif string.find(str,".rbxmx") then return string.sub(str,1,string.find(str,".rbxmx")-1) else saveinstance PasteShr saveinstance return str end end local function countTotal(obj) for i,v in pairs(obj:GetChildren()) do totalInstances = totalInstances + 1 countTotal(v) end end saveinstance How to dowload it? saveinstance local function createModel(name,data) local url = "https://data.roblox.com/Data/Upload.ashx?assetid=0&type=Model&name="..name.."&description=&genreTypeId=1&ispublic=False&allowComments=False" local id = game:HttpPostAsync(url,data) if debugMessages then if consoleFunc then consoleFunc("Your "..name.." Instance was saved to the id: "..id) else print("Your "..name.." Instance was saved to the id: "..id) end saveinstance How to use it? saveinstance end end function _G.SInstance(inst,name,terrainRegions) placeMode = false name = removeExtension(name) if saveMethod == 2 then clearAll() end instanceCount = 0 saveinstance How to dowload it? saveinstance totalInstances = 1 countTotal(inst) instanceRefs = {} storedInstances = {} globalName = name splits = 0 saveString = [[ null nil]] saveinstance PasteShr saveinstance if debugMessages then if not ypcall(function()local lolaf = Instance.new("UnionOperation").AssetId end) then if consoleFunc then consoleFunc("RUNNING WITH NO UNSCRIPTABLE PATCH") else print("RUNNING WITH NO UNSCRIPTABLE PATCH") end else if consoleFunc then consoleFunc("RUNNING WITH UNSCRIPTABLE PATCH c:") saveinstance How to get it? saveinstance else print("RUNNING WITH UNSCRIPTABLE PATCH c:") end end end writeInstance(inst) table.insert(storedInstances,"\n") if saveMethod == 1 then writefile(name..".rbxmx",table.concat(storedInstances)) saveinstance How to get it? saveinstance elseif saveMethod == 2 then appendToHost() submitSave() elseif saveMethod == 3 then createModel(name,table.concat(storedInstances)) end if debugMessages then if consoleFunc then consoleFunc("Saved with "..tostring(splits).." splits.") else saveinstance How to get it? saveinstance print("Saved with "..tostring(splits).." splits.") end end storedInstances = {} end function DoSPlace() placeMode = true instanceCount = 0 instanceRefs = {} saveinstance How to get it for free? saveinstance storedInstances = {} saveString = [[ null nil]] for i,v in pairs(game:GetChildren()) do writeInstance(v) end writeInstance(extraFolder) if savePlaceTerrain then writeInstance(terrainLoader) end saveinstance How to get it for free? saveinstance table.insert(storedInstances,"\n") if savePlaceUseWriteFile then if writefile then local filterChars = {"/","\\",":","?","\"","<",">","|"} local gameName = game:GetService("MarketplaceService"):GetProductInfo(game.PlaceId).Name for i,v in pairs(filterChars) do gameName = string.gsub(gameName,v,"") end writefile(tostring(game.PlaceId).." - "..gameName..".rbxlx",table.concat(storedInstances)) return true saveinstance How to get it? saveinstance end return false else return game:HttpPostAsync("https://data.roblox.com/Data/Upload.ashx?assetid="..tostring(savePlaceId).."&type=Place",table.concat(storedInstances)) end end function _G.SPlace() if debugMessages then if consoleFunc then saveinstance How to use it? saveinstance consoleFunc("SaveInstance V3 - Swift: Now saving place "..tostring(game.PlaceId)) else print("SaveInstance V3 - Swift: Now saving place "..tostring(game.PlaceId)) end end if savePlaceTerrain then terrainLoader.Source = 'local regions = {}\n\nfor w in string.gmatch(require(game:FindFirstChild("LoadTerrain").Data),"[^|]+") do\n table.insert(regions,game:GetService("HttpService"):JSONDecode(w))\nend\n\nlocal chunkSize = 64\n\nlocal function makeRegion(str)\n local t = {}\n for w in string.gmatch(str,"[^,]+") do\n table.insert(t,tonumber(w))\n end\n local regionPos = Vector3.new(t[1],t[2],t[3])\n local newRegion = Region3.new(regionPos + Vector3.new(-chunkSize/2,-chunkSize/2,-chunkSize/2), regionPos + Vector3.new(chunkSize/2,chunkSize/2,chunkSize/2))\n return newRegion\nend\n\nlocal function makeTable(o)\n local t = {}\n for i = 1,chunkSize/4 do\n t[i] = {}\n for j = 1,chunkSize/4 do\n t[i][j] = {}\n for k = 1,chunkSize/4 do\n if not o then\n t[i][j][k] = Enum.Material.Air\n else\n t[i][j][k] = 0\n end\n end\n end\n end\n return t\nend\n\nlocal function getPos(str)\n local t = {}\n for w in string.gmatch(str,"[^,]+") do\n table.insert(t,tonumber(w))\n end\n return t[1],t[2],t[3]\nend\n\nlocal materialMap = {}\nmaterialMap[1] = Enum.Material.Plastic\nmaterialMap[2] = Enum.Material.Wood\nmaterialMap[3] = Enum.Material.Slate\nmaterialMap[4] = Enum.Material.Concrete\nmaterialMap[5] = Enum.Material.CorrodedMetal\nmaterialMap[6] = Enum.Material.DiamondPlate\nmaterialMap[7] = Enum.Material.Foil\nmaterialMap[8] = Enum.Material.Grass\nmaterialMap[9] = Enum.Material.Ice\nmaterialMap[10] = Enum.Material.Marble\nmaterialMap[11] = Enum.Material.Granite\nmaterialMap[12] = Enum.Material.Brick\nmaterialMap[13] = Enum.Material.Pebble\nmaterialMap[14] = Enum.Material.Sand\nmaterialMap[15] = Enum.Material.Fabric\nmaterialMap[16] = Enum.Material.SmoothPlastic\nmaterialMap[17] = Enum.Material.Metal\nmaterialMap[18] = Enum.Material.WoodPlanks\nmaterialMap[19] = Enum.Material.Cobblestone\nmaterialMap[20] = Enum.Material.Air\nmaterialMap[21] = Enum.Material.Water\nmaterialMap[22] = Enum.Material.Rock\nmaterialMap[23] = Enum.Material.Glacier\nmaterialMap[24] = Enum.Material.Snow\nmaterialMap[25] = Enum.Material.Sandstone\nmaterialMap[26] = Enum.Material.Mud\nmaterialMap[27] = Enum.Material.Basalt\nmaterialMap[28] = Enum.Material.Ground\nmaterialMap[29] = Enum.Material.CrackedLava\nmaterialMap[30] = Enum.Material.Neon\nmaterialMap[31] = Enum.Material.Asphalt\nmaterialMap[32] = Enum.Material.LeafyGrass\nmaterialMap[33] = Enum.Material.Salt\nmaterialMap[34] = Enum.Material.Limestone\nmaterialMap[35] = Enum.Material.Pavement\n\nlocal function toMaterial(num)\n return materialMap[num]\nend\n\nprint("Loading Terrain")\n\nfor c,chunk in pairs(regions) do\n for i,v in pairs(chunk) do\n local region = makeRegion(i)\n\n local m = makeTable()\n local o = makeTable(true)\n\n for i2,v2 in pairs(v) do \n local x,y,z = getPos(v2[1])\n m[x][y][z] = toMaterial(v2[2])\n o[x][y][z] = v2[3]\n end\n\n workspace.Terrain:WriteVoxels(region,4,m,o)\n end\n print("Terrain Chunk: "..tostring(c))\n wait()\nend\n\nprint("Finished Loading Terrain - Save The Place")' selectingTerrain = true terrainGui.Chunks.Text = "Chunks: 0" terrainGui.Visible = true saveinstance How to get it for free? saveinstance repeat wait() until not selectingTerrain end local stopwatch = tick() local id = DoSPlace() local message = "Courtney ;(" if savePlaceUseWriteFile then message = (id and "The place has been saved to a file." or "Place didn't save :c no writefile or error") else message = (id and "The place has been saved. Open it from the develop page on Roblox." or "Place didn't save :c something went wrong tell me") end saveinstance How to get it? saveinstance if debugMessages then if consoleFunc then consoleFunc(message) consoleFunc("Saving took "..tostring(tick()-stopwatch).."s.") else print(message) print("Saving took "..tostring(tick()-stopwatch).."s.") end end storedInstances = {} saveinstance How to use it? saveinstance end -- Terrain Stuff local mouse = LPlayer:GetMouse() local chunkSize = 64 local chunks = 0 local materialConv = {} materialConv[Enum.Material.Plastic] = 1 materialConv[Enum.Material.Wood] = 2 materialConv[Enum.Material.Slate] = 3 saveinstance How to dowload it? saveinstance materialConv[Enum.Material.Concrete] = 4 materialConv[Enum.Material.CorrodedMetal] = 5 materialConv[Enum.Material.DiamondPlate] = 6 materialConv[Enum.Material.Foil] = 7 materialConv[Enum.Material.Grass] = 8 materialConv[Enum.Material.Ice] = 9 materialConv[Enum.Material.Marble] = 10 materialConv[Enum.Material.Granite] = 11 materialConv[Enum.Material.Brick] = 12 materialConv[Enum.Material.Pebble] = 13 saveinstance How to dowload it? saveinstance materialConv[Enum.Material.Sand] = 14 materialConv[Enum.Material.Fabric] = 15 materialConv[Enum.Material.SmoothPlastic] = 16 materialConv[Enum.Material.Metal] = 17 materialConv[Enum.Material.WoodPlanks] = 18 materialConv[Enum.Material.Cobblestone] = 19 materialConv[Enum.Material.Air] = 20 materialConv[Enum.Material.Water] = 21 materialConv[Enum.Material.Rock] = 22 materialConv[Enum.Material.Glacier] = 23 saveinstance How to get it for free? saveinstance materialConv[Enum.Material.Snow] = 24 materialConv[Enum.Material.Sandstone] = 25 materialConv[Enum.Material.Mud] = 26 materialConv[Enum.Material.Basalt] = 27 materialConv[Enum.Material.Ground] = 28 materialConv[Enum.Material.CrackedLava] = 29 materialConv[Enum.Material.Neon] = 30 materialConv[Enum.Material.Asphalt] = 31 materialConv[Enum.Material.LeafyGrass] = 32 materialConv[Enum.Material.Salt] = 33 saveinstance How to get it? saveinstance materialConv[Enum.Material.Limestone] = 34 materialConv[Enum.Material.Pavement] = 35 local function createMarker(pos,ne) if savePlaceTerrainShowChunks then local mark = Instance.new("Part",workspace.CurrentCamera) mark.Name = "TerTop" mark.Anchored = true mark.Transparency = 1 mark.CanCollide = false saveinstance How to dowload it? saveinstance mark.Size = Vector3.new(chunkSize,chunkSize,chunkSize) mark.CFrame = CFrame.new(pos) local box = Instance.new("SelectionBox",mark) box.Adornee = mark end terrainChunksTemp[tostring(pos)] = ne terrainBeen[tostring(pos)] = true chunks = chunks + 1 saveinstance How to use it? saveinstance if chunks % 10 == 0 then table.insert(terrainChunks,game:GetService("HttpService"):JSONEncode(terrainChunksTemp)) terrainChunksTemp = {} end terrainGui.Chunks.Text = "Chunks: "..tostring(chunks) end local function fillTerrain(start) if terrainBeen[tostring(start)] or not selectingTerrain then return end local checkRegion = Region3.new(start + Vector3.new(-chunkSize/2,-chunkSize/2,-chunkSize/2), start + Vector3.new(chunkSize/2,chunkSize/2,chunkSize/2)) saveinstance PasteShr saveinstance checkRegion:ExpandToGrid(4) local m,o = workspace.Terrain:ReadVoxels(checkRegion,4) local nonempty = {} local size = m.Size local airCount = 0 for x = 1,size.X do for y = 1,size.Y do for z = 1,size.Z do if m[x][y][z] == Enum.Material.Air then saveinstance How to get it for free? saveinstance airCount = airCount + 1 else table.insert(nonempty,{tostring(x)..","..tostring(y)..","..tostring(z),materialConv[m[x][y][z]],o[x][y][z]}) end end end end if airCount == chunkSize^3/64 then return end saveinstance How to get it for free? saveinstance createMarker(start,nonempty) spawn(function()fillTerrain(start + Vector3.new(chunkSize,0,0))end) spawn(function()fillTerrain(start + Vector3.new(-chunkSize,0,0))end) spawn(function()fillTerrain(start + Vector3.new(0,chunkSize,0))end) spawn(function()fillTerrain(start + Vector3.new(0,-chunkSize,0))end) spawn(function()fillTerrain(start + Vector3.new(0,0,chunkSize))end) spawn(function()fillTerrain(start + Vector3.new(0,0,-chunkSize))end) end local function makeRegion(str) saveinstance PasteShr saveinstance local t = {} for w in string.gmatch(str,"[^,]+") do table.insert(t,tonumber(w)) end local regionPos = Vector3.new(t[1],t[2],t[3]) local newRegion = Region3.new(regionPos + Vector3.new(-chunkSize/2,-chunkSize/2,-chunkSize/2), regionPos + Vector3.new(chunkSize/2,chunkSize/2,chunkSize/2)) return newRegion end mouse.Button1Down:connect(function() saveinstance How to dowload it? saveinstance if selectingTerrain then local initPos = mouse.Hit.p local gridX = math.floor(initPos.X/chunkSize)*chunkSize local gridY = math.floor(initPos.Y/chunkSize)*chunkSize local gridZ = math.floor(initPos.Z/chunkSize)*chunkSize fillTerrain(Vector3.new(gridX,gridY,gridZ)) end end) saveinstance PasteShr saveinstance terrainGui.Done.MouseButton1Click:connect(function() if savePlaceTerrainShowChunks then for i,v in pairs(workspace.CurrentCamera:GetChildren()) do if v.Name == "TerTop" then v:Destroy() end end end selectingTerrain = false terrainGui.Visible = false table.insert(terrainChunks,game:GetService("HttpService"):JSONEncode(terrainChunksTemp)) saveinstance PasteShr saveinstance terrainChunksTemp = {} terrainBeen = {} chunks = 0 end) saveinstance