Added Rocket Launcher. Implemented weapon types.

Implemented a rocket, but it doesn't fly right...
feature-rocketlauncher
unfa 2021-12-31 02:14:31 +01:00
parent dc0b83efff
commit 498bb5a09e
20 changed files with 3300 additions and 237 deletions

BIN
Asset Sources/Weapons/RocketLauncher/RocketLauncher.blend (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -38,7 +38,7 @@ var health = max_health:
@onready var body = $Body
@onready var mesh = $Mesh
@onready var weapon = $Head/Camera/Hand/Weapon
@onready var weapon = $Head/Camera/Hand/RocketLauncher
var gibs_vfx = preload("res://Assets/Effects/Gibs.tscn")
var blood_decal = preload("res://Assets/Decals/Blood/BloodSplash.tscn")
@ -209,6 +209,9 @@ func view_banner(show:bool):
return
func _ready() -> void:
weapon.show()
#Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
view_zoom_target = 1.0
@ -495,22 +498,22 @@ func _physics_process(delta):
# weapon bob
if direction.length() > 0:
if is_on_floor():
$Head/Camera/Hand/Weapon.transform.origin.y = lerp($Head/Camera/Hand/Weapon.transform.origin.y, sin(main.uptime * 10) / 15, 4 * delta)
weapon.transform.origin.y = lerp(weapon.transform.origin.y, sin(main.uptime * 10) / 15, 4 * delta)
else:
$Head/Camera/Hand/Weapon.transform.origin.y *= 1 - delta * 8
$Head/Camera/Hand/Weapon.transform.origin.y += sin(main.uptime * 2) / 1000 * delta
$Head/Camera/Hand/Weapon.transform.origin.y -= motion_velocity.y * delta / 60
weapon.transform.origin.y *= 1 - delta * 8
weapon.transform.origin.y += sin(main.uptime * 2) / 1000 * delta
weapon.transform.origin.y -= motion_velocity.y * delta / 60
if Input.is_action_just_pressed("move_jump") and is_on_floor():
# var tween = create_tween()
$Head/Camera/Hand/Weapon.transform.origin.y -= 0.025
#$Head/Camera/Hand/Weapon.transform.origin.y -= 0.05
weapon.transform.origin.y -= 0.025
#weapon.transform.origin.y -= 0.05
if is_on_floor() and not previously_on_floor: # we just landed from a jump or fall
var impact = (motion_velocity - previous_motion_velocity).length_squared()
#print ("impact: ", impact)
$Head/Camera/Hand/Weapon.transform.origin.y -= impact / 3000
weapon.transform.origin.y -= impact / 3000
# only play "ugh!" for certain force of impact
if impact >= 250:
@ -521,7 +524,7 @@ func _physics_process(delta):
$ImpactSFX.rpc(&"play")
# if
# $Head/Camera/Hand/Weapon.transform.origin.y -= 0.25
# weapon.transform.origin.y -= 0.25
#print("on floor now: ", is_on_floor(), " previously: ", previously_on_floor)

View File

@ -267,8 +267,10 @@ fov = 90.0
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0.3, -0.4, -0.6)
[node name="RocketLauncher" parent="Head/Camera/Hand" instance=ExtResource( "4_wnkv6" )]
visible = false
[node name="Handgun" parent="Head/Camera/Hand" instance=ExtResource( "4_7tta1" )]
visible = false
[node name="Tween" type="Node" parent="Head/Camera"]

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=34 format=3 uid="uid://wvxhewre31mo"]
[gd_scene load_steps=36 format=3 uid="uid://wvxhewre31mo"]
[ext_resource type="Script" path="res://Assets/Effects/Impact.gd" id="1_7cd22"]
[ext_resource type="Texture2D" uid="uid://pnh872qjk0oy" path="res://Assets/Effects/Flame.png" id="2_pyxv8"]
@ -16,11 +16,11 @@ colors = PackedColorArray(3, 2.4, 0.4, 1, 1, 0.503748, 0.133411, 1, 0.13, 0.13,
gradient = SubResource( "Gradient_gbvow" )
use_hdr = true
[sub_resource type="Curve" id="Curve_cqj0h"]
[sub_resource type="Curve" id="Curve_vfbna"]
_data = [Vector2(0, 0.154545), 0.0, 5.74743, 0, 0, Vector2(0.157761, 0.6), 1.49824, 1.49824, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0]
[sub_resource type="CurveTexture" id="CurveTexture_n25a7"]
curve = SubResource( "Curve_cqj0h" )
curve = SubResource( "Curve_vfbna" )
[sub_resource type="ParticlesMaterial" id="ParticlesMaterial_pw7km"]
lifetime_randomness = 0.25
@ -122,10 +122,16 @@ interpolation_mode = 2
offsets = PackedFloat32Array(0, 0.0216998, 0.101266, 0.177215, 0.184448, 1)
colors = PackedColorArray(0, 0, 0, 1, 2, 1.66, 0.88, 1, 1, 0.510755, 0.116048, 1, 0.347656, 0.148293, 0.0503992, 1, 0.273438, 0.273438, 0.273438, 1, 0, 0, 0, 1)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_itq0n"]
[sub_resource type="GradientTexture1D" id="GradientTexture1D_yg7ay"]
gradient = SubResource( "Gradient_65457" )
use_hdr = true
[sub_resource type="Curve" id="Curve_cqj0h"]
_data = [Vector2(0, 0.154545), 0.0, 5.74743, 0, 0, Vector2(0.157761, 0.6), 1.49824, 1.49824, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0]
[sub_resource type="CurveTexture" id="CurveTexture_sddym"]
curve = SubResource( "Curve_cqj0h" )
[sub_resource type="ParticlesMaterial" id="ParticlesMaterial_fp0kq"]
lifetime_randomness = 0.25
direction = Vector3(0, 0, -1)
@ -141,8 +147,8 @@ angle_min = -180.0
angle_max = 180.0
scale_min = 1.5
scale_max = 2.0
scale_curve = SubResource( "CurveTexture_n25a7" )
color_ramp = SubResource( "GradientTexture1D_itq0n" )
scale_curve = SubResource( "CurveTexture_sddym" )
color_ramp = SubResource( "GradientTexture1D_yg7ay" )
hue_variation_min = -0.01
hue_variation_max = 0.01
anim_offset_max = 4.0
@ -150,7 +156,7 @@ collision_enabled = true
collision_friction = 1.0
collision_use_scale = true
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_eernl"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3qjja"]
blend_mode = 1
shading_mode = 0
vertex_color_use_as_albedo = true
@ -164,7 +170,7 @@ particles_anim_loop = false
proximity_fade_enable = true
[sub_resource type="QuadMesh" id="QuadMesh_n7yo0"]
material = SubResource( "StandardMaterial3D_eernl" )
material = SubResource( "StandardMaterial3D_3qjja" )
[sub_resource type="StandardMaterial3D" id="5"]
blend_mode = 1

