SoC. Однотипные квесты для нового NPC
Материал из S.T.A.L.K.E.R. Inside Wiki
В этой статье описано, как сделать однотипные квесты для нового NPC.
Содержание
Подготовка
Нам понадобятся эти файлы:
- all.spawn (spawns)
- npc_profile.xml (config\gameplay)
- spawn_sections.ltx (config\creatures)
- game_story_ids.ltx (config)
- task_manager.script (scripts)
- dialogs.xml (config\gameplay)
- game_tasks_by_vendor.xml (config\gameplay)
- stable_task_manager.xml (config\text\rus)
Создание NPC-работодателя
Работа с all.spawn
Распаковываем all.spawn с помощю ACDC.
Находим, например файл alife_l01_escape.ltx и вставляем в конец это:
[18240] ;это уникальный номер. Не должен повторятся ; cse_abstract properties section_name = stalker ;секция того, что спавним name = esc_kvestodatel ;имя может быть любое position = -212.877227783203,-23.1829051971436,-122.68586730957 ;позиция direction = 0.0285909995436668,0,-0.999590992927551 ;разворот ; cse_alife_trader_abstract properties money = 6000 ;количество денег, с которым создастся этот NPC (файл профиля NPC перекроет это значение) character_profile = kvestodatel ;профиль NPC ; cse_alife_object properties game_vertex_id = 59 ;гейм вертекс можно узнать через скрипт distance = 0 ;дистанция вокруг позиции, в которой спавним (если 0, то заспавнится точно в позиции, которую мы указали) level_vertex_id = 40610 ;левел вертекс можно узнать через скрипт object_flags = 0xffffffbf custom_data = <<END [logic] cfg = scripts\kvestodatel.ltx ;ссылка на логику [smart_terrains] ;настройки смартов none = true ;к какому смарту относится NPC (если ''none'', то не берется под гулаг) END story_id = 93 ;уникальный story ID ; cse_visual properties visual_name = actors\ecolog\stalker_ecolog ;визуал NPC ; cse_alife_creature_abstract properties g_team = 0 g_squad = 0 g_group = 0 health = 3 dynamic_out_restrictions = dynamic_in_restrictions = upd:health = 3 upd:timestamp = 0x6d6d695f upd:creature_flags = 0x75 upd:position = -212.877227783203,-23.1829051971436,-122.68586730957 ;сюда надо вписать теже кординаты, что и в позицию upd:o_model = 0 upd:o_torso = 0.0285909995436668,0,-0.999590992927551 upd:g_team = 0 upd:g_squad = 0 upd:g_group = 0 ; cse_alife_monster_abstract properties upd:next_game_vertex_id = 65535 upd:prev_game_vertex_id = 65535 upd:distance_from_point = 0 upd:distance_to_point = 0 ; cse_alife_human_abstract properties predicate5 = 1,0,0,2,0 predicate4 = 2,2,1,2 ; cse_ph_skeleton properties upd:start_dialog = ; se_stalker properties
Теперь переходим к путям. Открываем файл way_l01_escape.ltx и вставляем туда это (все настройки аналогичны alife_l01_escape.ltx):
[esc_lager_kvesto_look] points = p0 p0:name = wp00 p0:position = -213.064239501953,-22.4240226745605,-126.251586914063 p0:game_vertex_id = 59 p0:level_vertex_id = 41279 [esc_lager_kvesto_pack] points = p0 p0:name = wp00 p0:position = -212.877227783203,-23.1829051971436,-122.68586730957 p0:game_vertex_id = 59 p0:level_vertex_id = 40610
Теперь, скомпилируйте all.spawn.
Все со спавном закончили.
Профиль нового NPC
Думаю вы уже умеете работать с профилями, поэтому расписывать не буду - есть много статей про это.
Я сделал профиль так:
<specific_character id="kvestodatel" team_default = "1"> <name>kvestodatel</name> <icon>ui_npc_u_stalker_ecolog</icon> <bio>esc_stalker_novice_bio</bio> <class>kvestodatel</class> <community>ecolog</community> <terrain_sect>stalker_terrain</terrain_sect> <rank>400</rank> <reputation>30</reputation> <money min="20000" max="600000" infinitive="1"/> <snd_config>characters_voice\human_03\ecolog\</snd_config> <crouch_type>-1</crouch_type> <visual>actors\ecolog\stalker_ecolog</visual> <supplies> [spawn] \n wpn_pm \n ammo_9x18_fmj = 1 \n wpn_bm16 \n ammo_12x70_buck \n device_torch \n #include "gameplay\character_items.xml" \n #include "gameplay\character_food.xml" </supplies> #include "gameplay\character_criticals_3.xml" <start_dialog>hello_dialog</start_dialog> <actor_dialog>tm_kvestovik_dialog</actor_dialog> ;ссылка на диалог однотипного квеста <actor_dialog>tm_kvestovik_reward</actor_dialog> ;ссылка на награду за выполнения квеста </specific_character>
Теперь создадим класс и спавн секцию.
Открываем файл npc_profile.xml. Добавляем в него вот это:
<character id="kvestodatel"> <class>kvestodatel</class> </character>
В spawn_sections.ltx добавляем такую секцию:
[esc_kvest]:stalker $spawn= "respawn\esc_kvest" character_profile= kvestodatel spec_rank = regular community = ecolog
Логика
Создайте файл kvestodatel.ltx в config/scripts.
Пропишите в нем:
[logic] active = walker inv_max_weight = 10000 on_death = death combat_ignore = combat_ignore [walker] path_walk = esc_lager_kvesto_pack path_look = esc_lager_kvesto_look meet = meet [meet] use = true use_wpn = true meet_talk_enabled = true [combat_ignore] combat_ignore_cond = always
Ну вот и все, NPC готов, он заспавнится в подвале новичков.
Возможность выдачи квеста
Скрипты
Теперь, пропишем ему однотипные квесты.
Найдите файл game_story_ids.ltx, и после
092 = "escape_provodnik"
напишите
093 = "kvestovik"
Все, дальше переходим к файлу task_manager.script
В нем видим, в самом начале:
local parent_by_story = { [003] = "trader", [500] = "barman", [902] = "ecolog", [507] = "dolg", [707] = "freedom", [006] = "wolf", [004] = "shustriy", [510] = "drunk_dolg", [504] = "hunter", [518] = "zastava_commander", [506] = "petrenko", [607] = "lisiy", [515] = "mercenary" }
Допишем своего персонажа. Должно быть так:
local parent_by_story = { [003] = "trader", [500] = "barman", [902] = "ecolog", [507] = "dolg", [707] = "freedom", [006] = "wolf", [004] = "shustriy", [510] = "drunk_dolg", [504] = "hunter", [518] = "zastava_commander", [506] = "petrenko", [607] = "lisiy", [515] = "mercenary", [093] = "kvestovik" }
Далее видим:
local story_by_parent = { trader = 003, barman = 500, ecolog = 902, dolg = 507, freedom = 707, wolf = 006, shustriy = 004, drunk_dolg = 510, hunter = 504, zastava_commander = 518, petrenko = 506, lisiy = 607, mercenary = 515 }
Должно быть:
local story_by_parent = { trader = 003, barman = 500, ecolog = 902, dolg = 507, freedom = 707, wolf = 006, shustriy = 004, drunk_dolg = 510, hunter = 504, zastava_commander = 518, petrenko = 506, lisiy = 607, mercenary = 515, kvestovik = 093 }
Потом в конце находим:
function init_mercenary_task_dialog(dlg) get_random_task():init_task_dialog(dlg, "mercenary") end
После него пишем по аналогии:
function init_kvestovik_task_dialog(dlg) get_random_task():init_task_dialog(dlg, "kvestovik") end
Ниже, после
function init_mercenary_reward_dialog(dlg) get_random_task():init_reward_dialog(dlg, "mercenary") end
Пишем:
function init_kvestovik_reward_dialog(dlg) get_random_task():init_reward_dialog(dlg, "kvestovik") end
Диалоги
Открываем dialogs.xml
Добавим в конец:
<dialog id="tm_kvestovik_dialog" priority="-1"> <init_func>task_manager.init_kvestovik_task_dialog</init_func> </dialog> <dialog id="tm_kvestovik_reward" priority="0"> <init_func>task_manager.init_kvestovik_reward_dialog</init_func> <precondition>task_manager.has_active_vendor_task</precondition> </dialog>
Откройте game_tasks_by_vendor.xml. Добавьте туда это:
<!-- esc_arter --> <game_task id="eliminate_lager_kvestovik"> <title>title</title> <objective> <text>objective</text> <icon>ui_iconsTotal_eliminate_lager</icon> <function_complete>task_manager.task_complete</function_complete> <function_fail>task_manager.task_fail</function_fail> </objective> </game_task> <game_task id="defend_lager_kvestovik"> <title>title</title> <objective> <text>objective</text> <icon>ui_iconsTotal_defend_lager</icon> <function_complete>task_manager.task_complete</function_complete> <function_fail>task_manager.task_fail</function_fail> </objective> </game_task> <game_task id="artefact_kvestovik"> <title>title</title> <objective> <text>objective</text> <icon>ui_iconsTotal_artefact</icon> <function_complete>task_manager.task_complete</function_complete> <function_fail>task_manager.task_fail</function_fail> </objective> </game_task> <game_task id="kill_stalker_kvestovik"> <title>title</title> <objective> <text>objective</text> <icon>ui_iconsTotal_kill_stalker</icon> <function_complete>task_manager.task_complete</function_complete> <function_fail>task_manager.task_fail</function_fail> </objective> </game_task> <game_task id="monster_part_kvestovik"> <title>title</title> <objective> <text>objective</text> <icon>ui_iconsTotal_monster_part</icon> <function_complete>task_manager.task_complete</function_complete> <function_fail>task_manager.task_fail</function_fail> </objective> </game_task> <game_task id="find_item_kvestovik"> <title>title</title> <objective> <text>objective</text> <icon>ui_iconsTotal_find_item</icon> <function_complete>task_manager.task_complete</function_complete> <function_fail>task_manager.task_fail</function_fail> </objective> </game_task>
Откройте файл stable_task_manager.xml
Добавьте это:
<string id="tm_kvestovik_has_no_job"> <text>Пока ничего.</text> </string> <string id="tm_kvestovik_job_ask"> <text>По поводу какого задания ты хочешь поговорить?</text> </string> <string id="tm_kvestovik_job_complete"> <text>Вот вознаграждение</text> </string> <string id="tm_kvestovik_job_what"> <text>Что по заданию?</text> </string> <string id="tm_kvestovik_list_job"> <text>Есть кое-что:</text> </string>
Заключение
Теперь, создайте однотипный квест, останавливаться на этом я не буду - есть много статей на эту тему. Просто чтобы добавить этому NPC задания, когда будете делать квест, в task_manager.ltx, в строке parent пропишите kvestovik.