Data store not working for new players + am I reaching a cap on returning players?

function dataManager:GetData(player)
	local loadJSON = playerDataStore:GetAsync(player.UserId) or {}
	local setData = httpService:JSONDecode(loadJSON) or {}
		
	_G.playerData[player.UserId] = setData
		
	dataReady = true

    local user = _G.playerData[player.UserId]
    if not user then return end
    print(user.Items)
    print(user.Cash)
end

Outputs:

table: 3AF01F18
nil

I’m incredibly confused. For one, I have a data module, which stores default data, which for some reason, ain’t even located in the script, yet it still gets used somehow idk?

But here is the module

local data = {

Items = {},

PurchasedItems = {},

Cash = 0,

Mood = 'Happy',

Plot = 'Apt_Basic'

}

So this should be what a new player gets when they join the game, but for some reason it was working before without it?

Tried doing this:

local loadJSON = playerDataStore:GetAsync(player.UserId) or data

with error:

[Unable to cast value to std::string]

As well as this:

local setData = httpService:JSONDecode(loadJSON) or data

That didn’t error out, but it just broke everything entirely. Can someone please help and explain what I am doing wrong :weary: not used to using JSON for data saving. Pretty sure it’s not working for new players is because it’s not getting the default data from the module. But now onto the data cap:

function dataManager:SaveData(player)
if not plots:FindFirstChild(player.Name) then return end

savePlot:Save(player)

local saveJSON = httpService:JSONEncode(_G.playerData[player.UserId])
playerDataStore:SetAsync(player.UserId, saveJSON)

clearPlot:Clear(player)

end

This what I use to save the players data. So it’s saving it (somehow??)
and here;s the output I get when I put this print:

print(httpService:JSONEncode(httpService:JSONDecode(loadJSON)))

