Gotta say first, I hate datastores, I'm not too bad at them, but they're really difficult and lose data often, this shouldn't be happening though, I even check if the getasynced data is equal to the setasynced data, if anyone has an idea or sees something bad in the code, please help.
local DataNum = script.Parent:WaitForChild('DataNum') local DataStore = game:GetService("DataStoreService") local PlayerSave = DataStore:GetDataStore("PS_"..DataNum.Value) local SaveGUI = script.Parent:WaitForChild('SaveGUI') -- or {0,0,2,1,20, 100, 240, 0, 1, 1, 1, 1000, 1, 1, 1, 1, 1, 1, 100000, 777, 10000, 10, 1} local function writeplr(plr) end local function load(plr) local key = 'Key_'..plr.UserId local Stats = plr:WaitForChild('Stats') local UpGradeFrame = plr:WaitForChild("PlayerGui"):WaitForChild("Main"):WaitForChild("UpgradeFrame") local success, message = pcall(function() local success, saves = pcall(function() local saves = PlayerSave:GetAsync(key) return saves end) if saves then Stats:WaitForChild('Cash').Value = saves[1] or 0 Stats:WaitForChild('CashL').Value = saves[2] or 0 Stats:WaitForChild('Damage').Value = saves[3] or 2 Stats:WaitForChild('BuxDrop').Value = saves[4] or 1 Stats:WaitForChild('TixDrop').Value = saves[5] or 20 Stats:WaitForChild('BagDrop').Value= saves[6] or 100 Stats:WaitForChild('AutoClick').Value = saves[7] or 240 Stats:WaitForChild('NetWorth').Value = saves[8] or 0 Stats:WaitForChild('Multiplier').Value = saves[9] or 1 Stats:WaitForChild('UltraR').Value = saves[10] or 1 Stats:WaitForChild('Square').Value = saves[11] or 1 plr.Character:WaitForChild('Humanoid').MaxHealth = saves[12] or 1000 UpGradeFrame:WaitForChild('ACUpgrade').Button.Times.Value = saves[13] or 1 UpGradeFrame.BagUpgrade.Button.Times.Value = saves[14] or 1 UpGradeFrame.BuxUpgrade.Button.Times.Value = saves[15] or 1 UpGradeFrame.HPUpgrade.Button.Times.Value = saves[16] or 1 UpGradeFrame.TixUpgrade.Button.Times.Value = saves[17] or 1 plr.PlayerGui.Main.SquareFrame.Chance.Value = saves[18] or 777 plr.PlayerGui.Main.SquareFrame.SDO.Value = saves[19] or 10000 UpGradeFrame.DMGUpgrade.Button.Times.Value = saves[20] or 1 local Loaded = Instance.new("BoolValue") Loaded.Value = true Loaded.Name = "Loaded" Loaded.Parent = plr else if plr:FindFirstChild('LoadAttempts') then local Attempts = plr:FindFirstChild('LoadAttempts') if Attempts.Value > 3 then local Loaded = Instance.new("BoolValue") Loaded.Value = true Loaded.Name = "Loaded" Loaded.Parent = plr else wait(5) Attempts.Value = Attempts.Value + 1 load(plr) end else local Attempts = Instance.new('IntValue') Attempts.Name = 'LoadAttempts' Attempts.Value = 1 Attempts.Parent = plr end end end) end game.Players.PlayerAdded:Connect(function(plr) load(plr) end) function SavePlr(plr) local SavingMessage = SaveGUI:Clone() SavingMessage.Name = 'SavingMessage' local mainText = SavingMessage:WaitForChild('mainText') local mScript = mainText:WaitForChild('Main') local success, message = pcall(function() local key = 'Key_'..plr.UserId local Stats = plr:WaitForChild('Stats') local UpGradeFrame = plr:WaitForChild("PlayerGui"):WaitForChild("Main"):WaitForChild("UpgradeFrame") local ValuesToSave = { Stats:WaitForChild('Cash').Value, Stats:WaitForChild('CashL').Value, Stats:WaitForChild('Damage').Value, Stats:WaitForChild('BuxDrop').Value, Stats:WaitForChild('TixDrop').Value, Stats:WaitForChild('BagDrop').Value, Stats:WaitForChild('AutoClick').Value, Stats:WaitForChild('NetWorth').Value, Stats:WaitForChild('Multiplier').Value, Stats:WaitForChild('UltraR').Value, Stats:WaitForChild('Square').Value, plr.Character:WaitForChild('Humanoid').MaxHealth, UpGradeFrame.ACUpgrade.Button.Times.Value, UpGradeFrame.ACUpgrade.Button.Times.Value, UpGradeFrame.BagUpgrade.Button.Times.Value, UpGradeFrame.BuxUpgrade.Button.Times.Value, UpGradeFrame.HPUpgrade.Button.Times.Value, UpGradeFrame.TixUpgrade.Button.Times.Value, plr.PlayerGui.Main.SquareFrame.Chance.Value, plr.PlayerGui.Main.SquareFrame.SDO.Value, UpGradeFrame.DMGUpgrade.Button.Times.Value } if ValuesToSave and plr and plr:FindFirstChild('Loaded') then PlayerSave:SetAsync(key, ValuesToSave) local TestValues = PlayerSave:GetAsync(key) if TestValues == ValuesToSave then mainText.Text = 'Saved!' mScript.Disabled = false SavingMessage.Parent = plr:WaitForChild('PlayerGui') else mainText.Text = 'Error saving values! (datastore does not match to stats)' mainText.TextColor3 = Color3.fromRGB(255,0,0) mScript.Disabled = false SavingMessage.Parent = plr:WaitForChild('PlayerGui') end end end) if success then mainText.Text = 'Saved!' mScript.Disabled = false SavingMessage.Parent = plr:WaitForChild('PlayerGui') else mainText.Text = 'Failed to save: '..message mainText.TextColor3 = Color3.fromRGB(255,0,0) mScript.Disabled = false SavingMessage.Parent = plr:WaitForChild('PlayerGui') end end while wait() do for i, plr in pairs(game.Players:GetPlayers()) do SavePlr(plr) wait((60/#game.Players:GetPlayers())/2) end end
If you're confused here wait((60/#game.Players:GetPlayers())/2)
, what is does basicly is waiting 30 seconds/save. For errors, no I don't get them, for throtthles or so, not sure, It's in team create so I can't see the dev console.