extends KinematicBody class_name Player export(NodePath) var animationtree onready var _anim_tree = get_node(animationtree) export var max_speed = 10 export var gravity = -40 export var acceleration = 70 export var friction = 60 export var air_friction = 10 export var jump_impulse = 20 export var mouse_sensitivity = .1 export var controller_sensitivity = 3 export var rot_speed = 10 var velocity = Vector3.ZERO var snap_vector = Vector3.ZERO onready var spring_arm = $SpringArm onready var pivot = $Pivot func _ready(): Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) # Handles whether mouse is visible func _unhandled_input(event): if event.is_action_pressed("click"): Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) if event.is_action_pressed("toggle_mouse_captured"): if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) else: Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: rotate_y(deg2rad(-event.relative.x * mouse_sensitivity)) spring_arm.rotate_x(deg2rad(-event.relative.y * mouse_sensitivity)) spring_arm.rotation.x = clamp(spring_arm.rotation.x, deg2rad(-75), deg2rad(75)) func _physics_process(delta): var input_vector = get_input_vector() var direction = get_direction(input_vector) apply_movement(input_vector, direction, delta) apply_friction(direction, delta) apply_gravity(delta) update_snap_vector() jump() velocity = move_and_slide_with_snap(velocity, snap_vector, Vector3.UP, true) if is_on_floor(): if Input.is_action_pressed("move_foward") or Input.is_action_pressed("move_left") or Input.is_action_pressed("move_right") or Input.is_action_pressed("move_back"): _anim_tree["parameters/playback"].travel("Running") else: _anim_tree["parameters/playback"].travel("Idle") else: _anim_tree["parameters/playback"].travel("Running Jump") func get_input_vector(): var input_vector = Vector3.ZERO input_vector.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left") input_vector.z = Input.get_action_strength("move_back") - Input.get_action_strength("move_foward") return input_vector.normalized() if input_vector.length() > 1 else input_vector func get_direction(input_vector): var direction = (input_vector.x * transform.basis.x) + (input_vector.z * transform.basis.z) return direction func apply_movement(input_vector, direction, delta): if direction != Vector3.ZERO: velocity.x = velocity.move_toward(direction * max_speed, acceleration * delta).x velocity.z = velocity.move_toward(direction * max_speed, acceleration * delta).z #pivot.look_at(global_transform.origin + direction, Vector3.UP) pivot.rotation.y = lerp_angle(pivot.rotation.y, atan2(-input_vector.x, -input_vector.z), rot_speed * delta) func apply_friction(direction, delta): if direction == Vector3.ZERO: if is_on_floor(): velocity = velocity.move_toward(Vector3.ZERO, friction * delta) else: velocity.x = velocity.move_toward(direction * max_speed, air_friction * delta).x velocity.z = velocity.move_toward(direction * max_speed, air_friction * delta).z func apply_gravity(delta): velocity.y += gravity * delta velocity.y = clamp(velocity.y, gravity, jump_impulse) func update_snap_vector(): snap_vector = -get_floor_normal() if is_on_floor() else Vector3.DOWN func jump(): if Input.is_action_just_pressed("jump") and is_on_floor(): snap_vector = Vector3.ZERO velocity.y = jump_impulse if Input.is_action_just_released("jump") and velocity.y > jump_impulse / 2: velocity.y = jump_impulse / 2