extends StaticBody3D # --- ОПЦИЯ 1: БЫСТРЫЙ ДИАЛОГ НАПРЯМУЮ В ИНСПЕКТОРЕ NPC --- @export var dialogue_data: Array[Dictionary] = [ {"name": "Сталкер", "text": "Привет! Наконец-то ты подошел."} ] # --- ОПЦИЯ 2: ВНЕШНИЙ ФАЙЛ ДЛЯ БОЛЬШИХ ДIАЛОГОВ --- # Сюда можно будет перетащить файл .json из папки проекта! @export var dialogue_file: JSON const DIALOGUE_UI_FILE = preload("res://addons/dialoge/dialogue_ui.tscn") var is_player_inside: bool = false var is_dialogue_active: bool = false var ui_instance: Node = null var detect_area: Area3D = null # Финальный массив фраз, который мы передадим в UI на основе проверки var final_dialogue_lines: Array = [] func _ready() -> void: detect_area = get_node_or_null("DetectArea") if detect_area == null: detect_area = find_child("DetectArea", true, false) if detect_area: print("[NPC] Зона DetectArea найдена. Универсальный скрипт запущен.") # Готовим текст перед стартом _prepare_dialogue_data() if ui_instance == null: ui_instance = DIALOGUE_UI_FILE.instantiate() get_tree().get_root().add_child.call_deferred(ui_instance) if "layer" in ui_instance: ui_instance.layer = 135 func _prepare_dialogue_data() -> void: # Проверяем, закинул ли ты внешний JSON-файл в инспектор этого конкретного NPC if dialogue_file != null and dialogue_file.data is Array: final_dialogue_lines = dialogue_file.data print("[NPC] Успешно загружен диалог из внешнего JSON файла для: ", name) else: # Если файла нет, используем ручные строчки из инспектора final_dialogue_lines = dialogue_data print("[NPC] Использую ручной массив диалога из инспектора для: ", name) func _process(_delta: float) -> void: if detect_area == null: return var overlapping_bodies = detect_area.get_overlapping_bodies() var found_player_this_frame = false for body in overlapping_bodies: if "Player" in body.name or "Character" in body.name or body.find_child("WeaponManager", true, false) != null: found_player_this_frame = true break if found_player_this_frame and not is_player_inside: is_player_inside = true if ui_instance and not is_dialogue_active: if ui_instance.has_method("show_prompt"): ui_instance.show_prompt() elif not found_player_this_frame and is_player_inside: is_player_inside = false is_dialogue_active = false if ui_instance: if ui_instance.has_method("hide_prompt"): ui_instance.hide_prompt() if ui_instance.has_method("end_dialogue"): ui_instance.end_dialogue() if is_player_inside and not is_dialogue_active: if Input.is_key_pressed(KEY_E) or Input.is_action_just_pressed("interact"): is_dialogue_active = true if ui_instance: if ui_instance.has_method("hide_prompt"): ui_instance.hide_prompt() if ui_instance.has_method("start_dialogue"): # ПЕРЕДАЕМ НАШ СФОРМИРОВАННЫЙ ТЕКСТ ui_instance.start_dialogue(final_dialogue_lines)