116 lines
3.7 KiB
GDScript
116 lines
3.7 KiB
GDScript
extends Node
|
|
class_name CameraComponent
|
|
|
|
|
|
@export var networking_path : NodePath
|
|
@onready var networking = get_node(networking_path)
|
|
#####################################
|
|
#Refrences
|
|
@export var character_movement_component : NodePath
|
|
@export var camera_path : NodePath
|
|
@export var spring_arm_path : NodePath
|
|
|
|
@onready var SpringArm = get_node(spring_arm_path)
|
|
@onready var Camera = get_node(camera_path)
|
|
@onready var PlayerRef = get_node(character_movement_component)
|
|
@onready var HObject = SpringArm
|
|
@onready var VObject = SpringArm
|
|
#####################################
|
|
var CameraHOffset := 0.0
|
|
@export var view_angle : Global.view_angle = Global.view_angle.right_shoulder:
|
|
get: return view_angle
|
|
set(Newview_angle):
|
|
# if view_mode == Global.view_mode.first_person:
|
|
# return
|
|
view_angle = Newview_angle
|
|
if Camera:
|
|
match Newview_angle:
|
|
Global.view_angle.right_shoulder:
|
|
CameraHOffset = 0.45
|
|
update_camera_offset()
|
|
Global.view_angle.left_shoulder:
|
|
CameraHOffset = -0.45
|
|
update_camera_offset()
|
|
Global.view_angle.head:
|
|
CameraHOffset = 0.0
|
|
update_camera_offset()
|
|
|
|
|
|
@export var view_mode : Global.view_mode = Global.view_mode.third_person :
|
|
get: return view_mode
|
|
set(Newview_mode):
|
|
view_mode = Newview_mode
|
|
if VObject:
|
|
VObject.rotation.x = 0.0
|
|
if SpringArm:
|
|
match view_mode:
|
|
Global.view_mode.first_person:
|
|
view_angle = Global.view_angle.head
|
|
PlayerRef.rotation_mode = Global.rotation_mode.looking_direction
|
|
SpringArm.spring_length = -0.4
|
|
VObject = Camera
|
|
Global.view_mode.third_person:
|
|
SpringArm.spring_length = 1.75
|
|
VObject = SpringArm
|
|
|
|
|
|
@export var mouse_sensitvity : float = 0.01
|
|
var camera_h : float = 0
|
|
var camera_v : float = 0
|
|
@export var camera_vertical_min = -90
|
|
@export var camera_vertical_max =90
|
|
var acceleration_h = 10
|
|
var acceleration_v = 10
|
|
|
|
func _ready():
|
|
#Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
|
Camera.current = networking.is_local_authority()
|
|
|
|
|
|
func _input(event):
|
|
if Common.is_menu_visible():
|
|
return
|
|
if event is InputEventMouseMotion:
|
|
if Input.is_action_pressed("INPUT_VIEW_CAMERA_MOVE_ONLY_MOUSE") or Input.is_action_pressed("INPUT_VIEW_CAMERA_MOVE_PLAYER_FOLLOW_MOUSE"):
|
|
camera_h += -event.relative.x * mouse_sensitvity
|
|
camera_v += -event.relative.y * mouse_sensitvity
|
|
# elif view_mode == Global.view_mode.first_person and event is InputEventKey:
|
|
# if Input.is_action_pressed("INPUT_ACTION_ROTATE_LEFT"):
|
|
# camera_h += +0.1
|
|
# elif Input.is_action_pressed("INPUT_ACTION_ROTATE_RIGHT"):
|
|
# camera_h += -0.1
|
|
|
|
|
|
func _physics_process(delta):
|
|
camera_v = clamp(camera_v,deg_to_rad(camera_vertical_min),deg_to_rad(camera_vertical_max))
|
|
HObject.rotation.y = lerp(HObject.rotation.y,camera_h,delta * acceleration_h)
|
|
VObject.rotation.x = lerp(VObject.rotation.x,camera_v,delta * acceleration_v)
|
|
if view_mode == Global.view_mode.first_person:
|
|
if Input.is_action_pressed("INPUT_ACTION_ROTATE_LEFT"):
|
|
camera_h += +0.05
|
|
elif Input.is_action_pressed("INPUT_ACTION_ROTATE_RIGHT"):
|
|
camera_h += -0.05
|
|
|
|
match PlayerRef.rotation_mode:
|
|
Global.rotation_mode.aiming:
|
|
if PlayerRef.gait == Global.gait.sprinting: # character can't sprint while aiming
|
|
PlayerRef.gait = Global.gait.running
|
|
smooth_fov(60.0)
|
|
Global.rotation_mode.velocity_direction:
|
|
smooth_fov(90.0)
|
|
Global.rotation_mode.looking_direction:
|
|
smooth_fov(90.0)
|
|
|
|
|
|
func update_camera_offset():
|
|
var tween := create_tween()
|
|
tween.tween_property(Camera,"h_offset",CameraHOffset,0.5).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_EXPO)
|
|
|
|
var changing_view := false
|
|
func smooth_fov(current_fov:float):
|
|
if changing_view:
|
|
return
|
|
changing_view=true
|
|
var tween := create_tween()
|
|
tween.tween_property(Camera,"fov",current_fov,0.1)
|
|
tween.tween_callback(func(): changing_view=false)
|