Issues with loading datasaved model positions

I have a script that saves the properties of blocks and models placed:

-- Save BLOCKS--- 
                local InfoToSave = {}
    for _,BA in pairs(bases:GetChildren()) do
        if BA:FindFirstChild("Owner").Value == player.UserId then
            local FolderToSave = BA:FindFirstChild("Blocks")
            local BaseCFrame = BA:FindFirstChild("Base").CFrame
            for _, b in pairs(FolderToSave:GetChildren()) do
    if b.ClassName == "Part" then
         local PartInfo = {
                   ["Position"] = {X = b.CFrame:toObjectSpace(BaseCFrame).x, Y = b.CFrame:toObjectSpace(BaseCFrame).y, Z = b.CFrame:toObjectSpace(BaseCFrame).z};
                    ["Color"] = {R = b.Color.r, G = b.Color.g, B = b.Color.b};
                    ["OldBaseName"] = {N = tostring(BA.Name)};
                    ["Transparency"] = {T = tonumber(b.Transparency)};
                    ["Material"] = b.Material.Value;
                    --["Rotation"] = {X = b.Orientation.x, Y = b.Orientation.y, Z = b.Orientation.z };
                }
                table.insert(InfoToSave, PartInfo)
                print(b.Name)
                end
            end
break
        end
    end
    dataStore:SetAsync(player.UserId .. "_blocks", InfoToSave)
                
                -- END OF SAVE BLOCKS
                
                --MODELS SAVE
                
                 local InfoSave = {}
        for i,v in pairs (bases:GetChildren()) do
             if v:FindFirstChild("Owner").Value == player.UserId then
                 local FolderToSave = v:FindFirstChild("Blocks")

[ 10:39 PM ]

 local BaseCFrame = v:FindFirstChild("Base").CFrame
                    for _, m in pairs(FolderToSave:GetChildren()) do
                        if m.ClassName == "Model" then
                            local ModelInfo = {
                                ["Name"] = m.Name;
                                ["Position"] = {X = m.Base.CFrame:toObjectSpace(BaseCFrame).x, Y = m.Base.CFrame:toObjectSpace(BaseCFrame).y, Z = m.Base.CFrame:toObjectSpace(BaseCFrame).z};
                                ["OldBaseName"] = {N = tostring(v.Name)};
                            }
                            table.insert(InfoSave, ModelInfo)
                            print(ModelInfo["Name"])
                        end
                    end
                break
            end
        end
     dataStore:SetAsync(player.UserId .. "_models", InfoSave)

--END OF MODEL SAVES

This script loads them when the player rejoins.

--LOAD BLOCKS--
        local data = nil
    local good, info = pcall(function()
        data = dataStore:GetAsync(player.UserId .. "_blocks")
    end)
    if good and data then 
        for _,v in pairs(bases:GetChildren()) do
            if v:FindFirstChild("Owner").Value == player.UserId then
                       local PlayerBase = v:WaitForChild("Blocks")
                for index, tabl in pairs(data) do
                    local CFRameOldB = game.Workspace:WaitForChild("Bases"):WaitForChild(tabl["OldBaseName"]["N"]):WaitForChild("Base").CFrame
                    local partsOldPosition =  CFrame.new(tabl["Position"]["X"],tabl["Position"]["Y"], tabl["Position"]["Z"])
                    local newBase = v:FindFirstChild("Base")
                    local NewPart = Instance.new("Part")
                    NewPart.Parent = PlayerBase
                    NewPart.Size = Vector3.new(3,3,3)
                    NewPart.CFrame = partsOldPosition:toObjectSpace(newBase.CFrame)
                    NewPart.Material = tabl["Material"]
                    NewPart.Color = Color3.new(tabl["Color"]["R"],tabl["Color"]["G"], tabl["Color"]["B"]) 
                    --NewPart.Orientation = Vector3.new(tabl["Rotation"]["X"], tabl["Rotation"]["Y"], tabl["Rotation"]["Z"])
                    NewPart.BackSurface = "Smooth"
                    NewPart.BottomSurface = "Smooth"
                    NewPart.FrontSurface = "Smooth"
                    NewPart.LeftSurface = "Smooth"
                    NewPart.RightSurface = "Smooth"
                    NewPart.TopSurface = "Smooth"
                    NewPart.Transparency = (tabl["Transparency"]["T"])
                    NewPart.Anchored = true
                    NewPart.CFrame = partsOldPosition:toObjectSpace(newBase.CFrame)
                    wait(.7)
                end
break
            end
        end
    else
        print("UNABLE TO [PARTS]", info)
    end
        
        ---END OF LOAD BLOCKS--
--LOAD MODELS--
        
         local data = nil
    local good, info = pcall(function()
        data = dataStore:GetAsync(player.UserId .. "_models")
    end)
    if good and data then 
        for _, v in pairs(bases:GetChildren()) do
            if v:FindFirstChild("Owner").Value == player.UserId then
                local PlayerBase = v:WaitForChild("Blocks")
                  for index, tabl in pairs(data) do
                    local CFRameOldB = game.Workspace:WaitForChild("Bases"):WaitForChild(tabl["OldBaseName"]["N"]):WaitForChild("Base").CFrame
                    local partsOldPosition =  CFrame.new(tabl["Position"]["X"],tabl["Position"]["Y"], tabl["Position"]["Z"])
                    local newBase = v:FindFirstChild("Base")
                    local FurnItems = game:GetService("ReplicatedStorage"):WaitForChild("GameItems"):WaitForChild("Furniture"):GetChildren()
                        for i,item in pairs(FurnItems) do
                            if item.Name == (tabl["Name"]) then
                                local itemC = item:Clone()
                                itemC.Parent = PlayerBase
                                itemC:SetPrimaryPartCFrame(partsOldPosition:toObjectSpace(newBase.CFrame))
                                wait(.7)
                            end
                        end --For item loop end
                    --break 
                end
            end
        end
        else
    print("UNABLE TO [MODELS]", info)
    end
    
    --END OF LOAD MODELS--

I placed stairs and blocks in this pictures, the stairs are a single model, placed next to eachother to make them appear bigger. https://gyazo.com/cb8690a213b0ba77190fded813ee2cfc
And when I rejoined the stairs loaded away from where they should’ve loaded at https://gyazo.com/737e6e0f071a819751eeb4356f1ad29f

Gyazo

Gyazo

The reason I’m using CFrame is because the player is assigned different bases to build on each time they join, so I have to use toObjectSpace to have it placed in the same position it was on the last base.

1 Like

In the first picture you have stairs going down and up and in the second going up and up.
Is this a rotation problem as well as position?

1 Like

I’m quite confused with your code since you’ve provided so many updates and segments. Can you provide a script or place file instead?

So going back to your code you have a line for rotation but its commented out in the save and restore.
Did you have a problem with rotation?

1 Like