made tracker gun

This commit is contained in:
Derek
2024-11-24 16:27:48 -06:00
parent 05b8c0d760
commit 0312da48b8
21 changed files with 1008 additions and 242 deletions

View File

@@ -1,9 +1,10 @@
[gd_scene load_steps=111 format=4 uid="uid://6agmt1hqlhww"]
[gd_scene load_steps=112 format=4 uid="uid://6agmt1hqlhww"]
[ext_resource type="Script" path="res://scripts/LevelManager.gd" id="1_sbpvn"]
[ext_resource type="PackedScene" uid="uid://brl0bsqjl5dg3" path="res://assets/mac_10.tscn" id="2_fn4vb"]
[ext_resource type="Texture2D" uid="uid://ckjcv72jcojjh" path="res://assets/materials/91_laurel hedge PBR texture-seamless_hr/91_laurel hedge_DIFF (Custom).jpg" id="3_3ov8a"]
[ext_resource type="LightmapGIData" uid="uid://bwpvltmeo4cfl" path="res://assets/LevelBlockouts/blockout_2.lmbake" id="3_d2pxn"]
[ext_resource type="PackedScene" uid="uid://dslxb3psx30vp" path="res://assets/pistol1.tscn" id="3_s3a37"]
[ext_resource type="Texture2D" uid="uid://d210plbmb7a2o" path="res://assets/materials/91_laurel hedge PBR texture-seamless_hr/91_laurel hedge_NORM (Custom).jpg" id="4_5u2rd"]
[ext_resource type="PackedScene" uid="uid://20csd6dmwj4y" path="res://assets/jump_platform.tscn" id="4_j47q8"]
[ext_resource type="Texture2D" uid="uid://b43o7m3ykjvqg" path="res://assets/materials/71_clean plaster PBR texture-seamless_hr/71_clean plaster_DIFF.jpg" id="5_bm4ps"]
@@ -1004,6 +1005,7 @@ player = NodePath("Player")
money = 50
start_health = 5
gun_1 = ExtResource("2_fn4vb")
gun_2 = ExtResource("3_s3a37")
health_drop_enabled = false
[node name="Player" parent="." instance=ExtResource("9_3usor")]

View File

@@ -82,10 +82,10 @@ margin = 0.001
height = 1.5
radius = 0.055
[node name="Bullet" type="RigidBody3D"]
[node name="Bullet" type="RigidBody3D" node_paths=PackedStringArray("collision_shape")]
top_level = true
collision_layer = 0
collision_mask = 105
collision_layer = 128
collision_mask = 225
axis_lock_angular_x = true
axis_lock_angular_y = true
axis_lock_angular_z = true
@@ -95,6 +95,7 @@ continuous_cd = true
contact_monitor = true
max_contacts_reported = 3
script = ExtResource("1_oj0f5")
collision_shape = NodePath("BulletCollision")
[node name="Cylinder" type="MeshInstance3D" parent="."]
transform = Transform3D(-2, -3.01992e-07, 0, 0, 0, -2, 3.01992e-07, -2, 0, 1.46364e-07, 0, 0.627698)

View File

