From db6544b6eb1d6befd6c6d128854f352d801f69aa Mon Sep 17 00:00:00 2001 From: Rendo Date: Mon, 14 Jul 2025 20:54:58 +0500 Subject: [PATCH] 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