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

Why does my script unequip the tool even though i havent pressed the key twice?

Asked by
Dec_ade 47
3 years ago
Edited 3 years ago

The sword automatically unequips itself after the debounce has ended

The local script

local Pressed = false
local Debounce = false

local function PressedKey()
if Pressed == false and Debounce == false then  
    print("KeyPressed")
    Pressed = true
    Humanoid:EquipTool(Sword)
    Debounce = true
    wait(5)
    Debounce = false
    end

if Pressed == true and Debounce == false then
    print("Pressed Again")
    Pressed = false
    Humanoid:UnequipTools(Sword)
    Debounce = true
    wait(5)
    Debounce = false
end 
end

ContextActionService:BindAction("KeyHasBeenPressed" , PressedKey, false, "z")

2 answers

Log in to vote
1
Answered by
DevingDev 346 Moderation Voter
3 years ago
Edited 3 years ago

I suggest you use UserInputService since ContextActionService fires on InputBegan and InputEnded. That means that the function KeyPressed will be called two times; once when you press the key, and once when you release the key.

I also made a setDebounce function to reduce the boilerplate code. This should work exactly as you've inteded it to work.

The variable Pressed was also unnecessary. You only need one if statement with one Debounce variable.

You were setting the debounce variable inside the first if statement, but when the 5 seconds wait was over the compiler would go line to line and execute the next if statement in the same function call. Using 1 if statement fixed this problem.

if not debounce then  
    humanoid:EquipTool(sword)
    setDebounce()
else
    humanoid:UnequipTools(sword)
    setDebounce()
end

Here is the complete script.

-- Services
local replicatedStorage = game:GetService("ReplicatedStorage")
local playersService = game:GetService("Players")
local userInputService = game:GetService("UserInputService")

-- Player
local player = playersService.LocalPlayer
local character = player.Character
local humanoid = character:WaitForChild("Humanoid")

local sword = replicatedStorage:FindFirstChild("Sword")

local debounce = false

local function setDebounce()
    debounce = true
    wait(5)
    debounce = false
end

userInputService.InputBegan:Connect(function(input)
    if input.KeyCode == Enum.KeyCode.Z then
        if not debounce then  
            humanoid:EquipTool(sword)
            setDebounce()
        else
            humanoid:UnequipTools(sword)
            setDebounce()
        end
    end
end)

Please feel free to ask any questions you might have about my solution, and how I came up with it.

0
Thanks dude! Dec_ade 47 — 3y
Ad
Log in to vote
0
Answered by 3 years ago

Because it says in the first if statement to set Pressed true and after the 5 second wait timer it turns it to false the debounce so the second if statement fires.

0
so how do i fix this? Dec_ade 47 — 3y
0
well depends if you want to wait a certain amount of time to unequip it or maybe when you do a certain action like if(slash) then debounce = false like that or make the wait time longer or change the statement for the second if statement vortex767 20 — 3y

Answer this question