Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Создание и редактирование квестов
denis2000Дата: Пн, 10.10.2011, 21:25 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Создание и редактирование квестов

Создание новых квестов и редактирование существующих

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


Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7

Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML
[cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл:
1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R])
2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx"
3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо)
Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#"
Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]

[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти?
Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда.
Для того чтоб найти LOG необходимо зайти вот сюда:

В Win хр лог находится:

C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs

Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.

В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs

Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка:
...
$app_data_root$ = true | false| $fs_root$| users\
(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx)
...
$logs$ = true| false| $app_data_root$| logs\
(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи)
...
[/cut][cut=Получение более подробной информации о вылете (ХОВАН)]
Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...)
Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так:
Code
function abort(fmt, ...)
                       local reason = string.format(fmt, ...)
                       error_log(reason)
end

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

Первый:
Code
Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line          : 748
Description   : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil)

Второй:
Code
Expression    : 0
Function      : ErrorLog
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp
Line          : 49
Description   : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic'

[/cut]


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


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Вс, 17.02.2013, 21:05 | Сообщение # 91
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Ааз,
Может, это не имеет значения, но у всех НПС, логику которых я просматривал, on_death = death пишется под ссылкой на активную секцию логики. Попробуй первый абзац в логике ренегата написать так:

[logic]
active = remark1
danger = danger_ignore
on_death = death
 
АазДата: Вс, 17.02.2013, 21:46 | Сообщение # 92
Хозяин Зоны
Зомби
Награды: 30
Репутация: [ 0 ]

sergej5500, и даже так не помогает...Квест-то делался на основе тутора от Johann, но неточностей там хватает...По идее нужен новый тутор...

Добавлено (17.02.2013, 21:46)
---------------------------------------------
Да и кстати, меток на персонажах так и не появилось. Ни на НПСе, которого требуется убить, ни на квестодателе после убийства НПС.


 
sergej5500Дата: Вс, 17.02.2013, 22:17 | Сообщение # 93
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Ааз,
Нашел у Вас одну ошибку. В скрипте вы запускаете квест zat_renegat_kill_give, а в tm_zaton квест называется zat_renegat_kill. Поэтому метки не появляются. Квест не активируется. Я поправил у себя эту ошибку и попробовал запустить квест. Всё получилось. Метки перескочили и диалоги отработали нормально.

Добавлено (17.02.2013, 22:17)
---------------------------------------------
Ааз,
В варианте
[cut=квест][zat_renegat_kill]
icon = ui_inGame2_Bezopasnoe_mesto
storyline = false
title = {+zat_renegat_mertv} zat_renegat_kill_quest_name1, zat_renegat_kill_quest_name
descr = {+zat_renegat_mertv} zat_renegat_kill_quest_text1, zat_renegat_kill_quest_name
target = {+zat_renegat_mertv} zat_demiurg, {-zat_renegat_mertv} zat_renegat
condlist_0 = {+zat_renegat_kill_done} complete
on_complete = %=inc_faction_goodwill_to_actor(stalker:40)%
reward_money = 4500
[/cut]
квест вполне рабочий. Нужно вызывать его так:
[cut=скрипт]function zat_renegat_kill_quest()
task_manager.get_task_manager():give_task("zat_renegat_kill")
end
[/cut]


Сообщение отредактировал sergej5500 - Вс, 17.02.2013, 22:19
 
АазДата: Вс, 17.02.2013, 22:31 | Сообщение # 94
Хозяин Зоны
Зомби
Награды: 30
Репутация: [ 0 ]

sergej5500, огромное спасибо за помощь. Квест я протестировал. В общем-то всё ок, только метка почему-то на квестодателя не переходит и при взятии задания оно сразу же обновляется. А потом обновляется еще раз, когда НПС погибает.

 
sergej5500Дата: Пн, 18.02.2013, 00:06 | Сообщение # 95
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Ааз,
Метку можно поставить только на объект, имеющий story_id.
Добавь в zat_stalkers.ltx в секцию [zat_demiurg]:stalker_trader
строку story_id = zat_demiurg.
 
