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
:SaveData has no return value and therefore using the call as an expression will evaluate to nil.
How do i fix that?
By returning the function or something
Ah, well it say's auto saves but it does not load RIP