This script basically handles what happens when a player joins my game. (Like creating the stats such as hunger, thirst, and health.) It works perfectly sometimes, but other times The gui stats bars don't decrease but the script will still kill the player when the stat reaches 0. Any Idea what the problem could be?

wait(5 + math.random())

local SUMMER_CELEBRATION = 1

local PLAYER = script.Parent.Parent
local CHAR = PLAYER.Character

local ALIVE = true

function modStat(stat, val)
	local final_value = stat.Value + val

	if final_value > 100 then
		final_value = 100
	elseif final_value < 0 then
		final_value = 0
	end

	stat.Value = final_value
end

function killPlayer()
	local humanoid = CHAR.Humanoid

	if humanoid ~= nil then
		humanoid.Health = 0
	end

	ALIVE = false
end

function addDoonceCheck()
	local doonce = Instance.new("IntValue")
	doonce.Name = "DoOnce"
	doonce.Parent = PLAYER
end

function addRef(parent, ref, name)
	local reference = Instance.new("ObjectValue")
	reference.Value = ref
	reference.Name = name
	reference.Parent = parent
end

function do_make_survivor()
	local c = CHAR:GetChildren()

	for index, child in pairs(c) do
		if child.className == "Hat" then
			child:remove()
		elseif child.className == "Pants" then
			child:remove()
		elseif child.className == "Shirt" then
			child:remove()
		end
	end

	local c2 = CHAR.Torso:GetChildren()

	for index, child in pairs(c2) do
		if child.className == "Decal" then
			child:remove()
		end
	end

	local bc = CHAR["Body Colors"]

	bc.HeadColor = BrickColor.new("Cool yellow")
	bc.TorsoColor = BrickColor.new("Cool yellow")
	bc.RightArmColor = BrickColor.new("Cool yellow")
	bc.LeftArmColor = BrickColor.new("Cool yellow")
	bc.RightLegColor = BrickColor.new("Brown")
	bc.LeftLegColor = BrickColor.new("Brown")
end

function do_connect_ondeath()
	local human = CHAR.Humanoid

	human.Died:connect(on_death)
end

function on_death() --Remove backpack items to worldspace, remove stored tools to nil
	ALIVE = false --Stop da loop!

	script.Parent = PLAYER

	wait(1)

	local pos = CHAR.Head.Position
	local pack = PLAYER.Pack:GetChildren()
	local tools = PLAYER.Tools:GetChildren()

	for index, child in pairs(tools) do
		child:remove()
	end

	for index, child in pairs(pack) do
			child.Position = pos
			child.Parent = game.Workspace
			child.Locked = false
			wait()
	end

	script:remove()
end

function onEnter()
	local doonce_check = PLAYER:findFirstChild("DoOnce")

	if doonce_check == nil then
		addDoonceCheck()
		
		local pack = Instance.new("Model")
		pack.Name = "Pack"
		pack.Parent = PLAYER
		
		local packmax = Instance.new("NumberValue")
		packmax.Name = "PMax"
		packmax.Parent = PLAYER
		packmax.Value = 24

		local bldgs = Instance.new("Model")
		bldgs.Name = "Buildings"
		bldgs.Parent = PLAYER
		
		local Animals = Instance.new("Model")
		Animals.Name = "Animals"
		Animals.Parent = PLAYER

		local tools = Instance.new("Model")
		tools.Name = "Tools"
		tools.Parent = PLAYER

		local stats = Instance.new("Model")
		stats.Name = "Stats"

		local he = Instance.new("NumberValue")
		he.Name = "Health"
		he.Value = 100
		he.Parent = stats

		local hu = Instance.new("NumberValue")
		hu.Name = "Hunger"
		hu.Value = 100
		hu.Parent = stats

		local th = Instance.new("NumberValue")
		th.Name = "Thirst"
		th.Value = 100
		th.Parent = stats

		stats.Parent = PLAYER
	end
end

function getDead(he, hu, th)
	local bool = false

	bool = (bool or he.Value <= 0)
	bool = (bool or hu.Value <= 0)
	bool = (bool or th.Value <= 0)

	return bool
end

function getDrowning()
	local torso = CHAR.Torso

	return (torso.Position.y < 19 and torso.Position.y > 0)
end

function getStats()
	local stats = PLAYER.Stats
	local he = stats.Health
	local hu = stats.Hunger
	local th = stats.Thirst

	return he, hu, th
end

onEnter()
do_make_survivor()
do_connect_ondeath()

local he, hu, th = getStats()

while ALIVE do
	modStat(hu, -0.005 * SUMMER_CELEBRATION)
	modStat(th, -0.01 * SUMMER_CELEBRATION)

	if getDrowning() then
		modStat(he, -0.5)
	else
		modStat(he, 0.01 * SUMMER_CELEBRATION)
	end

	if getDead(he, hu, th) then
		modStat(he, 100)
		modStat(hu, 100)
		modStat(th, 100)

		killPlayer()
	end

	wait(0.1)
end

print("DEAD")