sapfirДата: Чт, 04.04.2013, 15:54 | Сообщение # 96
Боец резерва
Долг
Сообщений: 635
Награды: 9
Репутация: [ 537 ]

Вот я установил атмосфер для sgm 2.2. И (как мне объяснили) при начале псишторма, у меня появляется задание "TITLE DOESNT EXIST". Если по русски, то "Названия не существует". Как я понял, это задание не закончили. Подскажете, где файл, который отвечает за описание задание, и что надо сделать в этом задании(тоже файл)?


КПК Сапфира
 
FantomICWДата: Чт, 04.04.2013, 16:06 | Сообщение # 97
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

sapfir1998, название и описание обычно прописывается в configs/text/rus/st_quests_.


 
sapfirДата: Чт, 04.04.2013, 16:42 | Сообщение # 98
Боец резерва
Долг
Сообщений: 635
Награды: 9
Репутация: [ 537 ]

FantomICW, странно, там все прописано...


КПК Сапфира
 
mizabrikДата: Чт, 04.04.2013, 18:03 | Сообщение # 99
Почетный инженер «Свободы»
Свобода
Сообщений: 360
Награды: 10
Репутация: [ 216 ]

sapfir1998, возможно неправильно написан идентификатор строки. Проверьте совпадает ли с идентификатором строки параметр title в секции [sgm_pri_zone_cleaning] файл gamedata/config/misc/tasks/tm_pripyat.ltx.

 
FantomICWДата: Чт, 04.04.2013, 20:55 | Сообщение # 100
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Здравствуйте! Создавал квест на убийство нпс, столкнулся с вылетом. Не могу понять в чем проблема.
[cut=Лог]stack trace:

0023:060A105B lua.JIT.1.1.4.dll[/cut]

