Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

How do I autosave data instead of saving only when a player leaves?

So I have a script which saves player data whenever the player leaves. But I would want to make it so that it autosaves the data every few seconds. Because when a player leaves, I would be able to call on a function with the parameter of that specific player.

But if I were to make a loop, I will not be able to get each specific name of the players.

I have thought of making a 'LocalScript' which would be imported into every player when they join. And then I would be able to use game.Players.LocalPlayer to get the specific player. But I want to see if there are other methods of doing this.

My original script is here:

local DSService = game:GetService("DataStoreService"):GetDataStore("DataSaving832723579985723")

game.Players.PlayerAdded:connect(function(player)
	local playerId = "ID-"..player.userId
	
	local leaderstats = Instance.new("IntValue", player)
	leaderstats.Name = "leaderstats"
	
	local money = Instance.new("IntValue", leaderstats)
	money.Name = "Money"
	money.Value = 0
	
	local exp = Instance.new("IntValue", leaderstats)
	exp.Name = "Experience"
	exp.Value = 0
	
	local level = Instance.new("IntValue", leaderstats)
	level.Name = "Level"
	level.Value = 0
	
	exp.Changed:connect(function()
		level.Value = math.floor(exp.Value / 1000)
	end)
	
	local HasSaved = DSService:GetAsync(playerId)
	
	if HasSaved then
		money.Value = HasSaved[1]
		exp.Value = HasSaved[2]
		level.Value = HasSaved[3]
	else
		local toSave = {money.Value, exp.Value, level.Value}
		DSService:SetAsync(playerId, toSave)
	end
	
end)

game.Players.PlayerRemoving:connect(function(player)
	local playerId = "ID-"..player.userId
	local Save = {player.leaderstats.Money.Value, player.leaderstats.Experience.Value, player.leaderstats.Level.Value}
	DSService:SetAsync(playerId, Save)
end)

I hope someone can give me another idea for this.

1 answer

✓ Accepted answer

Datastores can only be used in ServerScripts so LocalScripts are out of the question (unless you want to use remote events, but I suggest against that in this case).

As for loops, this is the only way to repeated calls infinitely (as you can only recurse so deep before you hit a stack overflow), so we will have to use some sort of looping structure. I suggest have a while loop that repeats every x amount of time in which you loop through all the players in the game and save their data.

while wait(5) do
	for _, player in ipairs(game.Players:GetPlayers()) do
		datastore:SetAsync("ID-"..player.userId, {
			player.leaderstats.Money.Value,
			player.leaderstats.Experience.Value,
			player.leaderstats.Level.Value
		})
	end
end

This discussion is preserved as it was. New answers, comments, and votes are closed.