2026-07-21 00:27:17 +07:00
|
|
|
extends CanvasLayer
|
|
|
|
|
|
|
|
|
|
@onready var health_text = $HealthText
|
|
|
|
|
@onready var vignette = $Vignette
|
|
|
|
|
|
2026-08-02 17:30:18 +07:00
|
|
|
# Переменные для динамического поиска панели смерти
|
|
|
|
|
var death_panel: Control = null
|
|
|
|
|
var restart_button: Button = null
|
2026-07-21 00:27:17 +07:00
|
|
|
var health_component: Node = null
|
|
|
|
|
|
|
|
|
|
func _ready() -> void:
|
2026-08-02 17:30:18 +07:00
|
|
|
print("[ОТЛАДКА UI] Скрипт интерфейса здоровья УСПЕШНО ЗАПУЩЕН!")
|
|
|
|
|
|
|
|
|
|
# Глубокий поиск панели смерти по всей сцене, чтобы не зависеть от путей $Узел
|
|
|
|
|
death_panel = find_child("DeathPanel", true, false)
|
|
|
|
|
if death_panel:
|
|
|
|
|
print("[ОТЛАДКА UI] Панель DeathPanel найдена. Скрываю её со старта.")
|
|
|
|
|
death_panel.visible = false
|
|
|
|
|
|
|
|
|
|
# Ищем кнопку внутри панели
|
|
|
|
|
restart_button = death_panel.find_child("RestartButton", true, false)
|
|
|
|
|
if restart_button:
|
|
|
|
|
print("[ОТЛАДКА UI] Кнопка RestartButton найдена. Подключаю клик.")
|
|
|
|
|
restart_button.pressed.connect(_on_restart_button_pressed)
|
|
|
|
|
else:
|
|
|
|
|
print("[ОТЛАДКА UI] ОШИБКА: Кнопка с именем RestartButton НЕ найдена внутри DeathPanel!")
|
|
|
|
|
else:
|
|
|
|
|
print("[ОТЛАДКА UI] КРИТИЧЕСКАЯ ОШИБКА: Узел с именем DeathPanel вообще НЕ существует в этой сцене UI!")
|
|
|
|
|
|
|
|
|
|
# Ищем компонент здоровья у игрока
|
2026-07-21 00:27:17 +07:00
|
|
|
if get_parent():
|
|
|
|
|
health_component = get_parent().find_child("HealthComponent", true, false)
|
|
|
|
|
|
|
|
|
|
if health_component == null:
|
2026-08-02 17:30:18 +07:00
|
|
|
print("[ОТЛАДКА UI] ОШИБКА: HealthComponent игрока не найден!")
|
2026-07-21 00:27:17 +07:00
|
|
|
|
2026-08-02 17:30:18 +07:00
|
|
|
if health_text: health_text.visible = true
|
|
|
|
|
if vignette: vignette.visible = false
|
2026-07-21 00:27:17 +07:00
|
|
|
|
|
|
|
|
func _process(delta: float) -> void:
|
2026-08-02 17:30:18 +07:00
|
|
|
if health_component == null: return
|
2026-07-21 00:27:17 +07:00
|
|
|
|
|
|
|
|
var current_health = health_component.current_health
|
|
|
|
|
|
|
|
|
|
# 1. ОБНОВЛЯЕМ ЦИФРЫ НА ЭКРАНЕ
|
|
|
|
|
if health_text:
|
|
|
|
|
health_text.text = str(clamp(int(current_health), 0, 100))
|
|
|
|
|
if current_health <= 30:
|
|
|
|
|
health_text.add_theme_color_override("font_color", Color.RED)
|
|
|
|
|
else:
|
|
|
|
|
health_text.add_theme_color_override("font_color", Color.WHITE)
|
|
|
|
|
|
|
|
|
|
# 2. УПРАВЛЯЕМ КРАСНОЙ ВИНЬЕТКОЙ
|
|
|
|
|
if vignette:
|
|
|
|
|
if current_health <= 30 and current_health > 0:
|
|
|
|
|
vignette.visible = true
|
|
|
|
|
var color_rect = vignette.get_node_or_null("ColorRect")
|
|
|
|
|
if color_rect:
|
|
|
|
|
color_rect.visible = true
|
|
|
|
|
var pulse = (sin(Time.get_ticks_msec() * 0.005) + 1.0) / 2.0
|
|
|
|
|
color_rect.modulate.a = lerp(0.3, 1.0, pulse)
|
|
|
|
|
else:
|
|
|
|
|
vignette.visible = false
|
|
|
|
|
|
2026-08-02 17:30:18 +07:00
|
|
|
# 3. ПЕРЕХВАТ СМЕРТИ ИГРОКА
|
2026-07-21 00:27:17 +07:00
|
|
|
if current_health <= 0:
|
2026-08-02 17:30:18 +07:00
|
|
|
print("[ОТЛАДКА UI] ВНИМАНИЕ: Здоровье упало до 0! Включаю экран смерти...")
|
|
|
|
|
set_process(false) # Останавливаем цикл опроса
|
2026-07-21 00:27:17 +07:00
|
|
|
|
2026-08-02 17:30:18 +07:00
|
|
|
# Жестко включаем панель смерти
|
|
|
|
|
if death_panel:
|
|
|
|
|
death_panel.visible = true
|
|
|
|
|
print("[ОТЛАДКА UI] Свойство visible для DeathPanel переведено в TRUE.")
|
|
|
|
|
else:
|
|
|
|
|
print("[ОТЛАДКА UI] Сбой: Панель смерти равна null, включать нечего!")
|
|
|
|
|
|
|
|
|
|
# Включаем курсор мыши наэкранно
|
|
|
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
2026-07-21 00:27:17 +07:00
|
|
|
|
2026-08-02 17:30:18 +07:00
|
|
|
# Замораживаем стрельбу в WeaponManager ассета
|
|
|
|
|
var player_node = get_parent()
|
|
|
|
|
if player_node:
|
|
|
|
|
var wm = player_node.find_child("WeaponManager", true, false)
|
|
|
|
|
if wm and "canUseWeapon" in wm:
|
|
|
|
|
wm.canUseWeapon = false
|
|
|
|
|
|
|
|
|
|
func _on_restart_button_pressed() -> void:
|
|
|
|
|
print("[ОТЛАДКА UI] Игрок кликнул по кнопке рестарта! Перезагружаю уровень...")
|
|
|
|
|
var gt = get_node_or_null("/root/GameTransfer")
|
|
|
|
|
if gt and "saved_health" in gt:
|
|
|
|
|
gt.saved_health = 100.0
|
|
|
|
|
get_tree().reload_current_scene()
|