Затронуто несколько файлов (все новые прописал через #include куда надо)
[cut=jup_b46_spatial_bubble_zone]
Код
[logic]
active = sr_idle@jup_b46_sos_sound

[sr_idle@jup_b46_sos_sound]
on_info  = {+jup_b46_spatial_bubble_started -jup_b46_task_gived -jup_b46_spatial_bubble_ruptured} %+jup_b46_task_gived =give_task(jup_b46_spatial_bubble)%    
on_info2 = {=distance_to_obj_le(jup_b46_spatial_bubble_zone:50)} %=play_sound(jup_b46_spatial_bubble_sos)%
on_info3 = {+jup_b46_spatial_bubble_ruptured} sr_idle@jup_b46_rupture %=stop_sound%
on_info4 = {+pila_quest_init -spawn_jup_killer_ross_squad} %=create_squad(jup_killer_ross_squad:jup_b46) +spawn_jup_killer_ross_squad%

[sr_idle@jup_b46_rupture]    
on_game_timer = 46 | {-jup_b46_duty_founder_squad_spawned} %+jup_b46_duty_founder_squad_spawned =spawn_object(wpn_ak74:jup_b46_corps_spawn) =spawn_corpse(jup_b46_duty_founder:jup_b46_corps_spawn) =spawn_object(wpn_ak74u:jup_b46_corps_spawn) =spawn_corpse(jup_b46_duty_founder_squad_01:jup_b46_corps_spawn) =spawn_object(wpn_ak74u:jup_b46_corps_spawn) =spawn_corpse(jup_b46_duty_founder_squad_02:jup_b46_corps_spawn) =spawn_object(wpn_ak74:jup_b46_corps_spawn) =spawn_corpse(jup_b46_duty_founder_squad_03:jup_b46_corps_spawn) =spawn_object(wpn_abakan:jup_b46_corps_spawn) =spawn_object(wpn_abakan:jup_b46_corps_spawn) =spawn_corpse(jup_b46_duty_founder_squad_04:jup_b46_corps_spawn) =spawn_object(medkit:jup_b46_corps_spawn)%
on_info = {-jup_b46_duty_founder_pda_start =actor_has_item(jup_b46_duty_founder_pda)} %+jup_b46_duty_founder_pda_start =play_sound(jup_b46_duty_founder_pda_diary) =give_task(jup_b46_duty_founder_pda)%
on_info2 = {+jup_b46_duty_founder_squad_spawned +jup_b46_duty_founder_pda_start} sr_idle@end    

[sr_idle@end]

Добавлена строка с on_info3[/cut]

[cut=icw_dialogs.xml (текст диалогов)]
Код
<?xml version="1.0" encoding="windows-1251" ?>
<string_table>
    <string id="pila_quest_dialog_1">
     <text>Привет, сталкер. Чего сидишь здесь?</text>
    </string>
           <string id="pila_quest_dialog_2">
     <text>Из каких из "этих"?</text>
    </string>
           <string id="pila_quest_dialog_3">
     <text>Из наёмников Росса?</text>
    </string>
           <string id="pila_quest_dialog_4">
     <text>Кого?</text>
    </string>
           <string id="pila_quest_dialog_5">
     <text>А, ясно. Слушай, мужик, хочешь подзаработать?</text>
    </string>
           <string id="pila_quest_dialog_6">
     <text>Ну допустим.</text>
    </string>
           <string id="pila_quest_dialog_7">
     <text>Да нет, спасибо.</text>
    </string>
           <string id="pila_quest_dialog_8">
     <text>Меня один мужик пресует, как раз сей Росс. Длинная история... В общем он там глава небольшой группы наёмников из человек 10-12. Вальнёшь его и его подручных, заплачу отменно. Ну чё, по рукам?</text>
    </string>
           <string id="pila_quest_dialog_9">
     <text>По рукам. Где мне их найти?</text>
    </string>
           <string id="pila_quest_dialog_10">
     <text>Спасибо, мужик, что согласился! Их минибаза недалеко от Янова, у градирни. Возьмёшь КПК Росса и отнесёшь мне. Буду ждать тебя на Янове. Идёт?</text>
    </string>
           <string id="pila_quest_dialog_11">
     <text>Идёт, идёт. Скорее бы уже пришёл... Ладно, готовь деньги.</text>
    </string>
    <?xml version="1.0" encoding="windows-1251" ?>
</string_table>
[/cut]

[cut=icw_info ]
Код
<?xml version='1.0' encoding="windows-1251"?>
<game_information_portions>
<!------------------------------------------------->
<info_portion id="pila_quest_no_quest"></info_portion>    
<info_portion id="pila_quest_init"></info_portion>    
<info_portion id="pila_quest_end"></info_portion>    
<info_portion id="jup_killer_ross_squad_death"></info_portion>
<info_portion id="spawn_jup_killer_ross_squad"></info_portion>     
</game_information_portions>
[/cut]

[cut=extended_dialogs.xml (модель диалога)]
Код
<dialog id="pila_quest_begin">                
           <dont_has_info>pila_quest_init</dont_has_info>    
           <dont_has_info>pila_quest_no_quest</dont_has_info>    
           <precondition>sgm_dialogs.actor_not_have_pda_ross</precondition>    
           <phrase_list>    
               <phrase id="0">    
                   <text>pila_quest_dialog_1</text>    
                   <next>1</next>    
                   </phrase>           
           <phrase id="1">    
                   <text>pila_quest_dialog_2</text>    
                   <next>2</next>    
                   <next>3</next>    
           </phrase>    
           <phrase id="2">    
                   <text>pila_quest_dialog_3</text>    
           </phrase>    
           <phrase id="3">    
                   <text>pila_quest_dialog_4</text>                        
                   <next>4</next>    
           </phrase>    
           <phrase id="4">    
                   <text>pila_quest_dialog_5</text>    
          <next>5</next>
          <next>6</next>
           </phrase>     
        <phrase id="5">    
                   <text>pila_quest_dialog_6</text>    
       <action>sgm_dialogs.pila_quest_give_quest</action>
                   <next>7</next>
           </phrase>
        <phrase id="6">    
                   <text>pila_quest_dialog_7</text>    
                   <give_info>pila_quest_no_quest</give_info>    
                   <action>dialogs.break_dialog</action>    
           </phrase>    
        <phrase id="7">    
                   <text>pila_quest_dialog_8</text>
                <give_info>pila_quest_init</give_info>                         
                <next>8</next>
           </phrase>
        <phrase id="8">    
                   <text>pila_quest_dialog_9</text>    
                   <next>9</next>                        
           </phrase>
     <phrase id="9">    
                   <text>pila_quest_dialog_10</text>    
                   <next>10</next>                       
           </phrase>
     <phrase id="10">    
                   <text>pila_quest_dialog_11</text>    
          <action>dialogs.break_dialog</action>    
           </phrase>
    </phrase_list>    
</dialog>    
</game_dialogs>
[/cut]

[cut=sgm_dialogs.script]
Код
function pila_quest_give_quest()         
task_manager.get_task_manager():give_task("pila_quest")            
end    

function actor_have_pda_ross(first_speaker, second_speaker)    
return db.actor:object("pda_ross") ~= nil    
end    

function actor_not_have_pda_ross(first_speaker, second_speaker)    
return db.actor:object("pda_ross") == nil    
end    

function pila_quest_give_pda(first_speaker, second_speaker)    
dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "pda_ross")     
end         

