So like I Am trying to make a datastore for a placement system and it is keep on saying Argument 2 missing or nil on this 1 line
DataStore:SetAsync(id, DataModule:SaveData(player))
Is there anyway to fix it?
Here is the full code and the code it sends to
local DataStore = game:GetService("DataStoreService"):GetDataStore("DataStore2") local DataModule = require(game.ReplicatedStorage.Modules.DataModule) function getEmpty() for _,t in pairs(workspace.Tycoons:GetChildren()) do if t:FindFirstChild("Owner").Value == "No Owner" then return t end end end function getTycoon(player) for _,t in pairs(workspace.Tycoons:GetChildren()) do if t:FindFirstChild("Owner").Value == player.Name then return t end end end game.Players.PlayerAdded:Connect(function(player) local id = player.UserId getEmpty().Owner.Value = player.Name wait(.1) local Tycoon = getTycoon(player) player.CharacterAdded:Connect(function(char) wait(0.1) char:MoveTo(Tycoon.Plot.Position + Vector3.new(0, 15, 0)) end) local hasData = DataStore:GetAsync(id) if hasData then if hasData["ItemPlacement"] then DataModule:LoadItemPlacement(player, hasData["ItemPlacement"]) end end spawn(function() while wait(30) do DataStore:SetAsync(id, DataModule:SaveData(player)) warn("Autosave!") end end) end) game.Players.PlayerRemoving:connect(function(player) local id = player.UserId wait(.2) getTycoon(player).DroppedOres:ClearAllChildren() getTycoon(player).CurrentlyPlacing:ClearAllChildren() getTycoon(player).ItemHolder:ClearAllChildren() getTycoon(player).Owner.Value = "No Owner" end)
DataModule
local module = {} local mm = require(script.Parent.MathModule) function getTycoon(player) for _,t in pairs(workspace.Tycoons:GetChildren()) do if t:FindFirstChild("Owner").Value == player.Name then return t end end end function module:LoadItemPlacement(player, data) local Tycoon = getTycoon(player) local base = Tycoon.Plot local baseframe = base.CFrame local itemHolder = Tycoon.ItemHolder for i,v in pairs(data) do for _,r in pairs(game.ReplicatedStorage.Models:GetChildren()) do if r.ItemId.Value == tonumber(v[1]) then local newitem = r:Clone() newitem.Parent = itemHolder newitem:SetPrimaryPartCFrame(baseframe:toWorldSpace(mm:decodeCFrame(v[2]))) end end end end local function SaveItemPlacement(player) local Tycoon = getTycoon(player) local base = Tycoon.Plot local baseframe = base.CFrame local itemHolder = Tycoon.ItemHolder local itemstore = {} for i,v in pairs(itemHolder:GetChildren()) do local hitbox = v:FindFirstChild("Primary") local itemid = v.ItemId.Value local itemCframe = baseframe:toObjectSpace(v.PrimaryPart.CFrame) itemstore[tostring(i)] = {itemid, mm:encodeCFrame(itemCframe)} end return itemstore end function module:SaveData(player) local ItemPlacement = SaveItemPlacement(player) end return module