@@ -1,8 +1,8 @@
[gd_scene load_steps=19 format=3 uid="uid://dslxb3psx30vp"]
[gd_scene load_steps=23 format=3 uid="uid://dslxb3psx30vp"]
[ext_resource type="PackedScene" uid="uid://svrb3n31mkag" path="res://assets/Models/gun.blend" id="1_frekg"]
[ext_resource type="Script" path="res://scripts/gun.gd" id="2_63tea"]
[ext_resource type="PackedScene" uid="uid://dqhltdnqyg8ni" path="res://assets/bullet.tscn" id="3_4pvsf"]
[ext_resource type="Script" path="res://scripts/trackerGun.gd" id="2_ieev5"]
[ext_resource type="PackedScene" uid="uid://7u8hjsvnfwjn" path="res://assets/tracker_bullet.tscn" id="3_hixkr"]
[ext_resource type="PackedScene" uid="uid://crvohhc6kgshn" path="res://assets/bullet_hole.tscn" id="4_bu1g0"]
[ext_resource type="PackedScene" uid="uid://c1gdehrsytlkk" path="res://assets/casing_2.tscn" id="5_gls8p"]
[ext_resource type="PackedScene" uid="uid://cp8563f0oxvff" path="res://assets/mag1.tscn" id="6_ysonb"]
@@ -11,6 +11,43 @@
[ext_resource type="AudioStream" uid="uid://db3iy0f1pa5lg" path="res://assets/Audio/Weapons/gun-m-16-reload-full-clip-magazine-SBA-300121257.wav" id="10_xn8pu"]
[ext_resource type="Texture2D" uid="uid://dtg3nb2ew72c3" path="res://assets/star_05.png" id="11_x0sef"]
[sub_resource type="SphereMesh" id="SphereMesh_u47cm"]
radius = 0.05
height = 0.1
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4iouf"]
albedo_color = Color(0, 0, 0, 1)
emission_enabled = true
emission = Color(0.743194, 0.35874, 1.92523e-07, 1)
emission_energy_multiplier = 5.0
[sub_resource type="Animation" id="Animation_urfns"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("gun:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, -0.000397999, -0.11995)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("gun:rotation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, -1.5708, 0)]
}
[sub_resource type="Animation" id="Animation_u008m"]
resource_name = "empty"
length = 0.25
@@ -40,6 +77,47 @@ tracks/1/keys = {
"values": [Vector3(0, -1.5708, 0), Vector3(5.21802e-09, -1.5708, 0.11966), Vector3(0, -1.5708, 0)]
}
[sub_resource type="Animation" id="Animation_h3q6j"]
resource_name = "fire_tracker"
length = 0.35
step = 0.01
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("gun:position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.15, 0.25, 0.35),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector3(0, -0.000397999, 0), Vector3(0, 0.116845, 0), Vector3(0, -0.0215431, 0), Vector3(0, -0.000397999, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("gun:rotation")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.15, 0.25, 0.35),
"transitions": PackedFloat32Array(1, 1, 1, 1),
"update": 0,
"values": [Vector3(0, -1.5708, 0), Vector3(-2.69979e-06, -1.5708, -0.841737), Vector3(1.04543e-06, -1.5708, 0.288695), Vector3(0, -1.5708, 0)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("gun/slide:position")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(),
"transitions": PackedFloat32Array(),
"update": 0,
"values": []
}
[sub_resource type="Animation" id="Animation_cifop"]
resource_name = "inspect"
length = 2.51
@@ -255,17 +333,22 @@ tracks/2/path = NodePath(".")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(1),
"transitions": PackedFloat32Array(1),
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"values": [{
"args": [],
"method": &"remove_tracker"
}, {
"args": [],
"method": &"swapped_out"
}]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_vkrtt"]
_data = {
"RESET": SubResource("Animation_urfns"),
"empty": SubResource("Animation_u008m"),
"fire_tracker": SubResource("Animation_h3q6j"),
"inspect": SubResource("Animation_cifop"),
"reload": SubResource("Animation_svhrs"),
"shoot": SubResource("Animation_bsc1a"),
@@ -274,15 +357,16 @@ _data = {
"swap_out": SubResource("Animation_lleyf")
}
[node name="Pistol" node_paths=PackedStringArray("flare_light", "anim_player", "barrel_raycast", "casing_ejector", "mag_ejector", "audio_fire", "audio_empty", "audio_reload") instance=ExtResource("1_frekg")]
[node name="Pistol" node_paths=PackedStringArray("tracker_indicator", "flare_light", "anim_player", "barrel_raycast", "casing_ejector", "mag_ejector", "audio_fire", "audio_empty", "audio_reload") instance=ExtResource("1_frekg")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0145504, -0.0460228)
script = ExtResource("2_63tea")
gun_name = "Dumb Pistol"
script = ExtResource("2_ieev5")
gun_name = "Tracker Pistol"
fire_mode = 2
recoil_amount = Vector3(0.01, 0.01, 0.01)
bullet_drop = 0.03
recoil_amount = Vector3(0, 0.05, 0.05)
bullet_speed = 50
tracker_indicator = NodePath("gun/slide/TrackerIndicator")
flare_light = NodePath("SpotLight3D")
bullet = ExtResource("3_4pvsf")
bullet = ExtResource("3_hixkr")
bullethole = ExtResource("4_bu1g0")
casing = ExtResource("5_gls8p")
mag = ExtResource("6_ysonb")
@@ -295,7 +379,7 @@ audio_empty = NodePath("Audio/Empty")
audio_reload = NodePath("Audio/Reload")
[node name="gun" parent="." index="0"]
transform = Transform3D(-1.81e-06, 0, -0.5, 0, 0.5, 0, 0.5, 0, -1.81e-06, 0, -0.000397999, 0)
transform = Transform3D(-1.81e-06, 0, -0.5, 0, 0.5, 0, 0.5, 0, -1.81e-06, 0, -0.000397999, -0.11995)
[node name="mag" parent="gun" index="0"]
transform = Transform3D(0.0897307, -0.048904, -9.31323e-10, 0.012226, 0.358923, 1.74623e-10, 3.72529e-09, -1.86265e-09, 0.0323253, 0.00225297, 0.0306008, -2.98023e-08)
@@ -303,6 +387,12 @@ transform = Transform3D(0.0897307, -0.048904, -9.31323e-10, 0.012226, 0.358923,
[node name="slide" parent="gun" index="1"]
transform = Transform3D(0.579973, 0, 0, 0, 0.579973, -1.0175e-10, 1.16415e-10, 7.27596e-11, 0.579973, 0, 0, 0)
[node name="TrackerIndicator" type="MeshInstance3D" parent="gun/slide" index="0"]
transform = Transform3D(1.72422, -9.12793e-23, 0, -6.08805e-20, 1.72422, 3.02495e-10, -3.46063e-10, -2.16309e-10, 1.72422, 0.139739, 0.424926, -5.05937e-07)
mesh = SubResource("SphereMesh_u47cm")
skeleton = NodePath("../..")
surface_material_override/0 = SubResource("StandardMaterial3D_4iouf")
[node name="RayCastMag" type="RayCast3D" parent="gun" index="2"]
transform = Transform3D(1.11722, -0.0135336, 0.080048, 0.00234133, 1.1094, 0.154888, -0.0811502, -0.154313, 1.10651, 0, 0.000445819, 0)

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=26 format=3 uid="uid://drwae3loscbw7"]
[gd_scene load_steps=27 format=3 uid="uid://drwae3loscbw7"]
[ext_resource type="Script" path="res://scripts/player.gd" id="1_x7wms"]
[ext_resource type="Script" path="res://scripts/recoil.gd" id="3_405jc"]
@@ -18,6 +18,7 @@
[ext_resource type="AudioStream" uid="uid://t50i483xmj3a" path="res://assets/Audio/Weapons/toy-click-spin-SBA-300071143.wav" id="14_pnsbm"]
[ext_resource type="Shader" path="res://assets/crtTest.gdshader" id="14_v5svg"]
[ext_resource type="AudioStream" uid="uid://c1e6vr2hndho7" path="res://assets/Audio/Weapons/Misc (Ammo Boxes, Holsters, Etc)/Kydex Unholster 002.wav" id="17_1fyjm"]
[ext_resource type="AudioStream" uid="uid://dqj4cx05f25jj" path="res://assets/Audio/punch-body-hard-SBA-300156881.wav" id="19_6jglu"]
[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_l5ga0"]
blend_mode = 1
@@ -237,6 +238,9 @@ stream = ExtResource("12_f51u4")
[node name="WeaponPickup" type="AudioStreamPlayer" parent="Audio"]
stream = ExtResource("17_1fyjm")
[node name="HitIndicator" type="AudioStreamPlayer" parent="Audio"]
stream = ExtResource("19_6jglu")
[connection signal="tree_entered" from="." to="." method="_on_tree_entered"]
[connection signal="body_entered" from="pick_up_detection" to="." method="_on_pick_up_detection_body_entered"]
[connection signal="body_entered" from="pick_up_magnet" to="." method="_on_pick_up_magnet_body_entered"]

View File

@@ -1006,10 +1006,10 @@ tracks/1/path = NodePath("revolver1:rotation")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.6, 1),
"transitions": PackedFloat32Array(1, 1, 1),
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(-0.988971, 2.72615, -2.59346), Vector3(-0.187002, 0.326746, -1.63372), Vector3(0, 0, -1.5708)]
"values": [Vector3(-0.988971, 2.72615, -2.59346), Vector3(0, 0, -1.5708)]
}
[sub_resource type="Animation" id="Animation_nvmxj"]
@@ -1107,11 +1107,11 @@ audio_empty = NodePath("Audio/Empty")
audio_reload = NodePath("Audio/Reload")
[node name="revolver1" parent="." index="0"]
transform = Transform3D(-1.086e-06, 0.3, 0, -0.3, -1.086e-06, 0, 0, 0, 0.3, 0, 0, -0.073)
transform = Transform3D(0.286982, -0.0566938, 0.0665387, -0.0859102, -0.140712, 0.250638, -0.0161561, -0.258816, -0.150841, -3.07392, -1.84477, 0.367733)
mesh = SubResource("ArrayMesh_a1hah")
[node name="Chamber" parent="revolver1" index="0"]
transform = Transform3D(1, 0, 0, 0, -3.61999e-06, -1, 0, 1, -3.61999e-06, -0.0143475, 0, -0.0849619)
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, -0.0143475, 0, -0.0849619)
mesh = SubResource("ArrayMesh_x43wl")
[node name="bullet" parent="revolver1/Chamber" index="0"]
@@ -1173,7 +1173,7 @@ transform = Transform3D(4.17223e-07, 7.04731e-19, 2.10229, -2.98023e-07, -2.1022
mesh = SubResource("ArrayMesh_0w43n")
[node name="Trigger" parent="revolver1" index="2"]
transform = Transform3D(-0.86282, -0.50551, 1.82994e-06, 0, -3.61999e-06, -1, 0.50551, -0.86282, 3.1234e-06, 0.226752, 0, -0.00209358)
transform = Transform3D(-0.86282, -0.50551, 2.20966e-08, 0, -4.37114e-08, -1, 0.50551, -0.86282, 3.77151e-08, 0.226752, 0, -0.00209358)
mesh = SubResource("ArrayMesh_ahftj")
[node name="flare" type="MeshInstance3D" parent="revolver1" index="3"]

109
assets/shoot_marker.tscn Normal file
View File

@@ -0,0 +1,109 @@
[gd_scene load_steps=9 format=3 uid="uid://rcixv0spjpvw"]
[ext_resource type="Script" path="res://scripts/tracker_marker.gd" id="1_pi8qa"]
[sub_resource type="SphereMesh" id="SphereMesh_ejmtl"]
radius = 0.1
height = 0.2
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fmyhe"]
transparency = 1
blend_mode = 1
emission_enabled = true
emission = Color(0, 0.745098, 0, 1)
emission_energy_multiplier = 10.0
[sub_resource type="CylinderMesh" id="CylinderMesh_0f8ut"]
top_radius = 0.1
bottom_radius = 0.01
[sub_resource type="Animation" id="Animation_rkem3"]
resource_name = "mark"
length = 0.25
step = 0.01
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("MeshHandle:position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.25),
"transitions": PackedFloat32Array(2, 2),
"update": 0,
"values": [Vector3(0, 20, 0), Vector3(0, 0, 0)]
}
[sub_resource type="Animation" id="Animation_u52hi"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("MeshHandle:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, 0, 0)]
}
[sub_resource type="Animation" id="Animation_ylwlm"]
resource_name = "remove"
length = 0.5
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("MeshHandle:position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.5),
"transitions": PackedFloat32Array(2, 2),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, 20, 0)]
}
tracks/1/type = "method"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath(".")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0.5),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"queue_free"
}]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_776o6"]
_data = {
"RESET": SubResource("Animation_u52hi"),
"mark": SubResource("Animation_rkem3"),
"remove": SubResource("Animation_ylwlm")
}
[node name="ShootMarker" type="Node3D"]
script = ExtResource("1_pi8qa")
[node name="Sphere" type="MeshInstance3D" parent="."]
mesh = SubResource("SphereMesh_ejmtl")
skeleton = NodePath("../MeshHandle")
surface_material_override/0 = SubResource("StandardMaterial3D_fmyhe")
[node name="MeshHandle" type="Node3D" parent="."]
[node name="Mesh" type="MeshInstance3D" parent="MeshHandle"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
mesh = SubResource("CylinderMesh_0f8ut")
skeleton = NodePath("../..")
surface_material_override/0 = SubResource("StandardMaterial3D_fmyhe")
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
"": SubResource("AnimationLibrary_776o6")
}
autoplay = "mark"

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=6 format=3 uid="uid://717hhehp83k8"]
[gd_scene load_steps=8 format=3 uid="uid://717hhehp83k8"]
[ext_resource type="Script" path="res://scripts/shotgun_pellet.gd" id="1_1v1ju"]
@@ -19,7 +19,16 @@ emission_energy_multiplier = 20.0
[sub_resource type="SphereShape3D" id="SphereShape3D_55xw1"]
radius = 0.05
[sub_resource type="Animation" id="Animation_s2rms"]
resource_name = "pellet_glow"
[sub_resource type="AnimationLibrary" id="AnimationLibrary_2bjxd"]
_data = {
"pellet_glow": SubResource("Animation_s2rms")
}
[node name="ShotgunPellet" type="RigidBody3D" groups=["pellet", "spawned"]]
visible = false
collision_layer = 160
collision_mask = 237
mass = 0.01
@@ -28,6 +37,7 @@ continuous_cd = true
contact_monitor = true
max_contacts_reported = 1
script = ExtResource("1_1v1ju")
max_bounces = 20
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("SphereMesh_5okb1")
@@ -38,6 +48,13 @@ shape = SubResource("SphereShape3D_55xw1")
[node name="Timer" type="Timer" parent="."]
wait_time = 10.0
one_shot = true
autostart = true
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
"": SubResource("AnimationLibrary_2bjxd")
}
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]