function function pila_quest_give_reward(first_speaker, second_speaker)    
dialogs.relocate_money_to_actor(first_speaker, second_speaker, 7500)    
end
[/cut]

[cut=character_desc_icw]
Код
<specific_character id="jup_stalker_pila" team_default = "1">
                   <name>Пила</name>
                   <icon>ui_inGame2_neutral_2</icon>
                   <map_icon x="1" y="0"></map_icon>
                   <bio>Опытный сталкер. Детальная информация отсутствует.</bio>
                   <class>jup_stalker_pila</class>
                   <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>
                   <snd_config>characters_voice\human_03\stalker\</snd_config>
                   <rank>200</rank>
            <money min="3500" max="8500" infinitive="0"/>
                   <reputation>0</reputation>
                   <visual>actors\stalker_neutral\stalker_neutral_13</visual>
                   <supplies>
                   [spawn] \n
       wpn_lr300 = 1 \n
     ammo_5.45x39_ap = 1 \n
           wpn_beretta \n
     ammo_9x19_pbp = 1 \n
           grenade_rgd5 = 2 \n
#include "gameplay\character_items_2.xml"
#include "gameplay\character_food.xml"
#include "gameplay\character_drugs_2.xml"
     </supplies>
     <actor_dialog>pila_quest_begin</actor_dialog>
     <actor_dialog>actor_break_dialog</actor_dialog>
#include "gameplay\character_criticals_4.xml"
                   #include "gameplay\character_dialogs.xml"
</specific_character>

<specific_character id="jup_killer_ross" team_default = "1">
                   <name>Росс</name>
                   <icon>ui_inGame2_killer_4</icon>
                   <map_icon x="1" y="0"></map_icon>
                   <bio>Опытный сталкер. Детальная информация отсутствует.</bio>
                   <class>jup_killer_ross</class>
                   <community>killer</community> <terrain_sect>stalker_terrain</terrain_sect>
                   <snd_config>characters_voice\human_03\stalker\</snd_config>
                   <rank>200</rank>
            <money min="3500" max="8500" infinitive="0"/>
                   <reputation>0</reputation>
                   <visual>actors\stalker_merc\stalker_merc_4</visual>
                   <supplies>
                   [spawn] \n
       wpn_groza = 1 \n
     ammo_5.45x39_ap = 1 \n
           wpn_beretta \n
     ammo_9x19_pbp = 1 \n
           grenade_rgd5 = 2 \n
     pda_ross = 1 \n
#include "gameplay\character_items_2.xml"
#include "gameplay\character_food.xml"
#include "gameplay\character_drugs_2.xml"
     </supplies>
#include "gameplay\character_criticals_4.xml"
#include "gameplay\character_dialogs.xml"
</specific_character>
[/cut]

