Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Why does this stats script work sometimes but not others?

Asked by 7 years ago

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")

Answer this question