Added Rocket Launcher. Implemented weapon types.
Implemented a rocket, but it doesn't fly right...feature-rocketlauncher
parent
dc0b83efff
commit
498bb5a09e
Binary file not shown.
|
@ -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)
|
||||
|
||||
|
|
|
@ -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"]
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Binary file not shown.
|
@ -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
|
Binary file not shown.
|
@ -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
|
Binary file not shown.
|
@ -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
|
|
@ -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"]
|
||||
|
|
|
@ -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
|
@ -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={
|
||||
}
|
|
@ -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
|
@ -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={
|
||||
}
|
|
@ -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"]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"]
|
||||
|
|
Reference in New Issue