feat: implement double barrel shotgun weapon with procedural sound generation

This commit is contained in:
DottsGit
2026-06-04 13:23:31 -04:00
parent a8b3619f2e
commit 13ca2f46e9
4 changed files with 139 additions and 6 deletions
+23 -6
View File
@@ -10,6 +10,8 @@ var reload_timer: float = 0.0
var player: CharacterBody3D
var camera: Camera3D
var muzzle_flash: OmniLight3D
var fire_sound: AudioStreamPlayer3D
var reload_sound: AudioStreamPlayer3D
func _ready() -> void:
set_process_input(true)
@@ -61,6 +63,16 @@ func _build_model() -> void:
muzzle_flash.omni_range = 4.0
muzzle_flash.position = Vector3(0, 0.03, -0.45)
add_child(muzzle_flash)
# Audio Players
fire_sound = AudioStreamPlayer3D.new()
fire_sound.stream = load("res://assets/sounds/shotgun_fire.wav")
fire_sound.position = muzzle_flash.position
add_child(fire_sound)
reload_sound = AudioStreamPlayer3D.new()
reload_sound.stream = load("res://assets/sounds/shotgun_reload.wav")
add_child(reload_sound)
func _process(delta: float) -> void:
if reloading:
@@ -87,8 +99,13 @@ func _input(event: InputEvent) -> void:
if event.is_action_pressed("reload"):
if shells < 2 and not reloading:
reloading = true
reload_timer = reload_time
_start_reload()
func _start_reload() -> void:
reloading = true
reload_timer = reload_time
if reload_sound:
reload_sound.play()
func _try_fire() -> void:
if shells > 0 and not reloading:
@@ -97,16 +114,16 @@ func _try_fire() -> void:
_apply_impulse()
_shoot_hitscan()
_play_muzzle_flash()
if fire_sound:
fire_sound.play()
# Start reload timer if we just shot the LAST shell
if shells == 0:
reloading = true
reload_timer = reload_time
_start_reload()
elif shells == 0 and not reloading:
# Empty click, force reload
reloading = true
reload_timer = reload_time
_start_reload()
func _apply_impulse() -> void:
if not player or not camera: