Hi,
I have an obby game whose data store script was a typical “don’t touch or you will spoil” code. I needed to add new features so I needed to come back there and now after my changes nothing is working, it’s not saving. Code is messy because while writing it, I changed my mind about its style at least 4 times. Could someone help?
local DataStoreService = game:GetService("DataStoreService")
local datastore = DataStoreService:GetDataStore("AllData")
local Players = game:GetService("Players")
local playersData = {}
local playersJoinDates = {}
local playersSignalObjects = {}
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Parent = player
leaderstats.Name = "leaderstats"
local ObbiesBeaten = Instance.new("IntValue")
ObbiesBeaten.Parent = leaderstats
ObbiesBeaten.Name = "Obbies Beaten"
local Points = Instance.new("IntValue")
Points.Parent = leaderstats
Points.Name = "Points"
local playerData = Instance.new("Folder")
playerData.Parent = player
playerData.Name = "playerData"
local signalToLoadData = Instance.new("BoolValue")
signalToLoadData.Name = player.Name
playersSignalObjects[player.UserId] = signalToLoadData
local difficultiesData = {"SuperEasy", "Easy", "Medium", "Hard", "Insane", "NoMercy"}
playersJoinDates[tostring(player.UserId)] = DateTime.now().UnixTimestamp
local allData = {
["ObbiesBeaten"] = 0;
["Points"] = 0;
["TimeInGame"] = 0;
["SuperEasy"] = 0;
["Easy"] = 0;
["Medium"] = 0;
["Hard"] = 0;
["Insane"] = 0;
["NoMercy"] = 0;
["firstAccountAge"] = player.AccountAge;
["CodesReedemed"] = {}
}
local allDataImported
local success, err = pcall(function()
allDataImported = datastore:GetAsync(player.UserId) or allData
end)
for index, value in pairs(allData) do
if not allDataImported[index] then
allDataImported[index] = allData[index]
end
end
createCodesReedemedFolder(player, allDataImported["CodesReedemed"])
for _, value in ipairs(difficultiesData) do
local container = Instance.new("IntValue")
container.Parent = playerData
container.Value = allDataImported[value]
container.Name = value
container.Changed:Connect(function(newValue)
allDataImported[value] = newValue
end)
end
ObbiesBeaten.Value = allDataImported["ObbiesBeaten"]
ObbiesBeaten.Changed:Connect(function(newValue)
allDataImported["ObbiesBeaten"] = newValue
end)
Points.Value = allDataImported["Points"]
Points.Changed:Connect(function(newValue)
print("changed")
allDataImported["Points"] = newValue
end)
spawn(function()
while task.wait(0.2) do
print(playersData[player.UserId])
end
end)
signalToLoadData.Changed:Connect(function(newValue)
if not newValue then return end
playersData[player.UserId] = allDataImported
signalToLoadData.Value = false
end)
end)
Players.PlayerRemoving:Connect(function(player)
updatePlayerData(player)
end)
game:BindToClose(function()
for _, player in ipairs(Players:GetChildren()) do
updatePlayerData(player)
end
end)
function updatePlayerData(player)
local playerSignal = playersSignalObjects[player.UserId]
playerSignal.Changed:Connect(function(newValue)
if newValue then return end
print(playersData[player.UserId])
uploadChanges(player)
local success, err = pcall(function()
datastore:SetAsync(player.UserId, playersData[player.UserId])
end)
print(playersData[player.UserId])
playersData[player.UserId] = nil
end)
playerSignal.Value = true
end
function uploadChanges(player)
assert(playersData[player.UserId]["TimeInGame"] ~= nil, "TimeInGame = nil") -- sometimes it's errors and says attempt to index nil
playersData[player.UserId]["TimeInGame"] += DateTime.now().UnixTimestamp - playersJoinDates[tostring(player.UserId)]
playersJoinDates[player.UserId] = nil
local CodesReedemed = {}
for index, value in ipairs(player.playerData.CodesReedemed:GetChildren()) do
CodesReedemed[index] = value
end
playersData[player.UserId]["CodesReedemed"] = CodesReedemed
end
function createCodesReedemedFolder(player, CodesReedemed)
local CodesReedemedFolder = Instance.new("Folder")
CodesReedemedFolder.Parent = player.playerData
CodesReedemedFolder.Name = "CodesReedemed"
for _, v in ipairs(CodesReedemed) do
local container = Instance.new("Folder")
container.Parent = CodesReedemedFolder
container.Name = v
end
end