Загрузка данных


extends CharacterBody3D

@export var SPEED: float = 12.0
@export var GRAVITY: float = 20.0

# Перетащи картинки спины и лица в Инспекторе
@export var texture_back: Texture2D
@export var texture_front: Texture2D

# Чувствительность мыши
@export var MOUSE_SENSITIVITY: float = 0.003

# Ограничение вертикального наклона (в радианах)
@export var MIN_PITCH: float = deg_to_rad(-60.0)
@export var MAX_PITCH: float = deg_to_rad(60.0)

@onready var sprite: Sprite3D = $Sprite3D
@onready var camera: Camera3D = $Camera3D

var is_rmb_pressed: bool = false

func _ready() -> void:
	Input.mouse_mode = Input.MOUSE_MODE_VISIBLE

func _input(event: InputEvent) -> void:
	# 1. Отслеживаем нажатие/отпускание ПКМ
	if event is InputEventMouseButton:
		if event.button_index == MOUSE_BUTTON_RIGHT:
			is_rmb_pressed = event.pressed
			if is_rmb_pressed:
				Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
			else:
				Input.mouse_mode = Input.MOUSE_MODE_VISIBLE

	# 2. Поворот камеры мышью ПРИ ЗАЖАТОЙ ПКМ
	if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
		if camera:
			# Вращаем камеру по горизонтали (вокруг игрока)
			camera.rotate_y(-event.relative.x * MOUSE_SENSITIVITY)
			# Вращаем камеру по вертикали
			camera.rotate_object_local(Vector3.RIGHT, -event.relative.y * MOUSE_SENSITIVITY)

func _physics_process(delta: float) -> void:
	# Гравитация
	if not is_on_floor():
		velocity.y -= GRAVITY * delta

	# Движение вперед / назад (W / S или Стрелки)
	var move_input: float = 0.0
	if Input.is_key_pressed(KEY_W) or Input.is_action_pressed("ui_up"):
		move_input -= 1.0
	if Input.is_key_pressed(KEY_S) or Input.is_action_pressed("ui_down"):
		move_input += 1.0

	var direction := (transform.basis * Vector3(0, 0, move_input)).normalized()

	if move_input != 0.0:
		velocity.x = direction.x * SPEED
		velocity.z = direction.z * SPEED
	else:
		velocity.x = move_toward(velocity.x, 0, SPEED)
		velocity.z = move_toward(velocity.z, 0, SPEED)

	move_and_slide()
	
	_update_sprite_texture()

func _update_sprite_texture() -> void:
	if not sprite or not camera:
		return

	# Направление от игрока к камере
	var cam_dir = (camera.global_position - global_position).normalized()
	# Направление "вперёд" самого игрока
	var player_forward = -global_transform.basis.z.normalized()

	# Переключаем текстуру (лицо / спина)
	if player_forward.dot(cam_dir) > 0.0:
		if texture_front:
			sprite.texture = texture_front
	else:
		if texture_back:
			sprite.texture = texture_back