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?