SoC. Однотипные квесты для нового NPC — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

SoC. Однотипные квесты для нового NPC — различия между версиями

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
м (category)
(стилевые правки, орфография, оформление, категория)
Строка 1: Строка 1:
== Прописываем однотипные квесты для нового нпс ==
+
В этой статье описано, как сделать однотипные квесты для нового 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'''.
  
Распаковываем алл.спавн с помощю acdc
+
Находим, например файл '''alife_l01_escape.ltx ''' и вставляем в конец это:
Находим файл alife_l01_escape(это на пример) и вставляем в конец это
+
  
'''[18240]''' ;это уникальный номер не должен повторятся
+
<ini>[18240] ;это уникальный номер. Не должен повторятся
 
; cse_abstract properties
 
; cse_abstract properties
'''section_name = stalker''' ;секция того что спавним
+
section_name = stalker ;секция того, что спавним
'''name = esc_kvestodatel''' ;имя может быть любое
+
name = esc_kvestodatel ;имя может быть любое
'''position = -212.877227783203,-23.1829051971436,-122.68586730957''' ;позиция я использовал скрипт от бардака
+
position = -212.877227783203,-23.1829051971436,-122.68586730957 ;позиция
'''direction = 0.0285909995436668,0,-0.999590992927551''' ;разворот в скрипте от бардака есть эта ф-ция
+
direction = 0.0285909995436668,0,-0.999590992927551 ;разворот
  
 
; cse_alife_trader_abstract properties
 
; cse_alife_trader_abstract properties
'''money = 6000''' ;количество денег с которым создастся этот нпс(файл профиля нпс перекроет это значение)
+
money = 6000 ;количество денег, с которым создастся этот NPC (файл профиля NPC перекроет это значение)
'''character_profile = kvestodatel''' ;профиль нпс
+
character_profile = kvestodatel ;профиль NPC
  
 
; cse_alife_object properties
 
; cse_alife_object properties
 +
game_vertex_id = 59 ;гейм вертекс можно узнать через скрипт
 +
distance = 0 ;дистанция вокруг позиции, в которой спавним (если 0, то заспавнится точно в позиции, которую мы указали)
 +
level_vertex_id = 40610 ;левел вертекс можно узнать через скрипт
 +
object_flags = 0xffffffbf
 +
custom_data = <<END
  
'''game_vertex_id = 59''' ;гейм вертекс можно узнать в скрипте
+
[logic]
 +
cfg = scripts\kvestodatel.ltx ;ссылка на логику
  
'''distance = 0''' ;дистанция вокруг вокруг позиции в которой спавним(если 0 то заспавница точно в позиции которую мы указали)
+
[smart_terrains] ;настройки смартов
 +
none = true ;к какому смарту относится NPC (если ''none'', то не берется под гулаг)
  
'''level_vertex_id = 40610''' ;левел вертекс можно узнать в скрипте
+
END
  
'''object_flags = 0xffffffbf'''
+
story_id = 93 ;уникальный story ID
 
+
'''custom_data = <<END'''
+
 
+
'''[logic]''' ;настройки логики
+
 
+
'''cfg = scripts\kvestodatel.ltx''' ;ссылка на логику
+
 
+
 
+
'''[smart_terrains]''' ;настройки смартов
+
 
+
'''none = true''' ;к какому смарту относится нпс(если none не берется под гулаг)
+
 
+
'''END'''
+
'''Жирный шрифт'''
+
'''story_id = 93''' ;уникальный стори ид
+
  
 
; cse_visual properties
 
; cse_visual properties
  
'''visual_name = actors\ecolog\stalker_ecolog''' ;визуал нпса
+
visual_name = actors\ecolog\stalker_ecolog ;визуал NPC
  
 
; cse_alife_creature_abstract properties
 
; cse_alife_creature_abstract properties
'''g_team = 0'''
+
g_team = 0
 
+
g_squad = 0
'''g_squad = 0'''
+
g_group = 0
 
+
health = 3
'''g_group = 0'''
+
dynamic_out_restrictions =
 
+
dynamic_in_restrictions =
'''health = 3'''
+
upd:health = 3
 
+
upd:timestamp = 0x6d6d695f
'''dynamic_out_restrictions ='''
+
upd:creature_flags = 0x75
 
+
upd:position = -212.877227783203,-23.1829051971436,-122.68586730957 ;сюда надо вписать теже кординаты, что и в позицию
'''dynamic_in_restrictions ='''
+
upd:o_model = 0
 
+
upd:o_torso = 0.0285909995436668,0,-0.999590992927551
'''upd:health = 3'''
+
upd:g_team = 0
 
+
upd:g_squad = 0
'''upd:timestamp = 0x6d6d695f'''
+
upd:g_group = 0
 
+
'''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
 
