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.