So after a while of not saving Coins in my game, I decided to save them using DataStore 2. I was already saving another currency so no big deal, should be easy. So in this game, you get usually 5 coins after every floor but I can't just make the data stores save with 5 more coins since sometimes you'd get more like a boss floor for example or anything else. So I need to do some math to get it to increment any Coins the player gets.
This is what I did. (You shouldn't require more code than this)
local DataStoreService = game:GetService("DataStoreService") local GameDataStore = DataStoreService:GetDataStore("GameDataStore") local Players = game:GetService("Players") local RunService = game:GetService("RunService") local MarketplaceService = game:GetService("MarketplaceService") local ServerScriptService = game:GetService("ServerScriptService") local workspace = game:GetService("Workspace") AlivePlayers = {} Players.PlayerAdded:Connect(function(player) print("Player joined and is being tracked to see if they die.") player.CharacterAdded:Connect(function(character) character:WaitForChild("Humanoid").Died:Connect(function() if table.find(AlivePlayers,player) then for i = 1, #AlivePlayers do if AlivePlayers[i] == player then table.remove(AlivePlayers, i) print("A player has been removed from the Alive People list.(Hopefully)") end end end if table.find(AlivePlayers,player) then print("Failed to remove a player from the Alive People list.") return end wait(3.5) player.Character:Destroy() player.Values.Lobby.Value = true end) end) end) workspace.Lobby.PlayersinLobby.Touched:Connect(function(hit) if hit.parent:FindFirstChild("Humanoid") and Players:GetPlayerFromCharacter(hit.parent) then local character = hit.parent local player = Players[character.Name] player.CameraMode = Enum.CameraMode.Classic player.Values.Lobby.Value = true if table.find(AlivePlayers,player) then for i = 1, #AlivePlayers do if AlivePlayers[i] == player then table.remove(AlivePlayers, i) print("Removed a player from the Alive Players list for staying in the lobby") end end end end end) local DataStore2 = require(ServerScriptService:WaitForChild("DataStore2")) DataStore2.Combine("DATA", "floors2", "coins2") local defaultValue = 0 Players.PlayerAdded:Connect(function(player) local Items = Instance.new("Folder") Items.Name = "Items" Items.Parent = player local Values = Instance.new("Folder") Values.Name = "Values" Values.Parent = player local Lobby = Instance.new("BoolValue") Lobby.Name = "Lobby" Lobby.Parent = Values Lobby.Value = true local SC = Instance.new("IntValue") SC.Name = "SC" SC.Parent = Items SC.Value = 0 local TimeT = Instance.new("IntValue") TimeT.Name = "TimeT" TimeT.Parent = Items TimeT.Value = 0 local Flash = Instance.new("IntValue") Flash.Name = "Flash" Flash.Parent = Items Flash.Value = 0 local RegenCoil = Instance.new("IntValue") RegenCoil.Name = "RegenCoil" RegenCoil.Parent = Items RegenCoil.Value = 0 local UltraCoil = Instance.new("IntValue") UltraCoil.Name = "UltraCoil" UltraCoil.Parent = Items UltraCoil.Value = 0 local HackDevice = Instance.new("IntValue") HackDevice.Name = "HackDevice" HackDevice.Parent = Items HackDevice.Value = 0 local Port = Instance.new("IntValue") Port.Name = "PortShop" Port.Parent = Items Port.Value = 0 print("Player data epicly loads (hopefully it didnt corrupt)") local CoinsStore = DataStore2("coins2", player) local floorsStore = DataStore2("floors2", player) local leaderstats = Instance.new("Folder", player) leaderstats.Name = "leaderstats" local Coins = Instance.new("IntValue", leaderstats) Coins.Name = "Coins" Coins.Value = CoinsStore:Get(0) local Floors = Instance.new("IntValue", leaderstats) Floors.Name = "Floors" Floors.Value = floorsStore:Get(0) local function coinUpdate(updatedValue) Coins.Value = CoinsStore:Get(updatedValue) CoinsStore:SetBackup(5) end local function floorUpdate(updatedValue) Floors.Value = floorsStore:Get(updatedValue) floorsStore:SetBackup(5) end coinUpdate(defaultValue) floorUpdate(defaultValue) CoinsStore:OnUpdate(function(coinUpdate) end) floorsStore:OnUpdate(function(floorUpdate) end) Players.PlayerAdded:Connect(function(player) local CoinsStore = DataStore2("coins2", player) local floorsStore = DataStore2("floors2", player) while true do wait(180) CoinsStore:Save() floorsStore:Save() end end) game.ServerStorage.PlayerIntermission.Changed:Connect(function() if game.ServerStorage.PlayerIntermission.Value == 0 then local players = Players:GetPlayers() for i=1,#players do table.insert(AlivePlayers,players[i]) end local parts = workspace.Lobby.PlayersinLobby:GetTouchingParts() for _, touchingPart in ipairs(parts) do local humanoid = touchingPart.Parent:FindFirstChild("Humanoid") if humanoid and humanoid.MoveDirection == Vector3.new(0,0,0) or humanoid then local character = humanoid.Parent if Players:GetPlayerFromCharacter(humanoid.Parent) then local player = Players[character.Name] player.CameraMode = Enum.CameraMode.Classic if table.find(AlivePlayers,player) then for i = 1, #AlivePlayers do if AlivePlayers[i] == player then table.remove(AlivePlayers, i) print("Removed every player in the Lobby from the Alive Players list.") end end end end end end else for i, player in pairs(AlivePlayers) do local CoinsStore = DataStore2("coins2", player) local floorsStore = DataStore2("floors2", player) local OldCoins = leaderstats.Coins.Value player.leaderstats.Floors.Value += 1 player.leaderstats.Coins.Value += 5 wait(1) local NewCoins = leaderstats.Coins.Value local AddedCoins = NewCoins - OldCoins print(AddedCoins.." Coins added to the player's data.") floorsStore:Increment(1,defaultValue) CoinsStore:Increment(AddedCoins,defaultValue) table.clear(AlivePlayers) end end end) end)
This should work (I think?) but it doesn't. I went from 90 coins to 100, (double coins gamepass, hence why I can't just say 5 coins) sounds good right? I leave the game, join back and I have 55 Coins???? Whaaaaaaat? How did I get from 100 (NewCoins) - 90 (OldCoins) = 10 (AddedCoins) to 55??? I cannot figure this out, so if you can help please help :)