; cse_alife_monster_abstract properties
 
+
upd:next_game_vertex_id = 65535
'''upd:next_game_vertex_id = 65535'''
+
upd:prev_game_vertex_id = 65535
 
+
upd:distance_from_point = 0
'''upd:prev_game_vertex_id = 65535'''
+
upd:distance_to_point = 0
 
+
'''upd:distance_from_point = 0'''
+
 
+
'''upd:distance_to_point = 0'''
+
  
 
; cse_alife_human_abstract properties
 
; cse_alife_human_abstract properties
 
+
predicate5 = 1,0,0,2,0
'''predicate5 = 1,0,0,2,0'''
+
predicate4 = 2,2,1,2
 
+
'''predicate4 = 2,2,1,2'''
+
  
 
; cse_ph_skeleton properties
 
; cse_ph_skeleton properties
 +
upd:start_dialog =
  
'''upd:start_dialog ='''
+
; se_stalker properties</ini>
  
; se_stalker properties
+
Теперь переходим к путям.
 +
Открываем файл '''way_l01_escape.ltx''' и вставляем туда это (все настройки аналогичны '''alife_l01_escape.ltx'''):
  
теперь переходим к путям
+
<ini>[esc_lager_kvesto_look]
открываем файл way_l01_escape
+
points = p0
и вставляем туда это(все настройки аналогичны как и в alife_l01_escape)
+
p0:name = wp00
 +
p0:position = -213.064239501953,-22.4240226745605,-126.251586914063
 +
p0:game_vertex_id = 59
 +
p0:level_vertex_id = 41279
  
