starting to fix guns under new script workflow

This commit is contained in:
derek
2025-03-03 16:58:10 -06:00
parent 15f32eff61
commit 6283c6f22f
19 changed files with 309 additions and 214 deletions

View File

@@ -113,7 +113,7 @@ func _process(delta: float) -> void:
stam_bar_visible = true
current_stam_bar.value = player.remaining_stamina
if player.gun != null:
if player.gun != null and player.gun.weapon_info.weapon_type == 0:
if GameGlobals.gun_ammo.has(player.gun.weapon_info.gun_name) and GameGlobals.gun_ammo[player.gun.weapon_info.gun_name] != null:
ammo_counter.visible = true
ammo_current.text = str(GameGlobals.gun_ammo[player.gun.weapon_info.gun_name]).pad_zeros(2)

View File

@@ -7,4 +7,4 @@ var bullet_damage
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
bullet_damage = machete.bullet_damage
bullet_damage = machete.weapon_info.bullet_damage

View File

@@ -51,10 +51,10 @@ func shoot(delta):
player.recoil.add_gun_recoil(recoil_amount.x)
SignalBus.emit_signal("shot_fired")
func collider_enable():
func melee_collider_enable():
collision_shape.disabled = false
func collider_disable():
func melee_collider_disable():
collision_shape.disabled = true
func swapped_out():

View File

@@ -24,7 +24,8 @@ func picked_up():
if !gun_already_held:
var spawn_gun = gun_resource.instantiate()
level_control.player.add_ammo(true,spawn_gun.weapon_info.gun_name,spawn_gun.weapon_info.bullet_info.ammo_type,spawn_gun.weapon_info.max_ammo,spawn_gun.weapon_info.start_mags)
if spawn_gun.weapon_info.weapon_type == 0:
level_control.player.add_ammo(true,spawn_gun.weapon_info.gun_name,spawn_gun.weapon_info.bullet.ammo_type,spawn_gun.weapon_info.max_ammo,spawn_gun.weapon_info.start_mags)
GameGlobals.held_guns.append(gun_resource)
var instance_gun = gun_resource.instantiate()
var weapon_id = GameGlobals.held_guns.size() - 1

View File

@@ -1,14 +1,15 @@
extends Resource
class_name weapon_resource
@export_group("Gun Feel")
@export var gun_name : String
@export var gun_icon : Texture2D
@export var path : String
@export_enum("Gun","Melee") var weapon_type = 0
@export var bullet : bullet_resource
@export_enum("Auto", "Single", "Burst") var fire_mode: int
@export var fov_zoom_amt = .98
@export var ads : bool = false
@export var recoil_amount : Vector3 = Vector3(.2,.05,.05)
@export var recoil_amount : Vector3 = Vector3(.05,.05,.05)
@export var kick_amount : float = .1
@export var max_ammo = 15
@export var start_mags = 3
@@ -18,8 +19,6 @@ class_name weapon_resource
@export var bullet_speed = 600
@export_group("Gun Assets")
@export var casing : Resource
@export_subgroup("Revolver")
@export var casing_array : Array[NodePath]
@export var mag : Resource
@export_group("Shotgun Settings")
@export var shotgun_spread : Vector3 = Vector3(.1,.1,.1)

View File

@@ -96,7 +96,7 @@ func _draw():
var draw_pos = radius_mid * Vector2.from_angle(mid_rads) + offset
var object = options[i].instantiate()
var texture = object.gun_icon
var texture = object.weapon_info.gun_icon
if selection == i:
var points_per_arc = 32

View File

