Can you send me that script? I can show you how it’s done.
local DataStore2 = require(game.ServerScriptService.DataStore2)
local MainKey = "MainDataStore"
--DataStore2.Combine(MainKey, "Stats", "OtherStats")
local dataStore = DataStore2.Combine("MainDataStore", "Stage", "Rebirths", "Cash", "BetaTester", "Time")
game.Players.PlayerAdded:Connect(function(player)
local stageData = DataStore2("Stage",player)
local rebirthsData = DataStore2("Rebirths",player)
local cashData = DataStore2("Cash",player)
local betaTesterData = DataStore2("BetaTester",player)
local timeData = DataStore2("Time",player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
local otherStats = Instance.new("Folder")
otherStats.Name = "OtherStats"
local stages = Instance.new("IntValue")
stages.Name = "Stage"
stages.Value = stageData:Get(0)
stages.Parent = leaderstats
local rebirths = Instance.new("IntValue")
rebirths.Name = "Rebirths"
rebirths.Value = rebirthsData:Get(0)
rebirths.Parent = leaderstats
local cash = Instance.new("IntValue")
cash.Name = "Cash"
cash.Value = cashData:Get(10)
cash.Parent = leaderstats
local betaTest = Instance.new("BoolValue")
betaTest.Name = "BetaTester"
betaTest.Value = betaTesterData:Get(true)
betaTest.Parent = otherStats
local timePlaying = Instance.new("IntValue")
timePlaying.Name = "Time"
timePlaying.Value = timeData:Get(0)
timePlaying.Parent = otherStats
leaderstats.Parent = player
otherStats.Parent = player
cashData:OnUpdate(function(newDataCash)
player.leaderstats.Cash.Value = newDataCash
end)
end)
local DataStore2 = require(game.ServerScriptService.DataStore2)
local MainKey = "MainDataStore"
DataStore2.Combine("MainDataStore", "Stage", "Rebirths", "Cash", "BetaTester", "Time")
game.Players.PlayerAdded:Connect(function(player)
local stageData = DataStore2("Stage",player)
local rebirthsData = DataStore2("Rebirths",player)
local cashData = DataStore2("Cash",player)
local betaTesterData = DataStore2("BetaTester",player)
local timeData = DataStore2("Time",player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
local otherStats = Instance.new("Folder")
otherStats.Name = "OtherStats"
local stages = Instance.new("IntValue")
stages.Name = "Stage"
stages.Value = stageData:Get(0)
stages.Parent = leaderstats
local rebirths = Instance.new("IntValue")
rebirths.Name = "Rebirths"
rebirths.Value = rebirthsData:Get(0)
rebirths.Parent = leaderstats
local cash = Instance.new("IntValue")
cash.Name = "Cash"
cash.Value = cashData:Get(10)
cash.Parent = leaderstats
local betaTest = Instance.new("BoolValue")
betaTest.Name = "BetaTester"
betaTest.Value = betaTesterData:Get(true)
betaTest.Parent = otherStats
local timePlaying = Instance.new("IntValue")
timePlaying.Name = "Time"
timePlaying.Value = timeData:Get(0)
timePlaying.Parent = otherStats
leaderstats.Parent = player
otherStats.Parent = player
cashData:OnUpdate(function(newDataCash)
print("cashData has been updated!")
cash.Value = newDataCash
end)
end)
local Players = game:GetService("Players")
local DataStore2 = require(game.ServerScriptService.DataStore2)
wait(10)
for _, Player in ipairs(Players:GetPlayers()) do
local CashData = DataStore2("Cash", Player)
CashData:Increment(10)
end
Change the script you sent me to the one on top, and make another script for testing with the code from the second example. Tell me if it updates.
The second script should be in a loop?
Don’t loop it yet. This is just for testing.
You are a legend! Working! Thank you so much. How should I put it in a loop now?
Well first, remove the print
from :OnUpdate
, and second, you can try this.
local Players = game:GetService("Players")
local DataStore2 = require(game.ServerScriptService.DataStore2)
local WAIT_TIME = 1 -- The time between each payout.
local INCREMENT_AMOUNT = 10 -- How much they are awarded.
while true do
wait(WAIT_TIME)
for _, Player in ipairs(Players:GetPlayers()) do
local CashData = DataStore2("Cash", Player)
CashData:Increment(INCREMENT_AMOUNT)
end
end
Seems to be working fine!
For time script, I will do the same.
For Rebirths, I will also do an event on click.
For stages, which increase when you touch them.
Should I put that function in all stages? And if so, I wouldn’t use increment but set so it’s always 100% which stage will be set.
Is there also another way to do it, not in each stage?
EDIT: I’ll actually put it in each stage.
- That would work.
- Also works.
- For stages, if they’re like an obby stage, do something like the script below.
- You can use CollectionService and the Tag Editor plugin.
local Players = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")
local CollectionService = game:GetService("CollectionService")
local DataStore2 = require(ServerScriptService.DataStore2)
local function TouchedFenv(StageObject)
local Stage
local StageNameIsStage = tonumber(StageObject.Name)
if StageNameIsStage then
Stage = StageNameIsStage
else
-- Stage is a IntValue or something.
if StageObject:FindFirstChild("Stage") then
Stage = StageObject.Stage.Value
end
end
if type(Stage) ~= "number" then
warn("No stage, cannot setup properly.")
return function() end
else
return function(Hit)
local Character = Hit:FindFirstAncestorOfClass("Model")
if Character then
local Humanoid = Character:FindFirstChildOfClass("Humanoid")
if Humanoid and Humanoid.Health > 0 then
local Player = Players:GetPlayerFromCharacter(Character)
if Player then
local StageStore = DataStore2("Stage", Player)
StageStore:Set(Stage) -- Make sure you setup :OnUpdate!
end
end
end
end
end
end
for _, StageObject in ipairs(CollectionService:GetTagged("Stages")) do
StageObject.Touched:Connect(TouchedFenv(StageObject))
end
Should that be in each stage in game because I already have some script that changes stage anyway? I just need to add like 4 lines of code to change data value and will use Set instead of Increment
You can just do something like
local Players = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")
local DataStore2 = require(ServerScriptService.DataStore2)
local STAGE_VALUE = 1
local function Touched(Hit)
local Character = Hit:FindFirstAncestorOfClass("Model")
if Character then
local Humanoid = Character:FindFirstChildOfClass("Humanoid")
if Humanoid and Humanoid.Health > 0 then
local Player = Players:GetPlayerFromCharacter(Character)
if Player then
local StageStore = DataStore2("Stage", Player)
StageStore:Set(STAGE_VALUE) -- Make sure you setup :OnUpdate!
end
end
end
end
script.Parent.Touched:Connect(Touched)
I have something similar to that. It also checks that player isn’t already above that stage.
Also, does PlayerAdded event works for each player separately?
And how would I change value manually? Basically, in Explorer or in-game with admin.
What do you mean?
You have to require the DataStore2 module in the command line (be it in Studio’s or the in-game one) and you could increment it there, but I’m not sure.
I mean, each PlayerAdded event is like spawn() event?
It should fire for every player that joins, unless it has a bunch of code that yields before it gets to the connecting part.
Yeah xD, but it has core and runs for each player separately during whole game?
I just realized I lost some piece of data
I don’t know why. Maybe beacuse I’m testing in Studio?
Wait, it doesn’t save anymore…
EDIT: Seems to be fine in game I guess.
Do you know how would I make save all data (like autosave)?
Would this be ok:
while true do
DataStore2:SaveAll(player)
wait(120)
end
What about something less than 120, like 30 (I heard anything below 100 seconds isn’t good…)
You do not need to do that. Just trust DataStore2 completely. It will do its job.