From 64127797fb17e8942707b2d5cb68c1dda7101b6f Mon Sep 17 00:00:00 2001 From: Rendo Date: Mon, 14 Jul 2025 21:09:47 +0500 Subject: [PATCH] Burst now supports fire delay and has validation check --- .../weapons/fire_mode/burst_fire_mode.gd | 46 ++++++++++++++----- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/base/scripts/weapons/fire_mode/burst_fire_mode.gd b/base/scripts/weapons/fire_mode/burst_fire_mode.gd index 6c5cdcc..345b2de 100644 --- a/base/scripts/weapons/fire_mode/burst_fire_mode.gd +++ b/base/scripts/weapons/fire_mode/burst_fire_mode.gd @@ -8,39 +8,63 @@ class_name BurstFireMode @export_range(1,25,1,"or_greater") var burst_amount : int = 1 ## Time to reload a burst -@export var burst_time : float +@export var reload_time : float + +## Delay between shots [br] +@export var fire_delay : float ## Amount of bullets currently [br] ## Resets in _on_fire_end var current_amount : int = 0 -## Controls burst internal reload +## Is burst currently reloading var reloading : bool = false -## Reference to scene timer -var timer : SceneTreeTimer = null +## Is fire mode on delay? +var cooldown : bool = false +## Reference to reload scene timer +var reload_timer : SceneTreeTimer = null + +## Reference to cooldown scene timer +var cooldown_timer : SceneTreeTimer = null func _on_fire_begin(_tree : SceneTree) -> void: current_amount = 0 - if timer != null: - timer.timeout.disconnect(on_reload_timeout) - timer = null + reloading = false + cooldown = false + check_unfinished_timer(reload_timer,on_reload_timeout) + check_unfinished_timer(cooldown_timer,on_cooldown_timeout) func _process(_tree : SceneTree) -> void: - if reloading: + if reloading or cooldown: return if _fire(): current_amount += 1 + cooldown_timer = _tree.create_timer(fire_delay) + cooldown_timer.timeout.connect(on_cooldown_timeout) if current_amount >= burst_amount: reloading = true - timer = _tree.create_timer(burst_time) - timer.timeout.connect(on_reload_timeout) + reload_timer = _tree.create_timer(reload_time) + reload_timer.timeout.connect(on_reload_timeout) ## Invoked when reload has ended func on_reload_timeout() -> void: reloading = false current_amount = 0 - timer = null + reload_timer = null + + +## Invoked when cooldown has ended +func on_cooldown_timeout() -> void: + cooldown = false + cooldown_timer = null + + +## Checks if timer is unfinished and unbounds to avoid errors +func check_unfinished_timer(timer : SceneTreeTimer, bounded_callable : Callable) -> void: + if timer == null: + return + timer.timeout.disconnect(bounded_callable)