Data not saving if two players are in-game

I’m having an issue where data just is not saving when there are two players in-game, it works completely fine with a single player however, any ideas why?

My script is below:

--// Services \\--
local ServerScriptService = game:GetService("ServerScriptService")
local ReplicatedStorag = game:GetService("ReplicatedStorage")
local DataStoreService = game:GetService("DataStoreService")
local PlayersService = game:GetService("Players")

--// Require \\--
local RaceHandler = require(script.RaceHandler)
local LivesHandler = require(script.LivesHandler)
local NameGenerator = require(script.NameGenerator)
local SpawnHandler = require(script.SpawnHandler)
--//Events / Bindables \\--
-- nothing here yet :)

--// DataStoreService Setup \\--
local DS_MainDataStore = DataStoreService:GetDataStore("StudioDataStore1")


if DS_MainDataStore then
	warn("DATASTORES LOADED!")
end

local LivePlayerData = {}

local FAILEDSAVETABLE = {}
--------------------------------

--// Loading / Saving Data \\--

function CreateDefaultDataTable(player)
	local UUID = player.UserId
	
	LivePlayerData[UUID] = {
		CharacterData = {
			MaleName = "John",
			FemaleName = "Doe",
			GuildName = "nil",
			Currency = 0,
			Health = 100,
			Lives = 0,
			Alignment = 0,
			ManaAbilities = {ManaSpeed = 0.1, ManaRun = false, ManaClimb = false, ManaClimbSpeed = 0.1, ManaPunch = false, HasMana = false},
			SpawnData = {SavedPosition = {}, SpawnPoint = "SpawnArea1", FirstSpawn = true},
			Kingdom = "David_Kingdom",
			Race = {RaceType = "Humanoid", RaceVar = 1},
			Armour = {ArmourType = "rags", hpboost = 0, speedboost = 0}
		},
		WeaponData = {},
		AccountData = {},
		InventoryData = {},
		ActionBarData = {Slot1 = nil, Slot2 = nil, Slot3 = nil, Slot4 = nil, Slot5 = nil, Slot6 = nil, Slot7 = nil, Slot8 = nil, Slot9 = nil, Slot10 = nil, Slot11 = nil}
	}
end

function SaveData(player)
	print(LivePlayerData)
	local UUID = player.UserId
	local Data = LivePlayerData[UUID]
	local TableToSave = {
		MaleName = Data.CharacterData.MaleName,
		FemaleName = Data.CharacterData.FemaleName,
		GuildName = Data.CharacterData.GuildName,
		Currency = Data.CharacterData.Currency,
		Health = Data.CharacterData.Health,
		Lives = Data.CharacterData.Lives,
		Alignment = Data.CharacterData.Alignment,
		ManaAbilities_ManaSpeed = Data.CharacterData.ManaAbilities.ManaSpeed,
		ManaAbilities_ManaRun = Data.CharacterData.ManaAbilities.ManaRun,
		ManaAbilities_ManaClimb = Data.CharacterData.ManaAbilities.ManaClimb,
		ManaAbilities_ManaClimbSpeed = Data.CharacterData.ManaAbilities.ManaClimbSpeed,
		ManaAbilities_ManaPunch = Data.CharacterData.ManaAbilities.ManaPunch,
		ManaAbilities_HasMana = Data.CharacterData.ManaAbilities.HasMana,
		Race_RaceType = Data.CharacterData.Race.RaceType,
		Race_RaceVar = Data.CharacterData.Race.RaceVar,
		Armour_ArmourType = Data.CharacterData.Armour.ArmourType,
		Armour_hpboost = Data.CharacterData.Armour.hpboost,
		Armour_speedboost = Data.CharacterData.Armour.speedboost,
		SpawnPoint = Data.CharacterData.SpawnData.SpawnPoint,
		SpawnPosition = Data.CharacterData.SpawnData.SavedPosition
	}
	local success, err = pcall(function()
		DS_MainDataStore:SetAsync(UUID, TableToSave)
	end)
	
	if success then
		warn("DATA SAVED")
	else
		print(err)
		warn("DATA DID NOT SAVE!")
	end
end

