made bullet with a camera on the end. other tweaks
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 18 KiB |
@@ -85,7 +85,7 @@ radius = 0.055
|
|||||||
[node name="Bullet" type="RigidBody3D" node_paths=PackedStringArray("collision_shape")]
|
[node name="Bullet" type="RigidBody3D" node_paths=PackedStringArray("collision_shape")]
|
||||||
top_level = true
|
top_level = true
|
||||||
collision_layer = 128
|
collision_layer = 128
|
||||||
collision_mask = 225
|
collision_mask = 233
|
||||||
axis_lock_angular_x = true
|
axis_lock_angular_x = true
|
||||||
axis_lock_angular_y = true
|
axis_lock_angular_y = true
|
||||||
axis_lock_angular_z = true
|
axis_lock_angular_z = true
|
||||||
|
|||||||
143
assets/bullet_cam.tscn
Normal file
143
assets/bullet_cam.tscn
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
[gd_scene load_steps=12 format=4 uid="uid://ba0jycejax6n7"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://scripts/bullet_cam.gd" id="1_uvdg3"]
|
||||||
|
[ext_resource type="AudioStream" uid="uid://dqj4cx05f25jj" path="res://assets/Audio/punch-body-hard-SBA-300156881.wav" id="3_t6e3w"]
|
||||||
|
|
||||||
|
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mfpbf"]
|
||||||
|
resource_name = "bullet"
|
||||||
|
transparency = 1
|
||||||
|
albedo_color = Color(0.701961, 0.556863, 0.223529, 1)
|
||||||
|
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="BulletCam" type="RigidBody3D"]
|
||||||
|
top_level = true
|
||||||
|
collision_layer = 128
|
||||||
|
collision_mask = 225
|
||||||
|
mass = 0.01
|
||||||
|
center_of_mass_mode = 1
|
||||||
|
continuous_cd = true
|
||||||
|
contact_monitor = true
|
||||||
|
max_contacts_reported = 3
|
||||||
|
script = ExtResource("1_uvdg3")
|
||||||
|
|
||||||
|
[node name="CameraHandle" type="Node3D" parent="."]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.789394)
|
||||||
|
|
||||||
|
[node name="Camera3D" type="Camera3D" parent="."]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.789394)
|
||||||
|
fov = 150.0
|
||||||
|
|
||||||
|
[node name="Cylinder" type="MeshInstance3D" parent="."]
|
||||||
|
transform = Transform3D(-1, -1.50996e-07, 6.60024e-15, 0, -4.37114e-08, -1, 1.50996e-07, -1, 4.37114e-08, 1.46364e-07, 0, -0.113697)
|
||||||
|
cast_shadow = 0
|
||||||
|
mesh = SubResource("ArrayMesh_gi7r4")
|
||||||
|
skeleton = NodePath("")
|
||||||
|
surface_material_override/0 = SubResource("StandardMaterial3D_mfpbf")
|
||||||
|
|
||||||
|
[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_t6e3w")
|
||||||
|
|
||||||
|
[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="."]
|
||||||
|
target_position = Vector3(0, 0, -2)
|
||||||
|
collision_mask = 105
|
||||||
|
collide_with_areas = true
|
||||||
|
|
||||||
|
[connection signal="body_entered" from="." to="." method="_on_body_entered"]
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
[ext_resource type="PackedScene" uid="uid://c33b6ldlxxfro" path="res://assets/Models/mac10.blend" id="1_nb4p5"]
|
[ext_resource type="PackedScene" uid="uid://c33b6ldlxxfro" path="res://assets/Models/mac10.blend" id="1_nb4p5"]
|
||||||
[ext_resource type="Script" path="res://scripts/gun.gd" id="2_tskiy"]
|
[ext_resource type="Script" path="res://scripts/gun.gd" id="2_tskiy"]
|
||||||
[ext_resource type="PackedScene" uid="uid://nq5nq2hjc4ec" path="res://assets/bullet_fake.tscn" id="3_heo3y"]
|
[ext_resource type="PackedScene" uid="uid://nq5nq2hjc4ec" path="res://assets/bullet_fake.tscn" id="3_heo3y"]
|
||||||
[ext_resource type="PackedScene" uid="uid://dqhltdnqyg8ni" path="res://assets/bullet.tscn" id="3_xr8co"]
|
[ext_resource type="PackedScene" uid="uid://dqhltdnqyg8ni" path="res://assets/bullet.tscn" id="3_w1kko"]
|
||||||
[ext_resource type="PackedScene" uid="uid://crvohhc6kgshn" path="res://assets/bullet_hole.tscn" id="4_eleuq"]
|
[ext_resource type="PackedScene" uid="uid://crvohhc6kgshn" path="res://assets/bullet_hole.tscn" id="4_eleuq"]
|
||||||
[ext_resource type="PackedScene" uid="uid://cp8563f0oxvff" path="res://assets/mag1.tscn" id="4_ji2hu"]
|
[ext_resource type="PackedScene" uid="uid://cp8563f0oxvff" path="res://assets/mag1.tscn" id="4_ji2hu"]
|
||||||
[ext_resource type="PackedScene" uid="uid://c1gdehrsytlkk" path="res://assets/casing_2.tscn" id="4_kpr3h"]
|
[ext_resource type="PackedScene" uid="uid://c1gdehrsytlkk" path="res://assets/casing_2.tscn" id="4_kpr3h"]
|
||||||
@@ -489,11 +489,11 @@ fov_zoom_amt = 0.995
|
|||||||
recoil_amount = Vector3(0.02, 0.05, 0.05)
|
recoil_amount = Vector3(0.02, 0.05, 0.05)
|
||||||
max_ammo = 20
|
max_ammo = 20
|
||||||
bullet_damage = 2
|
bullet_damage = 2
|
||||||
bullet_speed = 1500
|
bullet_speed = 1200
|
||||||
r_hand_location = NodePath("mac10/RHandLocation")
|
r_hand_location = NodePath("mac10/RHandLocation")
|
||||||
l_hand_location = NodePath("mac10/mag/LHandLocation")
|
l_hand_location = NodePath("mac10/mag/LHandLocation")
|
||||||
flare_light = NodePath("mac10/flare")
|
flare_light = NodePath("mac10/flare")
|
||||||
bullet = ExtResource("3_xr8co")
|
bullet = ExtResource("3_w1kko")
|
||||||
bullet_fake = ExtResource("3_heo3y")
|
bullet_fake = ExtResource("3_heo3y")
|
||||||
bullethole = ExtResource("4_eleuq")
|
bullethole = ExtResource("4_eleuq")
|
||||||
casing = ExtResource("4_kpr3h")
|
casing = ExtResource("4_kpr3h")
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
[gd_scene load_steps=24 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="PackedScene" uid="uid://svrb3n31mkag" path="res://assets/Models/gun.blend" id="1_frekg"]
|
||||||
[ext_resource type="Script" path="res://scripts/trackerGun.gd" id="2_ieev5"]
|
[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://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://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"]
|
[ext_resource type="PackedScene" uid="uid://cp8563f0oxvff" path="res://assets/mag1.tscn" id="6_ysonb"]
|
||||||
[ext_resource type="AudioStream" uid="uid://ba0w04uqqexpn" path="res://assets/Audio/Weapons/machine-gun-m16-double-shot-close-perspective-SBA-300130711.wav" id="8_jtjwm"]
|
[ext_resource type="AudioStream" uid="uid://bxjv50ivk3fvn" path="res://assets/Audio/Weapons/9mm Full Size Pistol/Gunshots/9mm Full Size Pistol - Gunshot B 001.wav" id="7_25stk"]
|
||||||
[ext_resource type="AudioStream" uid="uid://t50i483xmj3a" path="res://assets/Audio/Weapons/toy-click-spin-SBA-300071143.wav" id="9_btm61"]
|
[ext_resource type="AudioStream" uid="uid://t50i483xmj3a" path="res://assets/Audio/Weapons/toy-click-spin-SBA-300071143.wav" id="9_btm61"]
|
||||||
[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="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"]
|
[ext_resource type="Texture2D" uid="uid://dtg3nb2ew72c3" path="res://assets/star_05.png" id="11_x0sef"]
|
||||||
@@ -241,6 +240,64 @@ tracks/4/keys = {
|
|||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_lhlkm"]
|
||||||
|
resource_name = "remove_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.16, 0.24, 0.35),
|
||||||
|
"transitions": PackedFloat32Array(1, 1, 1, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Vector3(0, -0.000397999, 0), Vector3(0, -0.0215431, 0), Vector3(0, 0.116845, 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.16, 0.24, 0.35),
|
||||||
|
"transitions": PackedFloat32Array(1, 1, 1, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Vector3(0, -1.5708, 0), Vector3(1.04543e-06, -1.5708, 0.288695), Vector3(-2.69979e-06, -1.5708, -0.841737), 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": []
|
||||||
|
}
|
||||||
|
tracks/3/type = "method"
|
||||||
|
tracks/3/imported = false
|
||||||
|
tracks/3/enabled = true
|
||||||
|
tracks/3/path = NodePath(".")
|
||||||
|
tracks/3/interp = 1
|
||||||
|
tracks/3/loop_wrap = true
|
||||||
|
tracks/3/keys = {
|
||||||
|
"times": PackedFloat32Array(0.16, 0.35),
|
||||||
|
"transitions": PackedFloat32Array(1, 1),
|
||||||
|
"values": [{
|
||||||
|
"args": [],
|
||||||
|
"method": &"remove_tracker"
|
||||||
|
}, {
|
||||||
|
"args": [],
|
||||||
|
"method": &"check_ammo"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
[sub_resource type="Animation" id="Animation_bsc1a"]
|
[sub_resource type="Animation" id="Animation_bsc1a"]
|
||||||
resource_name = "shoot"
|
resource_name = "shoot"
|
||||||
length = 0.1
|
length = 0.1
|
||||||
@@ -356,61 +413,6 @@ tracks/2/keys = {
|
|||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
|
||||||
[sub_resource type="Animation" id="Animation_lhlkm"]
|
|
||||||
resource_name = "remove_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.16, 0.24, 0.35),
|
|
||||||
"transitions": PackedFloat32Array(1, 1, 1, 1),
|
|
||||||
"update": 0,
|
|
||||||
"values": [Vector3(0, -0.000397999, 0), Vector3(0, -0.0215431, 0), Vector3(0, 0.116845, 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.16, 0.24, 0.35),
|
|
||||||
"transitions": PackedFloat32Array(1, 1, 1, 1),
|
|
||||||
"update": 0,
|
|
||||||
"values": [Vector3(0, -1.5708, 0), Vector3(1.04543e-06, -1.5708, 0.288695), Vector3(-2.69979e-06, -1.5708, -0.841737), 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": []
|
|
||||||
}
|
|
||||||
tracks/3/type = "method"
|
|
||||||
tracks/3/imported = false
|
|
||||||
tracks/3/enabled = true
|
|
||||||
tracks/3/path = NodePath(".")
|
|
||||||
tracks/3/interp = 1
|
|
||||||
tracks/3/loop_wrap = true
|
|
||||||
tracks/3/keys = {
|
|
||||||
"times": PackedFloat32Array(0.24),
|
|
||||||
"transitions": PackedFloat32Array(1),
|
|
||||||
"values": [{
|
|
||||||
"args": [],
|
|
||||||
"method": &"remove_tracker"
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
|
|
||||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_vkrtt"]
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_vkrtt"]
|
||||||
_data = {
|
_data = {
|
||||||
"RESET": SubResource("Animation_urfns"),
|
"RESET": SubResource("Animation_urfns"),
|
||||||
@@ -433,7 +435,6 @@ recoil_amount = Vector3(0, 0.05, 0.05)
|
|||||||
bullet_speed = 50
|
bullet_speed = 50
|
||||||
tracker_indicator = NodePath("gun/slide/TrackerIndicator")
|
tracker_indicator = NodePath("gun/slide/TrackerIndicator")
|
||||||
flare_light = NodePath("SpotLight3D")
|
flare_light = NodePath("SpotLight3D")
|
||||||
bullet = ExtResource("3_hixkr")
|
|
||||||
bullethole = ExtResource("4_bu1g0")
|
bullethole = ExtResource("4_bu1g0")
|
||||||
casing = ExtResource("5_gls8p")
|
casing = ExtResource("5_gls8p")
|
||||||
mag = ExtResource("6_ysonb")
|
mag = ExtResource("6_ysonb")
|
||||||
@@ -479,7 +480,7 @@ libraries = {
|
|||||||
[node name="Audio" type="Node3D" parent="." index="2"]
|
[node name="Audio" type="Node3D" parent="." index="2"]
|
||||||
|
|
||||||
[node name="Fire" type="AudioStreamPlayer3D" parent="Audio" index="0"]
|
[node name="Fire" type="AudioStreamPlayer3D" parent="Audio" index="0"]
|
||||||
stream = ExtResource("8_jtjwm")
|
stream = ExtResource("7_25stk")
|
||||||
volume_db = 5.0
|
volume_db = 5.0
|
||||||
bus = &"SFX"
|
bus = &"SFX"
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
[gd_scene load_steps=27 format=3 uid="uid://drwae3loscbw7"]
|
[gd_scene load_steps=28 format=3 uid="uid://drwae3loscbw7"]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://scripts/player.gd" id="1_x7wms"]
|
[ext_resource type="Script" path="res://scripts/player.gd" id="1_x7wms"]
|
||||||
[ext_resource type="Script" path="res://scripts/recoil.gd" id="3_405jc"]
|
[ext_resource type="Script" path="res://scripts/recoil.gd" id="3_405jc"]
|
||||||
@@ -19,6 +19,7 @@
|
|||||||
[ext_resource type="Shader" path="res://assets/crtTest.gdshader" id="14_v5svg"]
|
[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://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"]
|
[ext_resource type="AudioStream" uid="uid://dqj4cx05f25jj" path="res://assets/Audio/punch-body-hard-SBA-300156881.wav" id="19_6jglu"]
|
||||||
|
[ext_resource type="AudioStream" uid="uid://c3cnnyotrri2b" path="res://assets/Audio/Foley Inventory and Interactions/Foley Inventory and Interactions/Drop Item/Drop Jewelery A.wav" id="20_t7lfm"]
|
||||||
|
|
||||||
[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_l5ga0"]
|
[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_l5ga0"]
|
||||||
blend_mode = 1
|
blend_mode = 1
|
||||||
@@ -241,6 +242,9 @@ stream = ExtResource("17_1fyjm")
|
|||||||
[node name="HitIndicator" type="AudioStreamPlayer" parent="Audio"]
|
[node name="HitIndicator" type="AudioStreamPlayer" parent="Audio"]
|
||||||
stream = ExtResource("19_6jglu")
|
stream = ExtResource("19_6jglu")
|
||||||
|
|
||||||
|
[node name="EnemyKilled" type="AudioStreamPlayer" parent="Audio"]
|
||||||
|
stream = ExtResource("20_t7lfm")
|
||||||
|
|
||||||
[connection signal="tree_entered" from="." to="." method="_on_tree_entered"]
|
[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_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"]
|
[connection signal="body_entered" from="pick_up_magnet" to="." method="_on_pick_up_magnet_body_entered"]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[gd_scene load_steps=13 format=4 uid="uid://7u8hjsvnfwjn"]
|
[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="Script" path="res://scripts/bullet_tracking.gd" id="1_d1qoc"]
|
||||||
[ext_resource type="Texture2D" uid="uid://dqytegxsmb5kg" path="res://assets/Models/bullet.transparency.png" id="2_m1lpb"]
|
[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"]
|
[ext_resource type="AudioStream" uid="uid://dqj4cx05f25jj" path="res://assets/Audio/punch-body-hard-SBA-300156881.wav" id="3_irpoj"]
|
||||||
|
|
||||||
|
|||||||
@@ -114,7 +114,8 @@ tracks/1/keys = {
|
|||||||
|
|
||||||
[sub_resource type="Animation" id="Animation_ylwlm"]
|
[sub_resource type="Animation" id="Animation_ylwlm"]
|
||||||
resource_name = "remove"
|
resource_name = "remove"
|
||||||
length = 0.5
|
length = 0.35
|
||||||
|
step = 0.01
|
||||||
tracks/0/type = "value"
|
tracks/0/type = "value"
|
||||||
tracks/0/imported = false
|
tracks/0/imported = false
|
||||||
tracks/0/enabled = true
|
tracks/0/enabled = true
|
||||||
@@ -122,7 +123,7 @@ tracks/0/path = NodePath("MeshHandle:position")
|
|||||||
tracks/0/interp = 2
|
tracks/0/interp = 2
|
||||||
tracks/0/loop_wrap = true
|
tracks/0/loop_wrap = true
|
||||||
tracks/0/keys = {
|
tracks/0/keys = {
|
||||||
"times": PackedFloat32Array(0, 0.5),
|
"times": PackedFloat32Array(0, 0.35),
|
||||||
"transitions": PackedFloat32Array(2, 2),
|
"transitions": PackedFloat32Array(2, 2),
|
||||||
"update": 0,
|
"update": 0,
|
||||||
"values": [Vector3(0, 0, 0), Vector3(0, 20, 0)]
|
"values": [Vector3(0, 0, 0), Vector3(0, 20, 0)]
|
||||||
@@ -134,7 +135,7 @@ tracks/1/path = NodePath(".")
|
|||||||
tracks/1/interp = 1
|
tracks/1/interp = 1
|
||||||
tracks/1/loop_wrap = true
|
tracks/1/loop_wrap = true
|
||||||
tracks/1/keys = {
|
tracks/1/keys = {
|
||||||
"times": PackedFloat32Array(0.5),
|
"times": PackedFloat32Array(0.35),
|
||||||
"transitions": PackedFloat32Array(1),
|
"transitions": PackedFloat32Array(1),
|
||||||
"values": [{
|
"values": [{
|
||||||
"args": [],
|
"args": [],
|
||||||
@@ -148,11 +149,23 @@ tracks/2/path = NodePath("Sphere:scale")
|
|||||||
tracks/2/interp = 2
|
tracks/2/interp = 2
|
||||||
tracks/2/loop_wrap = true
|
tracks/2/loop_wrap = true
|
||||||
tracks/2/keys = {
|
tracks/2/keys = {
|
||||||
"times": PackedFloat32Array(0, 0.5),
|
"times": PackedFloat32Array(0, 0.35),
|
||||||
"transitions": PackedFloat32Array(1, 1),
|
"transitions": PackedFloat32Array(1, 1),
|
||||||
"update": 0,
|
"update": 0,
|
||||||
"values": [Vector3(1, 1, 1), Vector3(0, 0, 0)]
|
"values": [Vector3(1, 1, 1), Vector3(0, 0, 0)]
|
||||||
}
|
}
|
||||||
|
tracks/3/type = "value"
|
||||||
|
tracks/3/imported = false
|
||||||
|
tracks/3/enabled = true
|
||||||
|
tracks/3/path = NodePath("MeshHandle/Mesh:visible")
|
||||||
|
tracks/3/interp = 1
|
||||||
|
tracks/3/loop_wrap = true
|
||||||
|
tracks/3/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 1,
|
||||||
|
"values": [true]
|
||||||
|
}
|
||||||
|
|
||||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_776o6"]
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_776o6"]
|
||||||
_data = {
|
_data = {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var distance_from_player
|
|||||||
var player_position
|
var player_position
|
||||||
var player_velocity
|
var player_velocity
|
||||||
var bullet_active = true
|
var bullet_active = true
|
||||||
|
var bullet_target : Node
|
||||||
|
|
||||||
@onready var mesh = $Cylinder
|
@onready var mesh = $Cylinder
|
||||||
@onready var particles = $GPUParticles3D
|
@onready var particles = $GPUParticles3D
|
||||||
@@ -23,47 +24,85 @@ var bullet_active = true
|
|||||||
func _ready():
|
func _ready():
|
||||||
|
|
||||||
visible = false
|
visible = false
|
||||||
linear_velocity += transform.basis * Vector3(0, 0, -bullet_speed) + player_velocity
|
if bullet_target == null:
|
||||||
|
linear_velocity += transform.basis * Vector3(0, 0, -bullet_speed) + player_velocity
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
func _physics_process(delta):
|
func _physics_process(delta):
|
||||||
|
|
||||||
angular_velocity = Vector3(0,0,0)
|
angular_velocity = Vector3(0,0,0)
|
||||||
|
|
||||||
distance_from_player = abs(self.global_position - player_position)
|
distance_from_player = self.global_position.distance_to(player_position)
|
||||||
|
|
||||||
if distance_from_player.length() > 1.5:
|
if distance_from_player > 1.5:
|
||||||
visible = true
|
visible = true
|
||||||
|
|
||||||
|
if bullet_target != null:
|
||||||
|
linear_velocity = transform.basis * Vector3(0, 0, -bullet_speed)
|
||||||
|
look_at(bullet_target.global_position)
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
despawn()
|
||||||
|
|
||||||
func _on_body_entered(body: Node) -> void:
|
#func _on_body_entered(body: Node) -> void:
|
||||||
|
#
|
||||||
if !body.is_in_group("player"):
|
#if !body.is_in_group("player"):
|
||||||
|
#
|
||||||
ray.enabled = false
|
#ray.enabled = false
|
||||||
|
#
|
||||||
if ray.is_colliding():
|
#if ray.is_colliding():
|
||||||
var ray_body = ray.get_collider()
|
#var ray_body = ray.get_collider()
|
||||||
if ray_body != null:
|
#if ray_body != null:
|
||||||
#bullethole effect
|
##bullethole effect
|
||||||
ray_body.add_child(instance_bullethole)
|
#ray_body.add_child(instance_bullethole)
|
||||||
instance_bullethole.global_transform.origin = ray.get_collision_point()
|
#instance_bullethole.global_transform.origin = ray.get_collision_point()
|
||||||
if (abs(ray.get_collision_normal().y) > 0.99):
|
#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))
|
#instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal(), Vector3(0,0,1))
|
||||||
else:
|
#else:
|
||||||
instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal())
|
#instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal())
|
||||||
|
#
|
||||||
if body.is_in_group("switch"):
|
#if body.is_in_group("switch"):
|
||||||
body.hit()
|
#body.hit()
|
||||||
|
#
|
||||||
##move rigidbodies
|
###move rigidbodies
|
||||||
#if body.is_in_group("scene_rigidbody"):
|
##if body.is_in_group("scene_rigidbody"):
|
||||||
#body.linear_velocity += transform.basis * Vector3(0,0,-1 * bullet_force_mod)
|
##body.linear_velocity += transform.basis * Vector3(0,0,-1 * bullet_force_mod)
|
||||||
|
#
|
||||||
if body.is_in_group("breakable"):
|
#if body.is_in_group("breakable"):
|
||||||
var current_velocity = transform.basis * Vector3(0,0,-1 * bullet_force_mod)
|
#var current_velocity = transform.basis * Vector3(0,0,-1 * bullet_force_mod)
|
||||||
body.breaking(current_velocity)
|
#body.breaking(current_velocity)
|
||||||
despawn()
|
#despawn()
|
||||||
|
|
||||||
func despawn():
|
func despawn():
|
||||||
#visible = false
|
#visible = false
|
||||||
|
|||||||
106
scripts/bullet_cam.gd
Normal file
106
scripts/bullet_cam.gd
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
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
|
||||||
|
var hold_cam_pos = null
|
||||||
|
var camera_start
|
||||||
|
var distance_to_cam_start
|
||||||
|
var player_cam_FOV : float
|
||||||
|
var opaque_color = Color(0.702, 0.557, 0.224)
|
||||||
|
var transparent_color = Color(0.702, 0.557, 0.224, 0)
|
||||||
|
|
||||||
|
@onready var level_control = get_tree().current_scene
|
||||||
|
@onready var player = level_control.player
|
||||||
|
@onready var mesh = $Cylinder
|
||||||
|
@onready var particles = $GPUParticles3D
|
||||||
|
@onready var enemy_particles = $GPUParticlesEnemy
|
||||||
|
@onready var hit_indicator = $Audio/HitIndicator
|
||||||
|
@onready var ray: RayCast3D = $RayCast3D
|
||||||
|
@onready var camera: Camera3D = $Camera3D
|
||||||
|
@onready var camera_handle: Node3D = $CameraHandle
|
||||||
|
@onready var bullet_material = mesh.get_surface_override_material(0)
|
||||||
|
|
||||||
|
const BULLET_CAM_FOV : float = 130
|
||||||
|
const BULLET_SENSITIVITY : float = 1
|
||||||
|
|
||||||
|
func _input(event):
|
||||||
|
if event is InputEventMouseMotion and hold_cam_pos == null:
|
||||||
|
var av_y = -event.relative.x * BULLET_SENSITIVITY
|
||||||
|
var av_x = -event.relative.y * BULLET_SENSITIVITY
|
||||||
|
angular_velocity += transform.basis * Vector3(av_x,av_y,0)
|
||||||
|
|
||||||
|
# Called when the node enters the scene tree for the first time.
|
||||||
|
func _ready():
|
||||||
|
Engine.time_scale = .01
|
||||||
|
player.gamespeed_controlled = true
|
||||||
|
player.controlled_elsewhere = true
|
||||||
|
player_cam_FOV = player.camera.fov
|
||||||
|
camera.fov = player_cam_FOV
|
||||||
|
camera_start = player.camera.global_position
|
||||||
|
camera.global_position = camera_start
|
||||||
|
distance_to_cam_start = camera.global_position.distance_to(camera_handle.global_position)
|
||||||
|
camera.current = true
|
||||||
|
|
||||||
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
func _physics_process(delta):
|
||||||
|
camera.fov = lerp(player_cam_FOV,BULLET_CAM_FOV, delta * 3000)
|
||||||
|
linear_velocity = transform.basis * Vector3(0, 0, -bullet_speed)
|
||||||
|
|
||||||
|
var distance_to_cam = camera.global_position.distance_to(camera_handle.global_position) / (distance_to_cam_start*2)
|
||||||
|
bullet_material.albedo_color = lerp(transparent_color,opaque_color,distance_to_cam)
|
||||||
|
|
||||||
|
if hold_cam_pos != null:
|
||||||
|
camera.global_position = hold_cam_pos
|
||||||
|
else:
|
||||||
|
camera.global_position = lerp(camera.global_position,camera_handle.global_position, delta * 300)
|
||||||
|
|
||||||
|
if ray.is_colliding() and hold_cam_pos == null:
|
||||||
|
hold_cam_pos = camera.global_position
|
||||||
|
Engine.time_scale = .005
|
||||||
|
|
||||||
|
|
||||||
|
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():
|
||||||
|
player.camera.current = true
|
||||||
|
player.controlled_elsewhere = false
|
||||||
|
player.gamespeed_controlled = false
|
||||||
|
#visible = false
|
||||||
|
#collision_shape.disabled = true
|
||||||
|
#await get_tree().create_timer(1).timeout
|
||||||
|
queue_free()
|
||||||
@@ -22,7 +22,7 @@ var bullet_target : Node
|
|||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
# Called when the node enters the scene tree for the first time.
|
||||||
func _ready():
|
func _ready():
|
||||||
|
linear_velocity += player_velocity
|
||||||
visible = false
|
visible = false
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
@@ -37,8 +37,7 @@ func _physics_process(delta):
|
|||||||
|
|
||||||
if distance_from_player.length() > 1.5:
|
if distance_from_player.length() > 1.5:
|
||||||
visible = true
|
visible = true
|
||||||
|
|
||||||
|
|
||||||
func _on_body_entered(body: Node) -> void:
|
func _on_body_entered(body: Node) -> void:
|
||||||
|
|
||||||
if !body.is_in_group("player"):
|
if !body.is_in_group("player"):
|
||||||
@@ -10,7 +10,7 @@ const SPRINT_SPEED = 15.0
|
|||||||
const DASH_SPEED = 40
|
const DASH_SPEED = 40
|
||||||
const SLOWSPEED = .1
|
const SLOWSPEED = .1
|
||||||
const MAX_STAMINA : float = 100
|
const MAX_STAMINA : float = 100
|
||||||
const STAMINA_DRAIN = 200
|
const STAMINA_DRAIN = 100 #multiplied times the delta when draining
|
||||||
|
|
||||||
var speed
|
var speed
|
||||||
var double_jump = true
|
var double_jump = true
|
||||||
@@ -75,6 +75,7 @@ var held_item_angular_damp_cache
|
|||||||
var held_item_gravity_cache
|
var held_item_gravity_cache
|
||||||
var held_item_mass_cache
|
var held_item_mass_cache
|
||||||
var held_item_rotation = Vector3(0,0,0)
|
var held_item_rotation = Vector3(0,0,0)
|
||||||
|
var gamespeed_controlled = false
|
||||||
|
|
||||||
# Slow Down Variables
|
# Slow Down Variables
|
||||||
var remaining_stamina : float = MAX_STAMINA
|
var remaining_stamina : float = MAX_STAMINA
|
||||||
@@ -84,6 +85,7 @@ var picked_up_text
|
|||||||
var pickup_announce = load("res://assets/pickup_announce.tscn")
|
var pickup_announce = load("res://assets/pickup_announce.tscn")
|
||||||
var dead_announce = load("res://assets/dead_announce.tscn")
|
var dead_announce = load("res://assets/dead_announce.tscn")
|
||||||
var pickupmsg
|
var pickupmsg
|
||||||
|
var controlled_elsewhere = false
|
||||||
|
|
||||||
@onready var crosshair = $Head/Recoil/Camera3D/Crosshair
|
@onready var crosshair = $Head/Recoil/Camera3D/Crosshair
|
||||||
@onready var head = $Head
|
@onready var head = $Head
|
||||||
@@ -110,11 +112,13 @@ var pickupmsg
|
|||||||
@onready var stand_check: RayCast3D = $StandCheck
|
@onready var stand_check: RayCast3D = $StandCheck
|
||||||
@onready var r_hand_test: MeshInstance3D = $Head/Recoil/Camera3D/WeaponHolder/RHandTest
|
@onready var r_hand_test: MeshInstance3D = $Head/Recoil/Camera3D/WeaponHolder/RHandTest
|
||||||
@onready var l_hand_test: MeshInstance3D = $Head/Recoil/Camera3D/WeaponHolder/LHandTest
|
@onready var l_hand_test: MeshInstance3D = $Head/Recoil/Camera3D/WeaponHolder/LHandTest
|
||||||
|
@onready var enemy_killed_audio: AudioStreamPlayer = $Audio/EnemyKilled
|
||||||
|
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
|
|
||||||
SignalBus.enemy_hit.connect(enemy_hit)
|
SignalBus.enemy_hit.connect(enemy_hit)
|
||||||
|
SignalBus.enemy_killed.connect(enemy_killed)
|
||||||
|
|
||||||
weapon_holder_start_rot = weapon_holder.rotation
|
weapon_holder_start_rot = weapon_holder.rotation
|
||||||
weapon_holder_start_pos = weapon_holder.position
|
weapon_holder_start_pos = weapon_holder.position
|
||||||
@@ -134,20 +138,20 @@ func _ready():
|
|||||||
AudioServer.set_bus_volume_db(0,-80)
|
AudioServer.set_bus_volume_db(0,-80)
|
||||||
|
|
||||||
func _input(event) -> void:
|
func _input(event) -> void:
|
||||||
|
if !controlled_elsewhere:
|
||||||
if !level_control.paused:
|
if !level_control.paused:
|
||||||
if event is InputEventMouseMotion:
|
if event is InputEventMouseMotion:
|
||||||
self.rotate_y(-event.relative.x * SENSITIVITY)
|
self.rotate_y(-event.relative.x * SENSITIVITY)
|
||||||
head.rotate_x(-event.relative.y * SENSITIVITY)
|
head.rotate_x(-event.relative.y * SENSITIVITY)
|
||||||
head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(85))
|
head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(85))
|
||||||
mouse_input = event.relative
|
mouse_input = event.relative
|
||||||
else:
|
else:
|
||||||
if event is InputEventMouseMotion:
|
if event is InputEventMouseMotion:
|
||||||
self.rotate_y(event.relative.x * .00001)
|
self.rotate_y(event.relative.x * .00001)
|
||||||
head.rotate_x(event.relative.y * .00001)
|
head.rotate_x(event.relative.y * .00001)
|
||||||
head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(85))
|
head.rotation.x = clamp(head.rotation.x, deg_to_rad(-90), deg_to_rad(85))
|
||||||
mouse_input = event.relative
|
mouse_input = event.relative
|
||||||
|
|
||||||
func _physics_process(delta):
|
func _physics_process(delta):
|
||||||
|
|
||||||
if !dead and !level_control.paused:
|
if !dead and !level_control.paused:
|
||||||
@@ -219,13 +223,10 @@ func _physics_process(delta):
|
|||||||
health_indicator.color = lerp(Color(0.471, 0, 0, 0), Color(0.471, 0, 0, .25),health_opacity)
|
health_indicator.color = lerp(Color(0.471, 0, 0, 0), Color(0.471, 0, 0, .25),health_opacity)
|
||||||
|
|
||||||
# Moving Fast Sound
|
# Moving Fast Sound
|
||||||
#initiate fast movement -- may be done with this block
|
var wind_volume = clamp(velocity.length()/20,0,1) #expected max velocity for effect
|
||||||
#change sounds with speed
|
ear_wind.volume_db = lerp(-80,0,wind_volume)
|
||||||
|
|
||||||
if moving_fast:
|
if moving_fast:
|
||||||
var wind_volume = clamp( velocity.length() - 20 ,-80,10)
|
|
||||||
ear_wind.volume_db = wind_volume
|
|
||||||
#reset at apex
|
|
||||||
|
|
||||||
#cache fastest speed
|
#cache fastest speed
|
||||||
if abs(velocity.y) > moving_fast_top_speed:
|
if abs(velocity.y) > moving_fast_top_speed:
|
||||||
moving_fast_top_speed = abs(velocity.y)
|
moving_fast_top_speed = abs(velocity.y)
|
||||||
@@ -243,23 +244,25 @@ func _physics_process(delta):
|
|||||||
# Game Speed
|
# Game Speed
|
||||||
if !level_control.paused:
|
if !level_control.paused:
|
||||||
if Input.is_action_pressed("slow_down") and remaining_stamina > 0 :
|
if Input.is_action_pressed("slow_down") and remaining_stamina > 0 :
|
||||||
Engine.time_scale = lerp(Engine.time_scale, SLOWSPEED, delta * 20)
|
if !gamespeed_controlled:
|
||||||
gun.random_spread_amt = 0
|
Engine.time_scale = lerp(Engine.time_scale, SLOWSPEED, delta * 20)
|
||||||
AudioServer.set_bus_effect_enabled(0,0,true)
|
gun.random_spread_amt = 0
|
||||||
camera.fov = lerp(camera.fov, camera.fov * gun.fov_zoom_amt, delta * 100)
|
AudioServer.set_bus_effect_enabled(0,0,true)
|
||||||
if sensitivity_shift == true:
|
camera.fov = lerp(camera.fov, camera.fov * gun.fov_zoom_amt, delta * 100)
|
||||||
SENSITIVITY = lerp(SENSITIVITY, SENSITIVITY * .998, delta * 100)
|
if sensitivity_shift == true:
|
||||||
if remaining_stamina > 0:
|
SENSITIVITY = lerp(SENSITIVITY, SENSITIVITY * .998, delta * 100)
|
||||||
remaining_stamina = clamp(remaining_stamina - (delta * STAMINA_DRAIN),0,MAX_STAMINA)
|
if remaining_stamina > 0:
|
||||||
|
remaining_stamina = clamp(remaining_stamina - (delta * STAMINA_DRAIN),0,MAX_STAMINA)
|
||||||
else:
|
else:
|
||||||
Engine.time_scale = lerp(Engine.time_scale, 1.0, delta * 50)
|
if !gamespeed_controlled:
|
||||||
gun.random_spread_amt = gun.random_spread_start
|
Engine.time_scale = lerp(Engine.time_scale, 1.0, delta * 50)
|
||||||
AudioServer.set_bus_effect_enabled(0,0,false)
|
gun.random_spread_amt = gun.random_spread_start
|
||||||
if sensitivity_shift == true:
|
AudioServer.set_bus_effect_enabled(0,0,false)
|
||||||
camera.fov = lerp(camera.fov, BASE_FOV, delta * .5)
|
if sensitivity_shift == true:
|
||||||
SENSITIVITY = start_sensitivity
|
camera.fov = lerp(camera.fov, BASE_FOV, delta * .5)
|
||||||
if remaining_stamina < MAX_STAMINA and !Input.is_action_pressed("slow_down"):
|
SENSITIVITY = start_sensitivity
|
||||||
remaining_stamina = clamp(remaining_stamina + (delta * STAMINA_DRAIN/10), 0, MAX_STAMINA)
|
if remaining_stamina < MAX_STAMINA and !Input.is_action_pressed("slow_down"):
|
||||||
|
remaining_stamina = clamp(remaining_stamina + (delta * STAMINA_DRAIN/10), 0, MAX_STAMINA)
|
||||||
|
|
||||||
|
|
||||||
# Reloading
|
# Reloading
|
||||||
@@ -354,6 +357,7 @@ func _physics_process(delta):
|
|||||||
weapon_sway(delta)
|
weapon_sway(delta)
|
||||||
weapon_bob(velocity.length(), delta)
|
weapon_bob(velocity.length(), delta)
|
||||||
|
|
||||||
|
|
||||||
func _headbob(time) -> Vector3:
|
func _headbob(time) -> Vector3:
|
||||||
var pos = Vector3.ZERO
|
var pos = Vector3.ZERO
|
||||||
pos.y = sin(time * BOB_FREQ) * BOB_AMP
|
pos.y = sin(time * BOB_FREQ) * BOB_AMP
|
||||||
@@ -414,6 +418,9 @@ func enemy_hit():
|
|||||||
camera.add_child(hitmarker_spawn)
|
camera.add_child(hitmarker_spawn)
|
||||||
hit_indicator.play()
|
hit_indicator.play()
|
||||||
|
|
||||||
|
func enemy_killed():
|
||||||
|
enemy_killed_audio.play()
|
||||||
|
|
||||||
func toggle_hud(hud_on):
|
func toggle_hud(hud_on):
|
||||||
|
|
||||||
if dead:
|
if dead:
|
||||||
@@ -426,7 +433,7 @@ func toggle_hud(hud_on):
|
|||||||
func grab_moveable(body):
|
func grab_moveable(body):
|
||||||
moveable_holder.global_position = body.global_position
|
moveable_holder.global_position = body.global_position
|
||||||
held_item = body
|
held_item = body
|
||||||
held_item_rotation = body.rotation
|
held_item_rotation = Vector3(0,0,0)#body.rotation
|
||||||
#cache rigidbody settings
|
#cache rigidbody settings
|
||||||
held_item_linear_damp_cache = body.linear_damp
|
held_item_linear_damp_cache = body.linear_damp
|
||||||
held_item_angular_damp_cache = body.angular_damp
|
held_item_angular_damp_cache = body.angular_damp
|
||||||
@@ -443,8 +450,9 @@ func hold_item():
|
|||||||
if held_item != null:
|
if held_item != null:
|
||||||
var held_dir = moveable_holder.global_position - held_item.global_position
|
var held_dir = moveable_holder.global_position - held_item.global_position
|
||||||
var held_av = held_item_rotation - held_item.rotation
|
var held_av = held_item_rotation - held_item.rotation
|
||||||
held_item.linear_velocity = held_dir * 30
|
held_item.linear_velocity = held_dir * 5
|
||||||
held_item.angular_velocity = held_av * 10
|
held_item.look_at(camera.global_position)
|
||||||
|
#held_item.angular_velocity = held_av * 10
|
||||||
|
|
||||||
#break when moved too far away
|
#break when moved too far away
|
||||||
var distance_from_player = abs(self.global_position - held_item.global_position)
|
var distance_from_player = abs(self.global_position - held_item.global_position)
|
||||||
|
|||||||
@@ -20,10 +20,11 @@ var rot_amount : float
|
|||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
# Called when the node enters the scene tree for the first time.
|
||||||
func _ready():
|
func _ready():
|
||||||
|
SignalBus.enemy_killed.connect(enemy_in_room_killed)
|
||||||
|
|
||||||
for i in self.get_children():
|
for i in self.get_children():
|
||||||
if i.is_in_group("enemy"):
|
if i.is_in_group("enemy"):
|
||||||
enemies.append(i)
|
enemies.append(i)
|
||||||
i.last_enemy_dead.connect(last_enemy_dead)
|
|
||||||
if i.is_in_group("door"):
|
if i.is_in_group("door"):
|
||||||
doors.append(i)
|
doors.append(i)
|
||||||
if i.is_in_group("room_check"):
|
if i.is_in_group("room_check"):
|
||||||
@@ -66,13 +67,19 @@ func _process(delta):
|
|||||||
i.loot_amount = 20 #assign loot to the last enemy drop from this section
|
i.loot_amount = 20 #assign loot to the last enemy drop from this section
|
||||||
i.last_enemy = true
|
i.last_enemy = true
|
||||||
|
|
||||||
func last_enemy_dead():
|
func enemy_in_room_killed():
|
||||||
if room_lockdown:
|
var enemy_count = 0
|
||||||
room_lockdown = false
|
for i in self.get_children():
|
||||||
|
if i.is_in_group("enemy") and i.health > 0:
|
||||||
|
enemy_count += 1
|
||||||
|
|
||||||
for i in doors:
|
if enemy_count <= 0:
|
||||||
if !i.door_open:
|
if room_lockdown:
|
||||||
i.open()
|
room_lockdown = false
|
||||||
|
|
||||||
|
for i in doors:
|
||||||
|
if !i.door_open:
|
||||||
|
i.open()
|
||||||
|
|
||||||
func room_entered():
|
func room_entered():
|
||||||
if room_lockdown:
|
if room_lockdown:
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ var player_position
|
|||||||
var bounces = 0
|
var bounces = 0
|
||||||
var start_time
|
var start_time
|
||||||
var end_time
|
var end_time
|
||||||
|
var start_velocity
|
||||||
|
|
||||||
const EMISSION_MAX : float = 200
|
const EMISSION_MAX : float = 200
|
||||||
const EMISSION_LIFETIME : float = 1.75 #in seconds
|
const EMISSION_LIFETIME : float = 1.75 #in seconds
|
||||||
@@ -22,7 +23,8 @@ func _ready() -> void:
|
|||||||
visible = false
|
visible = false
|
||||||
start_time = Time.get_ticks_msec()
|
start_time = Time.get_ticks_msec()
|
||||||
end_time = start_time + (EMISSION_LIFETIME * 1000)
|
end_time = start_time + (EMISSION_LIFETIME * 1000)
|
||||||
|
start_velocity = linear_velocity.length()
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
func _process(delta: float) -> void:
|
func _process(delta: float) -> void:
|
||||||
var current_time = (Time.get_ticks_msec())/end_time
|
var current_time = (Time.get_ticks_msec())/end_time
|
||||||
@@ -30,6 +32,7 @@ func _process(delta: float) -> void:
|
|||||||
|
|
||||||
var distance_from_player = abs(self.global_position - player_position)
|
var distance_from_player = abs(self.global_position - player_position)
|
||||||
|
|
||||||
|
|
||||||
if distance_from_player.length() > 1.5:
|
if distance_from_player.length() > 1.5:
|
||||||
visible = true
|
visible = true
|
||||||
|
|
||||||
|
|||||||
@@ -3,3 +3,4 @@ extends Node
|
|||||||
signal switch_changed()
|
signal switch_changed()
|
||||||
signal switch_timeout()
|
signal switch_timeout()
|
||||||
signal enemy_hit()
|
signal enemy_hit()
|
||||||
|
signal enemy_killed()
|
||||||
|
|||||||
@@ -185,10 +185,7 @@ func die():
|
|||||||
get_tree().get_root().add_child(particlespawn)
|
get_tree().get_root().add_child(particlespawn)
|
||||||
|
|
||||||
drop_loot(loot_amount)
|
drop_loot(loot_amount)
|
||||||
|
SignalBus.emit_signal("enemy_killed")
|
||||||
if last_enemy:
|
|
||||||
emit_signal("last_enemy_dead")
|
|
||||||
|
|
||||||
queue_free()
|
queue_free()
|
||||||
|
|
||||||
func drop_loot(number_of_drops):
|
func drop_loot(number_of_drops):
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ extends Node3D
|
|||||||
@export_subgroup("Main Assets")
|
@export_subgroup("Main Assets")
|
||||||
@export var tracker_indicator : Node
|
@export var tracker_indicator : Node
|
||||||
@export var flare_light : Node
|
@export var flare_light : Node
|
||||||
@export var bullet : Resource
|
|
||||||
@export var bullet_fake : Resource
|
@export var bullet_fake : Resource
|
||||||
@export var bullethole : Resource
|
@export var bullethole : Resource
|
||||||
@export var casing : Resource
|
@export var casing : Resource
|
||||||
@@ -39,6 +38,7 @@ extends Node3D
|
|||||||
@onready var level_control = get_tree().current_scene
|
@onready var level_control = get_tree().current_scene
|
||||||
@onready var ammo_current
|
@onready var ammo_current
|
||||||
@onready var tracker_marker = load("res://assets/tracker_marker.tscn")
|
@onready var tracker_marker = load("res://assets/tracker_marker.tscn")
|
||||||
|
@onready var bullet : Resource = load("res://assets/bullet.tscn")
|
||||||
@onready var tracker_indicator_material = tracker_indicator.get_surface_override_material(0)
|
@onready var tracker_indicator_material = tracker_indicator.get_surface_override_material(0)
|
||||||
|
|
||||||
var tracker : Node
|
var tracker : Node
|
||||||
@@ -160,6 +160,11 @@ func remove_tracker():
|
|||||||
tracker.remove()
|
tracker.remove()
|
||||||
tracker = null
|
tracker = null
|
||||||
|
|
||||||
|
func check_ammo():
|
||||||
|
if level_control.ammo_current[gun_index] == 0 and level_control.ammo_reserve[gun_index] > 0:
|
||||||
|
anim_player.play("reload")
|
||||||
|
audio_reload.play()
|
||||||
|
|
||||||
func reload():
|
func reload():
|
||||||
if tracker != null:
|
if tracker != null:
|
||||||
anim_player.play("remove_tracker")
|
anim_player.play("remove_tracker")
|
||||||
|
|||||||
Reference in New Issue
Block a user