Hello everyone, I am having an issue with my data store script since my last post. I wanted to add a code system.
I tried checking the code and playtesting multiple times but non of these methods worked.
Server Script:
local Services = {
Players = game:GetService("Players");
DataStoreService = game:GetService("DataStoreService");
RunService = game:GetService("RunService");
HttpService = game:GetService("HttpService");
}
local DataStores = {}
local resources = {"Gold", "Shells", "Coconuts", "Fish", "Pebbles", "Leaves", "Banned"}
local codes = {}
local codesDatabase = require( script["Codes System"].Database)
delay(0, function()
for i, v in pairs(codesDatabase.Codes) do
table.insert(codes, i)
end
for _, resource in pairs(resources) do
DataStores[resource .. "Data"] = Services.DataStoreService:GetDataStore(resource .. "Data")
end
for _, code in pairs(codes) do
DataStores[code .. "Data"] = Services.DataStoreService:GetDataStore("Code"..code .. "Data")
end
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(player.Codes: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()
if player:FindFirstChild("Data") then
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
if playerdata["Banned"] then
player:Kick("You have been kicked from the game due to being banned for prohibited client-server behavior. | If you believe that this is a mistake, contact our staff.")
end
end
if player:FindFirstChild("Codes") then
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.Codes:FindFirstChild(i).Value = v
end
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"
local CodesFolder = Instance.new("Folder", player)
CodesFolder.Name = "Codes"
local BannedValue = Instance.new("BoolValue", DataFolder)
BannedValue.Name = "Banned"
delay(0, function()
for _, resource in pairs(resources) do
local value = Instance.new("NumberValue", DataFolder)
value.Name = resource.."Data"
if Services.RunService:IsStudio() then
value.Changed:Connect(function()
SavePlayerData(player)
end)
end
end
for _, code in pairs(codes) do
local value = Instance.new("BoolValue", CodesFolder)
value.Name = "Code"..code.."Data"
if Services.RunService:IsStudio() then
value.Changed:Connect(function()
SavePlayerData(player)
end)
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)
Error | Output:
ServerScriptService.Data.Server:133: attempt to index nil with ‘Value’ - Server - Server:151
Argument 2 missing or nil - Server
And here is line 133:
player.Data:FindFirstChild(i).Value = v
Any help is greatly appreciated!