139 lines
4.0 KiB
GDScript
139 lines
4.0 KiB
GDScript
extends Node3D
|
|
|
|
const CONFIG_PATH = "weapons.cfg"
|
|
const REVOLVER = 0
|
|
const UZI = 1
|
|
const CHAINSAW = 2
|
|
|
|
var state = 0
|
|
@onready var player_root = get_node("../../../../PlayerQ3") as CharacterBody3D
|
|
@onready var raycast = get_node("../Camera3D/AimCast") as RayCast3D
|
|
#@onready var crosshair = $Crosshair
|
|
|
|
|
|
var weapons = []
|
|
var current_weapon = 0
|
|
|
|
var mouse_mov : Vector3
|
|
var sway_lerp = 5
|
|
|
|
func _ready():
|
|
var config = load_data() as ConfigFile
|
|
Init_Config(config)
|
|
|
|
weapons[current_weapon].init()
|
|
raycast.target_position.z = -weapons[current_weapon].RAY_LEN
|
|
|
|
func load_data():
|
|
var path = Runtimeloader.PATH
|
|
|
|
var config = ConfigFile.new()
|
|
var err = config.load(path + CONFIG_PATH)
|
|
|
|
if err != OK:
|
|
printerr("FAILED LOADING WEAPONS DATA @ ",path + CONFIG_PATH)
|
|
|
|
return config
|
|
|
|
func Init_Config(config):
|
|
for weapon in config.get_sections():
|
|
var root = Weapon.new()
|
|
root.name = weapon
|
|
var weapon_model = Runtimeloader.load_gltf(config.get_value(weapon, "MODEL"), root) as Node3D
|
|
|
|
root.position = config.get_value(weapon, "HAND_POS")
|
|
root.rotation = config.get_value(weapon, "HAND_ROT")
|
|
root.hide()
|
|
add_child(root)
|
|
|
|
#Set Weapon Data
|
|
root.MELEE = config.get_value(weapon, "MELEE")
|
|
root.MAX_CLIP = config.get_value(weapon, "MAX_CLIP")
|
|
root.clip = root.MAX_CLIP
|
|
root.DAMAGE = config.get_value(weapon, "DAMAGE")
|
|
root.RPM = config.get_value(weapon, "RPM")
|
|
root.FIREMODE = config.get_value(weapon, "FIREMODE")
|
|
root.HITSCAN = config.get_value(weapon, "HITSCAN")
|
|
if(not root.HITSCAN):
|
|
print("Projectile stats")
|
|
else:
|
|
root.RAY_LEN = config.get_value(weapon, "RAY_LEN")
|
|
|
|
#Set Anim Data
|
|
root.MODEL = weapon_model
|
|
root.DRAW_POS = config.get_value(weapon, "DRAW_POS")
|
|
root.DRAW_ROT = config.get_value(weapon, "DRAW_ROT")
|
|
root.MOMENTUM = config.get_value(weapon, "MOMENTUM")
|
|
root.ANGULAR_MOMENTUM = config.get_value(weapon, "ANGULAR_MOMENTUM")
|
|
root.RECOIL_COOLDOWN = config.get_value(weapon, "RECOIL_COOLDOWN")
|
|
root.RELOAD_MOMENTUM = config.get_value(weapon, "RELOAD_MOMENTUM")
|
|
root.RELOAD_ANGULAR_MOMENTUM = config.get_value(weapon, "RELOAD_ANGULAR_MOMENTUM")
|
|
root.RELOAD_TIME = config.get_value(weapon, "RELOAD_TIME")
|
|
|
|
weapons.append(root)
|
|
|
|
func _input(event):
|
|
if event is InputEventMouseMotion:
|
|
mouse_mov.y = clampf(-event.relative.x, -0.1, 0.1)
|
|
mouse_mov.x = clampf(event.relative.y, -0.1, 0.1)
|
|
|
|
|
|
|
|
func _unhandled_input(_event):
|
|
if weapons.size() > 1 && Input.is_action_just_released("wheel_up"):
|
|
ChangeWeapon((current_weapon + 1) % weapons.size())
|
|
if weapons.size() > 1 && Input.is_action_just_released("wheel_down"):
|
|
ChangeWeapon((current_weapon - 1) % weapons.size())
|
|
|
|
|
|
if Input.is_action_just_pressed("reload"):
|
|
weapons[current_weapon].Reload()
|
|
|
|
func ChangeWeapon(i):
|
|
weapons[current_weapon].hide()
|
|
current_weapon = i
|
|
weapons[current_weapon].init()
|
|
raycast.target_position.z = -weapons[current_weapon].RAY_LEN
|
|
|
|
var time = 0
|
|
func _process(delta):
|
|
if Input.is_action_pressed("shoot") && weapons[current_weapon].Shoot():
|
|
if(weapons[current_weapon].HITSCAN):
|
|
HitScan()
|
|
else:
|
|
Projectile()
|
|
|
|
if Input.is_action_just_released("shoot"):
|
|
weapons[current_weapon].Release()
|
|
|
|
|
|
#SWAY
|
|
if mouse_mov != null && mouse_mov.length() > 0:
|
|
weapons[current_weapon].MODEL.rotation = weapons[current_weapon].MODEL.rotation.lerp(mouse_mov, sway_lerp * delta)
|
|
mouse_mov = Vector3.ZERO
|
|
else:
|
|
weapons[current_weapon].MODEL.rotation = weapons[current_weapon].MODEL.rotation.lerp(Vector3.ZERO, sway_lerp * delta)
|
|
|
|
#BOB
|
|
if player_root.velocity.length() > 0:
|
|
time += delta
|
|
var bobOscillate = sin(time * 4 * (2 * PI)) * 0.01
|
|
position.y = bobOscillate
|
|
bobOscillate = sin(time * 4 * (PI) + PI/4) * 0.015
|
|
position.x = bobOscillate
|
|
|
|
|
|
func HitScan():
|
|
if(raycast.is_colliding()):
|
|
var target = raycast.get_collider()
|
|
print_debug("Hit target ", target.name, " with ", weapons[current_weapon].MODEL.name, " ",current_weapon, ". Dealt damage ", weapons[current_weapon].DAMAGE)
|
|
if(raycast.get_collision_mask_value(10)):
|
|
if(target is Hitable):
|
|
target.Hit(weapons[current_weapon].DAMAGE)
|
|
|
|
|
|
func Projectile():
|
|
pass
|
|
|
|
|