Problem With DataStore Script

Hello everyone,

I am having an issue with my data not saving correctly in Roblox Studio.

  1. What do you want to achieve? I want to make an efficient and organized DataStore script.
  2. What is the issue? I am getting the following error messages when I run my code:
ServerScriptService.Data.Server:37: attempt to index nil with 'Value'
Argument 2 missing or nil

Line 37: for i, v in pairs(playerdata) do

  1. What solutions have you tried so far? I have tried checking my code to make sure that all objects and arguments that are being accessed or passed to functions exist and are not nil.

Here is the code that is causing the errors:

local Services = {
	Players = game:GetService("Players");
	DataStoreService = game:GetService("DataStoreService");
	RunService = game:GetService("RunService");
}

local DataStores = {}

local resources = {"Gold", "Shells", "Coconuts", "Fish", "Pebbles", "Leaves"}

for _, resource in pairs(resources) do
	DataStores[resource .. "Data"] = Services.DataStoreService:GetDataStore(resource .. "Data")
end

local function SavePlayerData(player)
	local success, errormessage = pcall(function()
		local playerdata = {}
		for i, v in pairs(player.Data:GetChildren()) do
			playerdata[v.Name] = v.Value
		end
		for i, v in pairs(DataStores) do
			v:SetAsync(player.UserId, playerdata[i])
		end
	end)
	if not success then
		warn(errormessage)
	end
end

local function LoadPlayerData(player)
	local success, errormessage = pcall(function()
		local playerdata = {}
		for i, v in pairs(DataStores) do
			playerdata[i] = v:GetAsync(player.UserId) or 0
		end
		for i, v in pairs(playerdata) do
			player.Data:FindFirstChild(i).Value = v
		end
	end)
	if not success then
		warn(errormessage)
	end
end

Services.Players.PlayerAdded:Connect(function(player)
	local DataFolder = Instance.new("Folder", player)
	DataFolder.Name = "Data"

	for _, resource in pairs(resources) do
		local value = Instance.new("NumberValue", DataFolder)
		value.Name = resource

		if Services.RunService:IsStudio() then
			value.Changed:Connect(function()
				SavePlayerData(player)
			end)
		end
	end

	player.CharacterAdded:Wait()

	LoadPlayerData(player)
end)

Services.Players.PlayerRemoving:Connect(function(player)
	SavePlayerData(player)
end)

game:BindToClose(function()
	for i, player in pairs(Services.Players:GetPlayers()) do
		SavePlayerData(player)
	end
end)

Any help would be greatly appreciated. Thank you!

1 Like

This probably means that player.Data:FindFirstChild(i) doesn’t exist.

You make a Numbervalue with the name recource, but in the loadplayerdata you have it named recource.."Data".

Just replace
value.Name = resource
with
value.Name = resource.."Data"
and it should work!

1 Like

Thank you so so much! It worked! I was looking only in the load data function…

You’re welcome, another look into it always helps!

1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.