From db6544b6eb1d6befd6c6d128854f352d801f69aa Mon Sep 17 00:00:00 2001 From: Rendo Date: Mon, 14 Jul 2025 20:54:58 +0500 Subject: [PATCH 1/4] Burst fire mode --- .../weapons/fire_mode/base_fire_mode.gd | 9 +++- .../weapons/fire_mode/burst_fire_mode.gd | 46 +++++++++++++++++++ .../weapons/fire_mode/burst_fire_mode.gd.uid | 1 + 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 base/scripts/weapons/fire_mode/burst_fire_mode.gd create mode 100644 base/scripts/weapons/fire_mode/burst_fire_mode.gd.uid diff --git a/base/scripts/weapons/fire_mode/base_fire_mode.gd b/base/scripts/weapons/fire_mode/base_fire_mode.gd index 96d1458..8f423ee 100644 --- a/base/scripts/weapons/fire_mode/base_fire_mode.gd +++ b/base/scripts/weapons/fire_mode/base_fire_mode.gd @@ -15,10 +15,15 @@ func _fire() -> bool: ## Invoked when fire button is just pressed or reload ended while fire button is still pressed -func _on_fire_begin() -> void: +func _on_fire_begin(tree : SceneTree) -> void: pass ## Invoked when fire button is just released or reload started while fire button is still pressed -func _on_fire_end() -> void: +func _on_fire_end(tree : SceneTree) -> void: + pass + + +## Invoked every process frame on active fire mode +func _process(tree : SceneTree) -> void: pass diff --git a/base/scripts/weapons/fire_mode/burst_fire_mode.gd b/base/scripts/weapons/fire_mode/burst_fire_mode.gd new file mode 100644 index 0000000..6c5cdcc --- /dev/null +++ b/base/scripts/weapons/fire_mode/burst_fire_mode.gd @@ -0,0 +1,46 @@ +extends BaseFireMode + +## Fire mode that fires in bursts +class_name BurstFireMode + + +## Amount of bullets in burst +@export_range(1,25,1,"or_greater") var burst_amount : int = 1 + +## Time to reload a burst +@export var burst_time : float + +## Amount of bullets currently [br] +## Resets in _on_fire_end +var current_amount : int = 0 + +## Controls burst internal reload +var reloading : bool = false + +## Reference to scene timer +var timer : SceneTreeTimer = null + + +func _on_fire_begin(_tree : SceneTree) -> void: + current_amount = 0 + if timer != null: + timer.timeout.disconnect(on_reload_timeout) + timer = null + + +func _process(_tree : SceneTree) -> void: + if reloading: + return + if _fire(): + current_amount += 1 + if current_amount >= burst_amount: + reloading = true + timer = _tree.create_timer(burst_time) + timer.timeout.connect(on_reload_timeout) + + +## Invoked when reload has ended +func on_reload_timeout() -> void: + reloading = false + current_amount = 0 + timer = null diff --git a/base/scripts/weapons/fire_mode/burst_fire_mode.gd.uid b/base/scripts/weapons/fire_mode/burst_fire_mode.gd.uid new file mode 100644 index 0000000..9306092 --- /dev/null +++ b/base/scripts/weapons/fire_mode/burst_fire_mode.gd.uid @@ -0,0 +1 @@ +uid://msfvntjnawy5 From 64127797fb17e8942707b2d5cb68c1dda7101b6f Mon Sep 17 00:00:00 2001 From: Rendo Date: Mon, 14 Jul 2025 21:09:47 +0500 Subject: [PATCH 2/4] 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) From 63e8211b6c1dab07e7b7194a5ce31f13bc0c91d0 Mon Sep 17 00:00:00 2001 From: Rendo Date: Mon, 14 Jul 2025 21:20:02 +0500 Subject: [PATCH 3/4] 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) From 566a4b4a0545b08022ddbeb53be60f10096d4989 Mon Sep 17 00:00:00 2001 From: Rendo Date: Mon, 14 Jul 2025 21:31:39 +0500 Subject: [PATCH 4/4] Single fire mode --- .../weapons/fire_mode/single_fire_mode.gd | 28 +++++++++++++++++++ .../weapons/fire_mode/single_fire_mode.gd.uid | 1 + 2 files changed, 29 insertions(+) create mode 100644 base/scripts/weapons/fire_mode/single_fire_mode.gd create mode 100644 base/scripts/weapons/fire_mode/single_fire_mode.gd.uid diff --git a/base/scripts/weapons/fire_mode/single_fire_mode.gd b/base/scripts/weapons/fire_mode/single_fire_mode.gd new file mode 100644 index 0000000..a046102 --- /dev/null +++ b/base/scripts/weapons/fire_mode/single_fire_mode.gd @@ -0,0 +1,28 @@ +extends BaseFireMode + +## Firemode that fires single time [br] +## Has optional fire delay + +class_name SingleFireMode + +## Delay between shots [br] +## Values equal or less than 0 remove delay completely +@export var fire_delay : float + +## Is fire mode on delay? +var cooldown : bool = false + + +func _on_fire_begin(tree) -> void: + if cooldown: + return + + if _fire() == false or fire_delay <= 0: + return + cooldown = true + tree.create_timer(fire_delay).timeout.connect(on_cooldown_timeout) + + +## Invoked when cooldown has ended +func on_cooldown_timeout() -> void: + cooldown = false diff --git a/base/scripts/weapons/fire_mode/single_fire_mode.gd.uid b/base/scripts/weapons/fire_mode/single_fire_mode.gd.uid new file mode 100644 index 0000000..f0a14e7 --- /dev/null +++ b/base/scripts/weapons/fire_mode/single_fire_mode.gd.uid @@ -0,0 +1 @@ +uid://ckexgw71dd5jc