Fixed dead resource references in Character scenes, also added layered sound effect playback to Weapon.tscn

remotes/1698854768171617226/layered_gunshot
unfa 2021-04-05 04:14:09 +02:00
parent 7316ea12c2
commit a86214275a
18 changed files with 486 additions and 31 deletions

View File

@ -0,0 +1,21 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/Weapons_Handun_Shot_01_A.wav-b5049ef4e85c0808d916a354169d81be.sample"
[deps]
source_file="res://Assets/Audio/SFX/Weapons_Handun_Shot_01_A.wav"
dest_files=[ "res://.import/Weapons_Handun_Shot_01_A.wav-b5049ef4e85c0808d916a354169d81be.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop=false
compress/mode=0

View File

@ -0,0 +1,21 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/Weapons_Handun_Shot_01_B.wav-91e94d7b9c40af17e0b85445c3cd4794.sample"
[deps]
source_file="res://Assets/Audio/SFX/Weapons_Handun_Shot_01_B.wav"
dest_files=[ "res://.import/Weapons_Handun_Shot_01_B.wav-91e94d7b9c40af17e0b85445c3cd4794.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop=false
compress/mode=0

View File

@ -0,0 +1,21 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/Weapons_Handun_Shot_01_C.wav-5bd4324dcd7f9d7616ebe5cd03928aa4.sample"
[deps]
source_file="res://Assets/Audio/SFX/Weapons_Handun_Shot_01_C.wav"
dest_files=[ "res://.import/Weapons_Handun_Shot_01_C.wav-5bd4324dcd7f9d7616ebe5cd03928aa4.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop=false
compress/mode=0

View File

@ -0,0 +1,21 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/Weapons_Handun_Shot_02_A.wav-59af1bc71ddcc00f6f73dc8b1cc905dc.sample"
[deps]
source_file="res://Assets/Audio/SFX/Weapons_Handun_Shot_02_A.wav"
dest_files=[ "res://.import/Weapons_Handun_Shot_02_A.wav-59af1bc71ddcc00f6f73dc8b1cc905dc.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop=false
compress/mode=0

View File

@ -0,0 +1,21 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/Weapons_Handun_Shot_02_B.wav-6db638e923eff625fc24be7746e3cbf9.sample"
[deps]
source_file="res://Assets/Audio/SFX/Weapons_Handun_Shot_02_B.wav"
dest_files=[ "res://.import/Weapons_Handun_Shot_02_B.wav-6db638e923eff625fc24be7746e3cbf9.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop=false
compress/mode=0

View File

@ -0,0 +1,21 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/Weapons_Handun_Shot_02_C.wav-7976192c394ee6f94fbbf58e48ecf770.sample"
[deps]
source_file="res://Assets/Audio/SFX/Weapons_Handun_Shot_02_C.wav"
dest_files=[ "res://.import/Weapons_Handun_Shot_02_C.wav-7976192c394ee6f94fbbf58e48ecf770.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop=false
compress/mode=0

View File

@ -0,0 +1,21 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/Weapons_Handun_Shot_03_A.wav-8995aec4a701c64d2659a79326402ecb.sample"
[deps]
source_file="res://Assets/Audio/SFX/Weapons_Handun_Shot_03_A.wav"
dest_files=[ "res://.import/Weapons_Handun_Shot_03_A.wav-8995aec4a701c64d2659a79326402ecb.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop=false
compress/mode=0

View File

@ -0,0 +1,21 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/Weapons_Handun_Shot_03_B.wav-0ec5401d1dee25f9fe11ace2be944c05.sample"
[deps]
source_file="res://Assets/Audio/SFX/Weapons_Handun_Shot_03_B.wav"
dest_files=[ "res://.import/Weapons_Handun_Shot_03_B.wav-0ec5401d1dee25f9fe11ace2be944c05.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop=false
compress/mode=0

View File

@ -0,0 +1,21 @@
[remap]
importer="wav"
type="AudioStreamSample"
path="res://.import/Weapons_Handun_Shot_03_C.wav-3e9fd58bf53f5166e71559cd82c6c971.sample"
[deps]
source_file="res://Assets/Audio/SFX/Weapons_Handun_Shot_03_C.wav"
dest_files=[ "res://.import/Weapons_Handun_Shot_03_C.wav-3e9fd58bf53f5166e71559cd82c6c971.sample" ]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop=false
compress/mode=0

View File

@ -14,12 +14,12 @@ script = ExtResource( 2 )
max_health = 90
[node name="Hand" parent="Camera" index="0"]
transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0.335, -0.395602, -0.559 )
transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0.335, -0.396491, -0.559 )
[node name="WeaponBobAnimationTree" parent="Camera/Hand" index="0"]
parameters/playback = SubResource( 1 )
[node name="MeshInstance" type="MeshInstance" parent="." index="6"]
transform = Transform( 1, 0, 0, 0, -0.00441578, -0.99999, 0, 0.99999, -0.00441578, 0, 0.883, 0 )
transform = Transform( 1, 0, 0, 0, -0.00441578, -0.99999, 0, 0.99999, -0.00441578, 0, 0.888784, 0 )
mesh = SubResource( 2 )
material/0 = null

View File

@ -1,11 +1,13 @@
[gd_scene load_steps=6 format=2]
[gd_scene load_steps=7 format=2]
[ext_resource path="res://Classes/Player/Player.tscn" type="PackedScene" id=1]
[ext_resource path="res://Assets/Characters/HerMajestyTheQueen/HerMajestyTheQueen.gd" type="Script" id=2]
[ext_resource path="res://Assets/Characters/HerMajestyTheQueen/Throne/Throne.gltf" type="PackedScene" id=3]
[ext_resource path="res://Assets/Characters/HerMajestyTheQueen/RoyalGuard/RoyalGuard.tscn" type="PackedScene" id=4]
[sub_resource type="CapsuleShape" id=1]
[sub_resource type="AnimationNodeStateMachinePlayback" id=1]
[sub_resource type="CapsuleShape" id=2]
radius = 1.2
height = 0.6
@ -15,12 +17,18 @@ script = ExtResource( 2 )
[node name="Camera" parent="." index="0"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.52414, -0.0651628 )
[node name="Hand" parent="Camera" index="0"]
transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0.335, -0.399838, -0.559 )
[node name="WeaponBobAnimationTree" parent="Camera/Hand" index="0"]
parameters/playback = SubResource( 1 )
[node name="Billboard" parent="." index="1"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.27203, 0 )
[node name="CollisionShapeBody" parent="." index="2"]
transform = Transform( 1, 0, 0, 0, -1.62921e-07, 1, 0, -1, -1.62921e-07, 0, 1.5, 0 )
shape = SubResource( 1 )
shape = SubResource( 2 )
[node name="Throne" parent="." index="6" instance=ExtResource( 3 )]
transform = Transform( -1, 0, -3.25841e-07, 0, 1, 0, 3.25841e-07, 0, -1, 0, 0.989432, 0 )

View File

@ -1,10 +1,8 @@
[gd_scene load_steps=7 format=2]
[gd_scene load_steps=6 format=2]
[ext_resource path="res://Classes/Player/Player.tscn" type="PackedScene" id=1]
[ext_resource path="res://Assets/Characters/SmartFridge/SmartFridge.gltf" type="PackedScene" id=2]
[ext_resource path="res://Assets/Characters/SmartFridge/SmartFridge.gd" type="Script" id=3]
[ext_resource path="res://Assets/Audio/SFX/Ambient_Pipes.wav" type="AudioStream" id=4]
[sub_resource type="AnimationNodeStateMachinePlayback" id=1]
@ -15,7 +13,7 @@ extents = Vector3( 0.497026, 0.468212, 1 )
script = ExtResource( 3 )
[node name="Hand" parent="Camera" index="0"]
transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0.335, -0.390004, -0.559 )
transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0.335, -0.398653, -0.559 )
[node name="WeaponBobAnimationTree" parent="Camera/Hand" index="0"]
parameters/playback = SubResource( 1 )
@ -24,12 +22,7 @@ parameters/playback = SubResource( 1 )
transform = Transform( 1, 0, 0, 0, -1.62921e-07, 1, 0, -1, -1.62921e-07, 0, 0.997194, 0.228745 )
shape = SubResource( 2 )
[node name="Ambient" parent="Sounds" index="5"]
stream = ExtResource( 4 )
[node name="SmartFridge" parent="." index="6" instance=ExtResource( 2 )]
transform = Transform( -1, 0, -3.25841e-07, 0, 1, 0, 3.25841e-07, 0, -1, 0, 0, 0.313989 )
[editable path="Camera/Hand/Weapon"]
[editable path="Camera/Hand/Weapon/Handgun"]
[editable path="SmartFridge"]

View File

@ -1,11 +1,12 @@
[gd_scene load_steps=14 format=2]
[gd_scene load_steps=15 format=2]
[ext_resource path="res://Assets/Weapons/Handgun/Handgun.gltf" type="PackedScene" id=1]
[ext_resource path="res://Classes/Weapon/Weapon.gd" type="Script" id=2]
[ext_resource path="res://Assets/Audio/SFX/Weapons_Handun_Shot.wav" type="AudioStream" id=3]
[ext_resource path="res://Classes/Audio/LayeredSoundPlayer.gd" type="Script" id=3]
[ext_resource path="res://Assets/Effects/CircleSoft.svg" type="Texture" id=4]
[ext_resource path="res://Assets/Audio/SFX/Weapons-Empty.wav" type="AudioStream" id=5]
[ext_resource path="res://Assets/Audio/SFX/Weapons-Handgun-Reload.wav" type="AudioStream" id=6]
[ext_resource path="res://Classes/Audio/SoundPlayer.tscn" type="PackedScene" id=7]
[sub_resource type="Gradient" id=1]
offsets = PoolRealArray( 0, 0.0511628, 0.0883721, 0.302326, 1 )
@ -73,20 +74,28 @@ transform = Transform( -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0, 1, -0.0373
[node name="Sounds" type="Spatial" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.295478, 0.724833, 0.584699 )
[node name="SoundShoot" type="AudioStreamPlayer3D" parent="Sounds"]
transform = Transform( -4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 0, 0 )
stream = ExtResource( 3 )
attenuation_model = 3
unit_db = 3.0
unit_size = 25.0
emission_angle_enabled = true
emission_angle_degrees = 60.0
attenuation_filter_cutoff_hz = 15000.0
[node name="SoundEmpty" type="AudioStreamPlayer3D" parent="Sounds"]
[node name="Empty" type="AudioStreamPlayer3D" parent="Sounds"]
stream = ExtResource( 5 )
[node name="SoundReload" type="AudioStreamPlayer3D" parent="Sounds"]
[node name="Reload" type="AudioStreamPlayer3D" parent="Sounds"]
stream = ExtResource( 6 )
[node name="Shoot" type="Spatial" parent="Sounds"]
script = ExtResource( 3 )
[node name="A" type="Spatial" parent="Sounds/Shoot"]
[node name="SoundPlayer" parent="Sounds/Shoot/A" instance=ExtResource( 7 )]
SoundClip = "res://Assets/Audio/SFX/Weapons_Handun_Shot_01_A.wav"
[node name="B" type="Spatial" parent="Sounds/Shoot"]
[node name="SoundPlayer" parent="Sounds/Shoot/B" instance=ExtResource( 7 )]
SoundClip = "res://Assets/Audio/SFX/Weapons_Handun_Shot_01_B.wav"
[node name="C" type="Spatial" parent="Sounds/Shoot"]
[node name="SoundPlayer" parent="Sounds/Shoot/C" instance=ExtResource( 7 )]
SoundClip = "res://Assets/Audio/SFX/Weapons_Handun_Shot_01_C.wav"
[editable path="Handgun"]

View File

@ -0,0 +1,21 @@
extends Spatial
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
func play():
$A/SoundPlayer.play()
$B/SoundPlayer.play()
$C/SoundPlayer.play()
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass

View File

@ -6,7 +6,7 @@ const SFX_dir = "res://Assets/Audio/SFX/" # all sound clips must reside somewher
onready var player = $AudioStreamPlayer3D # playback backend
export(String, FILE, "*-01.wav") var SoundClip = SFX_dir + "Test-01.wav"
export(String, FILE, "*_01*.wav") var SoundClip = SFX_dir + "Test-01.wav"
export(bool) var AutoPlay = false
export(float) var MinimumRandomDistance = 0.35 # gives optimal playback repetition for sound clip groups of different sizes.
export(bool) var PlayUntilEnd = false # determines if the play() function is allowed to sop a previously started sound

View File

@ -9,7 +9,7 @@
[ext_resource path="res://Assets/UI/HUD.tscn" type="PackedScene" id=7]
[ext_resource path="res://Classes/Player/Player.gd" type="Script" id=8]
[ext_resource path="res://Classes/Player/WeaponsManager.gd" type="Script" id=9]
[ext_resource path="res://Assets/Weapons/GrenadeLauncher/GranadeLauncher.tscn" type="PackedScene" id=10]
[ext_resource path="res://Assets/Weapons/GrenadeLauncher/GrenadeLauncher.tscn" type="PackedScene" id=10]
[ext_resource path="res://Assets/Effects/CircleSoft.svg" type="Texture" id=11]
[ext_resource path="res://Assets/Maps/DM1/OmniFlicker.gd" type="Script" id=12]
@ -220,7 +220,7 @@ script = ExtResource( 8 )
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.53592, -0.0651628 )
[node name="Hand" type="Spatial" parent="Camera"]
transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0.335, -0.394059, -0.559 )
transform = Transform( -4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0.335, -0.39248, -0.559 )
[node name="WeaponBobAnimationTree" type="AnimationTree" parent="Camera/Hand"]
tree_root = SubResource( 12 )

View File

@ -0,0 +1,153 @@
extends Spatial
signal damage_dealt
signal ammo_changed(type, amount)
export(bool) var Hitscan = false
export(int) var Damage = 100
export(float) var Delay = 0.1
export(bool) var Automatic = false
export(int) var Rounds = 10
export(int) var MaxRoundsInClip = 10
export(int) var Clips = 1
export(int) var MaxClips = 4
onready var camera = get_parent().get_parent().get_parent()
onready var player = camera.get_parent()
onready var ejector = find_node("Ejector")
onready var muzzle = find_node("Muzzle")
onready var current_rounds = Rounds
var currently_fireing = false
var cached_fire = false
#onready var sound_shoot = $SoundShoot
var casing = preload("res://Assets/Weapons/Handgun/Casing.tscn")
var tracer = preload("res://Assets/Effects/BulletTracer.tscn")
func _ready():
$Sounds.global_transform.origin = camera.global_transform.origin
func shoot(camera):
if cached_fire == true:
return
if currently_fireing == true:
cached_fire = true
yield($Handgun/AnimationPlayer, "animation_finished")
# TODO: mutexes
currently_fireing = true
cached_fire = false
if current_rounds > 0:
rpc("fire_weapon", current_rounds)
rpc("compute_bullet_flyby")
current_rounds -= 1
emit_signal("ammo_changed", "handgun", current_rounds)
var space_state = get_world().direct_space_state
var crosshair_pos = get_viewport().size / 2
var from = camera.project_ray_origin(crosshair_pos)
var to = from + camera.project_ray_normal(crosshair_pos) * 1000
var result = space_state.intersect_ray(from, to)
if "collider" in result:
var hit = result.collider
if hit.has_method("on_hit"):
hit.rpc("on_hit", 30, result.position)
if hit is Player:
emit_signal("damage_dealt")
print(player.get_network_master())
else:
reload()
return current_rounds
sync func fire_weapon(var rounds_left):
show_muzzle_flash(rounds_left)
show_tracer()
spawn_casing()
yield($Handgun/AnimationPlayer, "animation_finished")
if !cached_fire:
currently_fireing = false
sync func dry_fire():
pass
func show_muzzle_flash(var rounds_left):
$Handgun/AnimationPlayer.stop()
if rounds_left == 1:
$Handgun/AnimationPlayer.play("Empty", -1, 2)
else:
$Handgun/AnimationPlayer.play("Shoot", -1, 2)
$MuzzleFlash.emitting = true
yield(get_tree().create_timer(0.07),"timeout")
$MuzzleFlash.emitting = false
$Sounds/Shoot.play()
func show_tracer():
var tracer_instance = tracer.instance()
tracer_instance.hide()
tracer_instance.global_transform = muzzle.global_transform
get_tree().root.call_deferred("add_child", tracer_instance)
tracer_instance.call_deferred("show")
func spawn_casing():
#while [ true ]:
#var casing_instance = load("res://Assets/Weapons/Handgun/Casing.tscn").instance()
var casing_instance = casing.instance()
casing_instance.global_transform = ejector.global_transform
casing_instance.rotate_object_local(Vector3.FORWARD, deg2rad(90))
casing_instance.angular_velocity = - ejector.global_transform.basis[2] * rand_range(23, 37)
casing_instance.linear_velocity = ejector.global_transform.basis[0] * rand_range(3.2, 4.5) - ejector.global_transform.basis[2] * rand_range(2.6, 3.7)
get_tree().root.call_deferred("add_child", casing_instance)
#yield(get_tree().create_timer(1),"timeout")
remote func compute_bullet_flyby():
var local_player = get_tree().root.get_node("Game").local_player
var transform = find_node("Muzzle").global_transform
var from = global_transform.xform(Vector3())
var to = global_transform.xform(Vector3(-1000, 0, 0))
if local_player:
local_player.on_bullet_flyby(from, to)
func reload():
rpc("play_reload_animation")
currently_fireing = true
cached_fire = false
yield($Handgun/AnimationPlayer, "animation_finished")
if not cached_fire:
currently_fireing = false
current_rounds = Rounds
emit_signal("ammo_changed", "handgun", current_rounds)
sync func play_reload_animation():
$Handgun/AnimationPlayer.play("Reload", 0.5, 1)
$Sounds/Reload.play()

View File

@ -0,0 +1,82 @@
[gd_scene load_steps=12 format=2]
[ext_resource path="res://Assets/Weapons/Handgun/Handgun.gltf" type="PackedScene" id=1]
[ext_resource path="res://Classes/Weapon/Weapon.gd" type="Script" id=2]
[ext_resource path="res://Assets/Audio/SFX/Weapons_Handun_Shot_01_A.wav" type="AudioStream" id=3]
[ext_resource path="res://Assets/Effects/CircleSoft.svg" type="Texture" id=4]
[sub_resource type="Gradient" id=1]
offsets = PoolRealArray( 0, 0.0511628, 0.0883721, 0.302326, 1 )
colors = PoolColorArray( 0, 0, 0, 1, 2, 2, 2, 1, 0.901961, 0.866667, 0.576471, 1, 0.909804, 0.592157, 0.168627, 1, 0, 0, 0, 1 )
[sub_resource type="GradientTexture" id=2]
gradient = SubResource( 1 )
[sub_resource type="Curve" id=3]
_data = [ Vector2( 0, 0.986364 ), 0.0, -0.872434, 0, 0, Vector2( 0.092437, 0.752585 ), 0.0, 0.0, 0, 0, Vector2( 1, 0.198039 ), -0.85103, 0.0, 0, 0 ]
[sub_resource type="CurveTexture" id=4]
curve = SubResource( 3 )
[sub_resource type="ParticlesMaterial" id=5]
direction = Vector3( 0, 0, -5 )
spread = 15.0
gravity = Vector3( 0, 0, 0 )
initial_velocity = 8.0
initial_velocity_random = 0.75
damping = 100.0
damping_random = 0.5
scale_random = 1.0
scale_curve = SubResource( 4 )
color_ramp = SubResource( 2 )
[sub_resource type="SpatialMaterial" id=6]
flags_transparent = true
flags_unshaded = true
vertex_color_use_as_albedo = true
params_blend_mode = 1
params_billboard_mode = 3
particles_anim_h_frames = 1
particles_anim_v_frames = 1
particles_anim_loop = false
albedo_texture = ExtResource( 4 )
[sub_resource type="QuadMesh" id=7]
material = SubResource( 6 )
size = Vector2( 0.3, 0.3 )
[node name="Weapon" type="Spatial"]
script = ExtResource( 2 )
[node name="MuzzleFlash" type="Particles" parent="."]
transform = Transform( -4.37113e-08, 0, 0.999999, 0, 0.999999, 0, -1, 0, -4.37114e-08, -0.3053, 0.124057, 0 )
cast_shadow = 0
emitting = false
amount = 16
lifetime = 0.1
one_shot = true
explosiveness = 1.0
visibility_aabb = AABB( -0.176241, -0.185755, -0.556571, 0.352482, 0.37151, 0.655134 )
process_material = SubResource( 5 )
draw_pass_1 = SubResource( 7 )
[node name="Handgun" parent="." instance=ExtResource( 1 )]
[node name="Muzzle" parent="Handgun" index="0"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.331868, 0.125291, 0 )
[node name="Ejector" parent="Handgun" index="1"]
transform = Transform( -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, 0, 1, -0.0373496, 0.126382, -0.00737098 )
[node name="Sounds" type="Spatial" parent="."]
transform = Transform( -4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0.63089, 0.616708, 0.43745 )
[node name="SoundShoot" type="AudioStreamPlayer3D" parent="Sounds"]
stream = ExtResource( 3 )
unit_db = 4.0
unit_size = 25.0
emission_angle_enabled = true
emission_angle_degrees = 60.0
attenuation_filter_cutoff_hz = 15000.0
[editable path="Handgun"]