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

Data Stores Not Saving When A Player Leaves? Please Help?

I want to save 3 values. Exp Level, Amount of Exp to Next Level, and Level. But it is not saving when i load back into game. It is a normal script in ServerScriptStorage. Here is my script for my data stores:

--References
local dataStore = game:GetService('DataStoreService')
local player = game.Players.LocalPlayer
local valueRef = game.Workspace.Values
--Values
local expAmount = valueRef.ExpLevel
local expToNextLevel = valueRef.ExpToNextLevel
local level = valueRef.Level
--Data Stores
local expStore = dataStore:GetDataStore('expStore')
local success, err = pcall(function()
	expStore:SetAsync(player.UserID..'_exp', expAmount)
end)
if err then
	print('Exp Store Error')
end

local nextLevelStore = dataStore:GetDataStore('nextLevelStore')
local success, err = pcall(function()
	nextLevelStore:SetAsync(player.UserID..'_nextLevel', expToNextLevel)
end)
if err then
	print('Next Level Store Error')
end

local levelStore = dataStore:GetDataStore('levelStore')
local success, err = pcall(function()
	levelStore:SetAsync(player.UserID..'_level', level)
end)
if err then
	print('Level Store Error')
end
--Data Store Updates
player.PlayerAdded:Connect(function(playerJoining)
	
end)
player.PlayerRemoving:Connect(function(playerLeaving)
	local success, err = pcall(function()
		expStore:UpdateAsync(player.UserID..'_exp', expAmount)
	end)
	local success, err = pcall(function()
		nextLevelStore:UpdateAsync(player.UserID..'_nextLevel', expToNextLevel)
	end)
	local success, err = pcall(function()
		levelStore:UpdateAsync(player.UserID..'_level', level)
	end)
end)
game:BindToClose(function()
	print(2*2)
	wait(3)
	print("Done")
end)

1 answer

It doesn't work because it is a normal script and you used LocalPlayer. The game cannot find the LocalPlayer so it will be stuck. In fact, you should use playerjoining or playerleaving as the Player that you are trying to refer to. Also use GetAsync(). Your new script should look like this:

--References
local dataStore = game:GetService('DataStoreService')
local valueRef = game.Workspace.Values
--Values
local expAmount = valueRef.ExpLevel
local expToNextLevel = valueRef.ExpToNextLevel
local level = valueRef.Level
--Data Store Updates
player.PlayerAdded:Connect(function(playerJoining)
local expStore = dataStore:GetDataStore('expStore')
local success, err = pcall(function()
    expStore:GetAsync(expAmount)
end)
if err then
    print('Exp Store Error')
end

local nextLevelStore = dataStore:GetDataStore('nextLevelStore')
local success, err = pcall(function()
    nextLevelStore:GetAsync(expToNextLevel)
end)
if err then
    print('Next Level Store Error')
end

local levelStore = dataStore:GetDataStore('levelStore')
local success, err = pcall(function()
    levelStore:GetAsync( level)
end)
if err then
    print('Level Store Error')
end
end)
player.PlayerRemoving:Connect(function(playerLeaving)
    local success, err = pcall(function()
        expStore:SetAsync(playerLeaving.UserID..'_exp', expAmount)
    end)
    local success, err = pcall(function()
        nextLevelStore:SetAsync(playerLeaving.UserID..'_nextLevel', expToNextLevel)
    end)
    local success, err = pcall(function()
        levelStore:SetAsync(playerLeaving.UserID..'_level', level)
    end)
end)
game:BindToClose(function()
    print(2*2)
    wait(3)
    print("Done")
end)

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