BIN
assets/smoketest.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dj3ja64b8eixe"
path.s3tc="res://.godot/imported/smoketest.jpg-28ad5d100b9669d62292289c20bb2fb9.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/smoketest.jpg"
dest_files=["res://.godot/imported/smoketest.jpg-28ad5d100b9669d62292289c20bb2fb9.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

View File

@@ -879,8 +879,8 @@ mesh = SubResource("ArrayMesh_d210d")
[node name="Area3D" type="Area3D" parent="body" groups=["enemy_target"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.03709, 0)
collision_layer = 136
collision_mask = 141
collision_layer = 128
collision_mask = 128
script = ExtResource("7_8vkma")
[node name="TargetShape" type="CollisionShape3D" parent="body/Area3D" groups=["enemy"]]

142
assets/tracker_bullet.tscn Normal file
View File

@@ -0,0 +1,142 @@
[gd_scene load_steps=13 format=4 uid="uid://7u8hjsvnfwjn"]
[ext_resource type="Script" path="res://scripts/tracker_bullet.gd" id="1_d1qoc"]
[ext_resource type="Texture2D" uid="uid://dqytegxsmb5kg" path="res://assets/Models/bullet.transparency.png" id="2_m1lpb"]
[ext_resource type="AudioStream" uid="uid://dqj4cx05f25jj" path="res://assets/Audio/punch-body-hard-SBA-300156881.wav" id="3_irpoj"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mfpbf"]
resource_name = "bullet"
transparency = 4
cull_mode = 2
albedo_texture = ExtResource("2_m1lpb")
roughness = 0.5
emission_enabled = true
emission = Color(1, 0.606841, 0.365696, 1)
emission_energy_multiplier = 4.0
[sub_resource type="ArrayMesh" id="ArrayMesh_dtlcm"]
_surfaces = [{
"aabb": AABB(-0.0255907, -0.0689083, -0.0255907, 0.0511814, 0.735285, 0.0511814),
"format": 34359742465,
"index_count": 180,
"index_data": PackedByteArray("AAADAAEAAAACAAMAAgAFAAMAAgAEAAUABAAHAAUABAAGAAcABgAJAAcABgAIAAkACAALAAkACAAKAAsACgANAAsACgAMAA0ABQAQAAMABQASABAADAAPAA0ADAAOAA8ADgABAA8ADgAAAAEADgACAAAAAgAGAAQABgAKAAgACgAOAAwADgAGAAIABgAOAAoAFgAdABUAFgAeAB0ACwAUAAkACwAVABQAAQAXAA8AAQARABcAAwARAAEAAwAQABEABwASAAUABwATABIADQAVAAsADQAWABUACQATAAcACQAUABMADwAWAA0ADwAXABYAGgAZABgAGQAeAB8AHgAcAB0AHAAaABsAGgAeABkAHgAaABwAFAAbABMAFAAcABsAEgAYABAAEgAaABgAFwAeABYAFwAfAB4AFQAcABQAFQAdABwAEwAaABIAEwAbABoAEAAZABEAEAAYABkAEQAfABcAEQAZAB8A"),
"lods": [0.0176836, PackedByteArray("AAAZAAEAAAACABkAAgASABkAEgAaABkAAgAEABIABAAGABIABgAIABIAHQAaABIACAAdABIACAAKAB0ACgAMAB0ADAAfAB0ADAAOAB8ADgABAB8AAQAZAB8ADgAAAAEADgACAAAADgAGAAIAAgAGAAQABgAOAAoACgAOAAwABgAKAAgAGQAdAB8AGgAdABkA"), 0.0191346, PackedByteArray("AAAEAAEABAASAAEAEgAZAAEAEgAaABkABAAMABIAHQAaABIADAAdABIADAABAB0AAQAZAB0ADAAAAAEADAAEAAAAGgAdABkA"), 0.0400226, PackedByteArray("AAAMAAEADAAdAAEAHQAZAAEADAABAB0AAQAZAB0ADAAAAAEA")],
"name": "bullet",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 32,
"vertex_data": PackedByteArray("AAAAAM4fjb2do9G8AAAAALkAIT+Mo9G8sDyUPM4fjb3BPJS8sDyUPLkAIT+wPJS8jKPRPM4fjb0iqQmzjKPRPLkAIT8AAACAsDyUPM4fjb2fPJQ8sDyUPLkAIT+wPJQ8AAAAAM4fjb17o9E8AAAAALkAIT+Mo9E8sDyUvM4fjb2fPJQ8sDyUvLkAIT+wPJQ8jKPRvM4fjb0iqQmzjKPRvLkAIT8AAACAsDyUvM4fjb3BPJS8sDyUvLkAIT+wPJS8nSBDPJymJz+cIEO8AAAAAJymJz/V+Ym81fmJPJymJz9PL4IvnSBDPJymJz+eIEM8AAAAAJymJz/V+Yk8nSBDvJymJz+eIEM81fmJvJymJz9PL4IvnSBDvJymJz+cIEO8bdeSO6uXKj9r15K7tqyfLquXKj9Mqs+7TqrPO6uXKj+nU1AwbdeSO6uXKj9v15I7tqyfLquXKj9Qqs87bdeSu6uXKj9v15I7TqrPu6uXKj+nU1AwbdeSu6uXKj9r15K7")
}]
blend_shape_mode = 0
[sub_resource type="ArrayMesh" id="ArrayMesh_gi7r4"]
resource_name = "gunbullet1_Cylinder"
_surfaces = [{
"aabb": AABB(-0.0255907, -0.0689083, -0.0255907, 0.0511814, 0.735285, 0.0511814),
"attribute_data": PackedByteArray("zVRQPzJjDj9eEic5j/V/PxkeJzkAECc5AAAAP4/1fz8AAAA/j/V/PwEAAD8AECc5AQAAPwAQJzl1UiE/MWMOP9YTJzkr+F8/1hMnOSv4Xz8AAAA/LPhfPwAAAD8s+F8/AAAAPyz4Xz8AAAA/LPhfP+QUAD9AS9o+TRUnOcj6Pz9NFSc5yPo/PwAAAD/I+j8/AAAAP8j6Pz8AAAA/yPo/PwAAAD/I+j8/5RQAPyCNeD7FFic5ZP0fP8UWJzlk/R8/AAAAP2T9Hz8AAAA/ZP0fPwAAAD9k/R8/AAAAP2T9Hz92UiE/uC3nPTwYJzkAAAA/PBgnOQAAAD8BAAA/AAAAPwEAAD8AAAA/AQAAPwAAAD8BAAA/AAAAP85UUD/ALec9sxknOTgFwD6zGSc5OAXAPgEAAD84BcA+AQAAPzgFwD4BAAA/OAXAPgEAAD84BcA+X5JxPySNeD4rGyc5cAqAPisbJzlwCoA+AQAAP3IKgD4BAAA/cgqAPgEAAD9yCoA+AQAAP3IKgD5eknE/QkvaPqIcJzlUHwA+ohwnOVQfAD4BAAA/VB8APgEAAD9UHwA+AQAAP1QfAD4BAAA/VB8APgAAAD8s+F8/AAAAPyz4Xz8AAAA/LPhfPwAAAD8s+F8/AAAAP4/1fz8AAAA/j/V/PwEAAD8AECc5AQAAPwAQJzkAAAA/yPo/PwAAAD/I+j8/AAAAP8j6Pz8AAAA/yPo/PwAAAD9k/R8/AAAAP2T9Hz8AAAA/ZP0fPwAAAD9k/R8/AQAAPwAAAD8BAAA/AAAAPwEAAD8AAAA/AQAAPwAAAD8BAAA/OAXAPgEAAD84BcA+AQAAPzgFwD4BAAA/OAXAPgEAAD9yCoA+AQAAP3IKgD4BAAA/cgqAPgEAAD9yCoA+AQAAP1QfAD4BAAA/VB8APgEAAD9UHwA+AQAAP1QfAD52UiE/jvV/PwAAAD8s+F8/AAAAPyz4Xz/OVFA/jvV/PwAAAD+P9X8/AQAAPwAQJznlFAA//rdePwAAAD/I+j8/AAAAP8j6Pz/lFAA/prUvPwAAAD9k/R8/AAAAP2T9Hz91UiE/FHgOPwEAAD8AAAA/AQAAPwAAAD/NVFA/FHgOPwEAAD84BcA+AQAAPzgFwD5eknE/pbUvPwEAAD9yCoA+AQAAP3IKgD5fknE//bdePwEAAD9UHwA+AQAAP1QfAD4="),
"format": 34359742487,
"index_count": 180,
"index_data": PackedByteArray("AQALAAQAAQAIAAsACQAUAA0ACQAQABQADwAbABMADwAXABsAFgAgABkAFgAdACAAHgAnACIAHgAkACcAJQAvACkAJQArAC8AEgA7AAwAEgBDADsALAA3ADAALAAzADcAMgAGADUAMgACAAYAMQAHAAAABwAVAA4AFQAjABwAIwAxACoAMQAVAAcAFQAxACMAUABpAE4AUABrAGkAJgBLACEAJgBNAEsABQBVADQABQA/AFUACgA9AAMACgA5AD0AGgBCABEAGgBHAEIALQBPACgALQBSAE8AHwBFABgAHwBJAEUANgBTAC4ANgBXAFMAXgBbAFgAWwBqAG0AagBkAGcAZABeAGEAXgBqAFsAagBeAGQASABiAEQASABlAGIAQQBaADoAQQBgAFoAVgBsAFEAVgBvAGwATABmAEoATABoAGYARgBfAEAARgBjAF8AOABcADwAOABZAFwAPgBuAFQAPgBdAG4A"),
"lods": [0.0176836, PackedByteArray("AQBcAAMAAQAIAFwACABAAFwAQABfAFwACAAPAEAADwAWAEAAFgAdAEAAaABfAEAAHQBoAEAAHQAkAGgAJAArAGgAKwBuAGgAKwAyAG4AMgAFAG4ABQBdAG4AMgACAAUAMQAHAAAAMQAVAAcABwAVAA4AFQAxACMAIwAxACoAFQAjABwAWwBnAG0AXgBnAFsA"), 0.0191346, PackedByteArray("AQAPAAMADwBAAAMAQABcAAMAQABfAFwADwArAEAAaABfAEAAKwBoAEAAKwAFAGgABQBdAGgAKwACAAUAKgAOAAAAXgBnAFsA"), 0.0400226, PackedByteArray("AQArAAMAKwBoAAMAaABcAAMAKwAFAGgABQBdAGgAKwACAAUA")],
"material": SubResource("StandardMaterial3D_mfpbf"),
"name": "bullet",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 112,
"vertex_data": PackedByteArray("AAAAAM4fjb2do9G8AAAAAM4fjb2do9G8AAAAAM4fjb2do9G8AAAAALkAIT+Mo9G8AAAAALkAIT+Mo9G8AAAAALkAIT+Mo9G8AAAAALkAIT+Mo9G8sDyUPM4fjb3BPJS8sDyUPM4fjb3BPJS8sDyUPM4fjb3BPJS8sDyUPLkAIT+wPJS8sDyUPLkAIT+wPJS8sDyUPLkAIT+wPJS8sDyUPLkAIT+wPJS8jKPRPM4fjb0iqQmzjKPRPM4fjb0iqQmzjKPRPM4fjb0iqQmzjKPRPLkAIT8AAACAjKPRPLkAIT8AAACAjKPRPLkAIT8AAACAjKPRPLkAIT8AAACAsDyUPM4fjb2fPJQ8sDyUPM4fjb2fPJQ8sDyUPM4fjb2fPJQ8sDyUPLkAIT+wPJQ8sDyUPLkAIT+wPJQ8sDyUPLkAIT+wPJQ8sDyUPLkAIT+wPJQ8AAAAAM4fjb17o9E8AAAAAM4fjb17o9E8AAAAAM4fjb17o9E8AAAAALkAIT+Mo9E8AAAAALkAIT+Mo9E8AAAAALkAIT+Mo9E8AAAAALkAIT+Mo9E8sDyUvM4fjb2fPJQ8sDyUvM4fjb2fPJQ8sDyUvM4fjb2fPJQ8sDyUvLkAIT+wPJQ8sDyUvLkAIT+wPJQ8sDyUvLkAIT+wPJQ8sDyUvLkAIT+wPJQ8jKPRvM4fjb0iqQmzjKPRvM4fjb0iqQmzjKPRvM4fjb0iqQmzjKPRvLkAIT8AAACAjKPRvLkAIT8AAACAjKPRvLkAIT8AAACAjKPRvLkAIT8AAACAsDyUvM4fjb3BPJS8sDyUvM4fjb3BPJS8sDyUvM4fjb3BPJS8sDyUvLkAIT+wPJS8sDyUvLkAIT+wPJS8sDyUvLkAIT+wPJS8sDyUvLkAIT+wPJS8nSBDPJymJz+cIEO8nSBDPJymJz+cIEO8nSBDPJymJz+cIEO8nSBDPJymJz+cIEO8AAAAAJymJz/V+Ym8AAAAAJymJz/V+Ym8AAAAAJymJz/V+Ym8AAAAAJymJz/V+Ym81fmJPJymJz9PL4Iv1fmJPJymJz9PL4Iv1fmJPJymJz9PL4Iv1fmJPJymJz9PL4IvnSBDPJymJz+eIEM8nSBDPJymJz+eIEM8nSBDPJymJz+eIEM8nSBDPJymJz+eIEM8AAAAAJymJz/V+Yk8AAAAAJymJz/V+Yk8AAAAAJymJz/V+Yk8AAAAAJymJz/V+Yk8nSBDvJymJz+eIEM8nSBDvJymJz+eIEM8nSBDvJymJz+eIEM8nSBDvJymJz+eIEM81fmJvJymJz9PL4Iv1fmJvJymJz9PL4Iv1fmJvJymJz9PL4Iv1fmJvJymJz9PL4IvnSBDvJymJz+cIEO8nSBDvJymJz+cIEO8nSBDvJymJz+cIEO8nSBDvJymJz+cIEO8bdeSO6uXKj9r15K7bdeSO6uXKj9r15K7bdeSO6uXKj9r15K7tqyfLquXKj9Mqs+7tqyfLquXKj9Mqs+7tqyfLquXKj9Mqs+7TqrPO6uXKj+nU1AwTqrPO6uXKj+nU1AwTqrPO6uXKj+nU1AwbdeSO6uXKj9v15I7bdeSO6uXKj9v15I7bdeSO6uXKj9v15I7tqyfLquXKj9Qqs87tqyfLquXKj9Qqs87tqyfLquXKj9Qqs87bdeSu6uXKj9v15I7bdeSu6uXKj9v15I7bdeSu6uXKj9v15I7TqrPu6uXKj+nU1AwTqrPu6uXKj+nU1AwTqrPu6uXKj+nU1AwbdeSu6uXKj9r15K7bdeSu6uXKj9r15K7bdeSu6uXKj9r15K7/38AAAAAQS3//4Ha/3///wAAgdr/f///Xue34f///7///4Ha/3///6AYt+H///+/AACB2v9/////fwAAAABBLf//gdr/f/////99pf9///9e57fh////v///gdr/f///Xufntv///7///32l/3////9/AAAAAEEtgdr/f/9//////32l/3///xfJn5j///8/Xufntv///7+B2v9//3//////faX/f////38AAAAAQS19pf9//3///4Ha/3//f///Rp6fmP///z99pf9//3///xfJn5j///8/gdr/f/9/////fwAAAABBLX2l/3//f///gVr/f/9///9Gnp+Y////P32l/3//f///uGGfmP///z+BWv9//3////9/AAAAAEEtgVr/f/9///99Jf9//3///7hhn5j///8/gVr/f/9////nNp+Y////P30l/3//f////38AAAAAQS19Jf9//3///wAAfaX/f///5zafmP///z+gGOe2////v30l/3//f///AAB9pf9/////fwAAAABBLQAAgdr/f///AAB9pf9///+gGLfh////vwAAgdr/f///oBjntv///78AAH2l/3///73NOen///+/Xue34f///7+9zQfJ////v17n57b///+/vc056f///79e57fh////v0EyOen///+/oBi34f///7/3tkGy////P73NB8n///+/F8mfmP///z9e5+e2////v8WWQbL///8/Rp6fmP///z/3tkGy////PxfJn5j///8/xZZBsv///z9Gnp+Y////PzlpQbL///8/uGGfmP///z85aUGy////P7hhn5j///8/B0lBsv///z/nNp+Y////PwdJQbL///8/QTIHyf///7/nNp+Y////P6AY57b///+/QTI56f///7+gGLfh////v0EyB8n///+/oBjntv///7//f///AAC90r3NOen///+/vc0Hyf///7//f///AAC90r3NOen///+/QTI56f///7//f///AAC90ve2QbL///8/vc0Hyf///7//f///AAC90sWWQbL///8/97ZBsv///z//f///AAC90sWWQbL///8/OWlBsv///z//f///AAC90jlpQbL///8/B0lBsv///z//f///AAC90gdJQbL///8/QTIHyf///7//f///AAC90kEyOen///+/QTIHyf///78=")
}]
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_dtlcm")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_x6v7s"]
metallic = 1.0
emission_enabled = true
emission = Color(1, 0.607843, 0.364706, 1)
emission_energy_multiplier = 4.0
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_3wvag"]
direction = Vector3(0, 0, 1)
initial_velocity_min = 1.0
initial_velocity_max = 2.0
collision_mode = 1
collision_friction = 1.0
collision_bounce = 1.0
collision_use_scale = true
[sub_resource type="BoxMesh" id="BoxMesh_qy3jk"]
size = Vector3(0.025, 0.025, 0.025)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ywt21"]
transparency = 1
blend_mode = 1
albedo_color = Color(0.383052, 0.264096, 0.213327, 1)
emission_enabled = true
emission = Color(0.737886, 0.150238, 0.0835467, 1)
emission_energy_multiplier = 8.0
[sub_resource type="BoxMesh" id="BoxMesh_jrtee"]
size = Vector3(0.04, 0.04, 0.04)
[sub_resource type="CylinderShape3D" id="CylinderShape3D_tqvit"]
margin = 0.001
height = 1.5
radius = 0.055
[node name="Bullet" type="RigidBody3D" node_paths=PackedStringArray("collision_shape")]
top_level = true
collision_layer = 128
collision_mask = 225
axis_lock_angular_x = true
axis_lock_angular_y = true
axis_lock_angular_z = true
mass = 0.01
center_of_mass_mode = 1
continuous_cd = true
contact_monitor = true
max_contacts_reported = 3
script = ExtResource("1_d1qoc")
collision_shape = NodePath("BulletCollision")
[node name="Cylinder" type="MeshInstance3D" parent="."]
transform = Transform3D(-2, -3.01992e-07, 0, 0, 0, -2, 3.01992e-07, -2, 0, 1.46364e-07, 0, 0.627698)
cast_shadow = 0
mesh = SubResource("ArrayMesh_gi7r4")
skeleton = NodePath("")
[node name="GPUParticles3D" type="GPUParticles3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.718767)
material_override = SubResource("StandardMaterial3D_x6v7s")
cast_shadow = 0
emitting = false
amount = 20
one_shot = true
explosiveness = 1.0
process_material = SubResource("ParticleProcessMaterial_3wvag")
draw_pass_1 = SubResource("BoxMesh_qy3jk")
[node name="GPUParticlesEnemy" type="GPUParticles3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.718767)
material_override = SubResource("StandardMaterial3D_ywt21")
cast_shadow = 0
emitting = false
one_shot = true
explosiveness = 1.0
process_material = SubResource("ParticleProcessMaterial_3wvag")
draw_pass_1 = SubResource("BoxMesh_jrtee")
[node name="Audio" type="Node" parent="."]
[node name="HitIndicator" type="AudioStreamPlayer" parent="Audio"]
stream = ExtResource("3_irpoj")
[node name="BulletCollision" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0)
shape = SubResource("CylinderShape3D_tqvit")
[node name="RayCast3D" type="RayCast3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.781848)
target_position = Vector3(0, 0, -3)
collision_mask = 105
collide_with_areas = true
[connection signal="body_entered" from="." to="." method="_on_body_entered"]

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=30 format=4 uid="uid://dqwkal3t4gf2p"]
[gd_scene load_steps=34 format=4 uid="uid://dqwkal3t4gf2p"]
[ext_resource type="Texture2D" uid="uid://dqgsiuy8wfxmv" path="res://assets/Models/blunderbus.stock.albedo.png" id="1_cvwjk"]
[ext_resource type="Script" path="res://scripts/blunderbus.gd" id="1_w46uw"]
@@ -8,6 +8,7 @@
[ext_resource type="Texture2D" uid="uid://ddrqh51fsq8gm" path="res://assets/Models/blunderbus.stock.rough.png" id="3_5ymul"]
[ext_resource type="Texture2D" uid="uid://kr2nf55qooib" path="res://assets/Models/blunderbus.metal.normal.png" id="4_bo0kd"]
[ext_resource type="Texture2D" uid="uid://bf4m8j05ypctm" path="res://assets/Models/blunderbus.metal.rough.png" id="6_x42cq"]
[ext_resource type="Texture2D" uid="uid://dj3ja64b8eixe" path="res://assets/smoketest.jpg" id="9_btq02"]
[ext_resource type="AudioStream" uid="uid://t50i483xmj3a" path="res://assets/Audio/Weapons/toy-click-spin-SBA-300071143.wav" id="9_ly2k1"]
[ext_resource type="AudioStream" uid="uid://bqoxdmsnfjiog" path="res://assets/Audio/Weapons/12ga Pump Shotgun/Gunshots/12ga Pump Shotgun - Gunshot A 001.wav" id="9_nu1jc"]
[ext_resource type="AudioStream" uid="uid://db3iy0f1pa5lg" path="res://assets/Audio/Weapons/gun-m-16-reload-full-clip-magazine-SBA-300121257.wav" id="10_8vcd2"]
@@ -35,7 +36,7 @@ metallic_texture_channel = 2
roughness_texture = ExtResource("6_x42cq")
roughness_texture_channel = 1
normal_enabled = true
normal_scale = 0.1
normal_scale = 0.5
normal_texture = ExtResource("4_bo0kd")
texture_filter = 2
@@ -230,127 +231,27 @@ _surfaces = [{
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_3f3hx")
[sub_resource type="Animation" id="Animation_qb0kb"]
resource_name = "reload"
length = 2.0
tracks/0/type = "method"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(1.33333),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"reload_finished"
}]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("BlunderbusHandle:position")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.7, 0.933333, 1.13333, 1.33333, 1.66667, 2),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(-0.0308378, -0.00945342, -0.22799), Vector3(0.0367182, -0.490888, 0.00709414), Vector3(0.0367182, -0.69383, 0.00709414), Vector3(0.0367182, -0.480753, 0.00709414), Vector3(0.108168, -0.563203, 0.00709414), Vector3(0.073864, 0.131724, 0.00334243), Vector3(0, 0, 0)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("BlunderbusHandle:quaternion")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.7, 0.933333, 1.13333, 1.33333, 1.66667, 2),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [Quaternion(0, 0, 0, 1), Quaternion(0.235702, 0, 0, 0.971825), Quaternion(0.188592, 0.751434, -0.614724, 0.147968), Quaternion(0.104134, 0.764512, -0.634514, 0.0454784), Quaternion(0.150342, 0.759741, -0.615834, 0.144703), Quaternion(0.132913, 0.762353, -0.626856, 0.0905744), Quaternion(-0.0283449, 0.211445, -0.134895, 0.967621), Quaternion(0, 0, 0, 1)]
}
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_4ojnn"]
emission_shape = 1
emission_sphere_radius = 0.1
gravity = Vector3(0, 0.5, 0)
scale_min = 0.1
scale_max = 2.0
turbulence_noise_strength = 0.1
turbulence_noise_scale = 0.1
[sub_resource type="Animation" id="Animation_k667n"]
resource_name = "shoot"
length = 0.7
step = 0.01
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("BlunderbusHandle:position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0.02, 0.06, 0.7),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, 0.11439, 0.207692), Vector3(0, 0, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("BlunderbusHandle:rotation")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0.02, 0.06, 0.7),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0.536095, 0.17949, 1.51621e-09), Vector3(0, 0, 0)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("BlunderbusHandle/Blunderbus/Hammer:rotation")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.02),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, 0, -1.04023)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("BlunderbusHandle/Blunderbus/Plate:rotation")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0.02, 0.04, 0.06, 0.09, 0.14),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, 0, -0.202353), Vector3(0.0579011, -0.067027, -0.105357), Vector3(0.0504229, -0.072816, -0.212189), Vector3(0.0578391, -0.0670805, -0.106282)]
}
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_crqaw"]
transparency = 1
blend_mode = 1
shading_mode = 0
albedo_color = Color(1, 1, 1, 0.14902)
albedo_texture = ExtResource("9_btq02")
billboard_mode = 1
[sub_resource type="Animation" id="Animation_yakxm"]
resource_name = "swap_in"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("BlunderbusHandle:position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.6, 1),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(0.276637, -1.00606, -0.34468), Vector3(0, 0.0142029, 0), Vector3(0, 0, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("BlunderbusHandle:rotation")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.6, 1),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(-1.36703, 0.124781, -0.13261), Vector3(0.000688741, 0.00692972, -0.0990625), Vector3(0, 0, 0)]
}
[sub_resource type="PlaneMesh" id="PlaneMesh_y0nwy"]
material = SubResource("StandardMaterial3D_crqaw")
size = Vector2(0.2, 0.2)
orientation = 2
[sub_resource type="Animation" id="Animation_r6as6"]
length = 0.001
@@ -415,6 +316,197 @@ tracks/4/keys = {
"values": [Quaternion(0, 0, 0, 1)]
}
[sub_resource type="Animation" id="Animation_f2rv4"]
resource_name = "empty"
length = 0.2
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("BlunderbusHandle:position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, 0, -0.0672249), Vector3(0, 0, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("BlunderbusHandle:quaternion")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Quaternion(0, 0, 0, 1), Quaternion(-0.0593238, 0, 0, 0.998239), Quaternion(0, 0, 0, 1)]
}
[sub_resource type="Animation" id="Animation_qb0kb"]
resource_name = "reload"
length = 2.0
tracks/0/type = "method"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath(".")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(1.33333),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"reload_finished"
}]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("BlunderbusHandle:position")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.7, 0.933333, 1.13333, 1.33333, 1.66667, 2),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(-0.0308378, -0.00945342, -0.22799), Vector3(0.0367182, -0.490888, 0.00709414), Vector3(0.0367182, -0.69383, 0.00709414), Vector3(0.0367182, -0.480753, 0.00709414), Vector3(0.108168, -0.563203, 0.00709414), Vector3(0.073864, 0.131724, 0.00334243), Vector3(0, 0, 0)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("BlunderbusHandle:quaternion")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.166667, 0.7, 0.933333, 1.13333, 1.33333, 1.66667, 2),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [Quaternion(0, 0, 0, 1), Quaternion(0.235702, 0, 0, 0.971825), Quaternion(0.188592, 0.751434, -0.614724, 0.147968), Quaternion(0.104134, 0.764512, -0.634514, 0.0454784), Quaternion(0.150342, 0.759741, -0.615834, 0.144703), Quaternion(0.132913, 0.762353, -0.626856, 0.0905744), Quaternion(-0.0283449, 0.211445, -0.134895, 0.967621), Quaternion(0, 0, 0, 1)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("BlunderbusHandle/Blunderbus/Hammer:rotation")
tracks/3/interp = 2
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(1.6, 1.86667),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0, 0, -1.04023), Vector3(0, 0, 0)]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("BlunderbusHandle/Blunderbus/Plate:rotation")
tracks/4/interp = 2
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(1.6, 1.86667),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0.0578391, -0.0670805, -0.106282), Vector3(0, 0, 0)]
}
[sub_resource type="Animation" id="Animation_k667n"]
resource_name = "shoot"
length = 0.7
step = 0.01
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("BlunderbusHandle:position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0.02, 0.06, 0.7),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, 0.11439, 0.207692), Vector3(0, 0, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("BlunderbusHandle:rotation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0.02, 0.06, 0.7),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0.536095, 0.17949, 1.51621e-09), Vector3(0, 0, 0)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("BlunderbusHandle/Blunderbus/Hammer:rotation")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.02),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, 0, -1.04023)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("BlunderbusHandle/Blunderbus/Plate:rotation")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0.01, 0.03, 0.05, 0.08, 0.13),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0.00486294, -0.000900874, -0.448292), Vector3(0.0579011, -0.067027, -0.105357), Vector3(0.0504229, -0.072816, -0.212189), Vector3(0.0578391, -0.0670805, -0.106282)]
}
tracks/4/type = "method"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath(".")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0.02, 0.37),
"transitions": PackedFloat32Array(1, 1),
"values": [{
"args": [],
"method": &"fire"
}, {
"args": [true],
"method": &"barrel_smoke"
}]
}
[sub_resource type="Animation" id="Animation_yakxm"]
resource_name = "swap_in"
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("BlunderbusHandle:position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.533333, 1),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(0.276637, -1.75639, -0.34468), Vector3(0, 0.0642636, 0), Vector3(0, 0, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("BlunderbusHandle:rotation")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.533333, 1),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(-1.36703, 0.856179, -0.13261), Vector3(0.106822, 0.0354618, 0.160794), Vector3(0, 0, 0)]
}
[sub_resource type="Animation" id="Animation_jrppn"]
resource_name = "swap_out"
tracks/0/type = "value"
@@ -456,34 +548,6 @@ tracks/2/keys = {
}]
}
[sub_resource type="Animation" id="Animation_f2rv4"]
resource_name = "empty"
length = 0.2
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("BlunderbusHandle:position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(0, 0, 0), Vector3(0, 0, -0.0672249), Vector3(0, 0, 0)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("BlunderbusHandle:quaternion")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Quaternion(0, 0, 0, 1), Quaternion(-0.0593238, 0, 0, 0.998239), Quaternion(0, 0, 0, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_mcns2"]
_data = {
"RESET": SubResource("Animation_r6as6"),
@@ -497,10 +561,13 @@ _data = {
[node name="Blunderbus" type="Node3D" node_paths=PackedStringArray("anim_player", "barrel_raycast", "audio_fire", "audio_empty", "audio_reload")]
script = ExtResource("1_w46uw")
gun_name = "Blunderbuss"
fire_mode = 1
recoil_amount = Vector3(0.5, 0.2, 0.2)
spread = Vector3(90, 90, 1)
kick_amount = 10.0
max_ammo = 1
start_mags = 20
pellets_per_shot = 25
bullet_speed = 500.0
fire_pitch_scale_amt = 0.1
bullet = ExtResource("2_544x3")
@@ -534,6 +601,15 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.062564, -0.0217875, 0)
mesh = SubResource("ArrayMesh_1fsm8")
skeleton = NodePath("")
[node name="Smoke" type="GPUParticles3D" parent="BlunderbusHandle/Blunderbus"]
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 1.14148, 0, 4.98958e-08)
emitting = false
amount = 100
lifetime = 4.0
fixed_fps = 60
process_material = SubResource("ParticleProcessMaterial_4ojnn")
draw_pass_1 = SubResource("PlaneMesh_y0nwy")
[node name="BarrelRaycast" type="RayCast3D" parent="BlunderbusHandle"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.818773)
target_position = Vector3(0, 0, -1)
@@ -543,6 +619,8 @@ libraries = {
"": SubResource("AnimationLibrary_mcns2")
}
[node name="SmokeTimer" type="Timer" parent="."]
[node name="Audio" type="Node3D" parent="."]
[node name="Fire" type="AudioStreamPlayer3D" parent="Audio"]
@@ -558,3 +636,5 @@ bus = &"SFX"
stream = ExtResource("10_8vcd2")
volume_db = 4.0
bus = &"SFX"
[connection signal="timeout" from="SmokeTimer" to="." method="_on_smoke_timer_timeout"]

