bullet feels better, added spike traps

This commit is contained in:
derek
2024-11-05 16:09:13 -06:00
parent 3002c6e2db
commit 83e2365892
23 changed files with 626 additions and 93 deletions

Binary file not shown.

View File

@@ -0,0 +1,51 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bl5aj1buejws7"
path="res://.godot/imported/SPIKES v1.blend-165c61adade1d508c27426515383d32b.scn"
[deps]
source_file="res://assets/Models/SPIKES v1.blend"
dest_files=["res://.godot/imported/SPIKES v1.blend-165c61adade1d508c27426515383d32b.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
blender/nodes/visible=0
blender/nodes/active_collection_only=false
blender/nodes/punctual_lights=true
blender/nodes/cameras=true
blender/nodes/custom_properties=true
blender/nodes/modifiers=1
blender/meshes/colors=false
blender/meshes/uvs=true
blender/meshes/normals=true
blender/meshes/tangents=true
blender/meshes/skins=2
blender/meshes/export_bones_deforming_mesh_only=false
blender/materials/unpack_enabled=true
blender/materials/export_materials=1
blender/animation/limit_playback=true
blender/animation/always_sample=true
blender/animation/group_tracks=true

Binary file not shown.

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=84 format=4 uid="uid://6agmt1hqlhww"]
[gd_scene load_steps=89 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"]
@@ -22,6 +22,7 @@
[ext_resource type="PackedScene" uid="uid://c6bpysq1tjhy4" path="res://vendingmahcine.tscn" id="10_8qgs0"]
[ext_resource type="PackedScene" uid="uid://clu76sc4uoswn" path="res://assets/rocketlauncher_pickup.tscn" id="11_6de2k"]
[ext_resource type="PackedScene" uid="uid://cnfc8rtk6l1d8" path="res://assets/crate1.tscn" id="12_30nle"]
[ext_resource type="PackedScene" uid="uid://dt4t2a48204v1" path="res://assets/spikes_1.tscn" id="12_w4dk0"]
[ext_resource type="PackedScene" uid="uid://cgo4qyul7ix5p" path="res://assets/ladder.tscn" id="13_qu8oi"]
[ext_resource type="PackedScene" uid="uid://cdpxctwwi12j" path="res://assets/ladder_collision_check.tscn" id="14_gijx0"]
[ext_resource type="PackedScene" uid="uid://b3t8fra7evqfb" path="res://assets/Models/building_1.tscn" id="15_ds1t8"]
@@ -45,6 +46,7 @@ ground_horizon_color = Color(0.64625, 0.65575, 0.67075, 1)
sky_material = SubResource("ProceduralSkyMaterial_eiud5")
[sub_resource type="Environment" id="Environment_b2qms"]
background_mode = 1
sky = SubResource("Sky_vk48o")
tonemap_mode = 2
ssr_enabled = true
@@ -747,6 +749,73 @@ _data = {
"movingswitch": SubResource("Animation_xdrt1")
}
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gcdr3"]
albedo_color = Color(0.336608, 0.336608, 0.336608, 1)
metallic = 1.0
roughness = 0.35
[sub_resource type="Animation" id="Animation_m0b4w"]
resource_name = "HallSpikes"
length = 1.5
loop_mode = 1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../../Hallway1/Spikes 1:position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.6, 1.5),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(42.1175, 19.0112, 71.9478), Vector3(31.7096, 19.0112, 71.9478), Vector3(42.1175, 19.0112, 71.9478)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../../Hallway1/Spikes 2:position")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.6, 1.5),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [Vector3(13.7458, 19.0112, 71.9478), Vector3(26.6885, 19.0112, 71.9478), Vector3(13.7458, 19.0112, 71.9478)]
}
[sub_resource type="Animation" id="Animation_3oaw1"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../../Hallway1/Spikes 1:position")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(42.1175, 19.0112, 71.9478)]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../../Hallway1/Spikes 2:position")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(13.7458, 19.0112, 71.9478)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_c4l4t"]
_data = {
"HallSpikes": SubResource("Animation_m0b4w"),
"RESET": SubResource("Animation_3oaw1")
}
[node name="BLOCKOUT2Test" type="Node3D" node_paths=PackedStringArray("player")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.016016, 0.0225029, -0.0192337)
script = ExtResource("1_sbpvn")
@@ -906,6 +975,9 @@ skeleton = NodePath("")
[node name="CollisionShape3D" type="CollisionShape3D" parent="NavigationRegion3D/blockout2/Thing/StaticBody3D"]
shape = SubResource("ConcavePolygonShape3D_eyfj3")
[node name="Spikes 1" parent="NavigationRegion3D" instance=ExtResource("12_w4dk0")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -27.1833, -5.75175, 34.3513)
[node name="EnemyHivemind" parent="." instance=ExtResource("7_nut1a")]
[node name="spider" parent="EnemyHivemind" instance=ExtResource("8_h7fp0")]
@@ -1744,7 +1816,53 @@ libraries = {
}
autoplay = "movingswitch"
[node name="switch2" type="MeshInstance3D" parent="Switch 1" groups=["interact", "switch", "switch_override"]]
transform = Transform3D(1.655, 0, 0, 0, 1.655, 0, 0, 0, 1.655, -11.1755, 28.5571, 15.622)
mesh = SubResource("SphereMesh_wh8x7")
skeleton = NodePath("../..")
script = ExtResource("35_ybetb")
[node name="StaticBody3D" type="StaticBody3D" parent="Switch 1/switch2" groups=["interact", "switch"]]
collision_layer = 3
script = ExtResource("36_fuepo")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Switch 1/switch2/StaticBody3D"]
shape = SubResource("SphereShape3D_w8su1")
[node name="rocketlauncher1_pickup2" parent="." instance=ExtResource("11_6de2k")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 29.7453, -2.8486, 37.7796)
[node name="Hallway1" type="Node" parent="."]
[node name="Spikes 1" parent="Hallway1" instance=ExtResource("12_w4dk0")]
transform = Transform3D(-1.09278e-07, -2.5, 0, 2.5, -1.09278e-07, 0, 0, 0, 2.5, 42.1175, 19.0112, 71.9478)
pushback = 20.0
[node name="CSGBox3D" type="CSGBox3D" parent="Hallway1/Spikes 1"]
transform = Transform3D(-1.74846e-08, 0.4, 0, -0.4, -1.74846e-08, 0, 0, 0, 0.4, 0.00845242, -5.03143, -0.0302448)
use_collision = true
size = Vector3(25.8188, 3.86572, 3.14655)
material = SubResource("StandardMaterial3D_gcdr3")
[node name="Spikes 2" parent="Hallway1" instance=ExtResource("12_w4dk0")]
transform = Transform3D(1.09278e-07, 2.5, -2.18557e-07, 2.5, -1.09278e-07, 0, -9.55343e-15, -2.18557e-07, -2.5, 13.7458, 19.0112, 71.9478)
pushback = 20.0
[node name="CSGBox3D2" type="CSGBox3D" parent="Hallway1/Spikes 2"]
transform = Transform3D(1.74846e-08, 0.4, -1.52855e-15, 0.4, -1.74846e-08, -3.49691e-08, -3.49691e-08, 3.78932e-21, -0.4, 0.00845337, -3.6799, 0.0302448)
use_collision = true
size = Vector3(17.7919, 3.86572, 3.14655)
material = SubResource("StandardMaterial3D_gcdr3")
[node name="Spikes 3" parent="Hallway1/Spikes 2" instance=ExtResource("12_w4dk0")]
transform = Transform3D(-1, 8.74228e-08, 1.27055e-21, -8.74228e-08, -1, -7.10543e-15, 1.69407e-21, -7.10543e-15, 1, -4.76837e-07, -7.29667, 0)
[node name="HallSpikes1" type="AnimationPlayer" parent="Hallway1"]
root_node = NodePath("../../Plants_pt19/Plant1_base")
libraries = {
"": SubResource("AnimationLibrary_c4l4t")
}
autoplay = "HallSpikes"
[connection signal="switch_hit" from="Switch 1/switch/StaticBody3D" to="Switch 1/switch" method="_on_static_body_3d_switch_hit"]
[connection signal="switch_hit" from="Switch 1/switch2/StaticBody3D" to="Switch 1/switch2" method="_on_static_body_3d_switch_hit"]