[cut=spawn_sections_icw]
Код
[jup_stalker_pila]:quest_stalker_heavy
$spawn            = "respawn\jup_stalker_pila"
character_profile = jup_stalker_pila
spec_rank         = master
community         = stalker
story_id          = jup_stalker_pila
custom_data       = scripts\bonus\jup_stalker_pila.ltx

[jup_killer_ross]:stalker
$spawn            = "respawn\jup_killer_ross"
character_profile = jup_killer_ross
spec_rank         = master
community         = killer
story_id          = jup_killer_ross
[/cut]

[cut=Логика нпс, выдающего задание]
Код
[logic]
active = move@pila

[move@pila]
move_dest_number       = 621603
move_look_vertex       = 623801
move_state_when_center = sit_ass
move_state_when_move   = walk
move_combat_disable    = true
meet                   = meet
invulnerable           = true
combat_ignore_cond     = true
combat_ignore_keep_when_attacked = true
on_info                = {+pila_quest_end =dist_to_actor_ge(90)} nil %=release_npc%

[meet]
abuse           = false
use             = true
allow_break     = false
meet_on_talking = false
trade_enable    = false
[/cut]

[cut=squad_descr_icw]
Код
[jup_killer_ross_squad]:online_offline_group
faction = killer
npc = jup_killer_ross, sim_default_killer_1, sim_default_killer_1, sim_default_killer_2, sim_default_killer_2, sim_default_killer_1, sim_default_killer_2, sim_default_killer_3, sim_default_killer_3, sim_default_killer_2, sim_default_killer_4
story_id = jup_killer_ross_squad
target_smart = jup_b46
on_death = %+jup_killer_ross_squad_death%
[/cut]

[cut=tm_extended]
Код
[pila_quest]    
icon = ui_inGame2_Shustriy_Find_1
prior = 2    
storyline = false    
title = {=actor_has_item(pda_ross)} pila_quest_title_3,  pila_quest_title_0    
descr = pila_quest_text_0    
target = {=actor_has_item(pda_ross)} jup_stalker_pila, {+jup_killer_ross_squad_death} pda_ross, jup_killer_ross    
condlist_0 = {+pila_quest_end} complete
[/cut]

В sgm_spawner.script добавил
Код
create("jup_stalker_pila",-58.588,3.764,155.301,621603,453)
в секции заселения Юпитера.


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





Сообщение отредактировал FantomICW - Чт, 04.04.2013, 20:57
 
sergej5500Дата: Чт, 04.04.2013, 21:15 | Сообщение # 101
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

FantomICW,
Попробуй прекондишионы прописать таким образом:
[cut=Функции]function actor_have_pda_ross(first_speaker, second_speaker)
if db.actor ~= nil then
return db.actor:object("pda_ross") ~= nil
else return false
end
end

function actor_not_have_pda_ross(first_speaker, second_speaker)
if db.actor ~= nil then
return db.actor:object("pda_ross") == nil
else return false
end
end
[/cut]


Сообщение отредактировал sergej5500 - Чт, 04.04.2013, 21:52
 
FantomICWДата: Чт, 04.04.2013, 21:51 | Сообщение # 102
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

sergej5500, сделал, все тот-же лог


 
sergej5500Дата: Чт, 04.04.2013, 21:52 | Сообщение # 103
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

FantomICW,
Так же возможна ошибка в спавне. Сквады, которые спавнятся через create_squad, имеют в конфиге строку spawn_point, прописанный в all.spawn (координаты точки спавна). Попробуй заспавнить сквад через конфиг смарт-террайна.
 
FantomICWДата: Чт, 04.04.2013, 21:57 | Сообщение # 104
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

sergej5500, в алл.спавн надо что-то делать, или достаточно прописать в simulation.ltx что-то в роде jup_killer_ross_squad = jup_b46?


 
GeonezisДата: Чт, 04.04.2013, 22:11 | Сообщение # 105
Разработчик «Смерти вопреки»
Свобода
Сообщений: 2360
Награды: 30
Репутация: [ 71 ]

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

Смерти Вопреки
Spectrum Project
AP_Prodaction
 
Поиск: