DataStore isn't saving table?

Hello, I’ve been trying to fix this for ages but it never saves.

local ds=game:GetService("DataStoreService"):GetDataStore("PlayerData")

game.Players.PlayerAdded:connect(function(plr)
	local leaderstats=Instance.new("IntValue",plr);leaderstats.Name="leaderstats"
	local clout=Instance.new("IntValue",leaderstats);clout.Name="Clout"
	local coins=Instance.new("IntValue",plr);coins.Name="Coins"
	local storage=Instance.new("NumberValue",plr);storage.Name="Storage"
	local equipped=Instance.new("ObjectValue",plr);equipped.Name="equipped";equipped.Value=game.ReplicatedStorage.FlexTools:FindFirstChild("1¢")
	storage.Value=5
	local clout_multiplier=Instance.new("NumberValue",plr);clout_multiplier.Name="clout_multiplier";clout_multiplier.Value=1
	local coin_multiplier=Instance.new("NumberValue",plr);coin_multiplier.Name="coin_multiplier";coin_multiplier.Value=1
	local dela=Instance.new("BoolValue",plr);dela.Name="DelayActive";dela.Value=false
	local rank=Instance.new("StringValue",plr.leaderstats);rank.Name="Rank";rank.Value="Noob"
	local dsLoaded=Instance.new("BoolValue",plr);dsLoaded.Name="dsLoaded"
	--Datastore Part--
	local PlayerData;
	local CanSave=Instance.new('BoolValue',plr)
	CanSave.Name="CanSaveData"
	CanSave.Value=true
	local DataFetchSuccess,ErrorMessage=pcall(function()
	PlayerData=ds:GetAsync(plr.UserId)
	end)
	if DataFetchSuccess then --Data successfully loaded.
		dsLoaded.Value=true
		print("player data loaded,")
		if PlayerData~=nil then
			local t=PlayerData
			--[[
			plr.leaderstats.Clout.Value=t.clout
			plr.leaderstats.Rank.Value=t.rank
			plr.Storage.Value=t.storage
			plr.Coins.Value=t.coins
			plr.equipped.Value=t.equipped
			plr.coin_multiplier.Value=t.multiplier
			plr.clout_multiplier.Value=t.cMultiplier
			--]]
		else
			local first=Instance.new("Model",plr);first.Name="FirstTime"
		end
	else
		plr.CanSaveData.Value=false
		plr:Kick("Your data failed to load, please try again in a few minutes.")		
	end
end)

game.Players.PlayerRemoving:connect(function(plr)
	local PlayerData={
	["clout"]=plr.leaderstats.Clout.Value,
	["rank"]=plr.leaderstats.Rank.Value,
	["storage"]=plr.Storage.Value,
	["coins"]=plr.Coins.Value,
	["equipped"]=plr.equipped.Value,
	["multiplier"]=plr.coin_multiplier.Value,
	["cMultiplier"]=plr.clout_multiplier.Value,
	}
	if plr.CanSaveData.Value==false then return end
	local DataWriteSuccess,ErrorMessage=pcall(function()
		ds:SetAsync(plr.UserId,PlayerData)
	end)
	if not DataWriteSuccess then
		print("data failed to load")
		local Retry_Count=0
		while Retry_Count<6 do
			wait(60)
			local Succeded,Error=pcall(function()
				ds:SetAsync(plr.UserId,PlayerData)
			end)
			if Succeded then break end
			Retry_Count=Retry_Count+1
		end
	end
end)```

Can you output what “ErrorMessage” is. It should contain info on why the save failed.

Other
I would also advise agains using Value object as it leads to a more complex save / load system.
The wait time between saves is too large. Also I would swap it for a for loop then break if it saves

104: Cannot store Dictionary in data store. Data stores can only accept valid UTF-8 characters.

It looks like the ObjectValue you use to store the equipped tool is the issue here. I would swap it to an id system then just store the id value.

Edit
You may find it usefull to have a function for prepare for save and load from saved. The idea is to do any preprocessing needed for player data.