I’m trying to make a function called “debounce.” the first parameter is how long you wait until you play the function given in the second parameter, which is where my problem is.
I get this error:
Players.OofDestroyer25.Backpack.Tool.client:26: attempt to call a nil value
This is my script:
local function debounce(waittime, func)
local db = false
if db == false then
db = true
func()
wait(waittime)
db = false
end
end
Firstly, the “db” variable will always be false since it’s a local variable set to false every time you call the function. It would be best to set this as a global variable. Secondly, there’s a much more efficient way to do this.
local debouncedFunctions = {}
local function debounce(waitTime, functionName)
if not table.find(debouncedFunctions, functionName) then
functionName()
table.insert(debouncedFunctions, functionName)
task.delay(waitTime, function()
table.remove(debouncedFunctions, table.find(debouncedFunctions, functionName))
end)
else
return true
end
end
Basically, this creates a table that will store all functions that are debounced and remove them after the wait time. If the function’s debounce isn’t over, it will return “true” for the debounce instead of adding it to the table again. If you have any questions, let me know. Please note that this is case-sensitive when calling the function name, or it will give you an error.
Edit: Also, be careful when calling a function like this, as it can easily error if it doesn’t recognize the function name as a parameter. I would recommend having a table of allowed functions which you check when the debounce function is called to ensure that the function really exists.
The reason the error pops up is that whatever Anim() returns is being passed as an argument to the debounce function. For example, if Anim() returns nil, you would be passing nil as an argument to be called in the debounce function, which isn’t what you want. Hence, “attempt to call a nil value”
In this case, you would want to use a tuple for your arguments.
local function debounce(waittime, func, ...)
local db = false
if db == false then
db = true
func(...) -- Use the tuple (...) as arguments for callback function
wait(waittime)
db = false
end
end
tool.Activated:Connect(function()
debounce(0.4, Anim, anims.swing1, true, Enum.AnimationPriority.Action4) -- Instead of calling Anim directly, pass the arguments of Anim through the debounce function
end)
And as @alreadyfans mentioned, your debounce wouldn’t work anyway so I suggest implementing the tuple method above with their code.