From 63e8211b6c1dab07e7b7194a5ce31f13bc0c91d0 Mon Sep 17 00:00:00 2001 From: Rendo Date: Mon, 14 Jul 2025 21:20:02 +0500 Subject: [PATCH] auto mode and burst mode refactor --- .../weapons/fire_mode/auto_fire_mode.gd | 49 +++++++++++++++++++ .../weapons/fire_mode/auto_fire_mode.gd.uid | 1 + .../weapons/fire_mode/burst_fire_mode.gd | 45 ++++------------- 3 files changed, 59 insertions(+), 36 deletions(-) create mode 100644 base/scripts/weapons/fire_mode/auto_fire_mode.gd create mode 100644 base/scripts/weapons/fire_mode/auto_fire_mode.gd.uid diff --git a/base/scripts/weapons/fire_mode/auto_fire_mode.gd b/base/scripts/weapons/fire_mode/auto_fire_mode.gd new file mode 100644 index 0000000..cf9f4a6 --- /dev/null +++ b/base/scripts/weapons/fire_mode/auto_fire_mode.gd @@ -0,0 +1,49 @@ +extends BaseFireMode + +## Firemode that fires automatically + +class_name AutoFireMode + + +## Delay between shots [br] +@export var fire_delay : float + +## Is fire mode on delay? +var cooldown : bool = false + +## Reference to cooldown scene timer +var cooldown_timer : SceneTreeTimer = null + +func _on_fire_begin(_tree : SceneTree) -> void: + cooldown = false + check_unfinished_timer(cooldown_timer,on_cooldown_timeout) + + +func _process(tree : SceneTree) -> void: + if can_fire() : + return + if _fire(): + on_fire(tree) + + +## 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) + +## Checks if can fire +func can_fire() -> bool: + return cooldown + +## Invoked when fired +func on_fire(tree : SceneTree) -> void: + cooldown = true + cooldown_timer = tree.create_timer(fire_delay) + cooldown_timer.timeout.connect(on_cooldown_timeout) diff --git a/base/scripts/weapons/fire_mode/auto_fire_mode.gd.uid b/base/scripts/weapons/fire_mode/auto_fire_mode.gd.uid new file mode 100644 index 0000000..b26df77 --- /dev/null +++ b/base/scripts/weapons/fire_mode/auto_fire_mode.gd.uid @@ -0,0 +1 @@ +uid://dsvgbyeerw1ld diff --git a/base/scripts/weapons/fire_mode/burst_fire_mode.gd b/base/scripts/weapons/fire_mode/burst_fire_mode.gd index 345b2de..8c45b0f 100644 --- a/base/scripts/weapons/fire_mode/burst_fire_mode.gd +++ b/base/scripts/weapons/fire_mode/burst_fire_mode.gd @@ -1,4 +1,4 @@ -extends BaseFireMode +extends AutoFireMode ## Fire mode that fires in bursts class_name BurstFireMode @@ -10,9 +10,6 @@ class_name BurstFireMode ## Time to reload a burst @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 @@ -20,34 +17,23 @@ var current_amount : int = 0 ## Is burst currently reloading var reloading : bool = false -## 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: + super._on_fire_begin(_tree) current_amount = 0 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 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 - reload_timer = _tree.create_timer(reload_time) - reload_timer.timeout.connect(on_reload_timeout) +func on_fire(tree : SceneTree) -> void: + super.on_fire(tree) + current_amount += 1 + if current_amount >= burst_amount: + reloading = true + reload_timer = tree.create_timer(reload_time) + reload_timer.timeout.connect(on_reload_timeout) ## Invoked when reload has ended @@ -55,16 +41,3 @@ func on_reload_timeout() -> void: reloading = false current_amount = 0 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)