diff --git a/assets/blockout_2.tscn b/assets/blockout_2.tscn index db03502..640618e 100644 --- a/assets/blockout_2.tscn +++ b/assets/blockout_2.tscn @@ -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")] diff --git a/assets/bullet.tscn b/assets/bullet.tscn index cfff405..cbf1f5f 100644 --- a/assets/bullet.tscn +++ b/assets/bullet.tscn @@ -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) diff --git a/assets/pistol1.tscn b/assets/pistol1.tscn index 4f317c1..ec8b01a 100644 --- a/assets/pistol1.tscn +++ b/assets/pistol1.tscn @@ -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) diff --git a/assets/player.tscn b/assets/player.tscn index 5df98c9..3aeffc6 100644 --- a/assets/player.tscn +++ b/assets/player.tscn @@ -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"] diff --git a/assets/revolver_1.tscn b/assets/revolver_1.tscn index 3b1c747..e21f793 100644 --- a/assets/revolver_1.tscn +++ b/assets/revolver_1.tscn @@ -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"] diff --git a/assets/shoot_marker.tscn b/assets/shoot_marker.tscn new file mode 100644 index 0000000..0f1707d --- /dev/null +++ b/assets/shoot_marker.tscn @@ -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" diff --git a/assets/shotgun_pellet.tscn b/assets/shotgun_pellet.tscn index eb4f3e4..47df00d 100644 --- a/assets/shotgun_pellet.tscn +++ b/assets/shotgun_pellet.tscn @@ -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"] diff --git a/assets/smoketest.jpg b/assets/smoketest.jpg new file mode 100644 index 0000000..5f9e2d5 Binary files /dev/null and b/assets/smoketest.jpg differ diff --git a/assets/smoketest.jpg.import b/assets/smoketest.jpg.import new file mode 100644 index 0000000..67dab45 --- /dev/null +++ b/assets/smoketest.jpg.import @@ -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 diff --git a/assets/spider2.tscn b/assets/spider2.tscn index bb246d6..44c8528 100644 --- a/assets/spider2.tscn +++ b/assets/spider2.tscn @@ -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"]] diff --git a/assets/tracker_bullet.tscn b/assets/tracker_bullet.tscn new file mode 100644 index 0000000..8c616de --- /dev/null +++ b/assets/tracker_bullet.tscn @@ -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"] diff --git a/blunderbus.tscn b/blunderbus.tscn index 7a16698..52fc21b 100644 --- a/blunderbus.tscn +++ b/blunderbus.tscn @@ -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"] diff --git a/project.godot b/project.godot index eb125b4..9c27842 100644 --- a/project.godot +++ b/project.godot @@ -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] diff --git a/scripts/EnemyTarget.gd b/scripts/EnemyTarget.gd index a5517a1..c1bb573 100644 --- a/scripts/EnemyTarget.gd +++ b/scripts/EnemyTarget.gd @@ -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() diff --git a/scripts/blunderbus.gd b/scripts/blunderbus.gd index ab593ee..dac5b42 100644 --- a/scripts/blunderbus.gd +++ b/scripts/blunderbus.gd @@ -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) diff --git a/scripts/bullet.gd b/scripts/bullet.gd index baf15ae..30def08 100644 --- a/scripts/bullet.gd +++ b/scripts/bullet.gd @@ -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() diff --git a/scripts/player.gd b/scripts/player.gd index 9cf7abd..e2870ab 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -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): diff --git a/scripts/shotgun_pellet.gd b/scripts/shotgun_pellet.gd index a928f37..e3d0b2f 100644 --- a/scripts/shotgun_pellet.gd +++ b/scripts/shotgun_pellet.gd @@ -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) diff --git a/scripts/trackerGun.gd b/scripts/trackerGun.gd new file mode 100644 index 0000000..aec0347 --- /dev/null +++ b/scripts/trackerGun.gd @@ -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() diff --git a/scripts/tracker_bullet.gd b/scripts/tracker_bullet.gd new file mode 100644 index 0000000..f3a3d3a --- /dev/null +++ b/scripts/tracker_bullet.gd @@ -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() diff --git a/scripts/tracker_marker.gd b/scripts/tracker_marker.gd new file mode 100644 index 0000000..e52a69f --- /dev/null +++ b/scripts/tracker_marker.gd @@ -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")