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

4 comments

1

:SaveData has no return value and therefore using the call as an expression will evaluate to nil.

0

How do i fix that?

1

By returning the function or something

0

Ah, well it say's auto saves but it does not load RIP