Donderboor2 I also have had trouble with timers, the way you have. I have a stamina meter that drains and refills and has a "cooldown" state in my game when exhausted.
When this happens, I find a value I can add in each frame, watch it, and when it hits a level, flip whatever bool I need to allow whatever to happen again. I should mention to incorporate delta
into those calculations for consistency between platforms.
Something like:
var _currentMoveMeter = 0 ## your "cooldown" meter
const _moveMeterTarget = 0.1 ## meter's target level before move can trigger
export var _moveInputNudge = 0.1 ## level that cooldown refills, export to save your sanity in editor for balancing/tweaking
var _canTrigger : bool = true ## this flag determines if move can trigger
func _process(_delta): ## listen if bool is open every frame
if _canTrigger: ## if open, allow move execute
### move logic (likely with an input function so it doesn't trigger each frame)
else: ## if meter empty, bool flips to disable move and cooldown begins
_currentMoveMeter+=_moveInputNudge
if _currentMoveMeter >= _moveMeterTarget: ## when cooldown hits levels, bool flips
_canTrigger = true
_currentMoveMeter = 0 ## reset at end to avoid logic weirdness