fixed hud wobble and removed deprecated scripts
This commit is contained in:
@@ -1,145 +0,0 @@
|
||||
extends Node3D
|
||||
|
||||
var start_position
|
||||
var start_rotation
|
||||
var random_spread_start
|
||||
var cycle_count_start
|
||||
var cycle_count
|
||||
|
||||
@export_group("Gun Feel")
|
||||
@export var gun_name : String
|
||||
@export var gun_icon : Texture2D
|
||||
@export_enum("Light", "Medium", "Heavy", "Shotgun", "Rocket") var ammo_type: int
|
||||
@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,0,0)
|
||||
@export var spread : Vector3 = Vector3(1,1,1)
|
||||
@export var kick_amount : float = 5
|
||||
@export var max_ammo = 15
|
||||
@export var start_mags = 3
|
||||
@export var pellets_per_shot = 12
|
||||
@export var bullet_damage = 1
|
||||
@export var bullet_force_mod = 5
|
||||
@export var blast_power = 50.0
|
||||
@export var bullet_speed : float = 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 bullet : Resource
|
||||
@export_subgroup("Raycast Nodes")
|
||||
@export var anim_player : Node
|
||||
@export var barrel_raycast : Node
|
||||
@export_subgroup("Audio Clips")
|
||||
@export var audio_fire : Node
|
||||
@export var audio_empty : Node
|
||||
@export var audio_reload : Node
|
||||
|
||||
@onready var smoke: GPUParticles3D = $BlunderbusHandle/Blunderbus/Smoke
|
||||
@onready var player = get_tree().current_scene.player
|
||||
@onready var level_control = get_tree().current_scene
|
||||
@onready var ammo_current
|
||||
@onready var smoke_timer: Timer = $SmokeTimer
|
||||
@onready var fire_smoke: GPUParticles3D = $BlunderbusHandle/Blunderbus/fire_smoke
|
||||
|
||||
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():
|
||||
#smoke.emitting = false
|
||||
start_position = self.position
|
||||
start_rotation = self.rotation
|
||||
random_spread_start = random_spread_amt
|
||||
|
||||
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 GameGlobals.ammo_reserve[str(ammo_type)] >= max_ammo:
|
||||
GameGlobals.gun_ammo[gun_name] += max_ammo
|
||||
GameGlobals.ammo_reserve[str(ammo_type)] -= max_ammo
|
||||
|
||||
else:
|
||||
GameGlobals.gun_ammo[gun_name] += GameGlobals.ammo_reserve[str(ammo_type)]
|
||||
GameGlobals.ammo_reserve[str(ammo_type)] -= GameGlobals.ammo_reserve[str(ammo_type)]
|
||||
|
||||
|
||||
func shoot(delta):
|
||||
if GameGlobals.gun_ammo[gun_name] > 0:
|
||||
if !anim_player.is_playing():
|
||||
anim_player.play("shoot")
|
||||
elif !anim_player.is_playing() and cycle_count != 0:
|
||||
anim_player.play("empty")
|
||||
audio_empty.play()
|
||||
|
||||
func fire():
|
||||
GameGlobals.gun_ammo[gun_name] -= 1
|
||||
audio_fire.pitch_scale = 1 + rng.randf_range(-fire_pitch_scale_amt,fire_pitch_scale_amt)
|
||||
audio_fire.play()
|
||||
pellet_spawn()
|
||||
vibration()
|
||||
fire_smoke.restart()
|
||||
fire_smoke.emitting = true
|
||||
smoke_timer.start()
|
||||
player.recoil.add_recoil(Vector3(0,recoil_amount.y,recoil_amount.z),10,10)
|
||||
player.recoil.add_gun_recoil(recoil_amount.x)
|
||||
player.velocity += player.bullet_ray.global_basis * Vector3(0,0, kick_amount)
|
||||
SignalBus.emit_signal("shot_fired")
|
||||
|
||||
func reload():
|
||||
if GameGlobals.gun_ammo[gun_name] < max_ammo and player.gun.anim_player.get_current_animation() != "reload" and GameGlobals.ammo_reserve[str(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[gun_name] == 0:
|
||||
GameGlobals.gun_ammo[gun_name] = 0
|
||||
else:
|
||||
GameGlobals.gun_ammo[gun_name] = 1
|
||||
|
||||
func pellet_spawn():
|
||||
var pellets_remaining = pellets_per_shot
|
||||
while pellets_remaining > 0:
|
||||
var lv_x = rng.randf_range(-spread.x,spread.x)
|
||||
var lv_y = rng.randf_range(-spread.y,spread.y)
|
||||
# instance bullet
|
||||
var instance_bullet = bullet.instantiate()
|
||||
instance_bullet.position = player.bullet_ray.global_position
|
||||
instance_bullet.transform.basis = player.bullet_ray.global_transform.basis
|
||||
instance_bullet.linear_velocity += instance_bullet.transform.basis * Vector3(lv_x, lv_y, -bullet_speed) + player.velocity
|
||||
instance_bullet.bullet_damage = bullet_damage
|
||||
instance_bullet.bullet_force_mod = bullet_force_mod
|
||||
instance_bullet.player_position = player.global_position
|
||||
get_tree().get_root().add_child(instance_bullet)
|
||||
pellets_remaining -= 1
|
||||
|
||||
func swapped_out():
|
||||
queue_free()
|
||||
|
||||
|
||||
func _on_smoke_timer_timeout() -> void:
|
||||
smoke.restart()
|
||||
smoke.emitting = true
|
||||
smoke_timer.stop()
|
||||
|
||||
func vibration():
|
||||
Input.start_joy_vibration(0,.5,.9,.2)
|
||||
176
scripts/gun.gd
176
scripts/gun.gd
@@ -1,176 +0,0 @@
|
||||
extends Node3D
|
||||
|
||||
|
||||
@export_group("Gun Feel")
|
||||
@export var gun_name : String
|
||||
@export var gun_icon : Texture2D
|
||||
@export_enum("Light", "Medium", "Heavy", "Shotgun", "Rocket") var ammo_type: int
|
||||
@export_enum("Auto", "Single", "Burst") var fire_mode: int
|
||||
@export var gun_info : gun_stats
|
||||
@export var hitscan_enabled : bool = false
|
||||
@export var fov_zoom_amt = .98
|
||||
@export var ads : bool = false
|
||||
@export var recoil_amount : Vector3 = Vector3(.2,.05,.05)
|
||||
@export var kick_amount : float = .1
|
||||
@export var max_ammo = 15
|
||||
@export var start_mags = 3
|
||||
@export var bullet_damage = 1
|
||||
@export var smoke_enabled : bool = false
|
||||
@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 r_hand_location : Node
|
||||
@export var l_hand_location : Node
|
||||
@export var flare_light : Node
|
||||
@export var bullet : Resource
|
||||
@export var bullet_fake : Resource
|
||||
@export var bullethole : Resource
|
||||
@export var casing : Resource
|
||||
@export var mag : Resource
|
||||
@export_subgroup("Raycast Nodes")
|
||||
@export var anim_player : Node
|
||||
@export var barrel_raycast : Node
|
||||
@export var casing_ejector : Node
|
||||
@export var mag_ejector : Node
|
||||
@export_subgroup("Audio Clips")
|
||||
@export var audio_fire : Node
|
||||
@export var audio_empty : Node
|
||||
@export var audio_reload : Node
|
||||
|
||||
@onready var player = get_tree().current_scene.player
|
||||
@onready var level_control = get_tree().current_scene
|
||||
@onready var muzzle_smoke = preload("res://assets/muzzle_smoke.tscn")
|
||||
|
||||
var start_position
|
||||
var start_rotation
|
||||
var random_spread_start
|
||||
var cycle_count_start
|
||||
var cycle_count
|
||||
var rng = RandomNumberGenerator.new()
|
||||
var gun_index
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
random_spread_start = random_spread_amt
|
||||
|
||||
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 GameGlobals.ammo_reserve[str(ammo_type)] >= max_ammo:
|
||||
GameGlobals.gun_ammo[gun_name] += max_ammo
|
||||
GameGlobals.ammo_reserve[str(ammo_type)] -= max_ammo
|
||||
else:
|
||||
GameGlobals.gun_ammo[gun_name] += GameGlobals.ammo_reserve[str(ammo_type)]
|
||||
GameGlobals.ammo_reserve[str(ammo_type)] -= GameGlobals.ammo_reserve[str(ammo_type)]
|
||||
|
||||
func shoot(delta):
|
||||
if GameGlobals.gun_ammo[gun_name] > 0 and cycle_count > 0:
|
||||
if !anim_player.is_playing():
|
||||
GameGlobals.gun_ammo[gun_name] -= 1
|
||||
#audio and anims
|
||||
audio_fire.pitch_scale = 1 + rng.randf_range(-fire_pitch_scale_amt,fire_pitch_scale_amt)
|
||||
audio_fire.play()
|
||||
anim_player.play("shoot")
|
||||
vibration()
|
||||
bullet_fire()
|
||||
hitscan_fire()
|
||||
spawn_casing()
|
||||
if smoke_enabled:
|
||||
spawn_muzzle_smoke()
|
||||
player.recoil.add_recoil(Vector3(0,recoil_amount.y,recoil_amount.z),10,10)
|
||||
player.recoil.add_gun_recoil(recoil_amount.x)
|
||||
#player.velocity += player.bullet_ray.global_basis * Vector3(0,0, kick_amount)
|
||||
SignalBus.emit_signal("shot_fired")
|
||||
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():
|
||||
if GameGlobals.gun_ammo[gun_name] < max_ammo and player.gun.anim_player.get_current_animation() != "reload" and GameGlobals.ammo_reserve[str(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[gun_name] == 0:
|
||||
GameGlobals.gun_ammo[gun_name] = 0
|
||||
else:
|
||||
GameGlobals.gun_ammo[gun_name] = 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
|
||||
instance_mag.linear_velocity += transform.basis * Vector3(0, -20, 0) + player.velocity
|
||||
get_tree().get_root().add_child(instance_mag)
|
||||
|
||||
func spawn_casing():
|
||||
# Casing transform
|
||||
var instance_casing = casing.instantiate()
|
||||
instance_casing.position = casing_ejector.global_position
|
||||
instance_casing.transform.basis = casing_ejector.global_transform.basis
|
||||
instance_casing.player_velocity = player.velocity * transform.basis
|
||||
get_tree().get_root().add_child(instance_casing)
|
||||
|
||||
func spawn_muzzle_smoke():
|
||||
var instance_smoke = muzzle_smoke.instantiate()
|
||||
instance_smoke.global_transform.basis = barrel_raycast.global_transform.basis
|
||||
|
||||
add_child(instance_smoke)
|
||||
|
||||
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()
|
||||
|
||||
func vibration():
|
||||
Input.start_joy_vibration(0,.1,.5,.1)
|
||||
@@ -1,19 +0,0 @@
|
||||
extends Resource
|
||||
class_name gun_stats
|
||||
|
||||
@export var gun_name : String
|
||||
@export var gun_icon : Texture2D
|
||||
@export_enum("Light", "Medium", "Heavy", "Shotgun", "Rocket") var ammo_type: int
|
||||
@export var fov_zoom_amt = .98
|
||||
@export var use_ads : bool = false
|
||||
@export var recoil_amount : Vector3 = Vector3(.2,.05,.05)
|
||||
@export var kick_amount : float = .1
|
||||
@export var max_ammo = 15
|
||||
@export var start_mags = 3
|
||||
@export var bullet_damage = 1
|
||||
@export var smoke_enabled : bool = false
|
||||
@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
|
||||
@@ -624,12 +624,18 @@ func grab_moveable(body):
|
||||
held_item.set_collision_layer_value(1,false)
|
||||
|
||||
func hud_wobble(delta):
|
||||
const HUD_WOBBLE_MAX : float = 10
|
||||
const MOUSE_AMT = 0
|
||||
const VELOCITY_AMT = 10
|
||||
var dir = Vector2(-velocity.x * VELOCITY_AMT - mouse_input.x * MOUSE_AMT,velocity.y * VELOCITY_AMT - mouse_input.y * MOUSE_AMT)
|
||||
var dir_clamped = clamp(dir,Vector2(-HUD_WOBBLE_MAX,-HUD_WOBBLE_MAX),Vector2(HUD_WOBBLE_MAX,HUD_WOBBLE_MAX))
|
||||
hud.position = lerp(hud.position, dir_clamped, delta * 5)
|
||||
const HUD_WOBBLE_MAX : float = 20
|
||||
const MOUSE_AMT = 10
|
||||
const VELOCITY_AMT = 100
|
||||
const HUD_SPEED = 10
|
||||
var dir_mouse = Vector2(-mouse_input.x * MOUSE_AMT,-mouse_input.y * MOUSE_AMT)
|
||||
var velocity_dir_transformed = velocity.normalized() * global_basis
|
||||
var velocity_lengh_clamped = clamp(velocity.length(),-VELOCITY_AMT,VELOCITY_AMT)
|
||||
var dir_velocity = Vector2(-velocity_dir_transformed.x * velocity_lengh_clamped,velocity_dir_transformed.y * velocity_lengh_clamped)
|
||||
var dir_clamped = clamp(dir_mouse + dir_velocity,Vector2(-HUD_WOBBLE_MAX,-HUD_WOBBLE_MAX),Vector2(HUD_WOBBLE_MAX,HUD_WOBBLE_MAX))
|
||||
var offset = lerp(hud.position, dir_clamped, delta * HUD_SPEED)
|
||||
hud.position = offset
|
||||
hud.crosshair.position = -offset
|
||||
|
||||
func hold_item(_delta):
|
||||
# Move Held Items
|
||||
|
||||
@@ -1,192 +0,0 @@
|
||||
extends Node3D
|
||||
|
||||
var start_position
|
||||
var start_rotation
|
||||
var random_spread_start
|
||||
var cycle_count_start
|
||||
var cycle_count
|
||||
|
||||
@export_group("Gun Feel")
|
||||
@export var gun_name : String
|
||||
@export var gun_icon : Texture2D
|
||||
@export_enum("Light", "Medium", "Heavy", "Shotgun", "Rocket") var ammo_type: int
|
||||
@export_enum("Auto", "Single", "Burst") var fire_mode: int
|
||||
@export var fov_zoom_amt = 10
|
||||
@export var ads : bool = false
|
||||
@export var recoil_amount : Vector3 = Vector3(1,.1,.1)
|
||||
@export var recoil_speed_change : float = 4
|
||||
@export var max_ammo = 15
|
||||
@export var start_mags = 3
|
||||
@export var bullet_damage = 1
|
||||
@export var kick_amount = 1
|
||||
@export var bullet_force_mod = 5
|
||||
@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 r_hand_location : Node
|
||||
@export var l_hand_location : Node
|
||||
@export var chamber : Node
|
||||
@export var bullet : Resource
|
||||
@export var bullethole : Resource
|
||||
@export var spawn_casing : Resource
|
||||
@export_subgroup("Revolver/Casings")
|
||||
@export var casing0 : Node
|
||||
@export var casing1 : Node
|
||||
@export var casing2 : Node
|
||||
@export var casing3 : Node
|
||||
@export var casing4 : Node
|
||||
@export var casing5 : Node
|
||||
@export var casing_spawn0 : Node
|
||||
@export var casing_spawn1 : Node
|
||||
@export var casing_spawn2 : Node
|
||||
@export var casing_spawn3 : Node
|
||||
@export var casing_spawn4 : Node
|
||||
@export var casing_spawn5 : Node
|
||||
@export_subgroup("Revolver/Bullets")
|
||||
@export var bullet0 : Node
|
||||
@export var bullet1 : Node
|
||||
@export var bullet2 : Node
|
||||
@export var bullet3 : Node
|
||||
@export var bullet4 : Node
|
||||
@export var bullet5 : Node
|
||||
@export_subgroup("Raycast Nodes")
|
||||
@export var anim_player : Node
|
||||
@export var barrel_raycast : 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 chamber_rot_amt = 0
|
||||
var casing_array = []
|
||||
var casing_spawn_array = []
|
||||
var bullet_array = []
|
||||
var rng = RandomNumberGenerator.new()
|
||||
var gun_index
|
||||
var casings_chamber_last
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
start_position = self.position
|
||||
start_rotation = self.rotation
|
||||
random_spread_start = random_spread_amt
|
||||
|
||||
casings_chamber_last = max_ammo
|
||||
|
||||
casing_array = [casing0,casing1,casing2,casing3,casing4,casing5]
|
||||
casing_spawn_array = [casing_spawn0,casing_spawn1,casing_spawn2,casing_spawn3,casing_spawn4,casing_spawn5]
|
||||
bullet_array = [bullet0,bullet1,bullet2,bullet3,bullet4,bullet5]
|
||||
|
||||
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):
|
||||
var rot_amount = chamber_rot_amt * delta * 10
|
||||
chamber.rotate_object_local(Vector3(0,-1,0),deg_to_rad(rot_amount))
|
||||
chamber_rot_amt -= rot_amount
|
||||
|
||||
|
||||
func reload_finished():
|
||||
#if max ammo in reserve fill all the way
|
||||
if GameGlobals.ammo_reserve[str(ammo_type)] >= max_ammo:
|
||||
GameGlobals.gun_ammo[gun_name] += max_ammo
|
||||
GameGlobals.ammo_reserve[str(ammo_type)] -= max_ammo
|
||||
casings_chamber_last = max_ammo
|
||||
for i in casing_array:
|
||||
i.visible = true
|
||||
for i in bullet_array:
|
||||
i.visible = true
|
||||
player.reloading = false
|
||||
#if not max ammo in reserve add remaining ammo
|
||||
else:
|
||||
GameGlobals.gun_ammo[gun_name] += GameGlobals.ammo_reserve[str(ammo_type)]
|
||||
var casings_in_chamber = GameGlobals.ammo_reserve[str(ammo_type)]
|
||||
casings_chamber_last = GameGlobals.ammo_reserve[str(ammo_type)]
|
||||
GameGlobals.ammo_reserve[str(ammo_type)] -= GameGlobals.ammo_reserve[str(ammo_type)]
|
||||
|
||||
while casings_in_chamber > 0:
|
||||
casing_array[casings_in_chamber].visible = true
|
||||
bullet_array[casings_in_chamber].visible = true
|
||||
casings_in_chamber -= 1
|
||||
await get_tree().create_timer(.01).timeout
|
||||
player.reloading = false
|
||||
|
||||
func shoot(delta):
|
||||
if GameGlobals.gun_ammo[gun_name] > 0 and cycle_count > 0:
|
||||
if !anim_player.is_playing():
|
||||
GameGlobals.gun_ammo[gun_name] -= 1
|
||||
audio_fire.pitch_scale = 1 + rng.randf_range(-fire_pitch_scale_amt,fire_pitch_scale_amt)
|
||||
audio_fire.play()
|
||||
anim_player.play("shoot") #actual bullet spawn triggered by animation
|
||||
SignalBus.emit_signal("shot_fired")
|
||||
if fire_mode != 0:
|
||||
cycle_count -= 1
|
||||
|
||||
elif !anim_player.is_playing() and cycle_count != 0:
|
||||
anim_player.play("empty")
|
||||
audio_empty.play()
|
||||
|
||||
func fire(delta):
|
||||
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.bullet_drop = bullet_drop
|
||||
instance_bullet.bullet_damage = bullet_damage
|
||||
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 * player.transform.basis)
|
||||
instance_bullet.instance_bullethole = bullethole.instantiate()
|
||||
get_tree().get_root().add_child(instance_bullet)
|
||||
player.recoil.add_recoil(Vector3(0,recoil_amount.y,recoil_amount.z),10,recoil_speed_change)
|
||||
player.recoil.add_gun_recoil(recoil_amount.x)
|
||||
chamber_rot_amt += 60
|
||||
Input.start_joy_vibration(0,.5,.9,.2)
|
||||
|
||||
func reload():
|
||||
if GameGlobals.gun_ammo[gun_name] < max_ammo and player.gun.anim_player.get_current_animation() != "reload" and GameGlobals.ammo_reserve[str(ammo_type)] > 0:
|
||||
anim_player.play("reload")
|
||||
audio_reload.play()
|
||||
for i in bullet_array:
|
||||
i.visible = false
|
||||
if anim_player.is_playing() and anim_player.current_animation == "reload":
|
||||
GameGlobals.gun_ammo[gun_name] = 0
|
||||
|
||||
func spawn_casings():
|
||||
for i in casing_array:
|
||||
i.visible = false
|
||||
if casings_chamber_last > 0:
|
||||
var instance_casing = 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)
|
||||
casings_chamber_last -= 1
|
||||
|
||||
func swapped_out():
|
||||
queue_free()
|
||||
@@ -1,126 +0,0 @@
|
||||
extends Node3D
|
||||
|
||||
var start_position
|
||||
var start_rotation
|
||||
var random_spread_start
|
||||
var cycle_count_start
|
||||
var cycle_count
|
||||
var ads = false
|
||||
|
||||
@export_group("Gun Feel")
|
||||
@export var gun_name : String
|
||||
@export var gun_icon : Texture2D
|
||||
@export_enum("Light", "Medium", "Heavy", "Shotgun", "Rocket") var ammo_type: int
|
||||
@export_enum("Auto", "Single", "Burst") var fire_mode: int
|
||||
@export var fov_zoom_amt = .98
|
||||
@export var recoil_amount : Vector3 = Vector3(.2,0,0)
|
||||
@export var max_ammo = 15
|
||||
@export var start_mags = 3
|
||||
@export var bullet_damage = 1
|
||||
@export var blast_power = 50.0
|
||||
@export var bullet_speed : float = 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 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
|
||||
var rng = RandomNumberGenerator.new()
|
||||
var gun_index
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
start_position = self.position
|
||||
start_rotation = self.rotation
|
||||
random_spread_start = random_spread_amt
|
||||
|
||||
|
||||
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 GameGlobals.ammo_reserve[str(ammo_type)] >= max_ammo:
|
||||
GameGlobals.gun_ammo[gun_name] += max_ammo
|
||||
GameGlobals.ammo_reserve[str(ammo_type)] -= max_ammo
|
||||
|
||||
else:
|
||||
GameGlobals.gun_ammo[gun_name] += GameGlobals.ammo_reserve[str(ammo_type)]
|
||||
GameGlobals.ammo_reserve[str(ammo_type)] -= GameGlobals.ammo_reserve[str(ammo_type)]
|
||||
|
||||
|
||||
func shoot(delta):
|
||||
|
||||
if GameGlobals.gun_ammo[gun_name] > 0 and cycle_count > 0:
|
||||
if !anim_player.is_playing():
|
||||
GameGlobals.gun_ammo[gun_name] -= 1
|
||||
#RECOIL --- fix later to happen over a period of time
|
||||
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 = barrel_raycast.global_position
|
||||
instance_bullet.transform.basis = barrel_raycast.global_transform.basis
|
||||
instance_bullet.bullet_speed = bullet_speed
|
||||
instance_bullet.player_velocity = player.velocity
|
||||
instance_bullet.bullet_damage = bullet_damage
|
||||
instance_bullet.blast_power = blast_power
|
||||
instance_bullet.player_position = player.global_position
|
||||
get_tree().get_root().add_child(instance_bullet)
|
||||
player.recoil.add_recoil(recoil_amount,10,10)
|
||||
SignalBus.emit_signal("shot_fired")
|
||||
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():
|
||||
if GameGlobals.gun_ammo[gun_name] < max_ammo and player.gun.anim_player.get_current_animation() != "reload" and GameGlobals.ammo_reserve[str(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[gun_name] == 0:
|
||||
GameGlobals.gun_ammo[gun_name] = 0
|
||||
else:
|
||||
GameGlobals.gun_ammo[gun_name] = 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()
|
||||
@@ -262,6 +262,8 @@ func bullet_fire():
|
||||
revolver_chamber_rot_amt += 60
|
||||
if weapon_info.smoke_enabled:
|
||||
spawn_muzzle_smoke()
|
||||
if casing_ejector != null:
|
||||
spawn_casing()
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user