Hello everyone,
I am having an issue with my data not saving correctly in Roblox Studio.
- What do you want to achieve? I want to make an efficient and organized DataStore script.
- 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
-
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!