BIN
Game/Assets/SFX/Weapons_RocketLauncher_Shot_01_A.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,22 @@
[remap]
importer="wav"
type="AudioStreamSample"
uid="uid://bpuw5fx04a7n0"
path="res://.godot/imported/Weapons_RocketLauncher_Shot_01_A.wav-e529da25a111c6e6b15d44c99e6c1779.sample"
[deps]
source_file="res://Assets/SFX/Weapons_RocketLauncher_Shot_01_A.wav"
dest_files=["res://.godot/imported/Weapons_RocketLauncher_Shot_01_A.wav-e529da25a111c6e6b15d44c99e6c1779.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

BIN
Game/Assets/SFX/Weapons_RocketLauncher_Shot_01_B.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,22 @@
[remap]
importer="wav"
type="AudioStreamSample"
uid="uid://c3es208ntginf"
path="res://.godot/imported/Weapons_RocketLauncher_Shot_01_B.wav-6b17998856358ce11a3cd82bec3ac0e9.sample"
[deps]
source_file="res://Assets/SFX/Weapons_RocketLauncher_Shot_01_B.wav"
dest_files=["res://.godot/imported/Weapons_RocketLauncher_Shot_01_B.wav-6b17998856358ce11a3cd82bec3ac0e9.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

BIN
Game/Assets/SFX/Weapons_RocketLauncher_Shot_01_C.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,22 @@
[remap]
importer="wav"
type="AudioStreamSample"
uid="uid://c1fv01sc4dy5w"
path="res://.godot/imported/Weapons_RocketLauncher_Shot_01_C.wav-fabf8c5ba6959022248e8d3daa92d1f8.sample"
[deps]
source_file="res://Assets/SFX/Weapons_RocketLauncher_Shot_01_C.wav"
dest_files=["res://.godot/imported/Weapons_RocketLauncher_Shot_01_C.wav-fabf8c5ba6959022248e8d3daa92d1f8.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

@ -1,17 +1,15 @@
[gd_scene load_steps=2 format=3 uid="uid://sq3wql1r3hod"]
[gd_scene load_steps=4 format=3 uid="uid://sq3wql1r3hod"]
[ext_resource type="PackedScene" uid="uid://bemrov0tiy08n" path="res://Assets/Weapons/Weapon.tscn" id="1_fpucm"]
[ext_resource type="PackedScene" uid="uid://2h6xvopq206h" path="res://Assets/Weapons/Handgun/Handgun.gltf" id="2_0ysys"]
[ext_resource type="PackedScene" uid="uid://eerqpr05s6d4" path="res://Assets/Effects/BulletTracer.tscn" id="2_u1c26"]
[node name="Weapon" instance=ExtResource( "1_fpucm" )]
projectile_or_tracer_scene = ExtResource( "2_u1c26" )
weapon_damage = 15
[node name="Static" parent="Handgun/Handgun_Armature/Skeleton3D" index="0"]
surface_material_override/0 = null
surface_material_override/1 = null
[node name="Handgun" parent="." index="0" instance=ExtResource( "2_0ysys" )]
[node name="Hand" parent="Handgun/HandArmature/Skeleton3D2" index="0"]
surface_material_override/0 = null
[editable path="Handgun"]
[editable path="SFX/Shoot A"]
[editable path="SFX/Shoot B"]
[editable path="SFX/Shoot C"]

View File

@ -0,0 +1,23 @@
extends AnimatableBody3D
@export var hit_effect_scene : PackedScene
@export var speed : float
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
constant_linear_velocity = Vector3.FORWARD * speed
$OmniLight3D/Smoke.emitting = true
func _physics_process(delta):
#constant_linear_velocity = Vector3(1, 0, 0)
move_and_collide(global_transform.basis[0]*Vector3.FORWARD * speed)
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,29 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://db4ibhxmrgqny"
path="res://.godot/imported/Rocket.gltf-575907286e2747daad3a3e941bf85f7d.scn"
[deps]
source_file="res://Assets/Weapons/RocketLauncher/Rocket.gltf"
dest_files=["res://.godot/imported/Rocket.gltf-575907286e2747daad3a3e941bf85f7d.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=2
meshes/lightmap_texel_size=0.1
skins/use_named_skins=true
animation/import=true
animation/fps=30
import_script/path=""
_subresources={
}

View File

@ -0,0 +1,96 @@
[gd_scene load_steps=13 format=3 uid="uid://bt0lppumya6fv"]
[ext_resource type="Script" path="res://Assets/Weapons/Projectile.gd" id="1_3ywpo"]
[ext_resource type="PackedScene" uid="uid://wvxhewre31mo" path="res://Assets/Effects/ImpactExplosion.tscn" id="2_1tben"]
[ext_resource type="PackedScene" uid="uid://db4ibhxmrgqny" path="res://Assets/Weapons/RocketLauncher/Rocket.gltf" id="3_wqrr6"]
[ext_resource type="Texture2D" uid="uid://pnh872qjk0oy" path="res://Assets/Effects/Flame.png" id="4_aitcu"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_qjk68"]
radius = 0.0853144
height = 0.512485
[sub_resource type="Gradient" id="Gradient_l1dmm"]
interpolation_mode = 2
offsets = PackedFloat32Array(0, 0.0216998, 0.101266, 0.177215, 0.184448, 1)
colors = PackedColorArray(0, 0, 0, 1, 2, 1.66, 0.88, 1, 1, 0.510755, 0.116048, 1, 0.347656, 0.148293, 0.0503992, 1, 0.273438, 0.273438, 0.273438, 1, 0, 0, 0, 1)
[sub_resource type="GradientTexture1D" id="GradientTexture1D_itq0n"]
gradient = SubResource( "Gradient_l1dmm" )
use_hdr = true
[sub_resource type="Curve" id="Curve_vfbna"]
_data = [Vector2(0, 0.154545), 0.0, 5.74743, 0, 0, Vector2(0.157761, 0.6), 1.49824, 1.49824, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0]
[sub_resource type="CurveTexture" id="CurveTexture_n25a7"]
curve = SubResource( "Curve_vfbna" )
[sub_resource type="ParticlesMaterial" id="ParticlesMaterial_ckuul"]
lifetime_randomness = 0.25
direction = Vector3(0, 0, -1)
spread = 120.0
gravity = Vector3(0, 0, 0)
angular_velocity_min = -5.0
angular_velocity_max = 5.0
damping_min = 20.0
damping_max = 26.0
angle_min = -180.0
angle_max = 180.0
scale_min = 1.5
scale_max = 2.0
scale_curve = SubResource( "CurveTexture_n25a7" )
color_ramp = SubResource( "GradientTexture1D_itq0n" )
hue_variation_min = -0.01
hue_variation_max = 0.01
anim_offset_max = 4.0
collision_enabled = true
collision_friction = 1.0
collision_use_scale = true
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_eernl"]
blend_mode = 1
shading_mode = 0
vertex_color_use_as_albedo = true
albedo_color = Color(0.419608, 0.419608, 0.419608, 1)
albedo_texture = ExtResource( "4_aitcu" )
disable_receive_shadows = true
billboard_mode = 3
particles_anim_h_frames = 2
particles_anim_v_frames = 2
particles_anim_loop = false
proximity_fade_enable = true
[sub_resource type="QuadMesh" id="QuadMesh_gkbg3"]
material = SubResource( "StandardMaterial3D_eernl" )
[node name="Rocket" type="AnimatableBody3D"]
collision_layer = 3
collision_mask = 3
sync_to_physics = false
script = ExtResource( "1_3ywpo" )
hit_effect_scene = ExtResource( "2_1tben" )
speed = 15.0
[node name="Rocket" parent="." instance=ExtResource( "3_wqrr6" )]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(0, 4.37114e-08, -1, 1, 0, 0, 0, -1, -4.37114e-08, 0, 0, 0)
shape = SubResource( "CapsuleShape3D_qjk68" )
[node name="OmniLight3D" type="OmniLight3D" parent="."]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0.378725)
light_color = Color(1, 0.882353, 0.462745, 1)
light_size = 0.25
shadow_enabled = true
shadow_blur = 3.0
[node name="Smoke" type="GPUParticles3D" parent="OmniLight3D"]
layers = 2
emitting = false
amount = 128
lifetime = 1.26
fixed_fps = 0
local_coords = false
trail_length_secs = 0.72
process_material = SubResource( "ParticlesMaterial_ckuul" )
draw_pass_1 = SubResource( "QuadMesh_gkbg3" )

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,29 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dwiyp823r5r8t"
path="res://.godot/imported/RocketLauncher.gltf-db4a63ef51b8543aafbff6f2736827c3.scn"
[deps]
source_file="res://Assets/Weapons/RocketLauncher/RocketLauncher.gltf"
dest_files=["res://.godot/imported/RocketLauncher.gltf-db4a63ef51b8543aafbff6f2736827c3.scn"]
[params]
nodes/root_type="Node3D"
nodes/root_name="Scene Root"
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=2
meshes/lightmap_texel_size=0.1
skins/use_named_skins=true
animation/import=true
animation/fps=30
import_script/path=""
_subresources={
}

View File

@ -1,93 +1,38 @@
[gd_scene load_steps=15 format=3 uid="uid://qc2fug6o4wns"]
[gd_scene load_steps=7 format=3 uid="uid://qc2fug6o4wns"]
[ext_resource type="PackedScene" uid="uid://bemrov0tiy08n" path="res://Assets/Weapons/Weapon.tscn" id="1_x28sf"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0dj5f"]
albedo_color = Color(0, 0, 0, 1)
metallic = 1.0
roughness = 0.0
emission_enabled = true
emission = Color(0.054902, 0.207843, 1, 1)
emission_energy = 16.0
emission_operator = 1
[sub_resource type="OpenSimplexNoise" id="OpenSimplexNoise_vahne"]
[sub_resource type="NoiseTexture" id="NoiseTexture_hoc12"]
seamless = true
noise = SubResource( "OpenSimplexNoise_vahne" )
[sub_resource type="OpenSimplexNoise" id="OpenSimplexNoise_x3lq2"]
[sub_resource type="NoiseTexture" id="NoiseTexture_qdc4e"]
seamless = true
as_normal_map = true
noise = SubResource( "OpenSimplexNoise_x3lq2" )
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3fpoc"]
transparency = 1
blend_mode = 1
albedo_color = Color(0.478431, 0.478431, 0.478431, 1)
albedo_texture = SubResource( "NoiseTexture_hoc12" )
metallic = 1.0
roughness = 0.46
normal_enabled = true
normal_texture = SubResource( "NoiseTexture_qdc4e" )
uv1_triplanar = true
grow = true
grow_amount = 0.006
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_6sfk3"]
next_pass = SubResource( "StandardMaterial3D_3fpoc" )
albedo_color = Color(0.678431, 0.0745098, 0, 1)
metallic = 1.0
roughness = 0.0
uv1_triplanar = true
[sub_resource type="OpenSimplexNoise" id="OpenSimplexNoise_v4ghl"]
[sub_resource type="NoiseTexture" id="NoiseTexture_j68te"]
seamless = true
noise = SubResource( "OpenSimplexNoise_v4ghl" )
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_14dfa"]
transparency = 1
cull_mode = 1
albedo_color = Color(0.513726, 1, 0.129412, 0.329412)
metallic = 1.0
roughness = 0.36
roughness_texture = SubResource( "NoiseTexture_j68te" )
uv1_triplanar = true
grow = true
grow_amount = -0.003
[sub_resource type="OpenSimplexNoise" id="OpenSimplexNoise_mvpai"]
[sub_resource type="NoiseTexture" id="NoiseTexture_4tgn3"]
seamless = true
as_normal_map = true
bump_strength = 20.3
noise = SubResource( "OpenSimplexNoise_mvpai" )
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_f5e1a"]
next_pass = SubResource( "StandardMaterial3D_14dfa" )
cull_mode = 1
albedo_color = Color(0.482353, 0.482353, 0.482353, 1)
roughness = 0.3
normal_enabled = true
normal_texture = SubResource( "NoiseTexture_4tgn3" )
uv1_triplanar = true
[ext_resource type="PackedScene" uid="uid://dwiyp823r5r8t" path="res://Assets/Weapons/RocketLauncher/RocketLauncher.gltf" id="2_a04bi"]
[ext_resource type="PackedScene" uid="uid://bt0lppumya6fv" path="res://Assets/Weapons/RocketLauncher/Rocket.tscn" id="2_xwyny"]
[ext_resource type="AudioStream" uid="uid://bpuw5fx04a7n0" path="res://Assets/SFX/Weapons_RocketLauncher_Shot_01_A.wav" id="4_ni7bd"]
[ext_resource type="AudioStream" uid="uid://c3es208ntginf" path="res://Assets/SFX/Weapons_RocketLauncher_Shot_01_B.wav" id="5_vbe1t"]
[ext_resource type="AudioStream" uid="uid://c1fv01sc4dy5w" path="res://Assets/SFX/Weapons_RocketLauncher_Shot_01_C.wav" id="6_n223q"]
[node name="Weapon" instance=ExtResource( "1_x28sf" )]
weapon_type = 1
projectile_or_tracer_scene = ExtResource( "2_xwyny" )
weapon_damage = 125
[node name="Static" parent="Handgun/Handgun_Armature/Skeleton3D" index="0"]
surface_material_override/0 = SubResource( "StandardMaterial3D_0dj5f" )
surface_material_override/1 = SubResource( "StandardMaterial3D_6sfk3" )
[node name="RocketLauncher" parent="." index="0" instance=ExtResource( "2_a04bi" )]
[node name="Hand" parent="Handgun/HandArmature/Skeleton3D2" index="0"]
surface_material_override/0 = SubResource( "StandardMaterial3D_f5e1a" )
[node name="Muzzle" parent="RocketLauncher" index="0"]
transform = Transform3D(1.78814e-07, -1, 0, 1, 1.78814e-07, 0, 0, 0, 1, -0.613084, 0.126382, -8.51678e-05)
[editable path="Handgun"]
[node name="Cylinder" parent="RocketLauncher/Handgun_Armature" index="0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0414381, 0.0118755, -0.000240355)
[node name="Cylinder001" parent="RocketLauncher/Handgun_Armature/Cylinder" index="0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.259108, -0.0303738, 0.133397)
[node name="AudioStreamPlayer3D" parent="SFX/Shoot A" index="0"]
stream = ExtResource( "4_ni7bd" )
[node name="AudioStreamPlayer3D" parent="SFX/Shoot B" index="0"]
stream = ExtResource( "5_vbe1t" )
[node name="AudioStreamPlayer3D" parent="SFX/Shoot C" index="0"]
stream = ExtResource( "6_n223q" )
[editable path="RocketLauncher"]
[editable path="SFX/Shoot A"]
[editable path="SFX/Shoot B"]
[editable path="SFX/Shoot C"]

View File

@ -7,14 +7,20 @@ extends Node3D
@onready var camera = get_parent().get_parent()
@onready var ejector = find_node("Ejector")
@onready var muzzle = find_node("Muzzle")
@onready var animation_player = find_node("AnimationPlayer")
var casing = preload("res://Assets/Weapons/Handgun/Casing.tscn")
var flash = preload("res://Assets/Effects/MuzzleFlash.tscn")
var tracer = preload("res://Assets/Effects/BulletTracer.tscn")
#var impact_wall = preload("res://Assets/Effects/ImpactSparks.tscn")
var impact_wall = preload("res://Assets/Effects/ImpactExplosion.tscn")
var impact_bullet = preload("res://Assets/Effects/ImpactSparks.tscn")
var impact_explosion = preload("res://Assets/Effects/ImpactExplosion.tscn")
var flyby_sound = preload("res://Assets/Audio/BulletFlyBySoundPlayer.tscn")
enum WeaponType {HITSCAN, PROJECTILE, MELEE}
@export var weapon_type : WeaponType
@export var projectile_or_tracer_scene : PackedScene
@export var weapon_damage : int
# accuracy
var spread_min = 1
@ -30,7 +36,19 @@ var spread = spread_min
#enum Trigger {TRIGGER_PRIMARY, TRIGGER_SECONDARY}
@rpc(any_peer, call_local, reliable) func shoot(spread_offset:=Vector3.ZERO):
$"SFX/Shoot A".play()
$"SFX/Shoot B".play()
$"SFX/Shoot C".play()
var flash_effect = flash.instantiate()
flash_effect.global_transform = muzzle.global_transform
get_parent().add_child(flash_effect)
animation_player.play("Shoot", 0, 2.5)
var space_state = get_world_3d().direct_space_state
var from = camera.get_global_transform().origin
@ -43,126 +61,124 @@ var spread = spread_min
physics_ray_query_parameters_3d.exclude = [player]
var ray = space_state.intersect_ray(physics_ray_query_parameters_3d)
$"SFX/Shoot A".play()
$"SFX/Shoot B".play()
$"SFX/Shoot C".play()
$Handgun/AnimationPlayer.play("Shoot", 0, 2.5)
var flash_effect = flash.instantiate()
var tracer_effect = tracer.instantiate()
get_parent().add_child(flash_effect)
get_tree().root.add_child(tracer_effect)
flash_effect.global_transform = muzzle.global_transform
tracer_effect.global_transform = muzzle.global_transform.looking_at(to)
var casing_instance = casing.instantiate()
get_tree().root.add_child(casing_instance)
casing_instance.global_transform = ejector.global_transform#approximating delta
casing_instance.linear_velocity = ejector.global_transform.basis[1] * randf_range(3.2, 4.5) + (player.motion_velocity / 2)
casing_instance.angular_velocity.y += randf_range(-10, 10)
casing_instance.angular_velocity.x += randf_range(-10, 10)
if weapon_type == WeaponType.HITSCAN:
var tracer_instance = projectile_or_tracer_scene.instantiate()
get_tree().root.add_child(tracer_instance)
tracer_instance.global_transform = muzzle.global_transform.looking_at(to)
var casing_instance = casing.instantiate()
get_tree().root.add_child(casing_instance)
if ray:
if is_multiplayer_authority(): # only do this on the attacker's local instance of the game
give_damage(ray['collider'], ray['position'], ray['normal'], 20, self.global_transform.origin, Globals.DamageType.BULLET, 1.0)
### bullet flyby sounds
if ray: # if we hit something - use that to evaluate the flyby sound
to = ray['position']
var flyby_camera = get_tree().get_root().get_camera_3d()
if flyby_camera == camera: # don't spawn flyby sound for the shooter
return
casing_instance.global_transform = ejector.global_transform#approximating delta
casing_instance.linear_velocity = ejector.global_transform.basis[1] * randf_range(3.2, 4.5) + (player.motion_velocity / 2)
casing_instance.angular_velocity.y += randf_range(-10, 10)
casing_instance.angular_velocity.x += randf_range(-10, 10)
var x := Vector3.ZERO
var A = from
var B = to
var C = flyby_camera.global_transform.origin
var d0 = (B - A).dot(A - C)
var d1 = (B - A).dot(B - C)
if d0 < 0 and d1 < 0:
print("Firing away from the camera")
elif d0 > 0 and d1 > 0:
print("Bullet hit before passing by")
else:
var X = d0/(d0-d1)
var flyby = flyby_sound.instantiate()
get_tree().root.add_child(flyby)
flyby.global_transform.origin = A + X * (B - A)
if ray:
if is_multiplayer_authority(): # only do this on the attacker's local instance of the game
give_damage(ray['collider'], ray['position'], ray['normal'], 20, self.global_transform.origin, Globals.DamageType.BULLET, 1.0)
#print("===")
#print(X)
#print("===")
#flyby.global_transform.origin = A + x * (B - A)
### bullet flyby sounds
if ray: # if we hit something - use that to evaluate the flyby sound
to = ray['position']
var flyby_camera = get_tree().get_root().get_camera_3d()
if flyby_camera == camera: # don't spawn flyby sound for the shooter
return
var x := Vector3.ZERO
var A = from
var B = to
var C = flyby_camera.global_transform.origin
var d0 = (B - A).dot(A - C)
var d1 = (B - A).dot(B - C)
if d0 < 0 and d1 < 0:
print("Firing away from the camera")
elif d0 > 0 and d1 > 0:
print("Bullet hit before passing by")
else:
var X = d0/(d0-d1)
var flyby = flyby_sound.instantiate()
get_tree().root.add_child(flyby)
flyby.global_transform.origin = A + X * (B - A)
#print("===")
#print(X)
#print("===")
#flyby.global_transform.origin = A + x * (B - A)
# TODO - spawn
# TODO - spawn
elif weapon_type == WeaponType.PROJECTILE:
var projectile_instance : Node3D = projectile_or_tracer_scene.instantiate()
projectile_instance.global_transform = muzzle.global_transform.looking_at(to)
#projectile_instance.rotate_x(PI/2)
get_tree().root.add_child(projectile_instance)
return # skip the rest - it's deprecated code
####################### DEPRACATED ↓↓↓↓↓↓↓↓
var impact_vfx
if ray: # did we hit anything?
if ray['collider'].has_method(&'receive_damage') && is_multiplayer_authority():
ray['collider'].rpc(&'damage', 20, get_multiplayer_authority(), global_transform.origin) # apply damage
return
if ray['collider'].has_method(&'damage'):
if is_multiplayer_authority(): #get_tree().multiplayer.get_multiplayer_unique_id() == 1: # make sure this can only run on the server
#print("SHOT HIT ", ray['collider'])
ray['collider'].rpc(&'damage', 20) # apply damage
if main.player_list.get(ray['collider'].get_multiplayer_authority()).health <= 0: # if he ded
ray['collider'].rpc(&'die', self.get_multiplayer_authority())
main.player_list.players[player.get_multiplayer_authority()].score += 1 # give the killer a point
main.rpc(&'player_list_update', main.player_list.get(player.get_multiplayer_authority()).serialize(), player.get_multiplayer_authority())
hud.get_node("Crosshair").kill()
main.check_game_win_condition()
# check for firstblood
if main.player_list.players[player.get_multiplayer_authority()].score == 1:
var firstblood = true
for i in main.player_list.players.keys():
if i != player.get_multiplayer_authority() and main.player_list.players[i].score > 0:
firstblood = false
if firstblood:
main.get_node("Announcer").speak(main.get_node("Announcer").firstblood)
# check for revenge (payback) - don't play if this is a duel, it'd be silly
if main.player_list.players.size() > 2 and ray['collider'].get_multiplayer_authority() == player.revenge_pid:
main.get_node("Announcer").speak(main.get_node("Announcer").payback)
player.revenge_pid = -1 # reset revenge
else:
hud.get_node("Crosshair").hit()
ray['collider'].rpc(&'moan')
# boardcast the new health value to all peers
main.rpc(&'player_list_update', main.player_list.get(ray['collider'].get_multiplayer_authority()).serialize(), ray['collider'].get_multiplayer_authority())
main.update_hud()
# impact_vfx = impact_player.instantiate()
else:
# impact_vfx = impact_wall.instantiate()
pass
# if impact_vfx != null:
# impact_vfx.global_transform = impact_vfx.global_transform.looking_at(ray['normal'])
# impact_vfx.global_transform.origin = ray['position']
# get_tree().root.add_child(impact_vfx)
#
#print(ray)
# var impact_vfx
#
# if ray: # did we hit anything?
# if ray['collider'].has_method(&'receive_damage') && is_multiplayer_authority():
# ray['collider'].rpc(&'damage', 20, get_multiplayer_authority(), global_transform.origin) # apply damage
#
# return
#
# if ray['collider'].has_method(&'damage'):
# if is_multiplayer_authority(): #get_tree().multiplayer.get_multiplayer_unique_id() == 1: # make sure this can only run on the server
# #print("SHOT HIT ", ray['collider'])
# ray['collider'].rpc(&'damage', 20) # apply damage
# if main.player_list.get(ray['collider'].get_multiplayer_authority()).health <= 0: # if he ded
# ray['collider'].rpc(&'die', self.get_multiplayer_authority())
#
# main.player_list.players[player.get_multiplayer_authority()].score += 1 # give the killer a point
# main.rpc(&'player_list_update', main.player_list.get(player.get_multiplayer_authority()).serialize(), player.get_multiplayer_authority())
# hud.get_node("Crosshair").kill()
# main.check_game_win_condition()
#
# # check for firstblood
# if main.player_list.players[player.get_multiplayer_authority()].score == 1:
# var firstblood = true
# for i in main.player_list.players.keys():
# if i != player.get_multiplayer_authority() and main.player_list.players[i].score > 0:
# firstblood = false
# if firstblood:
# main.get_node("Announcer").speak(main.get_node("Announcer").firstblood)
#
# # check for revenge (payback) - don't play if this is a duel, it'd be silly
# if main.player_list.players.size() > 2 and ray['collider'].get_multiplayer_authority() == player.revenge_pid:
# main.get_node("Announcer").speak(main.get_node("Announcer").payback)
# player.revenge_pid = -1 # reset revenge
# else:
# hud.get_node("Crosshair").hit()
# ray['collider'].rpc(&'moan')
#
# # boardcast the new health value to all peers
# main.rpc(&'player_list_update', main.player_list.get(ray['collider'].get_multiplayer_authority()).serialize(), ray['collider'].get_multiplayer_authority())
# main.update_hud()
#
## impact_vfx = impact_player.instantiate()
# else:
## impact_vfx = impact_wall.instantiate()
# pass
#
## if impact_vfx != null:
## impact_vfx.global_transform = impact_vfx.global_transform.looking_at(ray['normal'])
## impact_vfx.global_transform.origin = ray['position']
## get_tree().root.add_child(impact_vfx)
##
# #print(ray)
####################### DEPRACATED ↑↑↑↑↑↑↑↑
@ -171,7 +187,7 @@ func give_damage(target: Node, hit_position: Vector3, hit_normal: Vector3, damag
target.rpc(&'take_damage', get_multiplayer_authority(), hit_position, hit_normal, damage, source_position, type, push)
else:
# TODO take data from the material of the target and spawn an appropriate hit effect
var impact_vfx : Node = impact_wall.instantiate()
var impact_vfx : Node = impact_bullet.instantiate()
get_tree().root.add_child(impact_vfx)
impact_vfx.global_transform.origin = hit_position
@ -188,7 +204,7 @@ func give_damage(target: Node, hit_position: Vector3, hit_normal: Vector3, damag
func trigger(index: int, active: bool) -> void:
#print("Weapon " + str(name) + ", Trigger " + str(index) + ", active: " + str(active))
if index == 0 and active and $Handgun/AnimationPlayer.is_playing() == false:
if index == 0 and active and animation_player.is_playing() == false:
spread = min(spread + spread_boost, spread_max)
var spread_offset = Vector3.ZERO
@ -203,7 +219,5 @@ func trigger(index: int, active: bool) -> void:
# Called when the node enters the scene tree for the first time.
func _ready():
# align the sound source with the head to produce balanced stereo
pass #$SFX/Shoot.global_transform = camera.global_transform

View File

@ -1,6 +1,5 @@
[gd_scene load_steps=7 format=3 uid="uid://bemrov0tiy08n"]
[gd_scene load_steps=6 format=3 uid="uid://bemrov0tiy08n"]
[ext_resource type="PackedScene" uid="uid://2h6xvopq206h" path="res://Assets/Weapons/Handgun/Handgun.gltf" id="1"]
[ext_resource type="Script" path="res://Assets/Weapons/Weapon.gd" id="2"]
[ext_resource type="PackedScene" uid="uid://c5cwnfuw4go1b" path="res://Assets/Audio/SoundPlayer.tscn" id="3_q0xp7"]
[ext_resource type="AudioStream" uid="uid://cw01fxbftb6m2" path="res://Assets/SFX/Weapons_Handgun_Shot_01_B.wav" id="4_4ao2c"]
@ -10,19 +9,7 @@
[node name="Weapon" type="Node3D"]
script = ExtResource( "2" )
[node name="Handgun" parent="." instance=ExtResource( "1" )]
[node name="Static" parent="Handgun/Handgun_Armature/Skeleton3D" index="0"]
layers = 2
[node name="Hand" parent="Handgun/HandArmature/Skeleton3D2" index="0"]
layers = 2
[node name="AnimationPlayer" parent="Handgun" index="4"]
blend_times = []
[node name="SFX" type="Node3D" parent="."]
script = null
[node name="Shoot A" parent="SFX" instance=ExtResource( "3_q0xp7" )]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0168038, 0.251726, 0.250185)
@ -57,7 +44,6 @@ unit_db = 4.0
unit_size = 16.0
max_db = 4.0
[editable path="Handgun"]
[editable path="SFX/Shoot A"]
[editable path="SFX/Shoot B"]
[editable path="SFX/Shoot C"]