PlayersService.PlayerAdded:Connect(function(player)
	CreateDefaultDataTable(player)
	local UUID = player.UserId
	local Data
	
	local success, err = pcall(function()
		Data = DS_MainDataStore:GetAsync(UUID)
	end)
	
	if success and Data then
		LivePlayerData[UUID]["CharacterData"]["MaleName"] = Data.MaleName
		LivePlayerData[UUID]["CharacterData"]["FemaleName"] = Data.FemaleName
		LivePlayerData[UUID]["CharacterData"]["GuildName"] = Data.GuildName
		LivePlayerData[UUID]["CharacterData"]["Currency"] = Data.Currency
		LivePlayerData[UUID]["CharacterData"]["Health"] = Data.Health
		LivePlayerData[UUID]["CharacterData"]["Lives"] = Data.Lives
		LivePlayerData[UUID]["CharacterData"]["Alignment"] = Data.Alignment
		LivePlayerData[UUID]["CharacterData"]["ManaAbilities"]["ManaSpeed"] = Data.ManaAbilities_ManaSpeed
		LivePlayerData[UUID]["CharacterData"]["ManaAbilities"]["ManaRun"] = Data.ManaAbilities_ManaRun
		LivePlayerData[UUID]["CharacterData"]["ManaAbilities"]["ManaClimb"] = Data.ManaAbilities_ManaClimb
		LivePlayerData[UUID]["CharacterData"]["ManaAbilities"]["ManaClimbSpeed"] = Data.ManaAbilities_ManaClimbSpeed
		LivePlayerData[UUID]["CharacterData"]["ManaAbilities"]["ManaPunch"] = Data.ManaAbilities_ManaPunch
		LivePlayerData[UUID]["CharacterData"]["ManaAbilities"]["HasMana"] = Data.ManaAbilities_HasMana
		LivePlayerData[UUID]["CharacterData"]["Race"]["RaceType"] = Data.Race_RaceType
		LivePlayerData[UUID]["CharacterData"]["Race"]["RaceVar"] = Data.Race_RaceVar
		LivePlayerData[UUID]["CharacterData"]["SpawnData"]["SpawnPoint"] = Data.SpawnPoint
		LivePlayerData[UUID]["CharacterData"]["SpawnData"]["SavedPosition"] = Data.SpawnPosition

	else

		warn(player.Name.. " HAS NO DATA! / DATA DD NOT SAVE! ( NEW USER? )")
		print(err)
	end
	
	local function OnCharacterAdded(Character)
		local RaceName, VarNum = RaceHandler:ChooseRandomRace(player, LivePlayerData)
		SpawnHandler:SpawnCharacter(player, LivePlayerData, Character)
	end
	
	local function onCharacterRemoving(Character)
		SpawnHandler:SaveSpawnPos(player, LivePlayerData, Character)
	end
	
	OnCharacterAdded(player.Character or player.CharacterAdded:wait())
	player.CharacterAdded:Connect(OnCharacterAdded)
	
	onCharacterRemoving(player.CharacterRemoving:Wait())
	player.CharacterRemoving:Connect(onCharacterRemoving)
end)

check = function()
	if #PlayersService:GetPlayers() == 1 then
		return false
	else
		return true
	end
end

PlayersService.PlayerRemoving:Connect(function(player)
	if check() == true then
		local UUID = player.UserId
		
		local success, err = pcall(function()
			SaveData(player)
		end)
		
		if success then
			LivePlayerData[UUID] = nil
			warn("DATA SAVED!")
		else
			LivePlayerData[UUID] = nil
			print(err)
			-- run function to attempt another save, the data is saved to a temporary "failed save" table to protect the data from simply being thrown away once the player leaves.
			warn("DATA DID NOT SAVE!")
		end
	end
end)


game:BindToClose(function()
	for _, player in pairs(game.Players:GetPlayers()) do
		local UUID = player.UserId
		local success, err = pcall(function()
			SaveData(player)
		end)
		
		if success then
			LivePlayerData[UUID] = nil
			warn("DATA SAVED!")
		else
			print(err)
			LivePlayerData[UUID] = nil
			warn("DATA DID NOT SAVE")
		end
	end
end)

After testing I was able to rule the issue down to something to do with the data not saving.

You are checking is 1 player is in the game:

check = function()
	if #PlayersService:GetPlayers() == 1 then
		return false
	else
		return true
	end
end

You have a condition for true but you don’t have a condition for false:

PlayersService.PlayerRemoving:Connect(function(player)
	if check() == true then
		
		
		local UUID = player.UserId
		local success, err = pcall(function()
			SaveData(player)
		end)

		if success then
			LivePlayerData[UUID] = nil
			warn("DATA SAVED!")
		else
			LivePlayerData[UUID] = nil
			print(err)
			-- run function to attempt another save, the data is saved to a temporary "failed save" table to protect the data from simply being thrown away once the player leaves.
			warn("DATA DID NOT SAVE!")
		end
		
		
	end
end)

To my understanding, it’s effectively: If more than one player is in the game, then PlayerRemoving will run because Check() will return true, otherwise if there is only one player in the game, It won’t matter as game:BindToClose() will run a save function on all in-game players regardless.

Please correct me if I am mistaken, I appreciate the response.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.