Files
Scoom/scripts/player/Weapons.gd
2023-01-01 19:34:37 +01:00

143 lines
4.2 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")) as Node3D
var old_parent = weapon_model.get_parent()
old_parent.remove_child(weapon_model)
#Set Weapon nodes
root.add_child(weapon_model)
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