I'm literally getting such a headache. Please help me...

local DatastoreService = game:GetService("DataStoreService")
local Datastore = DatastoreService:GetDataStore("ControlDatastore1|4")

function saveData(player)
	
	local shirts = {}
	local shirtsEquippedState = {}
	local shirtIds = {}
	local pants = {}
	local pantIds = {}
	
	for _,shirtsOwned in pairs(player.ShirtsFolder:GetChildren()) do
		
		table.insert(shirts,shirtsOwned.Name)
		table.insert(shirtsEquippedState,shirtsOwned.IsEquipped.Value)
		table.insert(shirtIds,shirtsOwned.ShirtId.Value)
	end
	
	for _,pantsOwned in pairs(player.PantsFolder:GetChildren()) do

		table.insert(shirts,pantsOwned.Name)
		table.insert(shirtIds,pantsOwned.PantId.Value)
	end
	
	local success,errorMsg = pcall(function()
		
		Datastore:SetAsync(player.UserId.."-controinsData",player.MiscStats.Controins.Value)
		Datastore:SetAsync(player.UserId.."-shirtsData",shirts)
		Datastore:SetAsync(player.UserId.."-equippedStateShirts",shirtsEquippedState)
		Datastore:SetAsync(player.UserId.."-shirtIdsData",shirtIds)
		Datastore:SetAsync(player.UserId.."-pantsData",pants)
		Datastore:SetAsync(player.UserId.."-pantsIdsData",pantIds)
	end)
end

game.Players.PlayerAdded:Connect(function(player)
	
	player.CharacterAdded:Connect(function(char)
	
	local miscStats = Instance.new("Folder")
	miscStats.Name = "MiscStats"
	miscStats.Parent = player
	
	local shirtsFolder = Instance.new("Folder")
	shirtsFolder.Name = "ShirtsFolder"
	shirtsFolder.Parent = player
	
	local pantsFolder = Instance.new("Folder")
	pantsFolder.Name = "PantsFolder"
	pantsFolder.Parent = player
	
	local controins = Instance.new("NumberValue")
	controins.Name = "Controins"
	controins.Parent = miscStats
	
	local controinsData,shirtsData,isEquippedStateShirtsData,shirtIdsData,pantsData,pantIdsData
	
	local success,errorMsg = pcall(function()
		
		controinsData = Datastore:GetAsync(player.UserId.."-controinsData")
		shirtsData = Datastore:GetAsync(player.UserId.."-shirtsData")
		isEquippedStateShirtsData = Datastore:GetAsync(player.UserId.."-equippedStateShirts")
		shirtIdsData = Datastore:GetAsync(player.UserId.."-shirtIdsData")
		pantsData = Datastore:GetAsync(player.UserId.."-pantsData")
		pantIdsData = Datastore:GetAsync(player.UserId.."-pantsIdsData")
	end)
	
	if success then
		
		if controinsData then
			
			controins.Value = controinsData
			
			for x = 1,#shirtsData do
					
				local newShirt = Instance.new("StringValue")
				newShirt.Name = shirtsData[x]
				newShirt.Value = shirtsData[x]
				newShirt.Parent = player.ShirtsFolder
					
				local shirtId = Instance.new("NumberValue")
				shirtId.Name = "ShirtId"
				shirtId.Value = shirtIdsData[x]
				shirtId.Parent = newShirt
				
				local isEquipped = Instance.new("BoolValue")
				isEquipped.Name = "IsEquipped"
				isEquipped.Value = isEquippedStateShirtsData[x]
				isEquipped.Parent = newShirt
				
				if isEquipped.Value == true then
						
						local shirt = char:FindFirstChild("Shirt")
						
					 if shirt then
													
						shirt:Destroy()
							
						local newClothing = Instance.new("Shirt")
						newClothing.Name = "Shirt"
						newClothing.ShirtTemplate = "http://www.roblox.com/asset/?id="..shirtId.Value+1	
						newClothing.Parent = char
					end
				end
			end
			
			for x = 1,#pantsData do

				local newPants = Instance.new("StringValue")
				newPants.Name = pantsData[x]
				newPants.Value = pantsData[x]
				newPants.Parent = player.PantsFolder

				local pantId = Instance.new("NumberValue")
				pantId.Name = "ShirtId"
				pantId.Value = pantIdsData[x]
				pantId.Parent = newPants
			end
		else
			 controins.Value = 25
			end
		end
	end)
end)

game.Players.PlayerRemoving:Connect(function(player)
	
	saveData(player)
end)

game:BindToClose(function()
	
	for _,players in pairs(game.Players:GetPlayers()) do
		
		saveData(players)
	end
end)