First, the code:

local lib = assert(LoadLibrary("RbxUtility"))

game.Players.PlayerAdded:connect(function(p)
	p.Character.Humanoid.Died:connect(function()
		local credittab = lib.DecodeJSON(p.PlayerGui.Creds.Value)
		p.CharacterAdded:connect(function(char)
			p.PlayerGui.Creds.Value = lib.EncodeJSON(credittab)
		end)
	end)
end)

Now let me explain what I am trying to do:

There is a value in PlayerGui called "Creds" which holds a JSON string indicating how many Credits a player has. However, whenever the player resets, this value is reset. I am trying to prevent that from happening.

I have previously (before the above version of the script) attempted this:

local lib = assert(LoadLibrary("RbxUtility"))

game.Players.PlayerAdded:connect(function(p)
	p.Character.Humanoid.Died:connect(function()
		local credittab = lib.DecodeJSON(p.PlayerGui.Creds.Value)
		repeat wait() until p.Character
		wait(1)
		p.PlayerGui.Creds.Value = lib.EncodeJSON(credittab)
	end)
end)

As well as this:

local lib = assert(LoadLibrary("RbxUtility"))

game.Players.PlayerAdded:connect(function(p)
	p.Character.Humanoid.Died:connect(function()
		local credittab = lib.DecodeJSON(p.PlayerGui.Creds.Value)
		repeat wait() until p.CharacterAdded
		wait(1)
		p.PlayerGui.Creds.Value = lib.EncodeJSON(credittab)
	end)
end)

I believe the problem may lie with my lack of understanding of .Died.

If you require any extra information to fully understand my question, please ask.