View File

@@ -193,6 +193,11 @@ crouch={
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194326,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
kill_self={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":75,"key_label":0,"unicode":107,"location":0,"echo":false,"script":null)
]
}
[layer_names]

View File

@@ -24,6 +24,6 @@ func hit(bullet_damage):
get_tree().get_root().add_child(number_spawn)
func _on_body_entered(body: Node3D) -> void:
if body.is_in_group("pellet"):
hit(body.bullet_damage)
SignalBus.emit_signal("enemy_hit")
hit(body.bullet_damage)
SignalBus.emit_signal("enemy_hit")
body.despawn()

View File

@@ -34,9 +34,12 @@ var cycle_count
@export var audio_empty : Node
@export var audio_reload : Node
@onready var smoke: GPUParticles3D = $BlunderbusHandle/Blunderbus/Smoke
@onready var player = get_tree().current_scene.player
@onready var level_control = get_tree().current_scene
@onready var ammo_current
@onready var smoke_timer: Timer = $SmokeTimer
var rng = RandomNumberGenerator.new()
var gun_index
#var ammo_current
@@ -44,6 +47,7 @@ var ammo_reserve
# Called when the node enters the scene tree for the first time.
func _ready():
#smoke.emitting = false
start_position = self.position
start_rotation = self.rotation
random_spread_start = random_spread_amt
@@ -80,27 +84,25 @@ func reload_finished():
func shoot(delta):
if level_control.ammo_current[gun_index] > 0 and cycle_count > 0:
if !anim_player.is_playing():
level_control.ammo_current[gun_index] -= 1
#RECOIL --- fix later to happen over a period of time
#(ADD PLAYER KICK HERE. RELATIVE TO GUN POSITION)
audio_fire.pitch_scale = 1 + rng.randf_range(-fire_pitch_scale_amt,fire_pitch_scale_amt)
audio_fire.play()
anim_player.play("shoot")
pellet_spawn()
player.recoil.add_recoil(Vector3(0,recoil_amount.y,recoil_amount.z),10,10)
player.recoil.add_gun_recoil(recoil_amount.x)
player.velocity += player.bullet_ray.global_basis * Vector3(0,0, kick_amount)
if fire_mode != 0:
cycle_count -= 1
elif !anim_player.is_playing() and cycle_count != 0:
anim_player.play("empty")
audio_empty.play()
func fire():
level_control.ammo_current[gun_index] -= 1
audio_fire.pitch_scale = 1 + rng.randf_range(-fire_pitch_scale_amt,fire_pitch_scale_amt)
audio_fire.play()
pellet_spawn()
player.recoil.add_recoil(Vector3(0,recoil_amount.y,recoil_amount.z),10,10)
player.recoil.add_gun_recoil(recoil_amount.x)
player.velocity += player.bullet_ray.global_basis * Vector3(0,0, kick_amount)
if fire_mode != 0:
cycle_count -= 1
func reload():
if level_control.ammo_current[gun_index] < max_ammo and player.gun.anim_player.get_current_animation() != "reload" and level_control.ammo_reserve[gun_index] > 0:
#player.reloading = true
@@ -134,5 +136,13 @@ func pellet_spawn():
get_tree().get_root().add_child(instance_bullet)
pellets_remaining -= 1
func barrel_smoke(emitting_state):
smoke.emitting = emitting_state
smoke_timer.start()
func swapped_out():
queue_free()
func _on_smoke_timer_timeout() -> void:
barrel_smoke(false)

