I broke my data store script by trying to add new features

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
1 Like