'''[esc_lager_kvesto_look]'''
+
[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</ini>
  
'''points = p0'''
+
Теперь, скомпилируйте '''all.spawn'''.
  
'''p0:name = wp00'''
+
Все со спавном закончили.
 +
=== Профиль нового NPC ===
 +
Думаю вы уже умеете работать с профилями, поэтому расписывать не буду - есть много статей про это.
  
'''p0:position = -213.064239501953,-22.4240226745605,-126.251586914063'''
+
Я сделал профиль так:
  
'''p0:game_vertex_id = 59'''
+
<xml><specific_character id="kvestodatel" team_default = "1">  
 
+
'''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
+
 
+
Все со спавном покончено
+
переходим к профилю
+
думаю вы умеете работать с профилем поэтому разжевывать не буду(есть много статей по этому)
+
я сделал профиль так:
+
 
+
<specific_character id="kvestodatel" team_default = "1">  
+
 
           <name>kvestodatel</name>  
 
           <name>kvestodatel</name>  
 
           <icon>ui_npc_u_stalker_ecolog</icon>  
 
           <icon>ui_npc_u_stalker_ecolog</icon>  
Строка 157: Строка 131:
 
             <start_dialog>hello_dialog</start_dialog>  
 
             <start_dialog>hello_dialog</start_dialog>  
 
             <actor_dialog>tm_kvestovik_dialog</actor_dialog> ;ссылка на диалог однотипного квеста
 
             <actor_dialog>tm_kvestovik_dialog</actor_dialog> ;ссылка на диалог однотипного квеста
    <actor_dialog>tm_kvestovik_reward</actor_dialog> ;ссылка на награду за выполнения квеста
+
    <actor_dialog>tm_kvestovik_reward</actor_dialog> ;ссылка на награду за выполнения квеста
             </specific_character>
+
             </specific_character></xml>
  
теперь создадим класс и спавн секцию
+
Теперь создадим класс и спавн секцию.
открываем файл npc_profile он находится в config\gameplay
+
добавляем пам дето вот это
+
  
<character id="kvestodatel">
+
Открываем файл '''npc_profile.xml'''. Добавляем в него вот это:
<class>kvestodatel</class>
+
</character>
+
  
 +
<xml><character id="kvestodatel">
 +
<class>kvestodatel</class>
 +
</character></xml>
  
в спавн секции добавляем такую секцию
 
  
[esc_kvest]:stalker
+
В '''spawn_sections.ltx''' добавляем такую секцию:
$spawn =  "respawn\esc_kvest"
+
 
character_profile = kvestodatel
+
<ini>[esc_kvest]:stalker
 +
$spawn=  "respawn\esc_kvest"
 +
character_profile= kvestodatel
 
spec_rank = regular
 
spec_rank = regular
community = ecolog
+
community = ecolog</ini>
  
теперь логика
+
=== Логика ===
создайте файл kvestodatel.ltx в config\scripts
+
Создайте файл '''kvestodatel.ltx''' в ''config/scripts''.
  
пропишите в нем
+
Пропишите в нем:
  
[logic]
+
<ini>[logic]
 
active = walker
 
active = walker
 
inv_max_weight = 10000  
 
inv_max_weight = 10000  
Строка 199: Строка 173:
  
 
[combat_ignore]
 
[combat_ignore]
combat_ignore_cond = always
+
combat_ignore_cond = always</ini>
  
 +
Ну вот и все, NPC готов, он заспавнится в подвале новичков.
  
компилируйте алл.спавн ну вот и все нпс готов он заспавница в подвале новичков
+
== Возможность выдачи квеста ==
и будет стоять на месте
+
=== Скрипты ===
  
теперь пропишем ему однотипные квесты
+
Теперь, пропишем ему однотипные квесты.
найдите файл game_story_ids в \config
+
и после
+
  
092 = "escape_provodnik"  
+
Найдите файл '''game_story_ids.ltx''', и после
 +
 
 +
<ini>092   = "escape_provodnik"</ini>
 
напишите
 
напишите
093 = "kvestovik"
+
<ini>093   = "kvestovik"</ini>
  
все, дальше переходим к файлу
+
Все, дальше переходим к файлу '''task_manager.script'''
\scripts находим task_manager
+
  
и там видем в самом начале
+
В нем видим, в самом начале:
  
local parent_by_story = {
+
<lua>local parent_by_story = {
[003] = "trader",
+
  [003] = "trader",
[500] = "barman",
+
  [500] = "barman",
[902] = "ecolog",
+
  [902] = "ecolog",
[507] = "dolg",
+
  [507] = "dolg",
[707] = "freedom",
+
  [707] = "freedom",
[006] = "wolf",
+
  [006] = "wolf",
[004] = "shustriy",
+
  [004] = "shustriy",
[510] = "drunk_dolg",
+
  [510] = "drunk_dolg",
[504] = "hunter",
+
  [504] = "hunter",
[518] = "zastava_commander",
+
  [518] = "zastava_commander",
[506] = "petrenko",
+
  [506] = "petrenko",
[607] = "lisiy",
+
  [607] = "lisiy",
[515] = "mercenary",
+
  [515] = "mercenary"
        допишем своего мужика(незабудте запятую после предыдущей строчки)
+
}</lua>
        [093] = "kvestovik"
+
}
+
  
дальше видим
+
Допишем своего персонажа. Должно быть так:
  
local story_by_parent = {
+
<lua>local parent_by_story = {
trader = 003,
+
  [003] = "trader",
barman = 500,
+
  [500] = "barman",
ecolog = 902,
+
  [902] = "ecolog",
dolg = 507,
+
  [507] = "dolg",
freedom = 707,
+
  [707] = "freedom",
wolf = 006,
+
  [006] = "wolf",
shustriy = 004,
+
  [004] = "shustriy",
drunk_dolg = 510,
+
  [510] = "drunk_dolg",
hunter = 504,
+
  [504] = "hunter",
zastava_commander = 518,
+
  [518] = "zastava_commander",
petrenko = 506,
+
  [506] = "petrenko",
lisiy = 607,
+
  [607] = "lisiy",
mercenary = 515,
+
  [515] = "mercenary",
прописываем нпса(незабудте запятую после предыдущей строки
+
  [093] = "kvestovik"
        kvestovik = 093
+
}</lua>
}
+
  
потом в конце находим
+
Далее видим:
function init_mercenary_task_dialog(dlg)
+
get_random_task():init_task_dialog(dlg, "mercenary")
+
end
+
и после него пишем по аналогии
+
  
function init_kvestovik_task_dialog(dlg)
+
<lua>local story_by_parent = {
get_random_task():init_task_dialog(dlg, "kvestovik")
+
  trader                  = 003,
end
+
  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
 +
}</lua>
  
и ниже после
+
Должно быть:      
function init_mercenary_reward_dialog(dlg)
+
get_random_task():init_reward_dialog(dlg, "mercenary")
+
end
+
  
пишем по аналогии
+
<lua>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
 +
}</lua>
  
function init_kvestovik_reward_dialog(dlg)
 
get_random_task():init_reward_dialog(dlg, "kvestovik")
 
end
 
  
так с скриптом все далее идем в config\gameplay
+
Потом в конце находим:
 +
<lua>function init_mercenary_task_dialog(dlg)
 +
get_random_task():init_task_dialog(dlg, "mercenary")
 +
end</lua>
  
открываем dialogs
+
После него пишем по аналогии:
  
добавим в конец  
+
<lua>function init_kvestovik_task_dialog(dlg)
<dialog id="tm_kvestovik_dialog" priority="-1">
+
get_random_task():init_task_dialog(dlg, "kvestovik")
<init_func>task_manager.init_kvestovik_task_dialog</init_func>
+
end</lua>
 +
 
 +
Ниже, после
 +
<lua>function init_mercenary_reward_dialog(dlg)
 +
get_random_task():init_reward_dialog(dlg, "mercenary")
 +
end</lua>
 +
 
 +
Пишем:
 +
<lua>function init_kvestovik_reward_dialog(dlg)
 +
get_random_task():init_reward_dialog(dlg, "kvestovik")
 +
end</lua>
 +
 
 +
===Диалоги===
 +
Открываем '''dialogs.xml'''
 +
 
 +
Добавим в конец:
 +
<xml><dialog id="tm_kvestovik_dialog" priority="-1">
 +
<init_func>task_manager.init_kvestovik_task_dialog</init_func>
 
     </dialog>
 
     </dialog>
 
     <dialog id="tm_kvestovik_reward" priority="0">
 
     <dialog id="tm_kvestovik_reward" priority="0">
<init_func>task_manager.init_kvestovik_reward_dialog</init_func>
+
<init_func>task_manager.init_kvestovik_reward_dialog</init_func>
<precondition>task_manager.has_active_vendor_task</precondition>
+
<precondition>task_manager.has_active_vendor_task</precondition>
     </dialog>
+
     </dialog></xml>
  
так и последние откройте game_tasks_by_vendor в config\gameplay
+
Откройте '''game_tasks_by_vendor.xml'''.
добавте туда
+
Добавьте туда это:
  
<!-- esc_arter -->
+
<xml><!-- esc_arter -->
 
         <game_task id="eliminate_lager_kvestovik">
 
         <game_task id="eliminate_lager_kvestovik">
<title>title</title>
+
<title>title</title>
<objective>
+
<objective>
<text>objective</text>
+
<text>objective</text>
<icon>ui_iconsTotal_eliminate_lager</icon>
+
<icon>ui_iconsTotal_eliminate_lager</icon>
<function_complete>task_manager.task_complete</function_complete>
+
<function_complete>task_manager.task_complete</function_complete>
<function_fail>task_manager.task_fail</function_fail>
+
<function_fail>task_manager.task_fail</function_fail>
</objective>
+
</objective>
</game_task>
+
</game_task>
<game_task id="defend_lager_kvestovik">
+
<game_task id="defend_lager_kvestovik">
<title>title</title>
+
<title>title</title>
<objective>
+
<objective>
<text>objective</text>
+
<text>objective</text>
<icon>ui_iconsTotal_defend_lager</icon>
+
<icon>ui_iconsTotal_defend_lager</icon>
<function_complete>task_manager.task_complete</function_complete>
+
<function_complete>task_manager.task_complete</function_complete>
<function_fail>task_manager.task_fail</function_fail>
+
<function_fail>task_manager.task_fail</function_fail>
</objective>
+
</objective>
</game_task>
+
</game_task>
<game_task id="artefact_kvestovik">
+
<game_task id="artefact_kvestovik">
<title>title</title>
+
<title>title</title>
<objective>
+
<objective>
<text>objective</text>
+
<text>objective</text>
<icon>ui_iconsTotal_artefact</icon>
+
<icon>ui_iconsTotal_artefact</icon>
<function_complete>task_manager.task_complete</function_complete>
+
<function_complete>task_manager.task_complete</function_complete>
<function_fail>task_manager.task_fail</function_fail>
+
<function_fail>task_manager.task_fail</function_fail>
</objective>
+
</objective>
</game_task>
+
</game_task>
<game_task id="kill_stalker_kvestovik">
+
<game_task id="kill_stalker_kvestovik">
<title>title</title>
+
<title>title</title>
<objective>
+
<objective>
<text>objective</text>
+
<text>objective</text>
<icon>ui_iconsTotal_kill_stalker</icon>
+
<icon>ui_iconsTotal_kill_stalker</icon>
<function_complete>task_manager.task_complete</function_complete>
+
<function_complete>task_manager.task_complete</function_complete>
<function_fail>task_manager.task_fail</function_fail>
+
<function_fail>task_manager.task_fail</function_fail>
</objective>
+
</objective>
</game_task>
+
</game_task>
<game_task id="monster_part_kvestovik">
+
<game_task id="monster_part_kvestovik">
<title>title</title>
+
<title>title</title>
<objective>
+
<objective>
<text>objective</text>
+
<text>objective</text>
<icon>ui_iconsTotal_monster_part</icon>
+
<icon>ui_iconsTotal_monster_part</icon>
<function_complete>task_manager.task_complete</function_complete>
+
<function_complete>task_manager.task_complete</function_complete>
<function_fail>task_manager.task_fail</function_fail>
+
<function_fail>task_manager.task_fail</function_fail>
</objective>
+
</objective>
</game_task>
+
</game_task>
<game_task id="find_item_kvestovik">
+
<game_task id="find_item_kvestovik">
<title>title</title>
+
<title>title</title>
<objective>
+
<objective>
<text>objective</text>
+
<text>objective</text>
<icon>ui_iconsTotal_find_item</icon>
+
<icon>ui_iconsTotal_find_item</icon>
<function_complete>task_manager.task_complete</function_complete>
+
<function_complete>task_manager.task_complete</function_complete>
<function_fail>task_manager.task_fail</function_fail>
+
<function_fail>task_manager.task_fail</function_fail>
</objective>
+
</objective>
</game_task>
+
</game_task></xml>
  
И вот еще забыл откройте \config\text\rus файл stable_task_manager
+
Откройте файл '''stable_task_manager.xml'''
  
добавте это
+
Добавьте это:
  
<string id="tm_kvestovik_has_no_job">
+
<xml><string id="tm_kvestovik_has_no_job">
 
         <text>Пока ничего.</text>
 
         <text>Пока ничего.</text>
 
     </string>
 
     </string>
Строка 367: Строка 375:
 
     <string id="tm_kvestovik_list_job">
 
     <string id="tm_kvestovik_list_job">
 
         <text>Есть кое-что:</text>
 
         <text>Есть кое-что:</text>
     </string>
+
     </string></xml>
 
+
== Заключение ==
все теперь создайте однотипный квест, останавливаться на этом я не буду есть много статей на эту тему
+
Теперь, создайте однотипный квест, останавливаться на этом я не буду - есть много статей на эту тему.
просто чтоб добавить этому нпсу задания когда будете делать квест
+
Просто чтобы добавить этому NPC задания, когда будете делать квест, в '''task_manager.ltx''', в строке ''parent'' пропишите '''kvestovik'''.
в misc\task_manager в строке parent пропишите = kvestovik все
+
== Ссылки ==
 +
[http://stalkerin.gameru.net/wiki/index.php/SoC._Однотипные_квесты Создание однотипных квестов]
 +
[http://stalkerin.gameru.net/wiki/index.php/All.spawn._Создание_NPC Создание NPC]
  
УДАЧНОГО МОДОСТРОЕНИЯ
+
[[Категория:Конфигурационные файлы]]
[[Категория:Незаконченные статьи]]
+

Версия 06:09, 2 августа 2011

В этой статье описано, как сделать однотипные квесты для нового 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.

Ссылки

Создание однотипных квестов Создание NPC

Другие места
LANGUAGE