View File

@@ -1,5 +1,7 @@
extends RigidBody3D
@export var collision_shape : Node
var bullet_speed
var bullet_drop
var random_spread_amt
@@ -17,7 +19,6 @@ var bullet_active = true
@onready var hit_indicator = $Audio/HitIndicator
@onready var ray: RayCast3D = $RayCast3D
# Called when the node enters the scene tree for the first time.
func _ready():
@@ -34,42 +35,38 @@ func _physics_process(delta):
if distance_from_player.length() > 1.5:
visible = true
if ray.is_colliding():
var body = ray.get_collider()
if body != null and !body.is_in_group("player"):
mesh.visible = false
ray.enabled = false
if body.is_in_group("enemy_target"):
hit_indicator.play()
enemy_particles.emitting = true
SignalBus.emit_signal("enemy_hit")
ray.get_collider().hit(bullet_damage)
#bullethole effect
body.add_child(instance_bullethole)
instance_bullethole.global_transform.origin = ray.get_collision_point()
if (abs(ray.get_collision_normal().y) > 0.99):
instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal(), Vector3(0,0,1))
else:
instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal())
if body.is_in_group("switch"):
body.hit()
#move rigidbodies
if body.is_in_group("scene_rigidbody"):
body.linear_velocity += transform.basis * Vector3(0,0,-1 * bullet_force_mod)
if body.is_in_group("breakable"):
var current_velocity = transform.basis * Vector3(0,0,-1 * bullet_force_mod)
ray.get_collider().breaking(current_velocity)
queue_free()
func _on_body_entered(body: Node) -> void:
if !body.is_in_group("player"):
await get_tree().create_timer(.1).timeout
mesh.visible = false
ray.enabled = false
if ray.is_colliding():
var ray_body = ray.get_collider()
if ray_body != null:
#bullethole effect
ray_body.add_child(instance_bullethole)
instance_bullethole.global_transform.origin = ray.get_collision_point()
if (abs(ray.get_collision_normal().y) > 0.99):
instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal(), Vector3(0,0,1))
else:
instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal())
if body.is_in_group("switch"):
body.hit()
##move rigidbodies
#if body.is_in_group("scene_rigidbody"):
#body.linear_velocity += transform.basis * Vector3(0,0,-1 * bullet_force_mod)
if body.is_in_group("breakable"):
var current_velocity = transform.basis * Vector3(0,0,-1 * bullet_force_mod)
body.breaking(current_velocity)
despawn()
func despawn():
visible = false
collision_shape.disabled = true
await get_tree().create_timer(1).timeout
self.queue_free()