@@ -2,15 +2,25 @@ extends Node3D
@export var weapon_info : weapon_resource
@export var casing_ejector : Node
@export var mag_ejector : Node
@export var barrel_ray : Node
@export var anim_player : AnimationPlayer
@export var barrel_ray : RayCast3D
@export var casing_ejector : RayCast3D
@export var mag_ejector : RayCast3D
@export var audio_fire : AudioStreamPlayer3D
@export var audio_empty : AudioStreamPlayer3D
@export var audio_reload : AudioStreamPlayer3D
@export_group("Barrel Smoke")
@export var fire_smoke : GPUParticles3D
@export var smoke_timer : Timer
@export_group("Revolver")
@export var casing_array : Array[RayCast3D]
@export var chamber : Node
@export_group("Melee")
@export var melee_collision_shape : Node
@onready var player = get_tree().current_scene.player
var revolver_chamber_rot_amt
var start_position
var start_rotation
var cycle_count_start
@@ -35,7 +45,10 @@ func _ready():
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta):
pass
if chamber != null:
var rot_amount = revolver_chamber_rot_amt * _delta * 10
chamber.rotate_object_local(Vector3(0,-1,0),deg_to_rad(rot_amount))
revolver_chamber_rot_amt -= rot_amount
func reload_finished():
@@ -47,41 +60,54 @@ func reload_finished():
GameGlobals.ammo_reserve[str(weapon_info.bullet.ammo_type)] -= GameGlobals.ammo_reserve[str(weapon_info.bullet.ammo_type)]
func shoot(delta):
if GameGlobals.gun_ammo[weapon_info.gun_name] > 0 and cycle_count > 0:
if weapon_info.weapon_type == 0:
if GameGlobals.gun_ammo[weapon_info.gun_name] > 0 and cycle_count > 0:
if !anim_player.is_playing():
GameGlobals.gun_ammo[weapon_info.gun_name] -= 1
#audio and anims
audio_fire.play()
anim_player.play("shoot")
vibration()
bullet_fire()
spawn_casing()
if chamber != null:
revolver_chamber_rot_amt += 60
if weapon_info.smoke_enabled:
spawn_muzzle_smoke()
player.recoil.add_recoil(Vector3(0,weapon_info.recoil_amount.y,weapon_info.recoil_amount.z),10,10)
player.recoil.add_gun_recoil(weapon_info.recoil_amount.x)
#player.velocity += player.bullet_ray.global_basis * Vector3(0,0, kick_amount)
SignalBus.emit_signal("shot_fired")
if weapon_info.fire_mode != 0:
cycle_count -= 1
elif !anim_player.is_playing() and cycle_count != 0:
anim_player.play("empty")
audio_empty.play()
elif weapon_info.weapon_type == 1:
if !anim_player.is_playing():
GameGlobals.gun_ammo[weapon_info.gun_name] -= 1
#audio and anims
audio_fire.play()
anim_player.play("shoot")
vibration()
bullet_fire()
spawn_casing()
if weapon_info.smoke_enabled:
spawn_muzzle_smoke()
player.recoil.add_recoil(Vector3(0,weapon_info.recoil_amount.y,weapon_info.recoil_amount.z),10,10)
player.recoil.add_gun_recoil(weapon_info.recoil_amount.x)
#player.velocity += player.bullet_ray.global_basis * Vector3(0,0, kick_amount)
SignalBus.emit_signal("shot_fired")
if weapon_info.fire_mode != 0:
cycle_count -= 1
elif !anim_player.is_playing() and cycle_count != 0:
anim_player.play("empty")
audio_empty.play()
func reload():
if GameGlobals.gun_ammo[weapon_info.gun_name] < weapon_info.max_ammo and player.gun.anim_player.get_current_animation() != "reload" and GameGlobals.ammo_reserve[str(weapon_info.bullet.ammo_type)] > 0:
#player.reloading = true
anim_player.play("reload")
audio_reload.play()
if anim_player.is_playing() and anim_player.current_animation == "reload":
if GameGlobals.gun_ammo[weapon_info.gun_name] == 0:
GameGlobals.gun_ammo[weapon_info.gun_name] = 0
else:
GameGlobals.gun_ammo[weapon_info.gun_name] = 1
if weapon_info.weapon_type == 0:
if GameGlobals.gun_ammo[weapon_info.gun_name] < weapon_info.max_ammo and player.gun.anim_player.get_current_animation() != "reload" and GameGlobals.ammo_reserve[str(weapon_info.bullet.ammo_type)] > 0:
#player.reloading = true
anim_player.play("reload")
audio_reload.play()
if anim_player.is_playing() and anim_player.current_animation == "reload":
if GameGlobals.gun_ammo[weapon_info.gun_name] == 0:
GameGlobals.gun_ammo[weapon_info.gun_name] = 0
else:
GameGlobals.gun_ammo[weapon_info.gun_name] = 1
func spawn_mag():
var instance_mag =weapon_info.mag.instantiate()
var instance_mag = weapon_info.mag.instantiate()
instance_mag.position = mag_ejector.global_position
instance_mag.transform.basis = mag_ejector.global_transform.basis
instance_mag.linear_velocity += transform.basis * Vector3(0, -20, 0) + player.velocity
@@ -96,23 +122,26 @@ func spawn_casing():
get_tree().get_root().add_child(instance_casing)
func spawn_revolver_casings():
if weapon_info.casing_array.size() > 0:
pass
#for i in weapon_info.casing_array:
#i.visible = false
#if weapon_info.casings_chamber_last > 0:
#var instance_casing = weapon_info.spawn_casing.instantiate()
#instance_casing.position = i.global_position
#instance_casing.random_rotation = false
#instance_casing.transform.basis = i.global_transform.basis
#instance_casing.player_velocity = player.velocity * transform.basis
#instance_casing.rotation.x += deg_to_rad(90)
#instance_casing.linear_velocity.y = -(8 + rng.randf_range(0,3))
#get_tree().get_root().add_child(instance_casing)
#weapon_info.casings_chamber_last -= 1
if casing_array.size() > 0:
for i in casing_array:
i.visible = false
if weapon_info.casings_chamber_last > 0:
var instance_casing = weapon_info.spawn_casing.instantiate()
instance_casing.position = i.global_position
instance_casing.random_rotation = false
instance_casing.transform.basis = i.global_transform.basis
instance_casing.player_velocity = player.velocity * transform.basis
instance_casing.rotation.x += deg_to_rad(90)
instance_casing.linear_velocity.y = -(8 + rng.randf_range(0,3))
get_tree().get_root().add_child(instance_casing)
weapon_info.casings_chamber_last -= 1
func shotgun_pellet_spawn():
GameGlobals.gun_ammo[weapon_info.gun_name] -= 1
audio_fire.play()
var pellets_remaining = weapon_info.pellets_per_shot
while pellets_remaining > 0:
var lv_x = rng.randf_range(-weapon_info.shotgun_spread.x,weapon_info.shotgun_spread.x)
var lv_y = rng.randf_range(-weapon_info.shotgun_spread.y,weapon_info.shotgun_spread.y)
@@ -124,6 +153,15 @@ func shotgun_pellet_spawn():
instance_bullet.player_position = player.global_position
get_tree().get_root().add_child(instance_bullet)
pellets_remaining -= 1
vibration()
fire_smoke.restart()
fire_smoke.emitting = true
smoke_timer.start()
player.recoil.add_recoil(Vector3(0,weapon_info.recoil_amount.y,weapon_info.recoil_amount.z),10,10)
player.recoil.add_gun_recoil(weapon_info.recoil_amount.x)
player.velocity += player.bullet_ray.global_basis * Vector3(0,0, weapon_info.kick_amount)
SignalBus.emit_signal("shot_fired")
func spawn_muzzle_smoke():
var instance_smoke = weapon_info.muzzle_smoke.instantiate()
@@ -150,5 +188,11 @@ func bullet_fire():
func swapped_out():
queue_free()
func melee_collider_enable():
melee_collision_shape.disabled = false
func melee_collider_disable():
melee_collision_shape.disabled = true
func vibration():
Input.start_joy_vibration(0,.1,.5,.1)