extends ClippedCamera var _modes: PoolStringArray = ["STATIC", "FIRSTPERSON", "THIRDPERSON", "ARM", "FREECAM"] var mode: String = "STATIC" #STATIC, FIRSTPERSON, THIRDPERSON, ARM, FREECAM #first/third person variables var head: Spatial = null var neck: Spatial = null var player: RigidBody = null #third person/arm variables var arm: SpringArm = null var mouse_axis: Vector2 var mouse_sensitivity: float = 12.0 var shake_amount:float = 0.0 const shake_limit:float = 0.2 onready var shake_timer:Timer = Timer.new() onready var shake_tween: Tween = Tween.new() func _ready(): add_child(shake_timer) add_child(shake_tween) Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) shake_timer.connect("timeout", self, "_on_shake_timer_timeout") current = true func _process(_delta): if mode == "STATIC": transform.origin = Vector3(rand_range(-shake_amount, shake_amount), rand_range(-shake_amount, shake_amount), rand_range(-shake_amount, shake_amount)) if mode == "FIRSTPERSON": head.transform.origin = Vector3(rand_range(-shake_amount, shake_amount), rand_range(-shake_amount, shake_amount), rand_range(-shake_amount, shake_amount)) func shake(new_shake, shake_time=0.4): shake_amount += new_shake if shake_amount > shake_limit: shake_amount = shake_limit shake_tween.stop_all() set_process(true) shake_timer.start(shake_time) func _on_shake_timer_timeout(): shake_amount = 0 set_process(false) shake_tween.interpolate_property(head, "translation", head.transform.origin, Vector3.ZERO, 0.1, Tween.TRANS_QUAD, Tween.EASE_IN_OUT) shake_tween.start() func _input(event: InputEvent): if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: mouse_axis = event.relative match mode: "FIRSTPERSON": mouse_firstperson() "THIRDPERSON": mouse_thirdperson() "STATIC": pass "ARM": mouse_arm() "FREECAM": mouse_freecam() _: pass func attach(new_parent: Node, c_mode: String, extra_path: String = "."): if get_parent(): get_parent().remove_child(self) if c_mode in _modes: mode = c_mode if mode == "FIRSTPERSON": head = new_parent.head; neck = new_parent.neck; arm = null; elif mode == "THIRDPERSON": head = new_parent.head; neck = new_parent.neck; arm = new_parent.arm elif mode == "ARM": head = null; neck = null; arm = new_parent.arm else: head = null; neck = null; arm = null; new_parent.get_node(extra_path).add_child(self) transform = Transform.IDENTITY func mouse_firstperson() -> void: if mouse_axis.length_squared() > 0: var horizontal: float = -mouse_axis.x * (mouse_sensitivity / 100) var vertical: float = -mouse_axis.y * (mouse_sensitivity / 100) neck.rotate_y(deg2rad(horizontal)) head.rotate_x(deg2rad(vertical)) #vertical clamp head.rotation_degrees.x = clamp(head.rotation_degrees.x, -90, 90) func mouse_thirdperson() -> void: arm.rotation_degrees.x = clamp(rotation_degrees.x-mouse_axis.y*(mouse_sensitivity / 100),-90,90) arm.rotation_degrees.y -= mouse_axis.x*(mouse_sensitivity / 100) head.rotation_degrees.x = arm.rotation_degrees.x neck.rotation_degrees.y = arm.rotation_degrees.y func mouse_arm() -> void: arm.rotation_degrees.x = clamp(rotation_degrees.x-mouse_axis.y*(mouse_sensitivity / 100),-70,70) arm.rotation_degrees.y -= mouse_axis.x*(mouse_sensitivity / 100) func mouse_freecam() -> void: pass