Перейти к контенту

GEONЕZIS

Проверенные
  • Число публикаций

    51
  • Регистрация

  • Последнее посещение

  • AMKoin

    7 [Подарить AMKoin]

Сообщения опубликованы GEONЕZIS

  1. Всем привет)  Немного экскурса в историю авиации. Видео о разработке первых реактивных самолетов в послевоенные годы. В данном случае это создание первого реактивного фронтового бомбардировщика ОКБ Туполева Ту-12. Ссылка на Ютуб   

     

    • Нравится 1
  2. Доброго времени суток. Команда разработчиков модификации Смерти Вопреки 3 ищет следующих специалистов:

    1. 3-D моделлер. Обязанности- создание объектов для локаций. Опыт работы с 3D-Max, SDK.
    2. Текстурщик. Важен опыт создания бампов. 

    Связь в ЛС. 

  3. Здравствуйте. 

     

    Перспективному проекту, разрабатываемому на платформе Зова Припяти, требуются следующие специалисты: 
     
    - Моделлеры. Обязанности: создание новых объектов для локаций. Знание 3D-Max. 
    - Аниматор. Обязанности: cоздание новых анимаций для моделей нпс, анимирование объектов и худовых предметов. 
    - Программист C++ для работы с движком игры. 
     
    Контакты:
    В ЛС профиля.
  4. Здравствуйте. Подскажите пожалуйста в чем может быть проблема при подгоне вертексов координат спавна в подключенной локации.

    Все утилиты и последние скрипты установлены.  

    Прописываю команду universal_acdc.pl -parse alife_marsh.ltx -old 0 -new 1276 -way  в батнике acdc_parse.bat  
    Создается пустая папка parsed_spawn, после этого ошибка

    2078982.jpg

    Как можно обойти проблему? 

  5. Что то пошла мода делать новый сюжет на одной локации

    А что в этом такого плохого? Как всем известно аддон Зов Припяти содержит в себе всего 5 локаций и основной упор в нем был сделан на тщательную реализацию квестовой составляющей. Для того чтобы реализовать сюжет подобного ПЫС уровня технической сложности (программирование логики, тестирование всех игровых вариантов и т.д.) одному человеку требуется достаточно много времени, не менее полугода. В принципе это сопоставимо по срокам с разработкой модификации на трех локациями, но с более упрощенной технической реализацией сюжета.  Так что лично я в таких модах ничего плохого не вижу. Плюсы можно перечислять и еще.  На ТЧ, ЧН немного другие приоритеты и думаю нет смысла сравнивать два мода на разных платформах.  

  6. Создание однотипного квеста на одновременный поиск двух разных предметов. Особенности- использование элементарных скриптовых функций actor_has_item() Реализация на X-Ray 1.6

     

    Итак, предположим нам необходимо создать простой квест для Зова Припяти на одновременный поиск двух различных предметов.

    Пусть идея квеста будет такой: Сыч дает ГГ поручение найти два артефакта Снежинка и Пламя.

     

    Необходимые для редактирования файлы:

    1. конфигурационные в (gamedata\configs\gameplay\)

    -character_desc_zaton.xml

    -dialogs_zaton.xml

    -info_zaton.xml

    -character_desc_general.xml (необязательно)

    2. конфигурационные в (gamedata\configs\misc\)

    - tm_zaton.ltx

    3. конфигурационные в (gamedata\configs\text\rus\)

    - st_dialogs_zaton.xml

    - st_quests_zaton.xml

    4. скриптовый в (gamedata\scripts\)

    - dialogs_zaton.script


    Для начала создадим два простеньких диалога для выдачи и завершения квеста.

     

    В файл dialogs_zaton.xml в самом низу добавим два диалога:

     

    На выдачу квеста:

    <dialog id="zat_b30_owl_stalker_trader_small_quests_begin">             
                 <dont_has_info>zat_b30_owl_stalker_trader_quest_init</dont_has_info>
                 <dont_has_info>zat_b30_owl_stalker_trader_quest_no_quest</dont_has_info>
                 <precondition>dialogs_zaton.zat_b30_owl_stalker_trader_not_have_arts</precondition>
                 <phrase_list>
                         <phrase id="0">
                            <text>zat_b30_owl_stalker_trader_small_quests_0</text>
                            <next>1</next>
                         </phrase>        
                         <phrase id="1">
                            <text>zat_b30_owl_stalker_trader_small_quests_1</text>
                            <next>2</next>
                            <next>3</next>
                         </phrase>
                         <phrase id="2">
                            <text>zat_b30_owl_stalker_trader_small_quests_2</text>
                            <give_info>zat_b30_owl_stalker_trader_quest_no_quest</give_info>
                         </phrase>
                         <phrase id="3">
                            <text>zat_b30_owl_stalker_trader_small_quests_3</text>
                            <action>dialogs_zaton.zat_b30_owl_stalker_trader_give_quest</action>                     
                            <next>4</next>
                          </phrase>
                          <phrase id="4">
                             <text>zat_b30_owl_stalker_trader_small_quests_4</text>
                             <give_info>zat_b30_owl_stalker_trader_quest_init</give_info>                     
                          </phrase>                 
                 </phrase_list>
    </dialog>

     

    На завершение квеста:

     

    <dialog id="zat_b30_owl_stalker_trader_small_quests_end">
                 <has_info>zat_b30_owl_stalker_trader_quest_init</has_info>      
                 <dont_has_info>zat_b30_owl_stalker_trader_quest_end</dont_has_info>
                 <precondition>dialogs_zaton.zat_b30_owl_stalker_trader_have_arts</precondition>       
                 <phrase_list>
                      <phrase id="0">
                             <text>zat_b30_owl_stalker_trader_small_quests_5</text>
                             <give_info>zat_b30_owl_stalker_trader_quest_end</give_info>         
                             <next>1</next>
                       </phrase>
                       <phrase id="1">
                            <text>zat_b30_owl_stalker_trader_small_quests_6</text>         
                            <next>2</next>
                       </phrase>      
                       <phrase id="2">
                            <text>zat_b30_owl_stalker_trader_small_quests_7</text>         
                            <action>dialogs_zaton.zat_b30_owl_stalker_trader_relocates_arts</action>
                            <next>3</next>
                         </phrase>        
                         <phrase id="3">
                            <text>zat_b30_owl_stalker_trader_small_quests_8</text>
                            <action>dialogs_zaton.zat_b30_owl_stalker_trader_relocates_money_to_actor</action>
                            <next>4</next>                         
                         </phrase>
                         <phrase id="4">
                            <text>zat_b30_owl_stalker_trader_small_quests_9</text>
                            <action>dialogs.break_dialog</action>
                         </phrase>                            
                 </phrase_list>
    </dialog>

     

    Пропишем их русскую транскрипцию в файле st_dialogs_zaton.xml

     

    Теперь разберем по порядку то что добавили.

     

    Диалог на выдачу квеста имеет следующую элементарную структуру:

     

    - ГГ предлагают задание и он на выбор может отказаться от него, тогда второй раз диалог уже не будет доступен. Либо же согласиться на исполение.

    - Соответсвенно происходит выдача инфопоршней zat_b30_owl_stalker_trader_quest_init (при старте квеста) и zat_b30_owl_stalker_trader_quest_no_quest (при отказе от выполнения).

    - Наличие в диалоге тегов <dont_has_info>имя поршня</dont_has_info> обеспечивает его блокировку при выборе одной из веток.

    - Наличие прекондишина <precondition>dialogs_zaton.zat_b30_owl_stalker_trader_have_arts</precondition> также блокирует стартовый диалог при наличии квестовых предметов (в данном случае это артефакты) в рюкзаке ГГ.

    - акшион <action>dialogs_zaton.zat_b30_owl_stalker_trader_give_quest</action> обеспечивает выдачу квеста.

     

    поясню особенности второго диалога:

     

    - наличие тега <has_info>zat_b30_owl_stalker_trader_quest_init</has_info> обеспечивает возможность инициализации диалога после выдачи квеста.

    - наличие <dont_has_info>zat_b30_owl_stalker_trader_quest_end</dont_has_info> обеспечивает блокировку диалога после завершение квеста.

    - прекондишн <precondition>dialogs_zaton.zat_b30_owl_stalker_trader_have_arts</precondition> обеспечивает блокирование диалога до момента наличия в инвентаре ГГ нужных квестовых предметов.

    - акшионы <action>dialogs_zaton.zat_b30_owl_stalker_trader_relocates_arts</action> и <action>dialogs_zaton.zat_b30_owl_stalker_trader_relocates_money_to_actor</action> обеспечивают передачу квестовых предметов от ГГ к НПС, и последующего денежного вознаграждения для ГГ от него.

     

     

    Объявим используемые инфопоршни в info_zaton.xml Добавим в конце файла код:

     

    <!-- New quest -->      
          <info_portion id="zat_b30_owl_stalker_trader_quest_no_quest"></info_portion>
          <info_portion id="zat_b30_owl_stalker_trader_quest_init"></info_portion>
          <info_portion id="zat_b30_owl_stalker_trader_quest_end"></info_portion>

     

    Добавим наши диалоги НПС (В данном случае Сычу) для этого в файл character_desc_zaton.xml в его профиль <specific_character id="zat_b30_owl_stalker_trader" team_default="1"> добавим две строки диалогов

     

    .....
          <actor_dialog>zat_b30_owl_stalker_trader_small_quests_begin</actor_dialog>
          <actor_dialog>zat_b30_owl_stalker_trader_small_quests_end</actor_dialog>
    .....

     

     

    С диалогами и инфопоршнями разобрались теперь раccмотрим необходимые скриптовые функции:

     

    В файл dialogs_zaton.script добавим код

    function zat_b30_owl_stalker_trader_give_quest()      
             task_manager.get_task_manager():give_task("geonezis_zat_b30_owl_quest")         
    end
    
    function zat_b30_owl_stalker_trader_have_arts(first_speaker, second_speaker)
          return ((db.actor:object("af_ice") ~= nil) and (db.actor:object("af_fire") ~= nil))
    end
    
    function zat_b30_owl_stalker_trader_not_have_arts(first_speaker, second_speaker)
          return ((db.actor:object("af_ice") == nil) and (db.actor:object("af_fire") == nil))
    end
    
    function zat_b30_owl_stalker_trader_relocates_arts(first_speaker, second_speaker)
          dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_ice")
          dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_fire")
    end      
    
    function zat_b30_owl_stalker_trader_relocates_money_to_actor(first_speaker, second_speaker)
          dialogs.relocate_money_to_actor(first_speaker, second_speaker, 30000)
    end

     

    Теперь по порядку разберем эти функции:

     

    - zat_b30_owl_stalker_trader_give_quest - выдача квеста

    - zat_b30_owl_stalker_trader_have_arts - возвращает true при проверки на наличие в инвентаре ГГ двух необходимвх предметов (в данном случае артефактов af_ice и af_fire)

    - zat_b30_owl_stalker_trader_not_have_arts- возвращает false при аналогичной проверке.

    - zat_b30_owl_stalker_trader_relocates_arts- передача НПС артефактов

    - zat_b30_owl_stalker_trader_relocates_money_to_actor- выдача денежной награды ГГ.


     

    Ну и самое основное это квест.

     

    В файле tm_zaton.ltx прописываем

     

    [geonezis_zat_b30_owl_quest]
    icon = ui_inGame2_Kontrakt_s_uchenimi
    prior = 2
    storyline = false
    title = {=actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_title_3, {=actor_has_item(af_ice) !actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_title_2, {!actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_title_1, zat_b30_owl_stalker_trader_small_quest_title_0      
    descr = {=actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_text_3, {=actor_has_item(af_ice) !actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_text_2, {!actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_text_1, zat_b30_owl_stalker_trader_small_quest_text_0
    target = {=actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_id, nil
    condlist_0 = {+zat_b30_owl_stalker_trader_quest_end} complete

     

    Разберем то что происходит в процессе выполнения квеста и собственно его структуру.

     

    - [geonezis_zat_b30_owl_quest] - название задение в таск менеджере

    - icon = ui_inGame2_Kontrakt_s_uchenimi - иконка квеста (в данном случае от задания Контракт с Учеными)

    - prior = 2 - приоретет задания

    - storyline = false - сюжеткный ли квест или нет

    - title = - заголовки при обновлении задания

    - descr = - дескрипшины при обновлении задания

    - target = - цели, метки квеста при его обьнавлении.

    - condlist_0 =- кондишн (спец. условия) в квесте (в данном случае один на завершение)

     

    Основная особенность задания это последовательная проверка структурных условий посредством функции actor_has_item(...). Это вызываемая из xr_conditions.script функция на проверку наличия у актора того или иного предмета. Соответсвенно в структуре этого квеста используют два варианта когда значениее функции false (!actor_has_item(...)) и true (=actor_has_item(...))

     

    В квесте рассматриваются все возможные сочетания вариантов наличия или отсутсвия найденного того или иного предмета.

     

    1. когда нет ни одного.

    2. первый (арт снежинка) есть, второго (арт пламя) нет.

    3. первого нет, второй есть

    4. оба есть.

     

    Соответсвенно в независимости от того какой арт был найден первым- произойдет точное обновление дескрипшина и титла задания с указанием текущего состояния. Также если игрок выложит из инвентаря уже найденный арт, то задание будет обновляться снова. Метка на цели в квесте (Сыч) появиться только при наличии обоих предметов.

    По выдачи инфопоршня zat_b30_owl_stalker_trader_quest_end квест будет завершен.

     

    Пропишим рускую транскрипцию дескрипшинов и тайтлов квеста в st_quests_zaton.xml

     

    По желанию для проверки в character_desc_general.xml при старте ГГ пропишем нужный арты.

     

    На этом урок завершен.

    Файл с отработанным заданием можно скачать здесь- http://narod.ru/disk....ar.html

     

     

     

     

    Создание примитивного квеста на поиск двух различных предметов, с выдачей ачивмента.

    Особенности- способ написания задание с его обновлением по инфопорциям, добавление по завершении простого достижения (ачивмента). Реализация на X-Ray 1.6

     

    Поставленная в данном уроке задача схожа с той что была в предыдущем. Основным отличием от него будет являться способ реализации заданий такого типа. Если ранее основным обработчиком на обновление этапов квеста служило использование функций actor_has_item(...), то сейчас последовательное обновление будет осуществляться через выдачу соответствующих инфопорций. Будет подробно рассмотрена структура диалога в котором будет происходить их выдача. Также среди особенностей отметим добавление по завершении задания специального достижения.

     

    Необходимые для редактирования файлы:

     

    1. конфигурационные в (gamedata\configs\gameplay)

    -character_desc_zaton.xml

    -dialogs_zaton.xml

    -info_zaton.xml

    -character_desc_general.xml (необязательно)

    2. конфигурационные в (gamedata\configs\misc\)

    - tm_zaton.ltx

    - achievements.ltx

    3. конфигурационные в (gamedata\configs\text\rus\)

    - st_dialogs_zaton.xml

    - st_quests_zaton.xml

    - st_achievement.xml

    - ui_st_screen.xml

    4. скриптовые в (gamedata\scripts\)

    - dialogs_zaton.script

    - xr_statistic.script

     

    Начнем с разбора процесса создания ачивмента, выдаваемого по завершении задания. Остальные этапы по написанию квеста будут сокращаны, ибо по большей части они уже были рассмотрены в предыдущем уроке.

     

    В файле achievements.ltx в самом низу добавим следующую секцию:

    [sich_helper]
    icon  = ui_inGame2_Iskatel
    hint  = st_sp_achievement_22_hint
    name  = st_sp_achievement_22_name
    desc  = st_sp_achievement_22_descr
    functor  = xr_statistic.sich_helper_functor

     

    -[sich_helper]- уникальное имя секции ачивмента. его же необходимо зарегистрировать в начале файла в списке всех достижений.

    -icon- имя секции иконки достижения. берется из файла ui_actor_achivments.xml (\configs\ui\textures_descr\) в свою очередь сама иконка прописывается в ui_actor_achivments.dds (\textures\ui\) В данном случае возьмем стандартную иконку из другого достижения.

    - hint- описание в ПДА при наведении на ачивку.

    - name- название (имя) достижения.

    - desc- описание самого достижения.

    - functor- имя функции из xr_statistic.script отвечающей за срабатывания условий на получение достижения и собственно его выдача.

     

    Описание русской транскрипции добавим в файл st_achievement.xml

    <string id="st_sp_achievement_22_name">
         <text>Помошник торговца</text>
    </string>
    <string id="st_sp_achievement_22_hint">
         <text>Бандиты стали лучше к Вам относится.</text>
    </string>
    <string id="st_sp_achievement_22_descr">
         <text>Вы нашли и принесли артефакты скряге Сычу. Тем самым Вы заслужили уважение бандитов.</text>
    </string>

    и в ui_st_screen.xml

    <string id="st_ach_sich_helper">
         <text>Получено достижение «Помошник торговца».</text>
    </string>

     

    В xr_statistic.script добавляем исполняемую функцию:

        
    function sich_helper_functor()
        if not has_alife_info("sich_helper_achievement_gained") then
         if has_alife_info("zat_geonezis_example_quest_complete") then
          news_manager.send_tip(db.actor, "st_ach_sich_helper", nil, "seeker", nil, nil)
          xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"bandit", 100})
          db.actor:give_info_portion("sich_helper_achievement_gained")
         end
        end
        return has_alife_info("sich_helper_achievement_gained")
    end

     

    более подробно разберем работу данной функции:

    - происходит проверка, а не было ли уже получено данное достижение (отсутствие инфопоршня sich_helper_achievement_gained)

    - срабатывание условия выдачи достижения

    в данном случае условие только одно- это получение инфопоршня zat_geonezis_example_quest_complete (который будет выдаваться по завершению квеста)

    - далее происходит отправка на пда ГГ сообщения с текстом что достижение было получено.

    - вызывается обработчик функций на выполнение "бонуса" или "антибонуса" достижения. (в данном случае это только увеличение репутации у сталкеров)

    - выдается инфопоршень получения достижения (в рассматриваемом примере это sich_helper_achievement_gained)

     

    Так, теперь приступим к процессу формирования задания.

     

    Опишем подробно только второй диалог, который будет активен после взятия задания.

    Первый, на получения квеста можно будет посмотреть в файле dialogs_zaton.xml имя диалога- jup_azot_sborkiquest_init_dialog

    Соответственно русскую транскрипцию диалогов и квестов также не будем приводить. Ее можно будет увидеть в файлах st_quests_zaton.xml и st_dialogs_zaton.xml

     

    Код второго диалога следующий:

    <dialog id="jup_azot_sborkiquest_find_dialog">    
           <has_info>jup_azot_quest_sborki_give</has_info>    
           <precondition>dialogs_zaton.actor_has_first_or_second_grenader_item</precondition>    
               <phrase_list>
               <phrase id="0">    
                       <text>jup_azot_quest_sborki_find_begin</text>    
                       <next>1</next>
               </phrase>
               <phrase id="1">
                       <text>jup_azot_quest_sborki_find_what</text>
                       <next>11</next>
                       <next>12</next>
                       <next>13</next>
                       <next>14</next>
               </phrase>
               <phrase id="11">     
                       <text>jup_azot_quest_sborki_find_first_item</text>
                       <precondition>dialogs_zaton.if_actor_has_zat_grenader_stalker_flash</precondition>
                       <action>dialogs_zaton.transfer_zat_grenader_stalker_flash</action>
                       <action>dialogs_jupiter.jup_b43_reward_for_first_artefact</action>                   
                       <give_info>jup_azot_quest_sborki1_done</give_info>
                       <next>111</next>
                       <next>112</next>                   
               </phrase>
         <phrase id="111">
                       <text>jup_azot_quest_sborki_find_item_flash</text>                   
                       <dont_has_info>jup_azot_quest_sborki2_done</dont_has_info>
               </phrase>
               <phrase id="112">
                       <text>jup_azot_quest_sborki_find_item_all</text>
                       <has_info>jup_azot_quest_sborki2_done</has_info>
                       <has_info>jup_azot_quest_sborki1_done</has_info>
               </phrase>
               <phrase id="12">     
                       <text>jup_azot_quest_sborki_find_second_item</text>
                       <precondition>dialogs_zaton.if_actor_has_zat_grenader_stalker_gran_instrument</precondition>
                       <action>dialogs_zaton.transfer_zat_grenader_stalker_gran_instrument</action>
                       <action>dialogs_jupiter.jup_b43_reward_for_second_artefact</action>                   
                       <give_info>jup_azot_quest_sborki2_done</give_info>
                       <next>121</next>
                       <next>122</next>                   
               </phrase>
        <phrase id="121">
                       <text>jup_azot_quest_sborki_find_item_instr</text>                   
                       <dont_has_info>jup_azot_quest_sborki1_done</dont_has_info>
               </phrase>
               <phrase id="122">
                       <text>jup_azot_quest_sborki_find_item_all</text>
                       <has_info>jup_azot_quest_sborki2_done</has_info>
                       <has_info>jup_azot_quest_sborki1_done</has_info>
               </phrase>
               <phrase id="13">     
                       <text>jup_azot_quest_sborki_find_first_or_second_item</text>
                       <precondition>dialogs_zaton.actor_has_first_and_second_grenader_item</precondition>
                       <action>dialogs_zaton.transfer_zat_grenader_stalker_flash</action>
                       <action>dialogs_zaton.transfer_zat_grenader_stalker_gran_instrument</action>
                       <action>dialogs_jupiter.jup_b43_reward_for_both_artefacts</action>                   
                       <give_info>jup_azot_quest_sborki1_done</give_info>
                       <give_info>jup_azot_quest_sborki2_done</give_info>
                       <next>131</next>
               </phrase>
         <phrase id="131">
                       <text>jup_azot_quest_sborki_find_end</text>
               </phrase>            
         <phrase id="14">
                       <text>jup_azot_quest_sborki_find_nothing</text>
                       <action>dialogs.break_dialog</action>
               </phrase>                
           </phrase_list>    
           </dialog>

    начнем по-порядку разбирать особенности этого диалога:

     

    - обязательными условиями его активации будет наличие инфопоршня выдачи задания jup_azot_quest_sborki_give, а также функции прекондишина actor_has_first_or_second_grenader_item

    - будет происходить выбор четырех последующих фраз для генерации в зависимости от наличия у ГГ квестовых предметов.

    - четвертая, имеющая нулевое значение отрицания- будет активна при любых условиях.

    - первая и вторая- когда у ГГ есть один из двух необходимых предметов активны при наличии выполнения соответствующих прекондишинов if_actor_has_zat_grenader_stalker_flash и if_actor_has_zat_grenader_stalker_gran_instrument. при этом проиходит передача этого предмета НПС функции (transfer_....),получении от НПС награды на каждом этапе и выдача инфопорции на обновление задания. первый и второй этапы- взаимоисключающие. одновременно они не могут быть активны.

    - третья- когда у ГГ есть оба необходимых предмета. происходит их передача и завершение квеста.

     

    добавим все скриптовые функции в файл dialogs_zaton.script

    function jup_azot_quest_sborki_give()    
           task_manager.get_task_manager():give_task("geonezis_azot_quest_sborki_give")    
    end    
    
    function zat_b33_relocate_money_to_azot(first_speaker, second_speaker)    
        dialogs.relocate_money_from_actor(first_speaker, second_speaker, 500)    
    end
    
    function actor_has_first_or_second_grenader_item(first_speaker, second_speaker)
        return first_speaker:object("af_baloon") ~= nil or first_speaker:object("af_gold_fish") ~= nil
    end
    
    function actor_has_first_and_second_grenader_item(first_speaker, second_speaker)
        return first_speaker:object("af_baloon") ~= nil and first_speaker:object("af_gold_fish") ~= nil
    end
    
    function if_actor_has_zat_grenader_stalker_flash(first_speaker, second_speaker)
        return first_speaker:object("af_baloon") ~= nil and first_speaker:object("af_gold_fish") == nil    
    end
    
    function if_actor_has_zat_grenader_stalker_gran_instrument(first_speaker, second_speaker)
        return first_speaker:object("af_gold_fish") ~= nil and first_speaker:object("af_baloon") == nil
    end
    
    function transfer_zat_grenader_stalker_flash(first_speaker, second_speaker)
         dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_baloon")
    end
    
    function transfer_zat_grenader_stalker_gran_instrument(first_speaker, second_speaker)
         dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_gold_fish")
    end

    Описывать их нет смысла- они все элементарные.

    Аналогично не будем расписывать процесс добавления диалогов нпс и регистрацию инфопоршней. Все это приведено в предыдущем уроке.

     

    Отметим особенности квеста.

     

    В файле tm_zaton.ltx добавим код задания

     

    --|>
    [geonezis_azot_quest_sborki_give]
    icon = ui_inGame2_Kontrakt_s_uchenimi
    prior = 1    
    storyline = false
    title = {+jup_azot_quest_sborki2_done -jup_azot_quest_sborki1_done} zat_sich_bring_1_name, {+jup_azot_quest_sborki1_done -jup_azot_quest_sborki2_done} zat_sich_bring_2_name, {+jup_azot_quest_sborki1_done +jup_azot_quest_sborki2_done} zat_sich_thanks_for_2_items_name, {-jup_azot_quest_sborki1_done -jup_azot_quest_sborki2_done} zat_sich_sborki_started_name
    descr = {+jup_azot_quest_sborki2_done -jup_azot_quest_sborki1_done} zat_sich_bring_1_text, {+jup_azot_quest_sborki1_done -jup_azot_quest_sborki2_done} zat_sich_bring_2_text, {+jup_azot_quest_sborki1_done +jup_azot_quest_sborki2_done} zat_sich_thanks_for_2_items_text, {-jup_azot_quest_sborki1_done -jup_azot_quest_sborki2_done} zat_sich_sborki_started_text
    target = zat_b30_owl_stalker_trader_id
    condlist_0 = {+jup_azot_quest_sborki1_done +jup_azot_quest_sborki2_done} complete
    condlist_1 = {+jup_azot_quest_sborki_give =is_squad_enemy_to_actor(zat_b30_owl_stalker_trader_squad)} fail    
    on_complete = %+zat_geonezis_example_quest_complete%    
    reward_money = 10000    

     

    Тайтлы и дескрипшины задания будут обновляться после второго разговора с НПС, при получении соответствующих инфопоршней. То есть основное отличие от задания из урока № 33 это его обновление после передачи предметов, а не при их получении и наличии в инвентаре ГГ. По завершении задания будет выдаваться инфопоршень zat_geonezis_example_quest_complete необходимый для выдачи ачивмента, который в свою очередь будет теперь необходим для разблокировки следующего смыслового диалога zat_b30_owl_stalker_trader_buy_info

     

    На этом урок завершен. Скачать пример можно тут: http://narod.ru/disk....ar.html

     

     

     

     

    Автор уроков: Geonezis

     

    Добавлено через 9 мин.:

    Создание сложного квеста с использованием объекта класса inventory_box. Особенности- отсутствие диалогов, использование рестрикторов, выдача тайника в качестве награды. Реализация на X-Ray 1.6

     

    Поставленная задача в данном уроке будет заключаться в обучении основным принципам создания сложного квеста в игре Сталкер Зов Припяти с добавление объекта класса inventory_box. Выдача задания будет осуществляться автоматически, в данном случае зададим ее при старте игры. Также будет показан пример задания сложной логики добавленного объекта и ее возможная привязка в процессе реализации квестов.

     

    Само задание будет следующим. При старте ГГ будет получено сообщение о необходимости поиска схрона на территории Земснаряда. Чтобы открыть этот схрон необходимо использоваться два специальных ключа. Нужно будет найти эти отмычки и использовать их для получения доступа к содержимому объекта. После этого квест автоматически завершается. Вместо получения денежной награды происходит выдача координат тайника, также дополнительно добавленного нами.

     

    Необходимые для редактирования файлы:

     

    1. конфигурационные в (gamedata\configs\gameplay\)

    -info_zaton.xml

    2. конфигурационные в (gamedata\configs\misc\)

    - tm_zaton.ltx

    - quest_items.ltx

    - secret_zaton.ltx

    3. конфигурационные в (gamedata\configs\text\rus\)

    - st_quests_zaton.xml

    - st_items_quest.xml

    - ui_st_screen.xml

    4. конфигурационные в (gamedata\configs\scripts\zaton\)

    - файлы логик рестрикторов

    5. скриптовый в (gamedata\scripts\)

    - bind_stalker.script

    - new_tasks.script

    6. all.spawn. (gamedata\spawns\)

    - alife_zaton.ltx

     

    Полный процесс регистрации квестовых предметов во всех файлах и некоторые повторяющиеся моменты не будет описаны, они аналогичны предыдущим урокам. Также текстовая транскрипция будет приведена только в файле с отработанным заданием.

     

    Первоначально создадим новый тайник который будет выдан нам в качестве награды по завершению квеста.

     

    - в файле secret_zaton.ltx добавим тайник в общий список zat_hiding_place_56 и объявим его секцию

    [zat_hiding_place_56]
    wpn_vintorez = 1, 1

    в нем будет находиться один предмет- винторез.

     

    - создадим секцию рестриктора тайника и сам предмет через all.spawn

    [zaton_1867]
    ; cse_abstract properties
    section_name = space_restrictor
    name = zat_hiding_place_56
    position = -443.072845458984,11.5764598846436,-51.894603729248
    direction = 0.000881000014487654,-0.242430001497269,-0.0560249984264374
    ; cse_alife_object properties
    game_vertex_id = 253
    distance = 0
    level_vertex_id = 118142
    object_flags = 0xffffef3e
    custom_data = <<END
    [secret]
    cfg = misc\secret_zaton.ltx
    END
    ; cse_shape properties
    shapes = shape0
    shape0:type = sphere
    shape0:offset = 0,0,0
    shape0:radius = 1
    ; cse_alife_space_restrictor properties
    restrictor_type = 3

    указывается уникальное имя, координаты спанва и файл конфига.

    [zaton_1868]
    ; cse_abstract properties
    section_name = wpn_vintorez
    name = zaton_hiding_wpn_vintorez_1
    position = -443.072845458984,11.5764598846436,-51.894603729248
    direction = -0.0467090010643005,0.650978982448578,1.5079699754715
    ; cse_alife_object properties
    game_vertex_id = 253
    distance = 0
    level_vertex_id = 118142
    object_flags = 0xffffff0f
    custom_data = <<END
    [secret]
    name = zat_hiding_place_56
    END
    ; cse_visual properties
    visual_name = dynamics\weapons\wpn_vintorez\wpn_vintorez
    ; cse_alife_item properties
    condition = 1
    upgrades =               
    ; cse_alife_item_weapon properties
    ammo_current = 90
    upd:condition = 255
    upd:weapon_flags = 0
    upd:ammo_elapsed = 0
    upd:addon_flags = 0
    upd:ammo_type = 0
    upd:weapon_state = 0
    upd:weapon_zoom = 0
    upd:current_fire_mode = 0
    upd:grenade_mode = 0

    указывается визуал модели предмета и принадлежность к тайнику.

     

    Теперь создадим квестовый объект класса inventory_box

     

    В файле алл спавна alife_zaton.ltx добавим секцию

     

    [zaton_1866]
    ; cse_abstract properties
    section_name = inventory_box
    name = zat_test_container
    position = 415.890075683594,-3.38021898269653,231.797317504883
    direction = 0.000230999998166226,-0.715035021305084,-0.000265999988187104
    
    ; cse_alife_object properties
    game_vertex_id = 7
    distance = 0
    level_vertex_id = 1647866
    object_flags = 0xffffff3f
    custom_data = <<END
    [story_object]
    story_id = zat_test_cont_id
    
    [logic]
    cfg = scripts\zaton\zat_test_conteiner.ltx
    END
    
    ; cse_visual properties
    visual_name = dynamics\equipments\quest\safe_container
    
    ; cse_alife_inventory_box properties
    tip = inventory_box_use

    указывается:

    - класс объекта section_name

    - уникальное имя секции name

    - координаты точки спавна

    - прикрепленный файл логики cfg

    - идентификатор для установления метки таргета квеста story_id

    - визуал модели объекта

    - тип объекта

     

    зададим логику нашего объекта в файле zat_test_conteiner.ltx следующим образом:

    [logic]
    active = ph_idle@full_locked
    
    [ph_idle@full_locked]
    nonscript_usable = false
    tips = zat_test_conteiner_full_locked
    on_info = {=actor_has_item(zat_test_key_1) =actor_has_item(zat_test_key_2)} ph_idle@has_two_key, {=actor_has_item(zat_test_key_1) !actor_has_item(zat_test_key_2)} ph_idle@has_one_key, {=actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@has_one_key
    on_info2 = {+zat_test_conteiner_open} ph_idle@open, {+zat_test_one_lock_open} ph_idle@locked
    on_use = {!actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} %+zat_test_quest_find_to_open =spawn_object_in(zat_test_container_item:zat_test_cont_id)%
    
    [ph_idle@has_one_key]
    nonscript_usable = false
    tips = zat_test_conteiner_has_one_key
    on_use = {=actor_has_item(zat_test_key_1) !actor_has_item(zat_test_key_2)} ph_idle@locked %=remove_item(zat_test_key_1) =play_sound(power_switch) +zat_test_one_lock_open%, {=actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@locked %=remove_item(zat_test_key_2) =play_sound(power_switch) +zat_test_one_lock_open%
    on_info = {=actor_has_item(zat_test_key_1) =actor_has_item(zat_test_key_2)} ph_idle@has_two_key, {!actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@full_locked
    on_info2 = {+zat_test_conteiner_open} ph_idle@open, {+zat_test_one_lock_open} ph_idle@locked
    
    [ph_idle@locked]
    nonscript_usable = false
    tips = zat_test_conteiner_locked
    on_info = {=actor_has_item(zat_test_key_1) !actor_has_item(zat_test_key_2)} ph_idle@locked_has_second_key, {=actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@locked_has_second_key
    on_info2 = {+zat_test_conteiner_open} ph_idle@open
    
    [ph_idle@locked_has_second_key]
    nonscript_usable = false
    tips = zat_test_conteiner_has_one_key
    on_use = {=actor_has_item(zat_test_key_1) !actor_has_item(zat_test_key_2)} ph_idle@open %=remove_item(zat_test_key_1) =play_sound(power_switch) +zat_test_conteiner_open%, {=actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@open %=remove_item(zat_test_key_2) =play_sound(power_switch) +zat_test_conteiner_open%
    on_info = {!actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@locked
    on_info2 = {+zat_test_conteiner_open} ph_idle@open
    
    [ph_idle@has_two_key]
    nonscript_usable = false
    tips = zat_test_conteiner_has_two_key
    on_use = {=actor_has_item(zat_test_key_1) =actor_has_item(zat_test_key_2)} ph_idle@open %=play_sound(power_switch) =remove_item(zat_test_key_1) =remove_item(zat_test_key_2) +zat_test_conteiner_open%
    on_info = {=actor_has_item(zat_test_key_1) !actor_has_item(zat_test_key_2)} ph_idle@has_one_key, {=actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@has_one_key, {!actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@full_locked
    on_info2 = {+zat_test_conteiner_open} ph_idle@open
    
    [ph_idle@open]
    nonscript_usable = true
    tips = zat_test_conteiner_open
    on_info = {-zat_test_conteiner_open} %+zat_test_conteiner_open%

     

    Теперь более подробно ее разберем. имеющийся у нас схрон (предмет с данной логикой) будет иметь 6 секций возможного состояния. Нам необходимо открыть его используя два ключа. Поэтому возможны следующие варианты:

    - ящик закрыт. ph_idle@full_locked

    - использован один из ключей ph_idle@locked

    - у актора есть один из ключей ph_idle@has_one_key

    - у актора есть второй ключ при условии что был уже использован любой из первых. ph_idle@locked_has_second_key

    - у актора сразу есть два ключаph_idle@has_two_key

    - ящик вскрыт.ph_idle@open

     

    Общая конструкция секций логики:

    - состоянии запрета использования обработчика nonscript_usable будет true только в одном случае когда ящик открыт.

    - строка с используемой секции надписи указывается в tips сама транскрипция задается в ui_st_screen.xml

    - вызываемое действие определяется в on_use- происходит переход в одно из последующих состояний и удаление предметов.

    - активное состояние определяется из условий on_info

     

    Теперь по порядку разберем каждую из секций. В принципе сложного в построении такой логике ничего нет, решается обыкновенная комбинаторная задача сочетания двух объектов, когда первый ключ есть, второго нет: наоборот второй есть, первого нет; обо есть; ни одного нет.

     

    - активное состояние ph_idle@full_locked- ящик закрыт.

    изначально необходимо его использовать чтобы произошло обновление квеста (выдача инфопорции +zat_test_quest_find_to_open) и спавн внутрь него необходимого нам предмета (=spawn_object_in(zat_test_container_item:zat_test_cont_id)). это действие возможно только когда ключей у актора нет (!actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)).

    если мы сразу нашли оба ключа (=actor_has_item(zat_test_key_1) =actor_has_item(zat_test_key_2)) то происходит переход в секцию ph_idle@has_two_key

    если у гг есть один ключ, но нет другого (не важно какого) то активируется секция ph_idle@has_one_key

    вторые условия on_info2 следующие:

    при получении инфопорции zat_test_conteiner_open происходит переход в ph_idle@open, соответственно при получении zat_test_one_lock_open становиться активной ph_idle@locked

     

    - у актора есть один из ключей ph_idle@has_one_key

    вне зависимости от того какой из ключей был найден при юзании ящика происходит вскрытие одного замка, переход в секцию ph_idle@locked и выполняются следующие действия %=remove_item(zat_test_key_....) =play_sound(power_switch) +zat_test_one_lock_open%

    удаляется один из ключей из инвентаря ГГ, проигрывается звук вскрытия замка, выдается соответствующий инфопоршень вскрытия.

     

    - один из ключей уже использован, второй нет. ph_idle@locked

    это переходная секция юзание ящика при этом невозможно.

    вне зависимости от того какой ключ есть у ГГ (=actor_has_item(zat_test_key_1) !actor_has_item(zat_test_key_2)) или (=actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)) будет осуществлен переход в секцию ph_idle@locked_has_second_key

    дополнительное условие наличие инфопорции zat_test_conteiner_open переход в ph_idle@open

     

    - один из ключей использован, второй в наличии. ph_idle@locked_has_second_key

    при наличии одного из двух ключей =actor_has_item(zat_test_key_...) !actor_has_item(zat_test_key_...) во время юзания происходит переход в секцию ph_idle@open,удаляется один из ключей, проигрывается звук вскрытия, выдается соответствующий инфопоршень.

    основное условие нет ни одного ключа- !actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)происходит переход в состояние ожидания ph_idle@locked

    дополнительное условие аналогично.

     

    - есть оба ключа. ph_idle@has_two_key

    при наличии обоих ключей =actor_has_item(zat_test_key_1) =actor_has_item(zat_test_key_2)

    оба они удаляются. происходит переход в ph_idle@open

    условия при этом- возвращения в необходимые секции когда либо ключей нет, либо есть по одному.

     

    - ключи заюзаны. ph_idle@open

    ящик вскрыт- можно забирать инвентарное содержимое.

     

    Квестовые предметы- ключи (zat_test_key_1, zat_test_key_2) и необходимый для получения из схрона предмет zat_test_container_item добавим в quest_items.ltx

    [zat_test_key_1]:dev_flash_1
    $spawn     = "quest_items\zat_test_key_1"
    visual    = dynamics\equipments\quest\key.ogf
    description   = st_zat_test_key_1_descr
    inv_name   = st_zat_test_key_1
    inv_name_short  = st_zat_test_key_1
    can_trade   = false
    quest_item       = true
    cost    = 0
    inv_grid_width  = 1
    inv_grid_height  = 1
    inv_grid_x   = 4
    inv_grid_y   = 15
    
    [zat_test_key_2]:dev_flash_2
    $spawn     = "quest_items\zat_test_key_2"
    visual    = dynamics\equipments\quest\key.ogf
    description   = st_zat_test_key_2_descr
    inv_name   = st_zat_test_key_2
    inv_name_short  = st_zat_test_key_2
    can_trade   = false
    quest_item       = true
    cost    = 0
    inv_grid_width  = 1
    inv_grid_height  = 1
    inv_grid_x   = 4
    inv_grid_y   = 15
    
    [zat_test_container_item]:device_pda
    $spawn     = "quest_items\zat_test_container_item"
    visual    = dynamics\equipments\quest\notes_document_case_3.ogf
    inv_weight   = 0.05
    inv_grid_width  = 2
    inv_grid_height  = 1
    inv_grid_x   = 18
    inv_grid_y   = 20
    $prefetch    = 16
    description   = st_zat_test_container_item_descr
    inv_name   = st_zat_test_container_item
    inv_name_short  = st_zat_test_container_item
    can_trade   = false
    quest_item       = true
    cost    = 0

     

    Сам квест имеет следующий вид:

    --|>
    [geonezis_test_quest]
    icon = ui_inGame2_Karti_mestnosti
    prior = 1   
    storyline = false
    title = {+zat_test_quest_find_to_open} zat_test_quest_title1, {-zat_test_quest_find_to_open} zat_test_quest_title0
    descr = {+zat_test_quest_find_to_open} zat_test_quest_text1, {-zat_test_quest_find_to_open} zat_test_quest_text0
    target = {+zat_test_quest_find_to_open} zat_test_cont_id, {-zat_test_quest_find_to_open} zat_test_cont_id
    condlist_0 = {=actor_has_item(zat_test_container_item)} complete
    on_complete = %+zat_test_quest_complete%
    ;=give_treasure(zat_hiding_place_31:zat_hiding_place_49

     

    В принципе он элементарный. До первого юзания ящика активна первая секция, после активна секция на поиск ключей. Квест завершается при наличии у ГГ необходимого и взятого из ящика предмета =actor_has_item(zat_test_container_item)

     

    Скрипт на спавн ключей будет иметь следующий вид:

    --/Квест Example
    function task_spec()
    local level_name=level.name()
       if level_name=="zaton" then
        if has_alife_info("zat_test_quest_find_to_open") and not has_alife_info("zat_test_quest_spawn_items") then       
          local rnd_quest_items_1=math.random(1,2)      
          if rnd_quest_items_1==1 then
            alife():create("zat_test_key_1",vector():set(369.470,-5.291,281.921),1579200,67)
            alife():create("zat_test_key_2",vector():set(368.114,-5.228,281.887),1577301,67)
            news_manager.send_tip(db.actor, "Чтобы выполнить тестовое задание необходимо вскрыть заблокированный модуль. Для этого необходимо найти два ключа оставленные в тайниках сталкерами.", nil, nil, 14000)
            db.actor:give_info_portion("zat_test_quest_spawn_items")
            elseif rnd_quest_items_1==2 then
            alife():create("zat_test_key_1",vector():set(366.925,-5.202,281.718),1575412,67)
            alife():create("zat_test_key_2",vector():set(365.569,-5.450,281.175),1573410,67)      
            news_manager.send_tip(db.actor, "Чтобы выполнить тестовое задание необходимо вскрыть заблокированный модуль. Для этого необходимо найти два ключа оставленные в тайниках сталкерами.", nil, nil, 14000)
            db.actor:give_info_portion("zat_test_quest_spawn_items")
            end             
          end
        if has_alife_info("zat_test_quest_complete") and not has_alife_info("zat_test_quest_tainik_give") then
          treasure_manager.get_treasure_manager():give_treasure("zat_hiding_place_56")
          db.actor:give_info_portion("zat_test_quest_tainik_give")
        end
      end
    end

    ключи спавняться рандомно в двух точках, после первого юзания ящика (получении инфопоршня zat_test_quest_find_to_open) Выдача тайника происходит по завершении квеста. Может быть сделано это двумя способами или внутри скрипта, или внутри задания.

     

    Включение квестового скрипта в обработку аналогично как и в других уроках. Выдача самого квеста на старте игры также по аналогии.

    Скачать файл с уроком можно по ссылке http://narod.ru/disk....ar.html

     

     

     

    Автор уроков: Geonezis

    • Нравится 1
  7. Создание квеста с добавлением дополнительных внутриэтапных заданий. Особенности- отсутствие диалогов, использование физических объектов класса physic_destroyable_object в качестве квестовых предметов. Реализация на X-Ray 1.6

     

    В данном уроке речь пойдет о реализации задания подобного тому что было рассмотрено в предыдущем уроке. В отличие от него теперь добавление внутриэтапных заданий будет завязано не на применение рестрикторов, а на использование физических объектов специального класса. Задание секций этих объектов будет осуществлено также как и в моде SGM (автор GeJorge) Еще одной особенностью будет добавление класса метки объекта (также по аналогии с SGM) что позволит отказаться от применения рестрикторов в определенных моментах. Выдача задания осуществляется при старте игры. Диалогов нет.

     

    Само задание:

     

    ГГ на ПДА приходит сообщение о необходимости обыска трех точек с установленными там объектами. Необходимо выяснить что это за объекты и вернуться в стартовую точку. После этого задание автоматически завершается. Выдача награды не предусмотрена.

     

    Необходимые для редактирования файлы:

     

    1. конфигурационные в (gamedata\configs\gameplay\)

    -info_zaton.xml

    2. конфигурационные в (gamedata\configs\misc\)

    - tm_zaton.ltx

    - quest_items.ltx

    3. конфигурационные в (gamedata\configs\text\rus\)

    - st_quests_zaton.xml

    - ui_st_screen.xml

    4. конфигурационные в (gamedata\configs\models\)

    - dynamic_objects.ltx

    5. конфигурационные в (gamedata\configs\scripts\zaton\)

    - файлы логик рестрикторов и объектов

    6. скриптовый в (gamedata\scripts\)

    - bind_stalker.script

    - new_tasks.script

    7. all.spawn. (gamedata\spawns\)

    - alife_zaton.ltx

    8. физическая модель в (gamedata\meshes\dynamics\box\)

    - konteyner.ogf

     

    Некоторые этапы добавления изменений будут приведены с сокращением, ввиду их схожести с аналогичными в других уроках. Акцент будет сделан на впервые вносимые изменения и аспекты.

     

    Изначально создадим новые классы квестовых предметов.

     

    Класс родительского предмета метка будет соответствовать стандартному квестовому device_pda, но будет иметь визуал "нулевого значения". поэтому при написания квестов и установки тагета в них можно будет воспользоваться именно этим приемом, а не добавлением цели на индивидуальном айди отдельного рестриктора. пропишем в quest_items.ltx секцию

    [quest_spot]:device_pda
    $spawn  = "devices\quest_spot"
    visual    = dynamics\scene_objects\part\part_none.ogf
    can_take = false

     

    сами добавленные метки имеют следующие секции. как видим они являются потомками родительского класса quest_spot. также указывается айди метки по которому будет прописываться таргет story_id.

     

    [zat_test_stalker_container_1_spot]:quest_spot
    story_id = zat_test_stalker_container_1_spot
    
    [zat_test_stalker_container_2_spot]:quest_spot
    story_id = zat_test_stalker_container_2_spot
    
    [zat_test_stalker_container_3_spot]:quest_spot
    story_id = zat_test_stalker_container_3_spot

     

    Новый физический объект используемый нами в квесте объявим в файле dynamic_objects.ltx

    . Он будет иметь свой уникальный класс наследуемый от основного physic_destroyable_object Секции конфигов будут следующими:

     

    [box_quest_item]:physic_destroyable_object
    $spawn                      = "dynamic_objects\box\box_quest_item"
    visual              = dynamics\box\konteyner.ogf
    
    [zat_test_stalker_container_1]:box_quest_item
    custom_data       = scripts\zaton\inventory_boxs\zat_test_stalker_container_1.ltx
    
    [zat_test_stalker_container_2]:box_quest_item
    custom_data       = scripts\zaton\inventory_boxs\zat_test_stalker_container_2.ltx
    
    [zat_test_stalker_container_3]:box_quest_item
    custom_data       = scripts\zaton\inventory_boxs\zat_test_stalker_container_3.ltx

     

    В основной секции указывается физическая модель предмета visual. В уникальных секциях указываются секции конфигов custom_data

     

    Логика добавленных предметов будет задаваться в файлах zat_test_stalker_container_....ltx следующим образом:

     

    [logic]
    active = ph_idle@retranslator_take
    
    [ph_idle@retranslator_take]
    nonscript_usable = false
    tips = st_take_the_quest_item
    on_use = ph_idle@retranslator_heavy %+zat_test_quest_item_1_used%
    on_info = {+zat_test_quest_complete} sr_idle@nil
    
    [ph_idle@retranslator_heavy]
    nonscript_usable = false
    tips = st_quest_item_is_used
    on_info = {+zat_test_quest_complete} sr_idle@nil
    
    [sr_idle@nil]

     

    - активная секция логики ph_idle@retranslator_take

    - первоначальная активная надпись считывается из секции st_take_the_quest_item

    - при юзании предмета произойдет выдача инфопорции zat_test_quest_item_1_used и переход во вторую секцию логики ph_idle@retranslator_heavy

    - при этом изменяется активная надпись на st_quest_item_is_used

    - при получении инфопорции zat_test_quest_complete логика обнуляется.

     

    Теперь необходимо создать основной рестриктор на обход которого будет завязана основа квеста.

     

    Сам рестриктор создаем в all.spawn по аналоги с предыдущими уроками.

    Логика рестриктора из файла zat_restr_logic_main.ltx имеет следующий вид:

     

    [logic]     
    active = sr_idle@start     
    
    [sr_idle@start]
    on_info = {+zat_test_quest_begin -zat_test_quest_rest_main_come =actor_in_zone(zat_test_quest_restrictor_main)} %=give_task(geonezis_zat_test_example_task_1) =give_task(geonezis_zat_test_example_task_2) =give_task(geonezis_zat_test_example_task_3) +zat_test_quest_rest_main_come%
    on_info2 = {+zat_test_quest_rest_main_come} sr_idle@wait
    
    [sr_idle@wait]
    on_info = {+zat_test_quest_all_item_used -zat_test_quest_complete =actor_in_zone(zat_test_quest_restrictor_main)} %+zat_test_quest_complete%
    on_info2 = {+zat_test_quest_complete} sr_idle@nil
    
    [sr_idle@nil]

    разберем ее:

     

    - имеет три секции первая активная, во вторую переходит по совокупности полученных условий при обновлении квеста. - при этом происходит выдача трех подзаданий.

    - для перехода в нулевую секцию необходимо завершение задания.

     

    Выдача задания будет происходит при старте ГГ одновременно с квестами основного сюжета. Для этого добавим инфопоршень выдачи и сам квест в секцию логики [sr_idle] оригинального рестриктор zat_b101_logic.ltx

    =give_task(geonezis_zat_test_example_task) +zat_test_quest_begin    

     

    Определим сам квест с подзаданиями:

     

    основной квест:

    [geonezis_zat_test_example_task]    
    icon = ui_inGame2_Osobiy_zakaz    
    prior = 1    
    storyline = false    
    title = {+zat_test_quest_all_item_used} zat_test_example_title2, {+zat_test_quest_rest_main_come -zat_test_quest_all_item_used} zat_test_example_title1, {-zat_test_quest_rest_main_come} zat_test_example_title0    
    descr = {+zat_test_quest_all_item_used} zat_test_example_text2, {+zat_test_quest_rest_main_come -zat_test_quest_all_item_used} zat_test_example_text1, {-zat_test_quest_rest_main_come} zat_test_example_text0    
    target = {+zat_test_quest_all_item_used} zat_restr_main_id, {+zat_test_quest_rest_main_come -zat_test_quest_all_item_used} nil, {-zat_test_quest_rest_main_come} zat_restr_main_id       
    condlist_0 = {+zat_test_quest_complete} complete    
    on_complete = %=inc_faction_goodwill_to_actor(stalker:50)%

     

    внутренние подквесты (приведен только первый, два других по аналогии):

     

    [geonezis_zat_test_example_task_1]
    icon = ui_inGame2_Osobiy_zakaz    
    prior = 1
    storyline = false
    title =  zat_test_example_1_title0    
    descr =  zat_test_example_1_text0    
    target = zat_test_stalker_container_1_spot
    condlist_0 = {+zat_test_quest_item_1_used} complete

     

    Особенности:

    - При старте задания необходимо посетить зону основного рестриктора, устанавливается тагет на zat_restr_main_id. В момент посещения активируются подквесты, выдается инфопоршень zat_test_quest_rest_main_come, задание обновляется, его тагет уходит в nil. после юзания всех квестовых айтемов созданных в начале объектов проиходит завершение всех трех подквестов, основной квест обновляется снова. чтобы завершить его необходимо снова посетить точку основного рестриктора.

     

    Скриптовая функция которая отвечает за создание трех основных квестовых предметов и выдачу завершающего основное задание инфопоршня прописывается в файл new_tasks.script, и объявляется в апдейте актора файла bind_stalker.script

     

    new_tasks.task_spec()    

     

    сама функция

     

    --/Квест Example
    function task_spec()
    local level_name=level.name()
      if level_name=="zaton" then
         if has_alife_info("zat_test_quest_begin") and not has_alife_info("zat_test_quest_spawn_items") then          
           alife():create("zat_test_stalker_container_1_spot",vector():set(210.996811,15.980440,480.381104),1323235,6)
           alife():create("zat_test_stalker_container_2_spot",vector():set(267.914307,17.374102,483.001709),1424536,6)
           alife():create("zat_test_stalker_container_3_spot",vector():set(305.260254,18.979174,532.515625),1484018,287)      
           news_manager.send_tip(db.actor, "Для начала займи указанную точку", nil, nil, 14000)
           db.actor:give_info_portion("zat_test_quest_spawn_items")              
           end
         if has_alife_info("zat_test_quest_rest_main_come") and not has_alife_info("zat_test_quest_spawn_items_2") then        
           alife():create("zat_test_stalker_container_1",vector():set(210.996811,15.980440,480.381104),1323235,6)
           alife():create("zat_test_stalker_container_2",vector():set(267.914307,17.374102,483.001709),1424536,6)
           alife():create("zat_test_stalker_container_3",vector():set(305.260254,18.979174,532.515625),1484018,287)         
           news_manager.send_tip(db.actor, "Чтобы выполнить тестовое задание необходимо исследовать все контейнеры.", nil, nil, 14000)
           db.actor:give_info_portion("zat_test_quest_spawn_items_2")              
         end
         if has_alife_info("zat_test_quest_item_1_used") and has_alife_info("zat_test_quest_item_2_used") and has_alife_info("zat_test_quest_item_3_used") and    
         not has_alife_info("zat_test_quest_all_item_used") then
         db.actor:give_info_portion("zat_test_quest_all_item_used")
       end
      end
    end

    описание:

    - первоначально по выдаче задания происходит создания меток дополнительных подквестов.

    - при выдачи самих подквестов происходит создание самих предметов необходимых для их выполнения.

    - при наличии трех инфопорций полученных от юзания всех предметов выдается общий инфопоршень на обновление основного задания.

     

    Все инфопоршни необходимые нам пропишем в файле info_zaton.xml

    Всю текстовую транскрипцию определим в xml-файлах.

    На этом урок завершен.

    Файл с отработанным задание можно скачать тут: http://narod.ru/disk....ar.html

     

     

     

    Создание квеста с добавлением дополнительных внутриэтапных заданий. Особенности- отсутствие диалогов, добавление тайников в качестве квестовых предметов. Реализация на X-Ray 1.6

     

    Основной отличительной особенностью этого урока от предыдущего является только то, что выполнение внутренних подквестов будет завязано на исследовании тайников (взятие квестовых предметов из них). Будет показан принцип добавление в игру тайников определенных отдельным классом и их заполнение различными предметами. Поэтому урок будет приведен по максимуму сокращенно, с указанием только основных особенностей и списком всех используемых файлов. Полностью просмотреть вносимые изменения вы сможете скачав пример с отработанным заданием или же изучив материал из предыдущего урока.

     

    Необходимые для изменения файлы:

     

    1. конфигурационные в (gamedata\configs\gameplay\)

    -info_zaton.xml

    2. конфигурационные в (gamedata\configs\misc\)

    - tm_zaton.ltx

    - quest_items.ltx

    3. конфигурационные в (gamedata\configs\text\rus\)

    - st_quests_zaton.xml

    4. конфигурационные в (gamedata\configs\scripts\zaton\)

    - файлы логик рестрикторов и объектов

    6. скриптовый в (gamedata\scripts\)

    - bind_stalker.script

    - new_tasks.script

    7. all.spawn. (gamedata\spawns\)

    - alife_zaton.ltx

     

    Определим в файле quest_items.ltx две родительские секции для создания предмета нового класса "квестовый рюкзак".

    [default_inventory_box]
    GroupControlSection    = spawn_group
    discovery_dependency    =
    $spawn    = "devices\default_inventory_box"
    class   = O_INVBOX
    cform   = skeleton
    visual   = dynamics\devices\dev_rukzak\dev_rukzak.ogf
    script_binding          = bind_physic_object.init
    radius                  = 3
    inv_grid_width  = 2
    inv_grid_height  = 2
    inv_grid_x  = 0
    inv_grid_y  = 38
    cost   = 3500
    can_take  = true
    inv_weight  = 1.14
    description  =   
    inv_name  =   
    inv_name_short  =   
    
    [quest_rukzak]:default_inventory_box
    $spawn    = "devices\quest_rukzak"
    visual   = dynamics\devices\dev_rukzak\dev_rukzak.ogf

     

    В дальнейшем нами будет использоваться переопределенный класс quest_rukzak с заданным нами визуалом dynamics\devices\dev_rukzak\dev_rukzak.ogf. В классе default_inventory_box определяются другие основные параметры.

     

    Вся остальная структура добавляемых изменений аналогично указанным ранее. По другом задается только основной квестовый скрипт в файле new_tasks.script

     

    --/Квест Example
    function task_spec()
    local level_name=level.name()
       if level_name=="zaton" then
          if has_alife_info("zat_test_quest_begin") and not has_alife_info("zat_test_quest_spawn_items") then         
             alife():create("zat_test_stalker_container_1_spot",vector():set(210.996811,15.980440,480.381104),1323235,6)
             alife():create("zat_test_stalker_container_2_spot",vector():set(267.914307,17.374102,483.001709),1424536,6)
             alife():create("zat_test_stalker_container_3_spot",vector():set(305.260254,18.979174,532.515625),1484018,287)     
             news_manager.send_tip(db.actor, "Для начала займи указанную точку", nil, nil, 14000)
             db.actor:give_info_portion("zat_test_quest_spawn_items")             
          end
          if has_alife_info("zat_test_quest_rest_main_come") and not has_alife_info("zat_test_quest_spawn_items_2") then       
             local x1_cell=alife():create("quest_rukzak",vector():set(210.996811,15.980440,480.381104),1323235,6)
                    parse_table=utils.parse_spawns("zat_test_quest_item_info_1,af_medusa,wpn_ak74,stalker_outfit,wpn_pm")
                      for k,v in pairs(parse_table) do
                        for i=1,v.prob do
                        alife():create(v.section,vector(),0,0,x1_cell.id)
                      end
             end
             local x2_cell=alife():create("quest_rukzak",vector():set(267.914307,17.374102,483.001709),1424536,6)
                    parse_table=utils.parse_spawns("zat_test_quest_item_info_2,af_ice,wpn_abakan,dolg_outfit,wpn_pm")
                      for k,v in pairs(parse_table) do
                        for i=1,v.prob do
                        alife():create(v.section,vector(),0,0,x2_cell.id)
                      end
             end
             local x3_cell=alife():create("quest_rukzak",vector():set(305.260254,18.979174,532.515625),1484018,287)
                    parse_table=utils.parse_spawns("zat_test_quest_item_info_3,af_fire,wpn_lr300,svoboda_light_outfit,wpn_pm")
                      for k,v in pairs(parse_table) do
                        for i=1,v.prob do
                        alife():create(v.section,vector(),0,0,x3_cell.id)
                      end
             end            
             news_manager.send_tip(db.actor, "Чтобы выполнить тестовое задание необходимо исследовать все тайники.", nil, nil, 14000)
             db.actor:give_info_portion("zat_test_quest_spawn_items_2")             
          end
          if (not has_alife_info("zat_test_quest_item_1_used")) and has_alife_info("zat_test_quest_spawn_items_2") and  db.actor:object("zat_test_quest_item_info_1") then       
            db.actor:give_info_portion("zat_test_quest_item_1_used")       
          end
          if (not has_alife_info("zat_test_quest_item_2_used")) and has_alife_info("zat_test_quest_spawn_items_2") and db.actor:object("zat_test_quest_item_info_2") then       
          db.actor:give_info_portion("zat_test_quest_item_2_used")       
          end
          if (not has_alife_info("zat_test_quest_item_3_used")) and has_alife_info("zat_test_quest_spawn_items_2") and db.actor:object("zat_test_quest_item_info_3") then       
          db.actor:give_info_portion("zat_test_quest_item_3_used")       
          end
          if has_alife_info("zat_test_quest_item_1_used") and has_alife_info("zat_test_quest_item_2_used") and has_alife_info("zat_test_quest_item_3_used") and   
          not has_alife_info("zat_test_quest_all_item_used") then
          db.actor:give_info_portion("zat_test_quest_all_item_used")
          end
     end
    end

    Особенности:

    - при старте задания создаются квестовые метки

    - при достижении позиции актора внутри основного рестриктора происходит создание трех квестовых тайников quest_rukzak по заданным координатам и их заполнение различными предметами.

    - при обыски тайника и взятии ГГ квестового предмета из него происходит выдача инфопоршеней на завершение внутренних подзаданий.

    - после обыска всех трех тайников выдается основной инфопоршень на обновление основного задания.

     

    Файл с отработанным заданием можно скачать тут: http://narod.ru/disk....ar.html

     

     

     

     

    Автор уроков: Geonezis

    • Нравится 1
  8. Создание квеста с добавлением дополнительных внутриэтапных подзаданий. Особенности- отсутствие диалогов, использование рестрикторов. Реализация на X-Ray 1.6

     

    Автор урока: GEONEZIS

    Поставленная задача в данном уроке будет заключаться в обучении основным принципам создания среднего по сложности квеста в игре Сталкер Зов Припяти без использования каких-либо диалогов. Выдача задания будет осуществляться автоматически, в данном случае зададим ее при старте игры. Также будет показан прием добавления во внутреннею структуру основного задания нескольких дополнительных подквестов и объяснение применение рестриторов на всех поставленных этапах.

     

    Само задание следующее: При старте ГГ на ПДА придет сообщение о необходимости установки схронов. Осущесвляется выдача квеста. Необходимо забрать утерянные рюкзаки и заложить их в трех указанных точках. После этого задание автоматически завершается. Выдача награды не предусмотрена.

     

    Необходимые для редактирования файлы:

     

    1. конфигурационные в (gamedata\configs\gameplay\)

    -character_desc_jupiter.xml

    -info_zaton.xml

    2. конфигурационные в (gamedata\configs\misc\)

    - tm_jupiter.ltx

    - quest_items.ltx

    - devices.ltx

    - death_generic.ltx

    3. конфигурационные в (gamedata\configs\text\rus\)

    - st_quests_zaton.xml

    - st_items_quest.xml

    - ui_st_screen.xml

    4. конфигурационные в (gamedata\configs\misc\trade\)

    - trade_generic.ltx

    5. конфигурационные в (gamedata\configs\ui\)

    - game_tutorials.xml

    6. конфигурационные в (gamedata\configs\scripts\zaton\)

    - файлы логик рестрикторов

    7. скриптовый в (gamedata\scripts\)

    - ui_si.script

    - bind_stalker.script

    - new_tasks.script

    - xr_effects.script

    8. all.spawn. (gamedata\spawns\)

    - alife_zaton.ltx

     

    На первоначальном этапе определимся с квестовыми предметами. Всего их шесть. Три будут отвечать за айтем рюкзака до его закладки. Они будут являться потомками основного родительского класса device_pda. Другие три будут определены иным классом, им будет соответствовать установленная логика и они отвечают за рюкзаки после установки схрона. Пропишем секции их конфигов в файле quest_items.ltx (Здесь и далее буду приводить конфиг только одной секции, остальные задаются аналогично только с изменением числовых значений в имени).

    [zat_example_taynik_1_item]:device_pda
    $spawn     = "quest_items\zat_example_taynik_1_item"
    description   = zat_example_taynik_item_descr
    inv_name   = zat_example_taynik_item_name
    visual    = dynamics\devices\dev_rukzak\dev_rukzak.ogf
    inv_weight   = 2
    story_id    = zat_example_taynik_1_item
    can_trade   = false
    quest_item       = true
    inv_grid_width  = 2
    inv_grid_height  = 2
    inv_grid_x      = 0
    inv_grid_y      = 38
    ..........
    [zat_example_taynik_1]:default_inventory_box
    custom_data         = scripts\zaton\inventory_boxs\zat_example_taynik_1.ltx
    ..........

    Первый конфиг не содержит в себе прикрепленного файла в дополнительной секции и определяется как простой квестовый предмет, второй же содержит прикрепленный конфиг с логикой его zat_example_taynik_1.ltx

    Для определении секции zat_example_taynik_1 необходимо определить родительский класс

    default_inventory_box в файле devices.ltx

    [default_inventory_box]
    GroupControlSection    = spawn_group
    discovery_dependency    =
    $spawn    = "devices\default_inventory_box"
    class   = O_INVBOX
    cform   = skeleton
    visual   = dynamics\devices\dev_rukzak\dev_rukzak.ogf
    script_binding          = bind_physic_object.init
    radius                  = 3
    inv_grid_width  = 2
    inv_grid_height  = 2
    inv_grid_x  = 0
    inv_grid_y  = 38
    cost   = 3500
    can_take  = true
    inv_weight  = 1.14
    description  =              
    inv_name  =              
    inv_name_short  =

    В этой секции указываются основные параметры такие как основной класс, форма, визуал.

    Кроме того определим его основную логику в конфигурационном файле zat_example_taynik_1.ltx

    logic]
    active = ph_idle@nothing
    
    [ph_idle@nothing]
    nonscript_usable = true
    tips = st_taynik_check_descr

     

    Здесь указывается активная секция это ph_idle@nothing, а также ее содержание.

    Тайник после установки можно использовать, т.е. возможно его наполнение различными предметами, также при наведении на него будет активна надпись из секции st_taynik_check_descr

     

    Зарегистрируем конфиги первой секции предмета тайник zat_example_taynik_..._item.

    В файле death_generic.ltx пропишем код

    .....
    zat_example_taynik_1_item = true
    zat_example_taynik_2_item = true
    zat_example_taynik_3_item = true

    В файле ui_si.script добавим

    "zat_example_taynik_1_item",
    "zat_example_taynik_2_item",
    "zat_example_taynik_3_item",

     

    Обозначим секции, логику и работу рестрикторов необходимых для выполнения внутренних подквестов.

     

    В файле alife_zaton.ltx обозначим три секции

    [zaton_999999011]
    ; cse_abstract properties
    section_name = space_restrictor
    name = zat_test_quest_restrictor_1
    position = 210.996811,15.980440,480.381104
    direction = 0,0.841602981090546,0
    
    ; cse_alife_object properties
    game_vertex_id = 6
    distance = 0
    level_vertex_id = 1323235
    object_flags = 0xffffff3e
    custom_data = <<END
    
    [story_object]            
    story_id = zat_restr_1_id
    
    [logic]
    cfg = scripts\zaton\zat_restr_logic_1.ltx
    END
    
    ; cse_shape properties
    shapes = shape0            
    shape0:type = box            
    shape0:axis_x = 4,0,0            
    shape0:axis_y = 0,3.13100147247314,0            
    shape0:axis_z = 0,0,2            
    shape0:offset = 0,0,0

    В секции указываются координаты и тип рестрикторов, их идентификатор, имя, тип и размер шейпа.

     

    В файле логики zat_restr_logic_1.ltx пропишем:

     

    [logic]            
    active = sr_idle@start            
    
    [sr_idle@start]            
    on_info  = {+zat_test_quest_rest_main_come =actor_in_zone(zat_test_quest_restrictor_1) =actor_has_item(zat_example_taynik_1_item)} sr_idle@tutorial %=run_tutorial(zat_test_quest_1_tutor)%            
    on_info2 = {+zat_test_quest_restr_1} sr_idle@nil            
    
    [sr_idle@tutorial]            
    on_info   = {+zat_test_quest_rest_main_come !actor_in_zone(zat_test_quest_restrictor_1)} sr_idle@start %=stop_tutorial%            
    on_info2 = {+zat_test_quest_restr_1} sr_idle@nil            
    on_info3 = {!has_active_tutorial} sr_idle@start            
    
    [sr_idle@nil]            

    Отметим особенности:

    Активная секция sr_idle@start переход на вторую происходит по достижению трех условий

    - наличие инфопоршня активности второго этапа основного задания (zat_test_quest_rest_main_come)

    - актор находиться в зоне действия рестриктора

    - наличие в его инвентаре zat_example_taynik_1_item

    При выполнении всех этих условий выполняется работа рестриктора определяемая в туториале zat_test_quest_1_tutor

    При получении инфопоршня zat_test_quest_restr_1 происходит переход в третью нулевую секцию логики рестриктора sr_idle@nil

    При выхода актора из зоны рестриктора его работа прекращается и логика переключается во второе состояние sr_idle@tutorial из которого она может снова перейти в первое или в третье.

     

    Объявим в файле game_tutorials.xml туторы выполняемые в работе рестрикторов

    <zat_test_quest_1_tutor>          
                  <global_wnd/>          
                     <item>          
                         <disabled_key>quit</disabled_key>          
                         <length_sec/>          
                         <action id="use" finalize="1">xr_effects.zat_test_quest_1</action>          
                         <guard_key>use</guard_key>          
                         <grab_input>0</grab_input>          
                             <main_wnd>          
                             <auto_static start_time="0" length_sec="5000" x="512" y="660" width="300" height="60" alignment="c" stretch="1"la_cyclic="1" la_texture="1" la_alpha="1">          
                             <text font="graffiti22" r="225" g="225" b="250" a="255" align="c">zat_test_quest_tips</text>          
                             </auto_static>          
                             </main_wnd>          
                     </item>          
                 </zat_test_quest_1_tutor>

    Основные параметры это функция скрипта обработчика действия xr_effects.zat_test_quest_1 и активная надпись из секции zat_test_quest_tips

    В файле xr_effects.scripts определим функции

    function zat_test_quest_1(actor, npc)          
                 if xr_conditions.actor_in_zone(actor, npc, {"zat_test_quest_restrictor_1"})          
                    then                
                    remove_item(actor, npc, {"zat_example_taynik_1_item"})             
                    alife():create("zat_example_taynik_1",vector():set(210.996811,15.980440,480.381104),1323235,6)
                    db.actor:give_info_portion("zat_test_quest_restr_1")             
                 end          
    end

    Опишем ее:

    - если выполнено условие нахождение актора в зоне рестриктора zat_test_quest_restrictor_1

    то происходит удаление из инвентаря ГГ айтема первого конфига тайника zat_example_taynik_1_item, создается по заданным координатам второй zat_example_taynik_1 и выдается инфопоршень zat_test_quest_restr_1

     

    Выдача задания будет происходит при старте ГГ одновременно с квестами основного сюжета. Для этого добавим инфопоршень выдачи и сам квест в секцию логики [sr_idle] оригинального рестриктор zat_b101_logic.ltx

    =give_task(geonezis_zat_test_example_task) +zat_test_quest_begin

    Выдача подквестов будет осуществлять в логике другого рестриктора zat_restr_logic_main.ltx Его секция прописывается в all.spawn по аналогии с предыдущими. Сама логика имеет следующий вид:

    [logic]       
    active = sr_idle@start       
    
    [sr_idle@start]
    on_info = {+zat_test_quest_begin -zat_test_quest_rest_main_come =actor_in_zone(zat_test_quest_restrictor_main)} %=give_task(geonezis_zat_test_example_task_1) =give_task(geonezis_zat_test_example_task_2) =give_task(geonezis_zat_test_example_task_3) +zat_test_quest_rest_main_come%
    on_info2 = {+zat_test_quest_rest_main_come} sr_idle@nil
    
    [sr_idle@nil]

    В активной секции при попадании актора в зону рестриктора происходит выдача внутренних подквестов и переход логики в нулевое состояние.

     

    Определим сам квест с подзаданиями:

    [geonezis_zat_test_example_task]      
    icon = ui_inGame2_Osobiy_zakaz      
    prior = 1      
    storyline = false      
    title = {+zat_test_quest_rest_main_come} zat_test_example_title1, {-zat_test_quest_rest_main_come} zat_test_example_title0      
    descr = {+zat_test_quest_rest_main_come} zat_test_example_text1, {-zat_test_quest_rest_main_come} zat_test_example_text0      
    target ={+zat_test_quest_rest_main_come} nil, {-zat_test_quest_rest_main_come} zat_restr_main_id         
    condlist_0 = {+zat_test_quest_complete} complete      
    on_complete = %=inc_faction_goodwill_to_actor(stalker:50)%

    Подквесты:

    [geonezis_zat_test_example_task_1]
    icon = ui_inGame2_Osobiy_zakaz
    prior = 1
    storyline = false
    title =  zat_test_example_1_title     
    descr =  zat_test_example_123_text     
    target = zat_restr_1_id
    condlist_0 = {+zat_test_quest_restr_1} complete
    on_complete = %=inc_faction_goodwill_to_actor(stalker:50)%

    Особенности:

    - При старте задания необходимо посетить зону основного рестриктора, устанавливается тагет на zat_restr_main_id. В момент посещения активируются подквесты, выдается инфопоршень zat_test_quest_rest_main_come, задание обновляется, его тагет уходит в nill. после взятия всех квестовых айтемов- необходимо завершение всех трех подквестов для получения инфопоршня zat_test_quest_complete

     

    Скриптовая функция которая отвечает за создание трех основных квестовых предметов и выдачу завершающего основное задание инфопоршня прописывается в файл new_tasks.script, и объявляется в апдейте актора файла bind_stalker.script

    new_tasks.task_spec()

    сама функция

    --/Квест Example
    function task_spec()
    local level_name=level.name()
         if level_name=="zaton" then
            if has_alife_info("zat_test_quest_begin") and not has_alife_info("zat_test_quest_spawn_items") then         
               alife():create("zat_example_taynik_1_item",vector():set(248.498016,14.915686,484.567932),1391296,6)
               alife():create("zat_example_taynik_2_item",vector():set(247.778076,14.872326,484.085999),1390040,6)
               alife():create("zat_example_taynik_3_item",vector():set(247.055069,14.796996,483.116058),1388814,6)
            news_manager.send_tip(db.actor, "Чтобы выполнить тестовое задание необходимо установить все тайники. Подбери рюкзаки оставленные сталкерами", nil, nil, 14000)
            db.actor:give_info_portion("zat_test_quest_spawn_items")               
            end
         if has_alife_info("zat_test_quest_restr_1") and has_alife_info("zat_test_quest_restr_2") and has_alife_info("zat_test_quest_restr_3") and     
         not has_alife_info("zat_test_quest_complete") then
            db.actor:give_info_portion("zat_test_quest_complete")
         end
         end
    end

    Описание:

    При нахождении ГГ на локации Затон и наличии инфопоршня zat_test_quest_begin создаются квестовые айтемы и отправляется мессадж на пда ГГ.

    При завершении всех трех подквестов выдается инфопоршень zat_test_quest_complete завершения основного.


    Все инфопоршни необходимые нам пропишем в файле info_zaton.xml

    .....
    <info_portion id="zat_test_quest_restr_1"></info_portion>
    <info_portion id="zat_test_quest_restr_2"></info_portion>
    <info_portion id="zat_test_quest_restr_3"></info_portion>    
    <info_portion id="zat_test_quest_spawn_items"></info_portion>
    <info_portion id="zat_test_quest_begin"></info_portion>
    <info_portion id="zat_test_quest_complete"></info_portion>
    <info_portion id="zat_test_quest_rest_main_come"></info_portion>
    .....

    Всю текстовую транскрипцию определим в соответствующий xml-файлах. Квестовые айтемы тайников можно занести в файлы торговли.

    На этом урок завершен.

    Файл с отработанным задание можно скачать тут: http://narod.ru/disk....ar.html

     

     

     

     

    • Нравится 2
  9. Evgeny2009, всего у наемников 4 квеста.

    - Пропавший отряд

    - Разбитый караван

    - Покушение на Валета

    - Слабый маяк

    Если ты их все выполнил, то других заданий не будет.

    idolo, попробуй переиграть с момента взятия квеста.

     

  10. Создание многоэтапного квеста на последовательный поиск предметов. Реализация на X-Ray 1.6

    Автор урока: GEONEZIS


    Поставленная задача состоит в обучения принципам построения сложных многоходовых заданий на чистой игре Сталкер Зов Припяти. Будет показан процесс построения сложного диалога с ветвлением, последовательный спавн квестовых предметов через скрипт и собственно структура многоуровнего квеста.
    Задание следующее. Новиков просит ГГ принести для него разбросанные по локации сканеры аномалий. Квест будет построен таким образом что необходим исключительно поэтапный вариант его прохождения, то есть от одной точки к другой, без каких-либо вариантов. Получить один предмет раньше другого не будет предоставляться возможным.

    Необходимые для редактирования файлы:
    1. конфигурационные в (gamedata\configs\gameplay\)
    -character_desc_jupiter.xml
    -dialogs_jupiter.xml
    -info_jupiter.xml

    2. конфигурационные в (gamedata\configs\misc\)
    - tm_jupiter.ltx
    - quest_items.ltx
    - death_generic.ltx

    3. конфигурационные в (gamedata\configs\text\rus\)
    - st_dialogs_jupiter.xml
    - st_quests_jupiter.xml
    - st_items_quest.xml

    4. конфигурационные в (gamedata\configs\misc\trade\)
    - trade_generic.ltx
    5. скриптовый в (gamedata\scripts\)
    - dialogs_jupiter.script
    - ui_si.script
    - bind_stalker.script
    - new_tasks.script


    Рассмотрим структуру квестовых диалогов. Для этого откроем dialogs_jupiter.xmlи в самом низу добавим два диалога. Один активный при старте задания. Второй на завершение. В принципе можно было объединить их в один, но рассмотрим более легкий вариант. Однока при этом внесем разнообразие в процесс выдачи задания предоставив несколько вариантов его получения внутри диалога. Этот несколько освежит стандартные методы диалогостроения, когда все они делаются последовательными, без каких-либо вариантов.

    1- ый диалог:
    <dialog id="jup_b6_scientist_tech_quest_anomalies_scaner">           
        <dont_has_info>jup_novikov_quest_zaton_scanner_start</dont_has_info>
            <phrase_list>
               <phrase id="0">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_0</text>
                           <next>1</next>                       
                </phrase>
                <phrase id="1">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_1</text>
                           <next>2</next>                       
                </phrase>
                <phrase id="2">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_2</text>
                           <action>dialogs_jupiter.jup_b6_create_first_scaner</action>
                           <next>3</next>                       
                </phrase>
                <phrase id="3">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_3</text>
                           <next>4</next>        
                           <next>5</next>
                           <next>6</next>           
                </phrase>          
                <phrase id="4">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_4</text>
                           <next>41</next>                       
                </phrase>
                <phrase id="41">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_41</text>
                           <next>401</next>        
                           <next>402</next>           
                       </phrase>
                <phrase id="401">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_401</text>
                           <next>4011</next>                       
                       </phrase>
                <phrase id="4011">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_4011</text>
                           <next>4012</next>                       
                       </phrase>
                <phrase id="4012">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_4012</text>
                           <next>4013</next>
                           <action>dialogs_jupiter.give_novikov_zaton_scaner_quest</action>                       
                       </phrase>
                <phrase id="4013">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_4013</text>
                           <give_info>jup_novikov_quest_zaton_scanner_start</give_info>           
                       </phrase>          
                <phrase id="402">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_402</text>
                           <next>4021</next>                       
                       </phrase>
                <phrase id="4021">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_4021</text>
                           <next>4022</next>                       
                       </phrase>
                <phrase id="4022">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_4022</text>
                           <next>4023</next>
                           <action>dialogs_jupiter.give_novikov_zaton_scaner_quest</action>                       
                       </phrase>
                <phrase id="4023">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_4023</text>
                           <give_info>jup_novikov_quest_zaton_scanner_start</give_info>           
                </phrase>          
                <phrase id="5">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_5</text>
                           <next>51</next>                       
                </phrase>
                <phrase id="51">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_51</text>
                           <next>52</next>                       
                </phrase>
                <phrase id="52">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_52</text>
                           <next>53</next>                       
                </phrase>
                <phrase id="53">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_53</text>
                           <action>dialogs_jupiter.jup_b6_to_actor_give_spez_outfit</action>
                           <next>531</next>
                           <next>532</next>                       
                       </phrase>
                <phrase id="531">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_531</text>
                           <next>5312</next>                       
                       </phrase>
                <phrase id="5312">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_5312</text>
                           <next>5313</next>
                           <action>dialogs_jupiter.give_novikov_zaton_scaner_quest</action>           
                       </phrase>
                <phrase id="5313">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_5313</text>
                           <give_info>jup_novikov_quest_zaton_scanner_start</give_info>           
                </phrase>          
                <phrase id="532">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_532</text>
                           <next>5321</next>
                           <action>dialogs_jupiter.give_novikov_zaton_scaner_quest</action>                       
                       </phrase>
                <phrase id="5321">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_5321</text>
                           <give_info>jup_novikov_quest_zaton_scanner_start</give_info>           
                </phrase>          
                <phrase id="6">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_6</text>
                           <next>61</next>                       
                </phrase>                   
                <phrase id="61">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_61</text>
                           <next>611</next>                       
                </phrase>
                <phrase id="611">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_611</text>
                           <action>dialogs_jupiter.give_novikov_zaton_scaner_quest</action>
                           <next>6111</next>                       
                </phrase>
                <phrase id="6111">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_6111</text>
                           <give_info>jup_novikov_quest_zaton_scanner_start</give_info>           
                </phrase>          
                 </phrase_list>
               </dialog>

    2-ой диалог:
    <dialog id="jup_b6_scientist_tech_quest_anomalies_scaner_end">
                   <has_info>jup_novikov_quest_zaton_scanner_have_6</has_info>
                   <dont_has_info>jup_novikov_quest_zaton_scanner_end</dont_has_info>
            <precondition>dialogs_jupiter.actot_have_all_zaton_scaner</precondition>
                   <phrase_list>
                <phrase id="0">
                       <text>jup_b6_scientist_tech_quest_anomalies_scaner_end_0</text>
                       <action>dialogs_jupiter.actot_to_novikov_give_zaton_scaner</action>
                           <next>1</next>
                       </phrase>
                       <phrase id="1">
                           <text>jup_b6_scientist_tech_quest_anomalies_scaner_end_1</text>
                           <give_info>jup_novikov_quest_zaton_scanner_end</give_info>
                       </phrase>                   
                   </phrase_list>
               </dialog>

    Сразу же пропишем русскую транскрипцию в st_dialogs_jupiter.xmlдля того чтобы понимать о чем в диалоге идет речь :
    <string id="jup_b6_scientist_tech_quest_anomalies_scaner_0">
             <text>Приветствую, хотел бы оказал вам максимально возможное содействие. Какого рода помощь тебе необходима?</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_1">
             <text>В принципе есть одно небольшое дело, главное это твое желание работать.</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_2">
             <text>Я готов.Что нужно делать?</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_3">
             <text>Прекрасно. Правда придется немного побегать. Мне необходимо получить кое-какие данные.</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4">
             <text>Замеры? Необходимо будет устанавливать какие-нибудь сканеры?</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_41">
             <text>Нет, устанавливать не придется. Их уже установили. Тебе же наоборот придется их собрать и доставить сюда, чтобы я смог получить с них результаты замеров.</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_401">
             <text>Что за сканеры-то? Аномальная активность?</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4011">
             <text>Обыкновенные сканеры аномалий. Их показатели результатов замеров будут мне необходимы для проведения настройки моего оборудования.</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4012">
             <text>Все ясно. Придется взять научный комбез. Передавай координаты.</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4013">
             <text>Уже загрузил. Комбез это хорошая тема. Обязательно возьми. И смотри не сварись в аномалиях.</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_402">
             <text>Кто их устанавливал и куда мне придется отправиться?</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4021">
             <text>Тебе то не все-равно, кто их размещал. Пару дней назад, сталкеры из Свободы - сойдет такой ответ? Не о том думаешь. Твоя задача отправиться на Затон, пробежаться по точкам и вернуться назад живым вместе со сканерами. Все ясно?</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4022">
             <text>Все. Передавай координаты.</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4023">
             <text>Уже загрузил. Комбез научный только одень. И смотри не сварись в аномалиях.</text>
            </string>        
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_5">
             <text>А может еще что нужно?</text>
            </string>        
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_51">
             <text>Нет, хотя может быть потом я подберу для тебя работку. Но сначала ты должен будешь добыть результаты измерений с установленных на Затоне сканеров аномалий.</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_52">
             <text>Искать сканеры в аномалиях. Ха, веселая преспектива. Без специального научного костюма мне там долго не пролазить...</text>
            </string>        
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_53">
             <text>Намек понял. Вот держи ССП-99. Неплохой костюм, хотя и поношенный. Координаты сканеров я тебе загрузил.</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_531">
             <text>Хотя бы кровь с костюма отмыли? По-любому с трупака какого-нибудь своего ботанического дружка сняли...</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_5311">
             <text>Ой, ну давай мне не заливай..Тоже мне брезгливый нашелся. У самого-то, чай не первой свежести костюмчик..</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_5312">
             <text>Проехали Кулибин. Все, я отправляюсь за замерами...</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_5313">
             <text>Поосторожнее там...</text>
            </string>        
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_532">
             <text>Все понял, отправляюсь.</text>
            </string>        
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_5321">
             <text>Поосторожнее там...</text>
            </string>        
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_6">
             <text>Хорошо, я сделаю то что нужно. Говори с чего начинать.</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_61">
             <text>Вот это деловой разговор, делового человека. Вообщем план таков. Сначала ты находишь на Затоне сканеры аномалий, установленные там нашими сподручными сталкерами. Координаты я тебе уже сбросил. Потом, я может быть посмотрю еще что для тебя..</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_611">
             <text>Все ясно, Кулибин. Жди, я за твоими сканерами.</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_6111">
             <text>Поосторожнее там. В аномалиях не сгинь...</text>
            </string>        
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_end_0">
             <text>Вот все твои сканеры.</text>
            </string>
            <string id="jup_b6_scientist_tech_quest_anomalies_scaner_end_1">
             <text>Отличная работа. Немедленно начинаю работу над обработкой результатов замеров. Новую работу получишь позже. А пока гуляй.</text>
            </string>

    Теперь разберем структуру представленных диалогов:

    - Во втором диалоге нет ничего сложного: активен при наличие инфопоршня jup_novikov_quest_zaton_scanner_have_6, исчезает после выдачи jup_novikov_quest_zaton_scanner_end, имеет прекондишн actot_have_all_zaton_scanerкогда в инвенторе ГГ наличие всех квестовых предметов. содержит один акшион actot_to_novikov_give_zaton_scanerна передачу предметов заказчику.
    - первый диалог сложнее. основная особенность это вложенная тройная разветвленность, когда можно выбрав одну из трех веток получить один и тот же результат.
    - внутри каждой из веток также имеет место дополнительные ответвления.
    - старт задания происходит по выдачи акшиона give_novikov_zaton_scaner_questсопровождается также выдачей инфопоршня jup_novikov_quest_zaton_scanner_start
    - создание первого квестового предмета происходит также внутри диалога- акшион
    jup_b6_create_first_scaner
    - чисто для атмосферности происходит выдача ГГ костюма для выполнения задания при выборе одной из трех веток.
    это акшион jup_b6_to_actor_give_spez_outfit


    Объявим используемые инфопоршни в info_jupiter.xml. Добавим в конце файла код:
    <!--New Quests-->
          <info_portion id="jup_novikov_quest_zaton_scanner_start"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_end"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_have_1"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_create_2"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_have_2"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_create_3"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_have_3"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_create_4"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_have_4"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_create_5"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_have_5"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_create_6"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_have_6"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_create_7"></info_portion>
             <info_portion id="jup_novikov_quest_zaton_scanner_have_7"></info_portion>


    Добавим наши диалоги НПС (В данном случае Новикову) для этого в файл character_desc_jupiter.xmlв его профиль <specific_character id="jup_b6_scientist_tech" team_default="1">добавим строки диалогов
    .....
    <actor_dialog>jup_b6_scientist_tech_quest_anomalies_scaner</actor_dialog>
    <actor_dialog>jup_b6_scientist_tech_quest_anomalies_scaner_end</actor_dialog>
    .....

    С диалогами и инфопоршнями разобрались теперь добавим необходимые для выполнения квеста предметы.

    В файл quest_items.ltxпропишем семь секций предметов zat_spec_anomaly_scanner_№. Все предметы являются квестовыми- невозможна их продажа и выкладывание из инвентаря ГГ.
    [zat_spec_anomaly_scanner_1]:device_pda
    $spawn     = "quest_items\zat_spec_anomaly_scanner_1"
    description   = zat_spec_anomaly_scanner_1_descr
    inv_name   = zat_spec_anomaly_scanner_1_name
    visual    = dynamics\equipments\quest\scanner_anomaly.ogf
    inv_weight   = 2
    story_id    = zat_spec_anomaly_scanner_1
    can_trade   = false
    quest_item       = true
    inv_grid_width  = 1
    inv_grid_height  = 2
    inv_grid_x   = 10
    inv_grid_y   = 23

    В файл death_generic.ltxпропишем: (в данном случае также необязательно так как генерации в инвентаре НПС нет)
    .......
    zat_spec_anomaly_scanner_1 = true
    zat_spec_anomaly_scanner_2 = true
    zat_spec_anomaly_scanner_3 = true
    zat_spec_anomaly_scanner_4 = true
    zat_spec_anomaly_scanner_5 = true
    zat_spec_anomaly_scanner_6 = true
    zat_spec_anomaly_scanner_7 = true
    .....

    В файл ui_si.scriptв таблицу info_tableдобавим (для спавна, в принципе работать будет и без внесения в этот файл):

    ........
    "zat_spec_anomaly_scanner_1"
    "zat_spec_anomaly_scanner_2"
    "zat_spec_anomaly_scanner_3"
    "zat_spec_anomaly_scanner_4"
    "zat_spec_anomaly_scanner_5"
    "zat_spec_anomaly_scanner_6"
    "zat_spec_anomaly_scanner_7"
    ........

    В файл st_items_quest.xmlпропишем дескрипцию предметов.

    <string id="zat_spec_anomaly_scanner_1_name">
           <text>«Сканер грави-химического симбионта»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_1_descr">
           <text>«Специализированный сканер аномальной активности из серии 32.1351. Используется учеными для изучения процессов происходящих в грави-химическом симбионте»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_2_name">
           <text>«Сканер химической аномалии»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_2_descr">
           <text>«Специализированный сканер аномальной активности из серии 27.7724. Используется учеными для изучения процессов происходящих в химической аномалии»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_3_name">
           <text>«Сканер гравитационной аномалии»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_3_descr">
           <text>«Специализированный сканер аномальной активности из серии 78.9835. Используется учеными для изучения процессов происходящих в гравитационной аномалии»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_4_name">
           <text>«Сканер термальной аномалии»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_4_descr">
           <text>«Специализированный сканер аномальной активности из серии 47.3246. Используется учеными для изучения процессов происходящих в термальной аномалии»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_5_name">
           <text>«Сканер пси-статической аномалии»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_5_descr">
           <text>«Специализированный сканер аномальной активности из серии 06.8912. Используется учеными для изучения процессов происходящих в пси-статической аномалии»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_6_name">
           <text>«Сканер термального симбионта»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_6_descr">
           <text>«Специализированный сканер аномальной активности из серии 35.0205. Используется учеными для изучения процессов происходящих в термальном симбионте»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_7_name">
           <text>«Сканер электро-статической аномалии»</text>
          </string>
          <string id="zat_spec_anomaly_scanner_7_descr">
           <text>«Специализированный сканер аномальной активности из серии 03.1392. Используется учеными для изучения процессов происходящих в электро-статической аномалии»</text>
          </string>

    В файле trade_generic.ltxпропишем торговлю. также нужно добавлять индивидуально во все остальные файлы конфигов торговли. (но не обязательно)
    .....
    zat_spec_anomaly_scanner_1          ;NO TRADE
    zat_spec_anomaly_scanner_2          ;NO TRADE
    zat_spec_anomaly_scanner_3          ;NO TRADE
    zat_spec_anomaly_scanner_4          ;NO TRADE
    zat_spec_anomaly_scanner_5          ;NO TRADE
    zat_spec_anomaly_scanner_6          ;NO TRADE
    zat_spec_anomaly_scanner_7          ;NO TRADE
    ......

    С квестовыми предметами также разобрались, теперь необходимо разобраться со скриптами квеста. Собственно теперь мы и подходим к основной сути нашего урока, в этом этапе заключен его основной смысл.

    В файле dialogs_jupiter.scriptдобавим следующие функции:
    function jup_b6_create_first_scaner(first_speaker, second_speaker)
           alife():create("zat_spec_anomaly_scanner_1",vector():set(-436.574,-6.527,170.169),116113,16)     
    end
    
    function jup_b6_to_actor_give_spez_outfit(first_speaker, second_speaker)
           dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, "scientific_outfit")
    end
    
    function give_novikov_zaton_scaner_quest()     
            task_manager.get_task_manager():give_task("geonezis_jup_spec_scaner")        
    end
    
    function actot_to_novikov_give_zaton_scaner(first_speaker, second_speaker)
           local items_table = {"zat_spec_anomaly_scanner_1","zat_spec_anomaly_scanner_2","zat_spec_anomaly_scanner_3","zat_spec_anomaly_scanner_4","zat_spec_anomaly_scann    er_5","zat_spec_anomaly_scanner_6","zat_spec_anomaly_scanner_7"}
           for k,v in pairs(items_table) do
              if db.actor:object(v) ~= nil then
                 dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, v)       
              end
           end     
    end
    
    function actot_have_all_zaton_scaner(first_speaker, second_speaker)
           return db.actor:object("zat_spec_anomaly_scanner_1")~=nil and db.actor:object("zat_spec_anomaly_scanner_2")~=nil and     
           db.actor:object("zat_spec_anomaly_scanner_3")~=nil and db.actor:object("zat_spec_anomaly_scanner_4")~=nil and     
           db.actor:object("zat_spec_anomaly_scanner_5")~=nil and db.actor:object("zat_spec_anomaly_scanner_6")~=nil and
           db.actor:object("zat_spec_anomaly_scanner_7")~=nil        
    end

    коротко их поясним:
    - спавн первого квестового предмета
    - передача бронекостюма ГГ
    - выдача задания
    - передача всех квестовых предметов НПС
    - скрипт проверки наличия в инвенторе ГГ всех необходимых предметов

    Теперь создадим файл new_tasks.scriptи добавим в него следующий код одной основной функции task_spec():

    --/Квест:Сканеры аномалий
    function task_spec()
    local level_name=level.name()
    if level_name=="zaton" then
        if has_alife_info("jup_novikov_quest_zaton_scanner_start") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_1")) and db.actor:object("zat_spec_anomaly_scanner_1") then    
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_1")              
        end
        if has_alife_info("jup_novikov_quest_zaton_scanner_have_1") and (not has_alife_info("jup_novikov_quest_zaton_scanner_create_2")) then    
           alife():create("zat_spec_anomaly_scanner_2",vector():set(-304.058,12.450,-159.233),339472,21)
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_create_2")              
        end
        if has_alife_info("jup_novikov_quest_zaton_scanner_create_2") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_2")) and db.actor:object("zat_spec_anomaly_scanner_2") then    
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_2")              
        end
        if has_alife_info("jup_novikov_quest_zaton_scanner_have_2") and (not has_alife_info("jup_novikov_quest_zaton_scanner_create_3")) then    
           alife():create("zat_spec_anomaly_scanner_3",vector():set(-68.024,1.398,-164.391),807200,235)        
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_create_3")              
        end
        if has_alife_info("jup_novikov_quest_zaton_scanner_create_3") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_3")) and db.actor:object("zat_spec_anomaly_scanner_3") then    
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_3")              
        end
        if has_alife_info("jup_novikov_quest_zaton_scanner_have_3") and (not has_alife_info("jup_novikov_quest_zaton_scanner_create_4")) then    
           alife():create("zat_spec_anomaly_scanner_4",vector():set(10.842,8.966,-394.252),964903,8)
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_create_4")              
        end
        if has_alife_info("jup_novikov_quest_zaton_scanner_create_4") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_4")) and db.actor:object("zat_spec_anomaly_scanner_4") then    
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_4")              
        end
        if has_alife_info("jup_novikov_quest_zaton_scanner_have_4") and (not has_alife_info("jup_novikov_quest_zaton_scanner_create_5")) then    
           alife():create("zat_spec_anomaly_scanner_5",vector():set(272.490,11.985,-289.525),1431789,43)
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_create_5")              
        end
        if has_alife_info("jup_novikov_quest_zaton_scanner_create_5") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_5")) and db.actor:object("zat_spec_anomaly_scanner_5") then    
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_5")              
        end
        if has_alife_info("jup_novikov_quest_zaton_scanner_have_5") and (not has_alife_info("jup_novikov_quest_zaton_scanner_create_6")) then    
           alife():create("zat_spec_anomaly_scanner_6",vector():set(400.209,-0.202,439.740),1630730,242)
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_create_6")              
        end
        if has_alife_info("jup_novikov_quest_zaton_scanner_create_6") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_6")) and db.actor:object("zat_spec_anomaly_scanner_6") then    
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_6")              
        end
        if has_alife_info("jup_novikov_quest_zaton_scanner_have_6") and (not has_alife_info("jup_novikov_quest_zaton_scanner_create_7")) then    
           alife():create("zat_spec_anomaly_scanner_7",vector():set(-347.855,40.160,-383.796),259035,29)          
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_create_7")              
        end
        if has_alife_info("jup_novikov_quest_zaton_scanner_create_7") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_7")) and db.actor:object("zat_spec_anomaly_scanner_7") then    
           db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_7")              
        end
      end    
    end

    Основная особенность скрипта это последовательный спавн квестовых предметов. Последующий будет создаваться только после того как был найден предыдущий. Также происходит выдача инфопоршней используемых в структуре самого квеста. Еще одна особенность это установка дополнительной проверки в зависимости от локации.

    Созданный нами скрипт необходимо обьявить в функции апдейта актора actor_binder:update(delta)в файле bind_stalker.script

    .....
    new_tasks.task_spec()
    .....

    Теперь собственно перейдем к созданию самого задания.
    Код секции квеста ([geonezis_jup_spec_scaner]) можно просмотреть в файле tm_jupiter.ltxв архиве с отработанным примером.
    Основные особенности это наличие двух кондишинов один на завершение задания, второй на его провал (в случае если сквад ученых бункера станет врагами по отношению к ГГ). По завершению задания будет повышена репутация у группировки экологов, а также выдана награда.
    Структура квеста последовательная. Одна секция тайтлов, дескрипшинов и меток заменаяет другую при получении соответсвующих им инфопоршней. Всего 7 таких этапов. Инфопоршни используемые в задании выдаются также последовательно. Определяемыми являются те которые обновляются при спавне (jup_novikov_quest_zaton_scanner_create_№), а не при взятии предмета.

    На этом урок завершен.
    Файл с отработанным заданием можно скачать здесь: http://narod.ru/disk....ar.html

    • Нравится 2
  11. LLIBED, а лог ошибки ошибки никак не привести? Последние 25 строк под спойлер. Без него только такие рекомендации: пробуй запустить игру от имени администратора, отключи автосохранение в меню.
  12. Sutorihin2011, после переустановки необходима новая игра. старые сейвы не пойдут. возможен только вариант их загрузки если были сохранены файлы pstor-переменных в gamedata\configs\mod_parameters\save_data\

     

    Рос, скорее всего мог быть поврежден файл gamedata/configs/mod_parameters/save_data/save_data.sgm поэтому придется переустанавливать мод и начинать новую игру.

     

    kalter, посмотри в меню игры настройки громкости звука- был иногда такой баг что значения ползунков обнулялись.

     

    =Wanderer=, этот параметр создается в реестре вручную. в меню regedit выбирай правка\создать\параметр DWWORD

    Строгое предупреждение от модератора monk
    Заглавные буквы отсутствуют. Устное замечание.
  13. Sutorihin2011, приходить туда нужно когда в первый раз возвращаешься с Юпитера при активном задании на юзание Скатов. У одного из бандитов-алкашей будет КПК. С его активации стартует квест.

    rocket1972, попробуй откатиться и переиграть. Если все же словил глюк и переигровка не поможет, то придется в ручную выдавать нужные инфопорши для продолжения этой квестовой ветки.

     

  14. Strannik726, нет. Это второстепенный квест- на прохождение сюжета не влияет.

    lotosman каждый квестовый предмет в этом задании имеет по 5 точек рандомного спавна на территории базы. Поэтому конкретно для твоего случае тебе врятли дадут ответ. Как вариант можешь зайти на оф. сайт SGM и в теме помощи прохождения версии 2.2 посмотреть два поста со скринами некоторых точек спавна. Приводить участки кода из скрипта с координатами этих точек я не буду, так как все-равно это мало кому поможет.

  15. rocket1972 и остальные у кого такая ошибка с логом:

    [error]Description : ...files\stalker Зов Припяти\gamedata\scripts\_g.script:4413: attempt to index local 'file' (a nil value)

    запускайте игру от имени администратора и отключите опцию авто сохранения в меню.

     

    Добавлено через 4 мин.:

    rocket1972 по первому логу на 2.1 в подземелье Агропрома. Необходимо перейти на статическое освещение, снизить игровые настройки по минимуму и откатиться с предыдущего сейва.

  16. Zidvan, лучше перекачай и переставь. Скорее всего ты что-то напортачил при установке. Этого вылета при старте игры никогда не было.

    Или чтобы конкретно его вылечить нужно прописать в файл w_sections.ltx (gamedata\configs\weapons\weapons\) следующую секцию:

    [mod_ak74_damage]
    hit_power               = 0.42,0.42,0.42,0.42
    hit_impulse             = 200
    hit_type                = fire_wound
    fire_distance           = 250
    bullet_speed            = 550
    rpm                     = 700
    rpm_empty_click         = 200
    silencer_hit_power      = 0.41,0.41,0.41,0.41
    silencer_hit_impulse    = 200
    silencer_fire_distance  = 210
    silencer_bullet_speed   = 400

  17. артем, создай и пропиши эту секцию wpn_crosshair_spec_5 в файл scopes_16.xmlscopes.xml) путь (gamedata\configs\ui\). Также придется добавлять туда секции и остальных прицельные сеток от weid.

     

    Добавлено через 4 мин.:

    York, вылет в подземельях Агропрома лечиться откаткой к предыдущим сейвам и переигровкой с понижением игровых настроек на минимум.

  18. Фикс динамических новостей

    1.Рандомную ошибку вида (решение от makdm)
    gamedata\scripts\vs_send_news.script:726: attempt to concatenate local 'SndName' (a nil value)
    2. Ошибку на Агропроме (решение от GEONEZIS) вида
    gamedata\scripts\vs_send_news.script:72: attempt to index field '?' (a nil value)
    скачать

    паньчо, твой второй лог этим лечится.

    Добавил в шапку темы. Спасибо. (fox6666)

AMK-Team.ru

×
×
  • Создать...