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/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..8c45b0f --- /dev/null +++ b/base/scripts/weapons/fire_mode/burst_fire_mode.gd @@ -0,0 +1,43 @@ +extends AutoFireMode + +## 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 reload_time : float + +## Amount of bullets currently [br] +## Resets in _on_fire_end +var current_amount : int = 0 + +## Is burst currently reloading +var reloading : bool = false + +## Reference to reload scene timer +var reload_timer : SceneTreeTimer = null + +func _on_fire_begin(_tree : SceneTree) -> void: + super._on_fire_begin(_tree) + current_amount = 0 + reloading = false + check_unfinished_timer(reload_timer,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 +func on_reload_timeout() -> void: + reloading = false + current_amount = 0 + reload_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 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