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" # Called when the node enters the scene tree for the first time. func _ready() -> void: queue.command_pushed.connect(on_queue_command_pushed) queue.command_popped.connect(on_queue_command_popped) weapon_player.current_animation = "static" Input.mouse_mode = Input.MOUSE_MODE_CAPTURED func _process(_delta: float) -> void: # TODO: use proper weapon system, this is just for testing command queue 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 ]) # Called every frame. 'delta' is the elapsed time since the previous frame. 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 handle_new_left_command(command: CommandQueue.Command): match command: CommandQueue.Command.NONE: pass _: print('New command %s is not implemented for left hand.' % str(command)) func handle_new_right_command(command: CommandQueue.Command): match command: CommandQueue.Command.NONE: pass CommandQueue.Command.SHOOT: weapon_player.play('shoot') _: print('New command %s is not implemented for right hand.' % str(command)) 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_ended_left_command(command: CommandQueue.Command): match command: CommandQueue.Command.NONE: pass _: print('Ended command %s is not implemented for left hand.' % str(command)) func handle_ended_right_command(command: CommandQueue.Command): match command: CommandQueue.Command.NONE: pass CommandQueue.Command.SHOOT: weapon_player.play('static') _: print('Ended command %s is not implemented for right hand.' % str(command))