npc+enemy(первая половина) фикс диалогов g
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
[gd_scene format=3 uid="uid://c0txsmf1ffuqg"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bv488f4v7ly6a" path="res://addons/NPC/script/dialog_npct.gd" id="1_7gkvn"]
|
||||
[ext_resource type="PackedScene" uid="uid://bdwjy2jvga343" path="res://addons/custmode/Models/Male/Character_20_Police.fbx" id="2_7gkvn"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_se2kl"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_diulm"]
|
||||
size = Vector3(1.6360468, 1.3225784, 2.9930296)
|
||||
|
||||
[node name="npc" type="StaticBody3D" unique_id=2094693982]
|
||||
collision_layer = 64
|
||||
collision_mask = 121
|
||||
script = ExtResource("1_7gkvn")
|
||||
|
||||
[node name="Hitbox" type="CollisionShape3D" parent="." unique_id=1852865682]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.017934263, 0.009854734, 0.019842744)
|
||||
shape = SubResource("CapsuleShape3D_se2kl")
|
||||
debug_color = Color(0.52798665, 0.57221377, 5.7756904e-07, 0.41960785)
|
||||
|
||||
[node name="DetectArea" type="Area3D" parent="." unique_id=798798411]
|
||||
transform = Transform3D(1.15835, 0, 0, 0, 1.5085664, 0, 0, 0, 3.406684, 0.4316032, 0.013125002, 0.15177906)
|
||||
collision_layer = 64
|
||||
collision_mask = 2
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="DetectArea" unique_id=1961649541]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.2729469, 0.09678304, 0.4440172)
|
||||
shape = SubResource("BoxShape3D_diulm")
|
||||
|
||||
[node name="Character_20_Police" parent="." unique_id=963124408 instance=ExtResource("2_7gkvn")]
|
||||
transform = Transform3D(0.455, 0, 0, 0, 0.455, 0, 0, 0, 0.455, 0, -0.895, 0)
|
||||
|
||||
[connection signal="area_entered" from="DetectArea" to="." method="_on_detect_area_area_entered"]
|
||||
@@ -0,0 +1,6 @@
|
||||
[
|
||||
{"name": "Иван", "text": "Аристотель давно не виделись"},
|
||||
{"name": "Аристотель", "text": "Используй “DASH“ чтобы пересечь трубу"},
|
||||
{"name": "Иван", "text": "Благодарие прими, но ты бы хоть поздоровался"}
|
||||
|
||||
]
|
||||
@@ -0,0 +1,26 @@
|
||||
[
|
||||
{
|
||||
"name": "Иван",
|
||||
"text": "Здравствуйте, мне бы цыбару"
|
||||
},
|
||||
{
|
||||
"name": "Бабка",
|
||||
"text": "Опять эти бомжи ходют тут и ходют, с тебя 43 рубля бомжара"
|
||||
},
|
||||
{
|
||||
"name": "Иван",
|
||||
"text": "а чего сразу бомжара? Я сейчас вызову клан Маклаудов, они быстро пояснят за жизнь так сказать"
|
||||
},
|
||||
{
|
||||
"name": "Бабка",
|
||||
"text": " Деньги плати(наставляет обрез)"
|
||||
},
|
||||
{
|
||||
"name": "Иван",
|
||||
"text": "да на тебе деньги"
|
||||
},
|
||||
{
|
||||
"name": "Бабка",
|
||||
"text": "вот и иди по добру здоровому"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,17 @@
|
||||
[
|
||||
{"name": "Иван", "text": "Приветствую уважаемый!"},
|
||||
{"name": "Охранник", "text": "Держи дистанцию, ты можешь быть переодетым драконом или засланным уродом газспора"},
|
||||
{"name": "Иван", "text": "Я хочу просто узнать пару моментов"},
|
||||
{"name": "Охранник", "text": "Если ты меня обманешь, получишь пулю в лоб"},
|
||||
{"name": "Иван", "text": "Да ты улыбнись и жизнь станет ярче, я ветеран первой драконовой войны(показывает документы)"},
|
||||
{"name": "Охранник", "text": "Ты ветеран? Это меняет дело, вы воевали за благое дело, я отвечу на твои вопросы"},
|
||||
{"name": "Иван", "text": "Как я тут оказался? Кто меня выкинул с поезда?"},
|
||||
{"name": "Охранник", "text": "Я не видел, знаю только что это был человек в военной форме"},
|
||||
{"name": "Иван", "text": "Урод ограбил меня, где тут ближайший магазин?"},
|
||||
{"name": "Охранник", "text": "Пройдёшь вперёд и впереди будет ларёк, там обычно есть всё для первой необходимости сигары, водка и шмаль"},
|
||||
{"name": "Иван", "text": "Отлично теперь надо как-то достать деньги…"},
|
||||
{"name": "Охранник", "text": "Держи пистолет с одной обоймой, как раз поможешь убрать местных цыган, которые терроризируют город"},
|
||||
{"name": "Иван", "text": "Вот это хорошая штука, пойду тогда разберусь с этими любителями золотить ручку"},
|
||||
{"name": "Охранник", "text": "Удачи, если захочешь узнать что случилось с Белово после войны я могу вкратце ответить"}
|
||||
|
||||
]
|
||||
File diff suppressed because one or more lines are too long
@@ -828,6 +828,7 @@ shape = SubResource("BoxShape3D_diulm")
|
||||
[node name="rig" type="Node3D" parent="." unique_id=331009377]
|
||||
|
||||
[node name="GeneralSkeleton" type="Skeleton3D" parent="rig" unique_id=45011411]
|
||||
transform = Transform3D(1.49, 0, 0, 0, 1.49, 0, 0, 0, 1.49, 0, 0, 0)
|
||||
motion_scale = 1.2929
|
||||
bones/0/name = "MCH-foot_ik.parent.L"
|
||||
bones/0/parent = -1
|
||||
|
||||
@@ -143,7 +143,7 @@ shape = SubResource("BoxShape3D_diulm")
|
||||
|
||||
[node name="GeneralSkeleton" type="Skeleton3D" parent="." unique_id=276953981]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(0.37, 0, 0, 0, 0.37, 0, 0, 0, 0.37, 0, -0.785, 0)
|
||||
transform = Transform3D(0.49, 0, 0, 0, 0.49, 0, 0, 0, 0.49, 0, -0.785, 0)
|
||||
motion_scale = 2.426675
|
||||
bones/0/name = "Hips"
|
||||
bones/0/parent = -1
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
extends StaticBody3D
|
||||
|
||||
# --- ОПЦИЯ 1: БЫСТРЫЙ ДИАЛОГ НАПРЯМУЮ В ИНСПЕКТОРЕ NPC ---
|
||||
@export var dialogue_data: Array[Dictionary] = [
|
||||
{"name": "Сталкер", "text": "Привет! Наконец-то ты подошел."},
|
||||
{"name": "Игрок", "text": "Привет. Что за проблемы со скриптами?"},
|
||||
{"name": "Сталкер", "text": "Да вот, теперь и подсказки работают как надо!"}
|
||||
{"name": "Сталкер", "text": "Привет! Наконец-то ты подошел."}
|
||||
]
|
||||
|
||||
# Укажи здесь точный путь к .tscn файлу твоей сцены диалога
|
||||
# --- ОПЦИЯ 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
|
||||
@@ -14,17 +16,34 @@ 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
|
||||
|
||||
@@ -36,14 +55,12 @@ func _process(_delta: float) -> void:
|
||||
found_player_this_frame = true
|
||||
break
|
||||
|
||||
# Игрок ЗАШЕЛ в зону NPC
|
||||
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()
|
||||
|
||||
# Игрок ВЫШЕЛ из зоны NPC
|
||||
elif not found_player_this_frame and is_player_inside:
|
||||
is_player_inside = false
|
||||
is_dialogue_active = false
|
||||
@@ -51,11 +68,11 @@ func _process(_delta: float) -> void:
|
||||
if ui_instance.has_method("hide_prompt"): ui_instance.hide_prompt()
|
||||
if ui_instance.has_method("end_dialogue"): ui_instance.end_dialogue()
|
||||
|
||||
# Старт диалога по кнопке E
|
||||
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(dialogue_data)
|
||||
# ПЕРЕДАЕМ НАШ СФОРМИРОВАННЫЙ ТЕКСТ
|
||||
ui_instance.start_dialogue(final_dialogue_lines)
|
||||
|
||||
Reference in New Issue
Block a user