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 :)
