Data not always saving(skins)

Hello,
I have a massive problem.
the players data won’t always save(skins, gears, traps only)
Script:

Players.PlayerAdded:Connect(function(Player)
	
	print('new plr')
	
	BadgeGiver:AwardBadge(Player,2124598270)
	
	Player.CharacterAdded:Connect(function(Character)
		print('new char')
		Character.Humanoid.Died:Connect(function()
			print('char')
			if not Player:FindFirstChild('DogeTag') then
				print('not doge')
				if table.find(PlayingPlayers,Player) then
					if Player.PlayerGui:FindFirstChild('CollectGems') then
						Player.PlayerGui.CollectGems:Destroy()
					end
					
					if Player.PlayerGui:FindFirstChild('IndicatorGui') then
						Player.PlayerGui.IndicatorGui:Destroy()
					end
					print('is playing')
					if Player:FindFirstChild('ContestantTag') then
						Player.ContestantTag:Destroy()
					end
					Player.CanSpectate.Value = true
					Values.KillFeed.Value = Player.Name..' was killed by the Doge!'
					local ReturnValue = table.find(PlayingPlayers,Player)
					table.remove(PlayingPlayers,ReturnValue)
				end
			end
		end)
	end)
	
	print('calculating')
	

	
	
	if Player.UserId == 1761967232 then
		for _, OtherPlayer in pairs(Players:GetPlayers()) do
			BadgeGiver:AwardBadge(OtherPlayer,2124598282)
		end
	end
		
	if Player.UserId == 191080541 then
		for _, OtherPlayer in pairs(Players:GetPlayers()) do
			BadgeGiver:AwardBadge(OtherPlayer,2124598283)
		end
	end 
	
	local Leaderstats = Instance.new('Folder',Player)
	Leaderstats.Name = 'Leaderstats'
	
	local Gems = Instance.new('IntValue',Leaderstats)
	Gems.Name = 'Gems'
	Gems.Value = DefaultGemsValue
	
	local MapVoted = Instance.new('IntValue',Player)
	MapVoted.Name = 'MapVoted'
	
	local EquippedSkin = Instance.new('StringValue',Player)
	EquippedSkin.Name = 'EquippedSkin'
	EquippedSkin.Value = 'Default'
	
	local TrapCount = Instance.new('IntValue',Player)
	TrapCount.Name = 'TrapCount'
	if not MarketplaceService:UserOwnsGamePassAsync(Player.UserId,11471437) then
		TrapCount.Value = 7
	else
		TrapCount.Value = 14
	end
	
	local EquippedTrap = Instance.new('StringValue',Player)
	EquippedTrap.Name = 'EquippedTrap'
	EquippedTrap.Value = 'Default'
	
	
	local TrapDebounce = Instance.new('BoolValue',Player)
	TrapDebounce.Name = 'TrapDebounce'
	TrapDebounce.Value = false
	
	local SeenLuke = Instance.new('BoolValue',Player)
	SeenLuke.Name = 'SeenLuke'
	SeenLuke.Value = false
	
	local OwnedSkins = Instance.new('Folder',Player)
	OwnedSkins.Name = 'OwnedSkins'
	
	local DefaultSkin = Instance.new('StringValue',OwnedSkins)
	DefaultSkin.Name = 'Default'
	
	local OwnedTraps = Instance.new('Folder',Player)
	OwnedTraps.Name = 'OwnedTraps'
	
	local DefaultTrap = Instance.new('StringValue',OwnedTraps)
	DefaultTrap.Name = 'Default'
	
	local OwnedGears = Instance.new('Folder',Player)
	OwnedGears.Name = 'OwnedGears'
	
	local EquippedGear = Instance.new('StringValue',Player)
	EquippedGear.Name = 'EquippedGear'
	EquippedGear.Value = 'Default'
	
	local DefaultGear = Instance.new('StringValue',OwnedGears)
	DefaultGear.Name = 'Default'
	
	local CanCrouch = Instance.new('BoolValue',Player)
	CanCrouch.Name = 'CanCrouch'
	CanCrouch.Value = true
	
	local GemCount = Instance.new('IntValue',Player)
	GemCount.Name = 'GemCount'
	GemCount.Value = 0
	
	local MaxGems = Instance.new('IntValue',Player)
	MaxGems.Name = 'MaxGems'
	if MarketplaceService:UserOwnsGamePassAsync(Player.UserId,11502286) or MarketplaceService:UserOwnsGamePassAsync(Player.UserId,11291087) then
		MaxGems.Value = 50
	else
		MaxGems.Value = 25
	end
	
	local Wins = Instance.new('IntValue',Player)
	Wins.Name = 'Wins'
	Wins.Value = 0
	
	local Kills = Instance.new('IntValue',Player)
	Kills.Name = 'Kills'
	Kills.Value = 0
	
	local Chance = Instance.new('IntValue',Player)
	Chance.Name = 'DogeChance'
	
	local CanSpectate = Instance.new('BoolValue',Player)
	CanSpectate.Name = 'CanSpectate'
	if GameRunning == true then
		CanSpectate.Value = true
	else
		CanSpectate.Value = false
	end
	
	local FirstTrap = Instance.new('BoolValue',Player)
	FirstTrap.Name = 'FirstTrap'
	FirstTrap.Value = true
	
	
	wait()
	
	if MarketplaceService:UserOwnsGamePassAsync(Player.UserId,11291087) and not Player.OwnedSkins:FindFirstChild('VIP') then
		Player.Leaderstats.Gems.Value += 5000
		local VIP = Instance.new('StringValue',Player.OwnedSkins)
		VIP.Name = 'VIP'
		local ZombieAxe = Instance.new('StringValue',Player.OwnedGears)
		ZombieAxe.Name = 'ZombieAxe'
		wait(.3)
		Player.MaxGems.Value = 50
		Events.UpdateBackpack:FireClient(Player,'VIP')
		wait(.3)
		Events.UpdateBackpack:FireClient(Player,'ZombieAxe')
	end
	
	CalculateChances()
	
	local GemsStore,EquippedSkinStore,EquippedTrapStore,SeenLukeStore,EquippedGearStore,WinsStore,KillsStore
	
	local savedSkins = skinsDS:GetAsync(Player.UserId) or {}
	local savedTraps = trapsDS:GetAsync(Player.UserId) or {}
	local savedGears = gearsDS:GetAsync(Player.UserId) or {}
	
	local Success, ErrorMessage = pcall(function()
		GemsStore = dStore:GetAsync(Player.UserId.."Gems")
		EquippedSkinStore = dStore:GetAsync(Player.UserId..'EquippedSkin')
		EquippedTrapStore = dStore:GetAsync(Player.UserId..'EquippedTrap')
		SeenLukeStore = dStore:GetAsync(Player.UserId..'SeenLuke')
		EquippedGearStore = dStore:GetAsync(Player.UserId..'EquippedGear')
		WinsStore = dStore:GetAsync(Player.UserId..'Wins')
		KillsStore = dStore:GetAsync(Player.UserId..'Kills')
	end)
	
	if not Success then
		warn('An error occured while getting '..Player.Name..'\'s data: '..ErrorMessage)
	end
	
	if GemsStore ~= nil then
		Player.Leaderstats.Gems.Value = GemsStore
	end
	
	if EquippedSkinStore ~= nil then
		Player:WaitForChild('EquippedSkin').Value = EquippedSkinStore
	end
	
	if EquippedTrapStore ~= nil then
		Player.EquippedTrap.Value = EquippedTrapStore
	end
	
	if EquippedGearStore ~= nil then
		Player.EquippedGear.Value = EquippedGearStore
	end
	
	if SeenLukeStore ~= nil then
		Player.SeenLuke.Value = SeenLukeStore
	end
	
	if WinsStore ~= nil then
		Player.Wins.Value = WinsStore
	end
	
	if KillsStore ~= nil then
		Player.Kills.Value = KillsStore
	end
	
	for i, SavedSkin in pairs(savedSkins) do
		local Skin = Instance.new('StringValue',Player.OwnedSkins)
		Skin.Name = SavedSkin
		wait()
		game.ReplicatedStorage.Events.UpdateBackpack:FireClient(Player,SavedSkin)
	end
	
	for i, SavedTrap in pairs(savedTraps) do
		local Trap = Instance.new('StringValue',Player.OwnedTraps)
		Trap.Name = SavedTrap
		wait()
		game.ReplicatedStorage.Events.UpdateBackpack:FireClient(Player,SavedTrap)
	end
	
	for _, SavedGear in pairs(savedGears) do
		local Gear = Instance.new('StringValue',Player.OwnedGears)
		Gear.Name = SavedGear
		wait()
		game.ReplicatedStorage.Events.UpdateBackpack:FireClient(Player,SavedGear)
	end
	
	
	


	
	
end)

	
Events.RemovePlayer.OnServerEvent:Connect(function(Player)
	if table.find(PlayingPlayers,Player) then
		if not Player:FindFirstChild('DogeTag') then
			Values.KillFeed.Value = Player.Name..' was killed by the Doge!'
			local ReturnValue = table.find(PlayingPlayers,Player)
			table.remove(PlayingPlayers,ReturnValue)
			wait(.5)
			print(#PlayingPlayers)
		end
	end	
end)

Players.PlayerRemoving:Connect(function(Player)
	
	CalculateChances()
	
	if table.find(PlayingPlayers,Player) then
		local ReturnValue = table.find(PlayingPlayers,Player)
		table.remove(PlayingPlayers,ReturnValue)
	end
	local Gems = Player.Leaderstats.Gems
	local EquippedSkin = Player.EquippedSkin
	local EquippedTrap = Player.EquippedTrap
	local SeenLuke = Player.SeenLuke
	local OwnedSkins = Player.OwnedSkins
	local OwnedTraps = Player.OwnedTraps
	local OwnedGears = Player.OwnedGears
	local EquippedGear = Player.EquippedGear
	local Wins = Player.Wins
	local Kills = Player.Kills
	
	local SavedSkins = {}
	local SavedTraps = {}
	local SavedGears = {}
			
	for i, SavedSkin in pairs(OwnedSkins:GetChildren()) do
				
		table.insert(SavedSkins,SavedSkin.Name)
				
	end
	
	for i, SavedTrap in pairs(OwnedTraps:GetChildren()) do
		
		table.insert(SavedTraps,SavedTrap.Name)
		
	end
	
	for i, SavedGear in pairs(OwnedGears:GetChildren()) do
		
		table.insert(SavedGears,SavedGear.Name)
		
	end
	
	local Success, ErrorMessage = pcall(function()
		dStore:SetAsync(Player.UserId.."Gems",Gems.Value)
		dStore:SetAsync(Player.UserId..'EquippedSkin',EquippedSkin.Value)
		dStore:SetAsync(Player.UserId..'EquippedTrap',EquippedTrap.Value)
		dStore:SetAsync(Player.UserId..'SeenLuke',SeenLuke.Value)
		skinsDS:SetAsync(Player.UserId,SavedSkins)
		trapsDS:SetAsync(Player.UserId,SavedTraps)
		gearsDS:SetAsync(Player.UserId,SavedGears)
		dStore:SetAsync(Player.UserId..'EquippedGear',EquippedGear.Value)
		dStore:SetAsync(Player.UserId..'Wins',Wins.Value)
		dStore:SetAsync(Player.UserId..'Kills',Kills.Value)
	end)
	
	if not Success then
		warn('An error occured while saving '..Player.Name..'\'s data: '..ErrorMessage)
	end
	

end)

game:BindToClose(function()
	
	for _, Player in pairs(game.Players:GetPlayers()) do
		
		spawn(function()
			
			local Gems = Player.Leaderstats.Gems
			local EquippedSkin = Player.EquippedSkin
			local EquippedTrap = Player.EquippedTrap
			local SeenLuke = Player.SeenLuke
			local OwnedSkins = Player.OwnedSkins
			local OwnedTraps = Player.OwnedTraps
			local OwnedGears = Player.OwnedGears
			local EquippedGear = Player.EquippedGear
			local Wins = Player.Wins
			local Kills = Player.Kills
			
			local SavedSkins = {}
			local SavedTraps = {}
			local SavedGears = {}
			
			for i, SavedSkin in pairs(OwnedSkins:GetChildren()) do
				
				table.insert(SavedSkins,SavedSkin.Name)
				
			end
			
			for i, SavedTrap in pairs(OwnedTraps:GetChildren()) do
		
				table.insert(SavedTraps,SavedTrap.Name)
		
			end
			
			for i, SavedGear in pairs(OwnedGears:GetChildren()) do
		
				table.insert(SavedGears,SavedGear.Name)
		
			end
	
			
			local Success, ErrorMessage = pcall(function()
				
				dStore:SetAsync(Player.UserId.."Gems",Gems.Value)
				dStore:SetAsync(Player.UserId..'EquippedSkin',EquippedSkin.Value)
				dStore:SetAsync(Player.UserId..'EquippedTrap',EquippedTrap.Value)
				dStore:SetAsync(Player.UserId..'SeenLuke',SeenLuke.Value)	
				skinsDS:SetAsync(Player.UserId,SavedSkins)
				trapsDS:SetAsync(Player.UserId,SavedTraps)
				gearsDS:SetAsync(Player.UserId,SavedGears)
				dStore:SetAsync(Player.UserId..'EquippedGear',EquippedGear.Value)
				dStore:SetAsync(Player.UserId..'Wins',Wins.Value)
				dStore:SetAsync(Player.UserId..'Kills',Kills.Value)
				
			end)
			
	
			if not Success then
				
				warn('An error occured while saving '..Player.Name..'\'s data: '..ErrorMessage)
				
			end
			
		end)
		
	end
	
	wait(10)
	
end)

I don’t know why this happens, anyone know why? People are complaining due to this!

I didn’t read the whole script thoroughly, but the first thing I noticed is that when a player leaves the game, SetASync is called 10 times. This is the upper maximum for each player, and if your server calls DataStores anywhere else, you may be exceeding the limit which causes data loss.

Even if this isn’t the issue, it may become one in the future so just keep an eye on it.