View File

@@ -93,6 +93,7 @@ var pickupmsg
@onready var ear_wind = $Audio/EarWind
@onready var land_sound: AudioStreamPlayer = $Audio/LandSound
@onready var hurt_audio = $Audio/Hurt
@onready var hit_indicator: AudioStreamPlayer = $Audio/HitIndicator
@onready var health_indicator = $HealthIndicator
@onready var ammo_counter = $Head/Recoil/Camera3D/AmmoCounter
@onready var stamina_counter = $Head/Recoil/Camera3D/StaminaCounter
@@ -341,6 +342,9 @@ func _physics_process(delta):
held_item.linear_velocity += interact_ray.global_transform.basis * Vector3(0,0, -KICK_AMOUNT)
release_moveable()
if Input.is_action_just_pressed("kill_self"):
level_control.health = 0
if level_control.health <= 0:
level_control.die()
@@ -408,6 +412,7 @@ func weapon_select(gun_id):
func enemy_hit():
var hitmarker_spawn = hitmarker.instantiate()
camera.add_child(hitmarker_spawn)
hit_indicator.play()
func toggle_hud(hud_on):

View File

@@ -13,8 +13,9 @@ var bounces = 0
var start_time
var end_time
const EMISSION_MAX : float = 20
const EMISSION_LIFETIME : float = 2 #in seconds
const EMISSION_MAX : float = 200
const EMISSION_LIFETIME : float = 1.75 #in seconds
const VELOCITY_REQUIRED_TO_HIT : float = 10
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
@@ -38,21 +39,11 @@ func _on_body_entered(body: Node) -> void:
if bounces >= max_bounces:
despawn()
if body != null and !body.is_in_group("player"):
if body.is_in_group("enemy_target"):
SignalBus.emit_signal("enemy_hit")
body.hit(bullet_damage)
if body != null and !body.is_in_group("player") and linear_velocity.length() >= VELOCITY_REQUIRED_TO_HIT:
if body.is_in_group("switch"):
body.hit()
#move rigidbodies
if body.is_in_group("scene_rigidbody"):
body.linear_velocity += transform.basis * Vector3(0,0,-1 * bullet_force_mod)
if body.is_in_group("breakable"):
var current_velocity = transform.basis * Vector3(0,0,-1 * bullet_force_mod)
body.breaking(current_velocity)

