extends Spatial class_name TPSController export var character_scene: PackedScene var character: Character var is_in_menu: bool = false onready var cam = $Head/Camera onready var default_camera_trans = cam.transform export var FOV = 80.0 export var HUD_scene: PackedScene onready var HUD: Control onready var debug_label = $DebugText var mouse_axis: Vector2 = Vector2.ZERO export var mouse_sensitivity = 10.0 onready var head = $Head func _ready(): cam.fov = FOV if not Engine.editor_hint: Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) HUD = HUD_scene.instance() add_child(HUD) character = character_scene.instance() add_child(character) func get_target() -> Dictionary: var weapon = character.current_weapon var ray_from = cam.global_transform.origin var ray_to = cam.global_transform.basis.z * -20000 var space_state = get_world().direct_space_state var result = space_state.intersect_ray(ray_from, ray_to, [self, weapon]) if not result: return Globals.create_empty_collision_dictionnary(ray_to) else: return result func _physics_process(delta): if Engine.editor_hint: return debug_label.text = "FPS: " + str(Engine.get_frames_per_second()) + " | Objects: " + str(Performance.get_monitor(Performance.OBJECT_COUNT)) # calculate and export target var target = get_target() Globals.target_position = target # cursor change if target["collider"] and target["collider"] is Entity: HUD.get_node("cursor_no_enemy").visible = false HUD.get_node("cursor_enemy").visible = true else: HUD.get_node("cursor_enemy").visible = false HUD.get_node("cursor_no_enemy").visible = true # update camera if character.sprinting: cam.set_fov(lerp(cam.fov, FOV * 1.2, delta * 8)) else: cam.set_fov(lerp(cam.fov, FOV, delta * 8)) head.global_transform.origin = character.global_transform.origin # cam.rotation = character.rotation #head.transform.basis.y = character.global_transform.basis.y #head.transform.basis.z = character.global_transform.basis.z # TPSController.head.global_transform = global_transform func camera_rotation() -> void: if mouse_axis.length() > 0: var _smoothness := 80 # Get mouse delta var horizontal: float = -(mouse_axis.x * mouse_sensitivity) / _smoothness var vertical: float = -(mouse_axis.y * mouse_sensitivity) / _smoothness mouse_axis = Vector2.ZERO character.rotate_y(deg2rad(horizontal)) head.rotation_degrees = head.rotation_degrees + Vector3(vertical, horizontal, 0) #head.rotate_y(deg2rad(horizontal)) #head.rotate_x(deg2rad(vertical)) # Clamp mouse rotation var temp_rot: Vector3 = head.rotation_degrees temp_rot.x = clamp(temp_rot.x, -75, 75) head.rotation_degrees = temp_rot func _input(event: InputEvent) -> void: if Engine.editor_hint: return if not Globals.process_3d_inputs: return if event is InputEventMouseMotion: mouse_axis = event.relative if Input.is_action_pressed("camera_front"): var camera_front_transform = default_camera_trans camera_front_transform = default_camera_trans.translated(Vector3(5, 0, -5)) camera_front_transform = camera_front_transform.rotated(Vector3.UP, deg2rad(-180)) cam.transform = camera_front_transform else: cam.transform = default_camera_trans if Input.is_action_just_pressed("inp_fire"): character.fire_pressed() if Input.is_action_just_released("inp_fire"): character.fire_released() if Input.is_action_just_pressed("weapon_forward"): character.switch_next_weapon_slot() if Globals.process_3d_inputs and Input.is_action_just_pressed("ui_cancel"): var ingame_menu = preload("res://ui/menus/ingame_menu.tscn").instance() Input.set_mouse_mode(Input.MOUSE_MODE_CONFINED) add_child(ingame_menu) ingame_menu.connect("tree_exited", self, "_ingamemenu_closed") Globals.process_3d_inputs = false func _process(_delta: float) -> void: if Engine.editor_hint: return if Globals.process_3d_inputs: camera_rotation() update_hud() func update_hud() -> void: for weapon in character.weapons: var weapon_slot = character.get_weapon_slot(weapon) var hud_weapon_slot = HUD.find_node("Weapon%s" % weapon_slot) var weapon_icon: Control = weapon.ui_icon if not weapon_icon.get_parent() == hud_weapon_slot: hud_weapon_slot.add_child(weapon_icon)