[SOLVED] Plots datastorage doesn't save

I want to achieve a working datastorage that saves the players objects. However I am getting “Argument 1 missing or nil” error. I am using a tutorial and I have checked the script at least 10x and nothing seems wrong at all.

local players = game:GetService("Players")
local replicatedStorage = game:GetService("ReplicatedStorage")

local plotManager = require(script.Parent.ServerModules.PlotManager)

local dataStoreService = game:GetService("DataStoreService")
local dataStore = dataStoreService:GetDataStore("TycoonProgress2")

local tries = 3
local dataloaded = nil

local function serialize(plr)
	if dataloaded then
		local plot = plotManager.returnPlot(workspace.plots, plr)

		local key = plr.UserId
		local count = 0

		local data = {}
		
		for i, obj in ipairs(plot.ItemHolder:GetChildren()) do
			table.insert(data, {
				["n"] = obj.Name,
				["t"] = {
					["x"] = obj.PrimaryPart.CFrame.X;
					["y"] = obj.PrimaryPart.CFrame.Y;
					["z"] = obj.PrimaryPart.CFrame.Z;
					["r"] = obj.PrimaryPart.Orientation.Y
				}
			})
		end

		local success, err

		repeat
			success, err = pcall(function()
				dataStore:SetAsync(key, data)
			end)

			count = count + 1
		until count >= tries or success

		if not success then
			warn("Data could not be set." .. tostring(err))

			return
		end
	else
		warn("Data has not been loaded. Do not attempt to set data when it has not been loaded.")

		return
	end
end

local function deserialize(plr)
	local key = plr.UserId
	local count = 0

	local data

	local success, err

	repeat
		success, err = pcall(function()
			data = dataStore:GetAsync(key)
		end)

		count = count + 1
	until count >= tries or success

	if not success then
		warn("Failed to read data." .. tostring(err))

		plr:Kick("Failed to read data. Please rejoin the game.")

		return
	end

	if data then
		local plot = plotManager.returnPlot(workspace.plots, plr)
		print("plot")

		for i, saved in ipairs(data) do
			local loadedModel = replicatedStorage.models:FindFirstChild(saved.name):Clone()

			if loadedModel then
				loadedModel:SetPrimaryPartCFrame(CFrame.new(saved.transform.x, saved.transform.y, saved.transform.z) *CFrame.Angles (0, math.rad(saved.transform.r), 0))

				loadedModel.Parent = plot.itemHolder
			else
				return
			end
		end

		dataloaded = true

		return data
	else
		dataloaded = true

		return {}	
	end
end

local function unloadTycoonData(plr)
	local plot = plotManager.returnPlot(workspace.plots, plr)

	serialize(plr)

	for  _, obj in ipairs(plot.itemHolder:GetChildren()) do
		obj:Destroy()
	end

	plot.owner.Value = ""
end

players.PlayerAdded:Connect(deserialize)
players.PlayerRemoving:Connect(serialize)

game:BindToClose(function()
	for i, plr in ipairs(players:GetPlayers()) do
		serialize(plr)
	end
end)

After placing few blocks and rejoining I got this error.

if data then
		local plot = plotManager.returnPlot(workspace.plots, plr)

		for i, saved in ipairs(data) do
			local loadedModel = replicatedStorage.models:FindFirstChild(saved.name):Clone()

			if loadedModel then
				loadedModel:SetPrimaryPartCFrame(CFrame.new(saved.transform.x, saved.transform.y, saved.transform.z) *CFrame.Angles (0, math.rad(saved.transform.r), 0))

				loadedModel.Parent = plot.itemHolder
			else
				return
			end
		end

Did I type something wrong? Or is the script broken?

2 Likes

Which line is it exactly that is erroring?

1 Like
local loadedModel = replicatedStorage.models:FindFirstChild(saved.name):Clone()
1 Like

It means that saved.name doesn’t exist or has a value of nil.

I’m looking at your serialize function and I see that your values are named n and t but in your deserialize function you use them like they are named Name and Transform.

This code should work:

if data then
		local plot = plotManager.returnPlot(workspace.plots, plr)

		for i, saved in ipairs(data) do
			local loadedModel = replicatedStorage.models:FindFirstChild(saved.n):Clone()

			if loadedModel then
				loadedModel:SetPrimaryPartCFrame(CFrame.new(saved.t.x, saved.t.y, saved.t.z) *CFrame.Angles (0, math.rad(saved.t.r), 0))

				loadedModel.Parent = plot.itemHolder
			else
				return
			end
		end
        dataloaded = true

		return data
	else
		dataloaded = true

		return {}	
	end
1 Like

That indeed has fixed the error however another showed up.

loadedModel.Parent = plot.itemHolder
1 Like

I guess that means that it doesn’t have an itemHolder. Just create one with whatever method suits you.

1 Like

That’s quite odd though, the model actually has it.
Snímek obrazovky 2023-07-11 214521

1 Like

I see, the folder is named ItemHolder but you are trying to access itemHolder (note the casing difference)

1 Like

Thanks man without you I probably wouldn’t even realize.

2 Likes

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.