190
scripts/trackerGun.gd Normal file
View File

@@ -0,0 +1,190 @@
extends Node3D
@export_group("Gun Feel")
@export var gun_name : String
@export_enum("Auto", "Single", "Burst") var fire_mode: int
@export var hitscan_enabled : bool = false
@export var fov_zoom_amt = .98
@export var recoil_amount : Vector3 = Vector3(.2,.05,.05)
@export var kick_amount : float = .1
@export var max_ammo = 15
@export var start_mags = 3
@export var bullet_damage = 1
@export var bullet_force_mod = 5.0
@export var bullet_speed = 150
@export var bullet_drop = .3
@export var random_spread_amt = 1.0
@export var fire_pitch_scale_amt = .2
@export_group("Gun Assets")
@export_subgroup("Main Assets")
@export var tracker_indicator : Node
@export var flare_light : Node
@export var bullet : Resource
@export var bullet_fake : Resource
@export var bullethole : Resource
@export var casing : Resource
@export var mag : Resource
@export_subgroup("Raycast Nodes")
@export var anim_player : Node
@export var barrel_raycast : Node
@export var casing_ejector : Node
@export var mag_ejector : Node
@export_subgroup("Audio Clips")
@export var audio_fire : Node
@export var audio_empty : Node
@export var audio_reload : Node
@onready var player = get_tree().current_scene.player
@onready var level_control = get_tree().current_scene
@onready var ammo_current
@onready var tracker_marker = load("res://assets/shoot_marker.tscn")
@onready var tracker_indicator_material = tracker_indicator.get_surface_override_material(0)
var tracker : Node
var start_position
var start_rotation
var random_spread_start
var cycle_count_start
var cycle_count
var rng = RandomNumberGenerator.new()
var gun_index
#var ammo_current
var ammo_reserve
const tracker_null_color = Color(0.743, 0.359, 0)
const tracker_assigned_color = Color(0, 0.853, 0)
# Called when the node enters the scene tree for the first time.
func _ready():
random_spread_start = random_spread_amt
ammo_current = level_control.ammo_current[gun_index]
ammo_reserve = level_control.ammo_reserve[gun_index]
if fire_mode == 0:
cycle_count = 1
cycle_count_start = 1
elif fire_mode == 1:
cycle_count = 1
cycle_count_start = 1
elif fire_mode == 2:
cycle_count = 3
cycle_count_start = 3
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta):
if tracker != null:
tracker_indicator_material.emission = tracker_assigned_color
else:
tracker_indicator_material.emission = tracker_null_color
func reload_finished():
if level_control.ammo_reserve[gun_index] >= max_ammo:
level_control.ammo_current[gun_index] += max_ammo
level_control.ammo_reserve[gun_index] -= max_ammo
else:
level_control.ammo_current[gun_index] += level_control.ammo_reserve[gun_index]
level_control.ammo_reserve[gun_index] -= level_control.ammo_reserve[gun_index]
func shoot(delta):
if !anim_player.is_playing():
if tracker == null and Input.is_action_just_pressed("shoot"):
fire_tracker()
else:
fire()
func fire():
if level_control.ammo_current[gun_index] > 0 and cycle_count > 0:
if !anim_player.is_playing():
level_control.ammo_current[gun_index] -= 1
#audio and anims
audio_fire.pitch_scale = 1 + rng.randf_range(-fire_pitch_scale_amt,fire_pitch_scale_amt)
audio_fire.play()
anim_player.play("shoot")
bullet_fire()
spawn_casing()
player.recoil.add_recoil(Vector3(0,recoil_amount.y,recoil_amount.z),10,10)
player.recoil.add_gun_recoil(recoil_amount.x)
#player.velocity += player.bullet_ray.global_basis * Vector3(0,0, kick_amount)
if fire_mode != 0:
cycle_count -= 1
elif !anim_player.is_playing() and cycle_count != 0:
anim_player.play("empty")
audio_empty.play()
func fire_tracker():
anim_player.play("fire_tracker")
var instance_tracker = tracker_marker.instantiate()
if player.bullet_ray.is_colliding():
var spawn_loc = player.bullet_ray.get_collision_point()
var spawn_parent = player.bullet_ray.get_collider()
if spawn_parent != null:
spawn_parent.add_child(instance_tracker)
instance_tracker.global_transform.origin = spawn_loc
tracker = instance_tracker
func remove_tracker():
if tracker != null:
tracker.remove()
func reload():
if tracker != null:
remove_tracker()
else:
if level_control.ammo_current[gun_index] < max_ammo and player.gun.anim_player.get_current_animation() != "reload" and level_control.ammo_reserve[gun_index] > 0:
anim_player.play("reload")
audio_reload.play()
remove_tracker()
if anim_player.is_playing() and anim_player.current_animation == "reload":
if level_control.ammo_current[gun_index] == 0:
level_control.ammo_current[gun_index] = 0
else:
level_control.ammo_current[gun_index] = 1
func spawn_mag():
var instance_mag = mag.instantiate()
instance_mag.position = mag_ejector.global_position
instance_mag.transform.basis = mag_ejector.global_transform.basis
get_tree().get_root().add_child(instance_mag)
func spawn_casing():
# Casing transform
var instance_casing = casing.instantiate()
instance_casing.position = casing_ejector.global_position
instance_casing.transform.basis = casing_ejector.global_transform.basis
instance_casing.player_velocity = player.velocity * transform.basis
get_tree().get_root().add_child(instance_casing)
func bullet_fire():
var instance_bullet
if hitscan_enabled:
instance_bullet = bullet_fake.instantiate()
else:
instance_bullet = bullet.instantiate()
instance_bullet.position = barrel_raycast.global_position
#shoot bullet from real gun if gun is folded up
if player.gun_folded == false:
instance_bullet.transform.basis = barrel_raycast.global_transform.basis
else:
instance_bullet.transform.basis = barrel_raycast.global_transform.basis
instance_bullet.bullet_speed = bullet_speed
instance_bullet.player_velocity = player.velocity * transform.basis
instance_bullet.bullet_drop = bullet_drop
instance_bullet.random_spread_amt = random_spread_amt
instance_bullet.bullet_damage = bullet_damage
instance_bullet.bullet_force_mod = bullet_force_mod
instance_bullet.bullet_target = tracker
instance_bullet.instance_bullethole = bullethole.instantiate()
instance_bullet.player_position = player.global_position
get_tree().current_scene.add_child(instance_bullet)
func swapped_out():
queue_free()

