56 lines
1.4 KiB
GDScript
56 lines
1.4 KiB
GDScript
class_name Player extends CharacterBody3D
|
|
|
|
@export var walk_speed: float = 4.0
|
|
@export var run_speed: float = 6.0
|
|
|
|
@onready var input = $Input
|
|
@onready var interactor = $Interactor
|
|
|
|
var is_running: bool:
|
|
get: return velocity and input.is_running
|
|
|
|
var is_carrying_item = true
|
|
var is_weapon_ready: bool:
|
|
get: return is_carrying_item and input.is_weapon_ready
|
|
|
|
func _ready() -> void:
|
|
input.connect('interact', _on_interact)
|
|
input.connect('fire', _on_fire)
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if is_weapon_ready:
|
|
rotate_toward_look(delta)
|
|
else:
|
|
move_and_rotate(delta)
|
|
|
|
func move_and_rotate(_delta: float):
|
|
var speed = run_speed if input.is_running else walk_speed
|
|
velocity = input.next_velocity(speed)
|
|
if !velocity.is_zero_approx():
|
|
look_at(global_position + velocity, Vector3.UP, true)
|
|
move_and_slide()
|
|
|
|
func rotate_toward_look(_delta: float):
|
|
velocity = Vector3.ZERO
|
|
var target = input.get_look_target(global_position)
|
|
if target.is_some():
|
|
look_at(target.unwrap(), Vector3.UP, true)
|
|
|
|
func _on_interact():
|
|
interactor.interact_nearest()
|
|
func _on_fire():
|
|
if is_weapon_ready:
|
|
print('firing weapon')
|
|
|
|
func on_save():
|
|
return {
|
|
position = position,
|
|
rotation = rotation
|
|
}
|
|
|
|
func on_before_load():
|
|
pass
|
|
|
|
func on_load(data: Dictionary):
|
|
position = data.position
|
|
rotation = data.rotation
|