local DataStoreService = game:GetService("DataStoreService")
local PlayerDataStore = DataStoreService:GetDataStore("PlayerDataStore")
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local ReplicatedFirst = game:GetService("ReplicatedFirst")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local dataFolder = ReplicatedFirst.DataFolder
local leaderstatsFolder = ReplicatedFirst.leaderstats
local remoteEventsFolder = ReplicatedStorage.Remotes
local GET_DATA_INTERVAL = 3
local DISTRIBUTE_DATA_INTERVAL = 3
local function defaultData(player, pointsValue, levelValue)
player.leaderstats.Points.Value = pointsValue
player.leaderstats.Level.Value = levelValue
end
local function setPlayerDataFolder(player, user, parent)
local newDataFolder = dataFolder:Clone()
local newLeaderstatsFolder = leaderstatsFolder:Clone()
newDataFolder.Name = user
newDataFolder.Parent = parent
newLeaderstatsFolder.Parent = player
end
local function setPlayer(player)
setPlayerDataFolder(player, player.Name, ServerStorage)
local character = player.Character or player.CharacterAdded:Wait()
local nameTag = ServerStorage.NameTag:Clone()
nameTag.User.Text = player.Name
nameTag.Parent = character.Head
end
local function writeData(player)
if player then
setPlayer(player)
local playerKey = "-Data" .. player.UserId
local data = {
["Points"] = player.leaderstats.Points.Value,
["Level"] = player.leaderstats.Level.Value,
}
local Player_Data
repeat
local success, errormessage = pcall(function()
Player_Data = PlayerDataStore:GetAsync(playerKey)
end)
if success then
if Player_Data then
data["Points"] = Player_Data
data["Level"] = Player_Data
else
defaultData(player, 25, 0)
end
else
warn(string.format("Data may take longer to load than usual for %s %s %s", player.Name, "Debug_Code:", errormessage))
end
until GET_DATA_INTERVAL == 3 or success
end
end
local function distributeData(player)
local playerKey = "-Data" .. player.UserId
local data = {
["Points"] = player.leaderstats.Points.Value,
["Level"] = player.leaderstats.Level.Value,
}
repeat
local success, errormessage = pcall(function()
PlayerDataStore:SetAsync(playerKey, data)
end)
if success then
print(player.Name .. " 's data successfully saved")
else
warn(errormessage)
end
DISTRIBUTE_DATA_INTERVAL = DISTRIBUTE_DATA_INTERVAL + 1
until DISTRIBUTE_DATA_INTERVAL == 3 or success
ServerStorage[player.Name]:Destroy()
end
Players.PlayerAdded:Connect(writeData)
Players.PlayerRemoving:Connect(distributeData)
game:BindToClose(function()
for _, player in ipairs(Players:GetPlayers()) do
if player then
distributeData(player)
end
end
end)
Line that’s causing it,
data["Points"] = Player_Data
data["Level"] = Player_Data
Have tried other solutions, debugging to no avail. It also prints data saved so not sure what could be causing the issue.
I’m indexing the points and level from a dictionary and setting to Player_Data…
Another solution I tried was checking if it was nil but it wasn’t.
if success then
if Player_Data then
data["Points"] = Player_Data
data["Level"] = Player_Data
print(data["Points"]) -- prints 0, not nil