72
scripts/tracker_bullet.gd Normal file
View File

@@ -0,0 +1,72 @@
extends RigidBody3D
@export var collision_shape : Node
var bullet_speed
var bullet_drop
var random_spread_amt
var bullet_damage
var instance_bullethole
var bullet_force_mod = 1.0
var distance_from_player
var player_position
var player_velocity
var bullet_active = true
var bullet_target : Node
@onready var mesh = $Cylinder
@onready var particles = $GPUParticles3D
@onready var enemy_particles = $GPUParticlesEnemy
@onready var hit_indicator = $Audio/HitIndicator
@onready var ray: RayCast3D = $RayCast3D
# Called when the node enters the scene tree for the first time.
func _ready():
visible = false
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _physics_process(delta):
linear_velocity = transform.basis * Vector3(0, 0, -bullet_speed)
if bullet_target != null:
look_at(bullet_target.global_position)
distance_from_player = abs(self.global_position - player_position)
if distance_from_player.length() > 1.5:
visible = true
func _on_body_entered(body: Node) -> void:
if !body.is_in_group("player"):
ray.enabled = false
if ray.is_colliding():
var ray_body = ray.get_collider()
if ray_body != null:
#bullethole effect
ray_body.add_child(instance_bullethole)
instance_bullethole.global_transform.origin = ray.get_collision_point()
if (abs(ray.get_collision_normal().y) > 0.99):
instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal(), Vector3(0,0,1))
else:
instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal())
if body.is_in_group("switch"):
body.hit()
if body.is_in_group("breakable"):
var current_velocity = transform.basis * Vector3(0,0,-1 * bullet_force_mod)
body.breaking(current_velocity)
despawn()
func despawn():
#visible = false
#collision_shape.disabled = true
#await get_tree().create_timer(1).timeout
queue_free()

16
scripts/tracker_marker.gd Normal file
View File

@@ -0,0 +1,16 @@
extends Node3D
@onready var anim_player: AnimationPlayer = $AnimationPlayer
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func remove():
anim_player.play("remove")