View File

@@ -133,7 +133,7 @@ transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 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, 1.47877)
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

File diff suppressed because one or more lines are too long

View File

@@ -5,6 +5,7 @@
[node name="enemyTaunt" type="Label3D" groups=["spawned"]]
billboard = 2
no_depth_test = true
text = "1
"
font = ExtResource("1_vuoli")

View File

@@ -1,8 +1,9 @@
[gd_scene load_steps=24 format=4 uid="uid://brl0bsqjl5dg3"]
[gd_scene load_steps=25 format=4 uid="uid://brl0bsqjl5dg3"]
[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_6i1l4"]
[ext_resource type="PackedScene" uid="uid://dqhltdnqyg8ni" path="res://assets/bullet.tscn" id="3_pyl20"]
[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://dqhltdnqyg8ni" path="res://assets/bullet.tscn" id="3_xr8co"]
[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://c1gdehrsytlkk" path="res://assets/casing_2.tscn" id="4_kpr3h"]
@@ -401,17 +402,14 @@ _data = {
}
[node name="mac10" node_paths=PackedStringArray("flare_light", "anim_player", "barrel_raycast", "casing_ejector", "mag_ejector", "audio_fire", "audio_empty", "audio_reload") instance=ExtResource("1_nb4p5")]
script = ExtResource("2_6i1l4")
script = ExtResource("2_tskiy")
gun_name = "Mac 10"
max_ammo = 30
start_mags = 300
max_ammo = 20
bullet_damage = 2
bullet_speed = 300
bullet_drop = 0.01
random_spread_amt = 0.5
fire_pitch_scale_amt = 0.05
flare_light = NodePath("mac10/SpotLight3D")
bullet = ExtResource("3_pyl20")
bullet_speed = 1500
flare_light = NodePath("mac10/flare")
bullet = ExtResource("3_xr8co")
bullet_fake = ExtResource("3_heo3y")
bullethole = ExtResource("4_eleuq")
casing = ExtResource("4_kpr3h")
mag = ExtResource("4_ji2hu")

View File

@@ -0,0 +1,8 @@
[gd_resource type="ORMMaterial3D" format=3 uid="uid://cc0el8wu0au85"]
[resource]
transparency = 1
albedo_color = Color(1, 0, 0, 1)
emission_enabled = true
emission = Color(1, 0, 0, 1)
emission_energy_multiplier = 2.0

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=25 format=3 uid="uid://drwae3loscbw7"]
[gd_scene load_steps=26 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"]
@@ -9,6 +9,7 @@
[ext_resource type="Script" path="res://scripts/StaminaCounter.gd" id="6_bgi8o"]
[ext_resource type="Script" path="res://scripts/UIScreenAdjust.gd" id="7_pnp4a"]
[ext_resource type="AudioStream" uid="uid://bki17g7j4kqn4" path="res://assets/Audio/PickupSound Mixdown 3.wav" id="8_dwqsx"]
[ext_resource type="Script" path="res://scripts/bullet_ray.gd" id="10_ektr6"]
[ext_resource type="AudioStream" uid="uid://dyd272r7n2ecd" path="res://assets/Audio/footsteps-shoes-jump-land-beach-sand-SBA-300118001.wav" id="10_tn0pn"]
[ext_resource type="AudioStream" uid="uid://bl8yg1d3bsxs3" path="res://assets/Audio/constant-natural-strong-wind-looping-SBA-300062687.wav" id="11_he7p5"]
[ext_resource type="AudioStream" uid="uid://cy150nsjqp7lt" path="res://assets/Audio/grunt-male-SBA-300282985.wav" id="12_f51u4"]
@@ -110,6 +111,8 @@ light_color = Color(1, 1, 0.898039, 1)
light_energy = 0.0
light_projector = ExtResource("4_x670l")
shadow_enabled = true
distance_fade_enabled = true
distance_fade_begin = 5.0
spot_range = 30.0
[node name="FlashlightButton" type="AudioStreamPlayer3D" parent="Head/Recoil/Camera3D/WeaponHolder"]
@@ -166,8 +169,9 @@ script = ExtResource("7_pnp4a")
[node name="BulletRay" type="RayCast3D" parent="Head/Recoil/Camera3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.487738)
target_position = Vector3(0, 0, -200)
collision_mask = 5
collision_mask = 105
collide_with_areas = true
script = ExtResource("10_ektr6")
[node name="InteractRay" type="RayCast3D" parent="Head/Recoil/Camera3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.00322104, -0.0232438)

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=69 format=4 uid="uid://b5eclfg0cmmal"]
[gd_scene load_steps=67 format=4 uid="uid://b5eclfg0cmmal"]
[ext_resource type="PackedScene" uid="uid://dgogd08c0ubt6" path="res://assets/Models/revolver1.blend" id="1_i5f84"]
[ext_resource type="Script" path="res://scripts/revolver_1.gd" id="2_7rsti"]
@@ -8,7 +8,7 @@
[ext_resource type="PackedScene" uid="uid://c1gdehrsytlkk" path="res://assets/casing_2.tscn" id="5_m3vsl"]
[ext_resource type="Texture2D" uid="uid://dit5pj07jr02y" path="res://assets/Models/revolver1.albedo.png" id="6_acf6f"]
[ext_resource type="AudioStream" uid="uid://dywuxr61pit5t" path="res://assets/Audio/Weapons/38 SPL Revolver/Gunshots/38 SPL Revolver - Gunshot B 001.wav" id="7_ve411"]
[ext_resource type="Texture2D" uid="uid://blcxok1w8f4xu" path="res://assets/Models/revolver1.roughness.png" id="7_w8q3k"]
[ext_resource type="Texture2D" uid="uid://b36a5av7x827o" path="res://assets/Models/revolver1.roughness.png" id="7_w8q3k"]
[ext_resource type="Texture2D" uid="uid://l6vsalcx12qr" path="res://assets/Models/textures/revolver1.normal.png" id="8_72uoo"]
[ext_resource type="Texture2D" uid="uid://bvsqe82hirgbj" path="res://assets/Models/revolver1.wood.png" id="9_5hgip"]
[ext_resource type="AudioStream" uid="uid://2rhacxv8tm6j" path="res://assets/Audio/Weapons/38 SPL Revolver/Foley/38 SPL Revolver - Unloading 001.wav" id="9_ob87h"]
@@ -741,13 +741,6 @@ _surfaces = [{
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_0sgiw")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_r3lw3"]
albedo_color = Color(0.859131, 0.597594, 0.456011, 1)
[sub_resource type="BoxMesh" id="BoxMesh_7fcc1"]
material = SubResource("StandardMaterial3D_r3lw3")
size = Vector3(0.1, 0.1, 1)
[sub_resource type="Animation" id="Animation_8akx8"]
resource_name = "empty"
length = 0.3
@@ -1212,12 +1205,6 @@ spot_range = 7.0
spot_angle = 70.0
spot_angle_attenuation = 0.353554
[node name="armStandin" type="MeshInstance3D" parent="revolver1" index="6"]
transform = Transform3D(2.01151e-05, -5.55667, -1.75852e-12, -5.55667, -2.01151e-05, 4.85779e-07, -4.85779e-07, 0, -5.55667, 0.502168, 0.0410088, 2.79972)
visible = false
mesh = SubResource("BoxMesh_7fcc1")
skeleton = NodePath("../../../../../../../..")
[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="1"]
libraries = {
"": SubResource("AnimationLibrary_2kb78")

File diff suppressed because one or more lines are too long

95
assets/spikes_1.tscn Normal file

File diff suppressed because one or more lines are too long

View File

@@ -22,7 +22,7 @@ var bullet_active = true
func _ready():
visible = false
linear_velocity += transform.basis * Vector3(0, 0, -bullet_speed)
linear_velocity += transform.basis * Vector3(0, 0, -bullet_speed) + player_velocity
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _physics_process(delta):

View File

@@ -1,7 +1,5 @@
extends Node3D
const recoil_amount : Vector3 = Vector3(.5,.1,.1)
var bullet_speed
var bullet_drop
var random_spread_amt
@@ -43,17 +41,8 @@ func _process(delta):
if ray.is_colliding() and ray.get_collider() != null:
if ray.get_collider().is_in_group("player"):
var player = ray.get_collider()
var snap_amount = 10
var speed_amount = 10
player.level_control.health -= bullet_damage
player.recoil.add_recoil(recoil_amount,snap_amount,speed_amount)
if player.level_control.health <= bullet_damage:
player.level_control.last_hit = fired_by
player.hurt_audio.play()
else:
queue_free()
ray.get_collider().hit(bullet_damage,fired_by)
queue_free()
if ray.is_colliding() and ray.get_collider() != null:

41
scripts/bullet_fake.gd Normal file
View File

@@ -0,0 +1,41 @@
extends Node3D
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
@onready var mesh = $gunbullet1/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):
position += transform.basis * Vector3(0, 0, -bullet_speed) * delta
distance_from_player = abs(self.global_position - player_position)
if distance_from_player.length() > 1.5:
visible = true
if ray.is_colliding() and !ray.get_collider().is_in_group("player"):
mesh.visible = false
ray.enabled = false
await get_tree().create_timer(1.0).timeout
queue_free()

42
scripts/bullet_ray.gd Normal file
View File

@@ -0,0 +1,42 @@
extends RayCast3D
@onready var hit_indicator: AudioStreamPlayer = $"../../../../Audio/HitIndicator"
# 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 hitscan_fire(bullet_damage,bullet_force_mod,bullethole):
if is_colliding():
#bullethole effect
var instance_bullethole = bullethole.instantiate()
get_collider().add_child(instance_bullethole)
instance_bullethole.global_transform.origin = get_collision_point()
if (abs(get_collision_normal().y) > 0.99):
instance_bullethole.look_at(get_collision_point() + get_collision_normal(), Vector3(0,0,1))
else:
instance_bullethole.look_at(get_collision_point() + get_collision_normal())
#move rigidbodies
if get_collider().is_in_group("scene_rigidbody"):
get_collider().linear_velocity += rotation * Vector3(0,0,-bullet_force_mod)
if get_collider().is_in_group("breakable"):
get_collider().breaking( Vector3(0,0,-bullet_force_mod))
if get_collider().is_in_group("enemy_target"):
emit_signal("enemy_hit")
get_collider().hit(bullet_damage)
if get_collider().is_in_group("switch"):
get_collider().hit()

View File

@@ -107,7 +107,6 @@ func _process(delta):
func _on_timer_timeout():
anim_step += 1
print("ANIM STEP " +str(anim_step))
func reload_level():
get_tree().reload_current_scene()

View File

@@ -4,6 +4,7 @@ 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 max_ammo = 15
@@ -18,6 +19,7 @@ extends Node3D
@export_subgroup("Main Assets")
@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
@@ -83,34 +85,15 @@ 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 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")
# instance bullet
var instance_bullet = bullet.instantiate()
instance_bullet.position = player.bullet_ray.global_position
#shoot bullet from real gun if gun is folded up
if player.gun_folded == false:
instance_bullet.transform.basis = player.bullet_ray.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
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.instance_bullethole = bullethole.instantiate()
instance_bullet.player_position = player.global_position
get_tree().current_scene.add_child(instance_bullet)
# Casing transform
var instance_casing = casing.instantiate()
instance_casing.position = casing_ejector.global_position
instance_casing.transform.basis = casing_ejector.global_transform.basis
get_tree().get_root().add_child(instance_casing)
bullet_fire()
hitscan_fire()
spawn_casing()
player.recoil.add_recoil(recoil_amount,10,10)
if fire_mode != 0:
cycle_count -= 1
@@ -136,5 +119,42 @@ func spawn_mag():
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
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 = player.bullet_ray.global_position
#shoot bullet from real gun if gun is folded up
if player.gun_folded == false:
instance_bullet.transform.basis = player.bullet_ray.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.instance_bullethole = bullethole.instantiate()
instance_bullet.player_position = player.global_position
get_tree().current_scene.add_child(instance_bullet)
func hitscan_fire():
if hitscan_enabled:
# Fire hitscan
if player.gun_folded == false:
player.bullet_ray.hitscan_fire(bullet_damage,bullet_force_mod,bullethole)
else:
barrel_raycast.hitscan_fire(bullet_damage,bullet_force_mod,bullethole)
func swapped_out():
queue_free()

153
scripts/gun_hitscan.gd Normal file
View File

@@ -0,0 +1,153 @@
extends Node3D
@export_group("Gun Feel")
@export var gun_name : String
@export_enum("Auto", "Single", "Burst") var fire_mode: int
@export var fov_zoom_amt = .98
@export var recoil_amount : Vector3 = Vector3(.2,.05,.05)
@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 flare_light : Node
@export var bullet : 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
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
# 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):
pass
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 level_control.ammo_current[gun_index] > 0 and cycle_count > 0:
if !anim_player.is_playing():
#Audio and Animations
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()
anim_player.play("shoot")
# instance fake bullet
bullet_fire()
# Fire hitscan
if player.gun_folded == false:
player.bullet_ray.hitscan_fire(bullet_damage,bullet_force_mod,bullethole)
else:
barrel_raycast.hitscan_fire(bullet_damage,bullet_force_mod,bullethole)
spawn_casing()
if fire_mode != 0:
cycle_count -= 1
elif !anim_player.is_playing() and cycle_count != 0:
anim_player.play("empty")
audio_empty.play()
func reload(delta):
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
anim_player.play("reload")
audio_reload.play()
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 swapped_out():
queue_free()
func bullet_fire():
var instance_bullet = bullet.instantiate()
instance_bullet.position = player.bullet_ray.global_position
instance_bullet.bullet_speed = bullet_speed
instance_bullet.player_velocity = player.velocity
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.instance_bullethole = bullethole.instantiate()
instance_bullet.player_position = player.global_position
#shoot bullet from real gun if gun is folded up
if player.gun_folded == false:
instance_bullet.transform.basis = player.bullet_ray.global_transform.basis
else:
instance_bullet.transform.basis = barrel_raycast.global_transform.basis
get_tree().current_scene.add_child(instance_bullet)
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
get_tree().get_root().add_child(instance_casing)
player.recoil.add_recoil(recoil_amount,10,10)

View File

@@ -465,3 +465,9 @@ func release_moveable():
held_item.mass = held_item_mass_cache
held_item.set_constant_force(Vector3(0,0,0))
held_item = null
func hit(damage,fired_by):
level_control.health -= damage
level_control.last_hit = fired_by
recoil.add_recoil(Vector3(.5,.1,.1),10,10)
hurt_audio.play()

View File

@@ -154,7 +154,7 @@ func fire(delta):
instance_bullet.random_spread_amt = random_spread_amt
instance_bullet.bullet_force_mod = bullet_force_mod
instance_bullet.player_position = player.global_position
instance_bullet.player_velocity = player.velocity
instance_bullet.player_velocity = (player.velocity * player.transform.basis)
instance_bullet.instance_bullethole = bullethole.instantiate()
get_tree().get_root().add_child(instance_bullet)
player.recoil.add_recoil(recoil_amount,10,recoil_speed_change)

21
scripts/spikes_1.gd Normal file
View File

@@ -0,0 +1,21 @@
extends Node3D
@export var damage : float = 1
@export var pushback : float = 5
@onready var outline_meshes = [$Spikes1/MeshInstance3D]
@onready var ray_cast: RayCast3D = $RayCast3D
# 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 _on_area_3d_body_entered(body: Node3D) -> void:
if body.is_in_group("player"):
body.hit(damage,self)
body.velocity = ray_cast.global_transform.basis * Vector3(0,0,-pushback)