Підготовка
Нам знадобляться ці файли:
- 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.68578 ; 95436668 , 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 ; 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 , -827 . у позицію 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 79 _ _ [ 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 /community > <terrain_sect > stalker_terrain </terrain_sect > <rank > 400 </rank > <reputation > 30 </reputation > <money min = "20000" max = "600000" infinitive = "1" /> <snd_config > characters_vo \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 > ; посилання на винагороду за виконання квесту
Тепер створимо клас і спавн секцію.
Відкриваємо файл 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 combat_ignore_cond = always meet = meet [ meet ] use = true use_wpn = true meet_talk_enabled = true [ combat_ignore ]
Ну от і все, NPC готовий, він спатиметься в підвалі новачків.
Можливість видачі квесту
Скрипти
Тепер пропишемо йому однотипні квести.
Знайдіть файл game_story_ids.ltx , і після
092 = "escape_provodnik"
напишіть
093 = "квестовик"
Все, далі переходимо до файлу 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 >. _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 . /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_taskid <objective > <text > objective </text > <icon > ui_iconsTotal_artefact < /icon > < function_complete > task_manager.task_complete < /function_complete > < function_fail > task_manager.task_fail < / task > = "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 > < . 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 > 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 .