below the function at the top of this post:

  {"Items":[{"Position":[-42.25,19.2499980926513671875,2,1,0,0],"ItemName":"Wall_Door","PrimaryColor":"Fossil"},{"Position":[-42.25,19.2499980926513671875,-2,1,0,0],"ItemName":"Wall_Door","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,42,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,38,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,30,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,34,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,18,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,14,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,22,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,26,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,6,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,10,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,-10,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,-6,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,-18,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,-14,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,-26,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,-22,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,-34,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,-30,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,-42,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-42.25,12.7499980926513671875,-38,1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[40,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[42.249969482421875,22.75000762939453125,10,-1,0,0],"ItemName":"Window_Top_Basic","PrimaryColor":"Fossil"},{"Position":[42.249969482421875,22.75000762939453125,6,-1,0,0],"ItemName":"Window_Top_Basic","PrimaryColor":"Fossil"},{"Position":[42.25,12.7499980926513671875,-42,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[42.249969482421875,22.75000762939453125,-30,-1,0,0],"ItemName":"Window_Top_Basic","PrimaryColor":"Fossil"},{"Position":[-24,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-40,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-36,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-32,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-28,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-16,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-20,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-12,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[4,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[0,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[20,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[16,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[12,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[8,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-8,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-4,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[32,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[24,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[28,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[40,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[36,12.75,-44.25,0,0,1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[42.25,12.7499980926513671875,-38,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[42.25,12.7499980926513671875,-34,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[42.25,12.7499980926513671875,34,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[42.25,12.7499980926513671875,38,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[42.25,12.7499980926513671875,42,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[42.25,12.7499980926513671875,-22,-1,0,0],"SecondaryColor":"Institutional white","ItemName":"Wall_Edge","PrimaryColor":"Black"},{"Position":[42.25,12.7499980926513671875,-14,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[42.25,12.7499980926513671875,-18,-1,0,0],"SecondaryColor":"Institutional white","ItemName":"Wall_Edge","PrimaryColor":"Black"},{"Position":[42.25,12.7499980926513671875,18,-1,0,0],"SecondaryColor":"Institutional white","ItemName":"Wall_Edge","PrimaryColor":"Black"},{"Position":[42.25,12.7499980926513671875,22,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[42.25,12.7499980926513671875,14,-1,0,0],"SecondaryColor":"Institutional white","ItemName":"Wall_Edge","PrimaryColor":"Black"},{"Position":[36,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[28,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[32,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[24,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[20,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[8,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[12,12.75,44.25,0,0,-1],"SecondaryColor":"Institutional white","ItemName":"Wall_Edge","PrimaryColor":"Black"},{"Position":[16,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[4,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-12,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[0,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-8,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-4,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-28,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-16,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-20,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-24,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-32,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-36,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[-40,12.75,44.25,0,0,-1],"SecondaryColor":"Fossil","ItemName":"Wall_Edge","PrimaryColor":"Fossil"},{"Position":[42.25,2.7499980926513671875,-30,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Window_Bottom_Basic","PrimaryColor":"Fossil"},{"Position":[42.25,2.7499980926513671875,-26,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Window_Bottom_Basic","PrimaryColor":"Fossil"},{"Position":[42.25,2.7499980926513671875,26,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Window_Bottom_Basic","PrimaryColor":"Fossil"},{"Position":[42.25,2.7499980926513671875,30,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Window_Bottom_Basic","PrimaryColor":"Fossil"},{"Position":[42.25,2.7499980926513671875,-10,-1,0,0],"SecondaryColor":"Institutional white","ItemName":"Window_Bottom_Basic","PrimaryColor":"Black"},{"Position":[42.25,2.7499980926513671875,-6,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Window_Bottom_Basic","PrimaryColor":"Fossil"},{"Position":[42.25,2.7499980926513671875,-2,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Window_Bottom_Basic","PrimaryColor":"Fossil"},{"Position":[42.25,2.7499980926513671875,2,-1,0,0],"SecondaryColor":"Institutional white","ItemName":"Window_Bottom_Basic","PrimaryColor":"Black"},{"Position":[42.25,2.7499980926513671875,6,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Window_Bottom_Basic","PrimaryColor":"Fossil"},{"Position":[42.25,2.7499980926513671875,10,-1,0,0],"SecondaryColor":"Fossil","ItemName":"Window_Bottom_Basic","PrimaryColor":"Fossil"},{"Position":[42.249969482421875,22.75000762939453125,-26,-1,0,0],"ItemName":"Window_Top_Basic","PrimaryColor":"Fossil"},{"Position":[42.249969482421875,22.75000762939453125,-2,-1,0,0],"ItemName":"Window_Top_Basic","PrimaryColor":"Fossil"},{"Position":[42.249969482421875,22.75000762939453125,26,-1,0,0],"ItemName":"Window_Top_Basic","PrimaryColor":"Fossil"},{"Position":[42.249969482421875,22.75000762939453125,30,-1,0,0],"ItemName":"Window_Top_Basic","PrimaryColor":"Fossil"},{"Position":[42.249969482421875,22.75000762939453125,-10,-1,0,0],"ItemName":"Window_Top_Basic","PrimaryColor":"Fossil"},{"Position":[42.249969482421875,22.75000762939453125,-6,-1,0,0],"ItemName":"Window_Top_Basic","PrimaryColor":"Fossil"},{"Position":[42.249969482421875,22.75000762939453125,2,-1,0,0],"ItemName":"Window_Top_Basic","PrimaryColor":"Fossil"}]}

So somehow it’s saving to the Items in the data pack, but nothing else? + why isn’t it print out like the Cash or Mood as well?

1 Like

Roblox automatically encodes and decodes the data you want to save into JSON, there’s no need to try to do it yourself.

By the way, GlobalDataStore:GetAsync() can fail, so you really should be handling errors on that and calling it in protected mode. You’re also saving guest data. You also don’t check if data could be successfully loaded before attempting to save it. These are all things that are important to do!

P.S. I believe I made something for you quite a few months ago that I never got around to giving you. I’ll take care of that privately soon!

1 Like

But the JSON doesn’t have any reference to what a new players data should be? Atm, when a new player joins, they are given no data. This should be what’s given to a new player:

local data = {

Items = {},

PurchasedItems = {},

Cash = 0,

Mood = 'Happy',

Plot = 'Apt_Basic'

}

The stuff inside this data table is what a new player should be given (the default data) but they are just given an empty table

{}

But when I try to reference the data table, going like:

local loadJSON = playerDataStore:GetAsync(player.UserId) or data

or

local setData = httpService:JSONDecode(loadJSON) or data

It doesn’t work. It errors out. Atm, what I have is the data in those 2 lines just being these {} which obviously gives them the empty table with no data. But I want to give them the default data, but I can’t/don’t know how to

playerDataStore:SetAsync(player.UserId, {}) -- converts table to JSON
local table = playerDataStore:GetAsync(player.UserId) -- converts JSON to table for you
1 Like

But if a player has never joined the game before, it will break with

local table = playerDataStore:GetAsync(player.UserId)

as if they’ve never joined before, they don’t have an assigned data store to their user ID. I’m using SetAsync when they leave the game.

That’s why I was hoping doing

local table = playerDataStore:GetAsync(player.UserId) or data

would either given them their previously saved data OR if they didn’t have a data save, just give them the default data.

It should, though there’s no need to handle JSON encoding or decoding yourself.

Are you sure this line is specifically erroring? It shouldn’t.

Oh, I was told by nearly everyone that I had to use JSON when data storing tables??

local loadJSON = playerDataStore:GetAsync(player.UserId) or data
local setData = httpService:JSONDecode(loadJSON) or {} -- Error on this line

When I use the above, I get this error:

Unable to cast value to std::string

You don’t, Roblox handles the JSON encoding when you call all the GlobalDataStore methods, you can simply get rid of that. The documentation on DataStores is lacking, so a beginner programmer may have been confused when telling you otherwise.

2 Likes

This is my typical setup for a basic data store.

local dsServ = game:GetService("DataStoreService")
local plrData = dsServ:GetDataStore('PlayerData')

local prefix = "usr_"
local waitTime = 1
local retryCount = 3

local function getKey(id)
	return prefix .. tostring(id)
end

local function saveData(key, data)
	for i=1, retryCount do
		local suc, res = pcall(plrData.SetAsync, plrData, key, data)
		if suc then 
			return suc, res
		else
			warn(res)
		end
		wait(waitTime)
	end
	
	return false, nil
end

local function loadData(key)
	for i=1, retryCount do
		local suc, res = pcall(plrData.GetAsync, plrData, key)
		if suc then 
			return suc, res
		else
			warn(res)
		end
		wait(waitTime)
	end
	
	return false, nil
end

local function newData()
	return {
		items = {},
		hp = 0 -- ect
	}
end

local plrDataList = {}
game.Player.PlayerAdded:Connect(function(plr)
	-- other setup
	
	-- I do not really like to load data as soon as the player joins
	-- I commonly use a remote event to tell the server to load data once
	local suc, data = loadData(getKey(plr.UserId))
	
	if suc then
		plrDataList[plr.UserId] = data or newData()
	else
		-- something bad ?
	end
end

game.PlayerRemoving:Connect(function(plr)
	local suc, res = saveData(getKey(plr.UserId), plrDataList[plr.UserId])
	if suc then
		plrDataList[plr.UserId] = nil
	else
		-- handle bad save??
	end
end)

game:BindToClose(function()
	local i = 0
	for id, data in pairs(plrDataList)
		i = i + 1
		spawn(function()
			local suc, res = saveData(getKey(id), data)
			i = i - 1
			-- handle bad save ???
		end)
	end
	
	while i ~= 0 do wait(1) end
end)
4 Likes

Huh, well it works now :smiley: thank you :smiley: :smiley: