Ok so, I'm making a mining simulator, and I want to make a tool DataStore. For some reason, the data won't load properly.
Script I used:
local DataStoreService = game:GetService("DataStoreService") local DS = DataStoreService:GetDataStore("MinerzData") local function loadData(player) local key = player.UserId .. "-minerzData" local data local success,errorMessage = pcall(function() data = DS:GetAsync(key) end) if success then print('MinerzData | Successfully loaded ' .. player.Name .. "'s data!") return data elseif errorMessage then warn('MinerzData | ' .. errorMessage) return nil end end local function saveData(player) local key = player.UserId .. "-minerzData" local data = { player.Items.Wood.Value, player.Items.Stone.Value, player.leaderstats.Cash.Value, pickaxes = { } } for i, pickaxe in pairs(player.Backpack:GetChildren()) do if pickaxe:IsA("Tool") then table.insert(data.pickaxes, pickaxe.Name) end end local success,errorMessage = pcall(function() DS:SetAsync(key, data) end) if success then print('MinerzData | Successfully saved ' .. player.Name .. "'s data!") return elseif errorMessage then warn('MinerzData | ' .. errorMessage) return end end game.Players.PlayerAdded:Connect(function(player) local playerItems = Instance.new("Folder", player) playerItems.Name = "Items" local leaderstats = Instance.new("Folder", player) leaderstats.Name = "leaderstats" local cash = Instance.new("IntValue", leaderstats) cash.Name = "Cash" cash.Value = 0 for i, item in pairs(game:GetService("ServerStorage"):WaitForChild("Items"):GetChildren()) do local newVal = Instance.new("IntValue", playerItems) newVal.Name = item.Name newVal.Value = 0 end local data = loadData(player) if data == nil then warn(player.Name .. " must be a new player; data not found!") elseif data then playerItems:WaitForChild("Wood").Value = data[1] playerItems:WaitForChild("Stone").Value = data[2] cash.Value = data[3] for i, pickaxe in ipairs(data.pickaxes) do local exists = game:GetService("ReplicatedStorage"):WaitForChild("Pickaxes"):FindFirstChild(pickaxe) if exists then local newPick = exists:Clone() local newPick2 = exists:Clone() newPick.Parent = player:WaitForChild("Backpack") newPick2.Parent = player:WaitForChild("StarterGear") end end end player.CharacterRemoving:Connect(function(char) char:WaitForChild("Humanoid"):UnequipTools() end) end) game.Players.PlayerRemoving:Connect(function(player) saveData(player) end) game:BindToClose(function() for i, player in pairs(game.Players:GetPlayers()) do saveData(player) end end)
On line 78, it errors with:
ServerScriptService.InventoryHandler:79: invalid argument #1 to 'ipairs' (table expected, got nil)
On line 23 I define the "data" table in the saveData() function. I also define "pickaxes" as a sub-table. (line 27) For some reason, when I join the game, it says table expected, got nil. I don't know why this happens, and when I do a print(data.pickaxes), it just prints "nil."
If someone could help, it would mean a lot to me!