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

Why is my Debounce Failing...?

Asked by 8 years ago

As the Title says, my Debounce in a script is not working. I am probably doing something extremely stupid which I am overlooking. Anyways, here is the script.

local DefenceBush = game.Workspace.DefenceBush



DefenceBush.TouchMe.Touched:connect(function(Hit)
    if Hit.Name ~= "Handle" and Hit.Parent:FindFirstChild("Humanoid") and Hit.Parent.Humanoid.Health ~= 0 then
        local DB = false
        if DB == false then DB = true
            wait(60)
            DB = false
        end
    end
end)

All that occurs is the second a player makes contact with the Berry Bush, we check to see if It's a player that is alive and then I make my Debounce (DB) as false and check if it's false, if so, make it true then continue the script which decided randomly whether the player get 1-3 berries then a 60 second cooldown occurs and DB becomes true thus making the Berries visible. The player should not be able to receive berries when they touch the Bush during the cooldown, however they do.

2 answers

Log in to vote
2
Answered by
BlueTaslem 18071 Moderation Voter Administrator Community Moderator Super Administrator
8 years ago

Your use of the debounce pattern is very subtly wrong.

Normally, you always want to use local variables, so that functions don't have side-effects--everything that a function/loop/condition computes doesn't affect anything else.

However, in this case, the point of DB is supposed to affect other functions -- when something else touches the button, it needs to know that DB is supposed to be true.

You want to define DB before the definition of the function.

local DB

DefenceBush.TouchMe.Touched:connect(function(Hit)
    if Hit.Name ~= "Handle" and Hit.Parent:FindFirstChild("Humanoid") and Hit.Parent.Humanoid.Health ~= 0 then
        DB = false
        ....

I really recommend a better name than "DB". Maybe alreadyTouching or disabled would be much clearer.

0
Thank you for the assistance. alphawolvess 1784 — 8y
Ad
Log in to vote
1
Answered by
Necrorave 560 Moderation Voter
8 years ago

Declare DB outside the function. It recreates DB everytime someone touches it.

local DefenceBush = game.Workspace.DefenceBush

local DB = false -- Moved it to here, this should prevent it from being recreated

DefenceBush.TouchMe.Touched:connect(function(Hit)
    if Hit.Name ~= "Handle" and Hit.Parent:FindFirstChild("Humanoid") and Hit.Parent.Humanoid.Health ~= 0 then
        if DB == false then DB = true
            local Plr = game.Players:GetPlayerFromCharacter(Hit.Parent)
            local Get = DefenceBush.Berries:GetChildren()
            for _, Berry in pairs(Get) do
                Berry.Transparency = 1
            end
            local More = math.random(0,5)
            local DBerry = game.ReplicatedStorage.DefenceBerry:Clone()
            local DBerry2 = game.ReplicatedStorage.DefenceBerry:Clone()
            local DBerry3 = game.ReplicatedStorage.DefenceBerry:Clone()
            if More == 3 then
                DBerry.Parent = Plr.Backpack
                DBerry2.Parent = Plr.Backpack
            elseif More == 5 then
                DBerry.Parent = Plr.Backpack
                DBerry2.Parent = Plr.Backpack
                DBerry3.Parent = Plr.Backpack
            else 
                DBerry.Parent = Plr.Backpack
            end
            wait(60)
            DB = false
            for _, Berry in pairs(Get) do
                Berry.Transparency = 0
            end
        end
    end
end)

Let me know how that works and if you have any questions!

EDIT: BlueTaslem gives a much better explanation though!

Answer this question