class_name MainCamera extends Camera3D @export var _height_offset: float = 0.5 @export var _distance: float = 50 @export var _angle_degrees: Vector3 = Vector3(-35, -45, 0) @export var _aim_offset_factor_mouse: float = 0.2 @export var _aim_offset_factor_controller: float = 0.5 @export var _aim_damping: float = 1 var _player_offsets: Dictionary[int, PlayerOffset] @onready var _listener := $AudioListener3D as AudioListener3D func _ready() -> void: Referencer.main_camera = self _listener.make_current() func _physics_process(delta: float) -> void: var follow_position: Vector3 = Vector3.ZERO for player in Referencer.players: follow_position += _follow(player, delta) follow_position /= Referencer.players_count follow_position += Vector3.UP * _height_offset global_rotation_degrees = _angle_degrees global_position = follow_position + transform.basis.z * _distance _listener.global_position = follow_position func _follow(player: Player, delta: float) -> Vector3: var id := player.get_instance_id() if not _player_offsets.has(id): _player_offsets[id] = PlayerOffset.new() var player_offset := _player_offsets[id] var player_position := player.global_position if player.is_on_floor(): player_offset.floor_height = player_position.y player_position.y = player_offset.floor_height + Projectile.HEIGHT if Referencer.players_count > 1: player_offset.aim_offset = Vector3.ZERO elif player.input_mode_is(Inputer.Mode.KB_MOUSE): player_offset.aim_offset = player.aiming.aim_offset elif player.input_mode_is(Inputer.Mode.CONTROLLER): var new_aim_offset := ( Vector3.ZERO if player.aiming.aim_input.length() == 0 else player.aiming.aim_offset ) player_offset.aim_offset = player_offset.aim_offset.lerp( new_aim_offset, _aim_damping * delta ) var follow_position := ( player_position + ( player_offset.aim_offset as Vector3 * ( _aim_offset_factor_mouse if player.input_mode_is(Inputer.Mode.KB_MOUSE) else _aim_offset_factor_controller ) ) ) Debugger.circle("follow_position" + str(player.name), follow_position) return follow_position class PlayerOffset: var floor_height: float = 0 var aim_offset: Vector3 = Vector3.ZERO