130 lines
3.7 KiB
GDScript
130 lines
3.7 KiB
GDScript
extends CharacterBody3D
|
|
|
|
@export var speed = 100.0
|
|
@export var fall_acceleration = 75.0
|
|
@export var vertical_sensivity = 0.005
|
|
@export var horizontal_sensivity = 0.005
|
|
|
|
var queue: CommandQueue = CommandQueue.new()
|
|
|
|
@onready var camera: Camera3D = $"Camera"
|
|
@onready var weapon_player: AnimationPlayer = $"HUD/Weapon/AnimationPlayer"
|
|
@onready var weapons: Node3D = $"WeaponContainer"
|
|
|
|
var current_weapon: Weapon
|
|
|
|
func _ready() -> void:
|
|
queue.command_pushed.connect(on_queue_command_pushed)
|
|
queue.command_popped.connect(on_queue_command_popped)
|
|
|
|
current_weapon = weapons.get_child(0) as Weapon
|
|
|
|
weapon_player.add_animation_library("current", current_weapon.animation_library)
|
|
weapon_player.play("current/static")
|
|
|
|
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
|
|
|
func _process(_delta: float) -> void:
|
|
if Input.is_action_pressed("shoot") \
|
|
and queue.current_command(CommandQueue.Side.RIGHT) \
|
|
== CommandQueue.DEFAULT_COMMAND:
|
|
queue.push([
|
|
CommandQueue.Command.NONE,
|
|
CommandQueue.Command.SHOOT
|
|
], [
|
|
CommandQueue.Side.LEFT,
|
|
CommandQueue.Side.RIGHT
|
|
])
|
|
|
|
for side in CommandQueue.Side.values():
|
|
var command = queue.current_command(side)
|
|
match side:
|
|
CommandQueue.Side.LEFT:
|
|
handle_current_left_command(command)
|
|
CommandQueue.Side.RIGHT:
|
|
handle_current_right_command(command)
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
var direction = Vector3.ZERO
|
|
direction.z = Input.get_axis("move_forward", "move_backward")
|
|
direction.x = Input.get_axis("move_left", "move_right")
|
|
var target_velocity = (transform.basis * direction).normalized() * speed * delta
|
|
|
|
if not is_on_floor():
|
|
target_velocity.y -= fall_acceleration * delta
|
|
|
|
velocity = target_velocity
|
|
move_and_slide()
|
|
|
|
func _input(event):
|
|
if event is InputEventMouseMotion:
|
|
var new_rotation = clamp(
|
|
camera.rotation.x - event.relative.y * vertical_sensivity,
|
|
-PI/2,
|
|
PI/2
|
|
)
|
|
camera.rotation.x = new_rotation
|
|
rotation.y -= event.relative.x * horizontal_sensivity
|
|
|
|
func on_queue_command_pushed(sides, commands):
|
|
for i in sides.size():
|
|
match sides[i]:
|
|
CommandQueue.Side.LEFT:
|
|
handle_new_left_command(commands[i])
|
|
CommandQueue.Side.RIGHT:
|
|
handle_new_right_command(commands[i])
|
|
|
|
func shoot_animation_ended():
|
|
queue.pop()
|
|
|
|
func on_queue_command_popped(commands):
|
|
for i in CommandQueue.Side.size():
|
|
match CommandQueue.Side.values()[i]:
|
|
CommandQueue.Side.LEFT:
|
|
handle_ended_left_command(commands[i])
|
|
CommandQueue.Side.RIGHT:
|
|
handle_ended_right_command(commands[i])
|
|
|
|
func handle_new_left_command(command: CommandQueue.Command):
|
|
match command:
|
|
CommandQueue.Command.NONE:
|
|
pass
|
|
_:
|
|
print('New command %s is not implemented for left hand.' % command)
|
|
|
|
func handle_new_right_command(command: CommandQueue.Command):
|
|
match command:
|
|
CommandQueue.Command.NONE | CommandQueue.Command.SHOOT:
|
|
pass
|
|
_:
|
|
print('New command %s is not implemented for right hand.' % command)
|
|
|
|
func handle_ended_left_command(command: CommandQueue.Command):
|
|
match command:
|
|
CommandQueue.Command.NONE:
|
|
pass
|
|
_:
|
|
print('Ended command %s is not implemented for left hand.' % command)
|
|
|
|
func handle_ended_right_command(command: CommandQueue.Command):
|
|
match command:
|
|
CommandQueue.Command.NONE:
|
|
pass
|
|
CommandQueue.Command.SHOOT:
|
|
weapon_player.play('current/static')
|
|
_:
|
|
print('Ended command %s is not implemented for right hand.' % command)
|
|
|
|
func handle_current_left_command(command: CommandQueue.Command):
|
|
match command:
|
|
CommandQueue.Command.NONE:
|
|
pass
|
|
_:
|
|
print('Current command %s is not implemented for left hand.' % command)
|
|
|
|
func handle_current_right_command(command: CommandQueue.Command):
|
|
match command:
|
|
CommandQueue.Command.NONE:
|
|
pass
|
|
_:
|
|
print('Current command %s is not implemented for right hand.' % command)
|