Сповіщення
Очистити все

SoC. Однотипні квести для нового NPC


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 

Підготовка

Нам знадобляться ці файли:

  • 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 .


   
Цитата