Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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Дата: Чт, 04.04.2013, 21:15 | Сообщение # 106
Полевой Исследователь
Ученые сталкеры
Сообщений: 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 | Сообщение # 107
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

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


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

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

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


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

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

Смерти Вопреки
Spectrum Project
AP_Prodaction
 
sergej5500Дата: Чт, 04.04.2013, 22:12 | Сообщение # 111
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

FantomICW,
В configs\scripts\jupiter\smart\jup_b46 добавь код:
[cut=Код]respawn_params = respawn@jup_b46

[respawn@jup_b46]
spawn_mercenary@jup_killer_ross_squad

[spawn_mercenary@jup_killer_ross_squad]
spawn_squads = jup_killer_ross_squad
spawn_num = {+pila_quest_init -jup_killer_ross_squad_death} 1, 0[/cut]
Добавь сквад в simulation_objects_props
[jup_killer_ross_squad]:default_squad
sim_avail = false

Убери строку on_info4 = {+pila_quest_init -spawn_jup_killer_ross_squad} %=create_squad(jup_killer_ross_squad:jup_b46) +spawn_jup_killer_ross_squad% из jup_b46_spatial_bubble_zone. Попробуй запустить квест.
 
mizabrikДата: Чт, 04.04.2013, 22:25 | Сообщение # 112
Почетный инженер «Свободы»
Свобода
Сообщений: 360
Награды: 10
Репутация: [ 216 ]

FantomICW, попробуй убрать лишнюю строчку <?xml… в файле с текстом.

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

sergej5500, не помогло. Сейчас попробую с функциями поделать.

Функции в порядке, xml вроде тоже в норме, по крайней мере проверь теги с подсветкой синтаксиса, шерсти логику. denis2000



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

FantomICW,
Возможно, вылет из-за xr_conditions. Попробуй добавить в этот файл код:
function actor_have_pda_ross(actor, npc, p)
return (sgm_dialogs.actor_have_pda_ross(actor, npc)) or (has_alife_info("pila_quest_end"))
end
function actor_not_have_pda_ross(actor, npc, p)
return (sgm_dialogs.actor_have_pda_ross(actor, npc)) or (has_alife_info("pila_quest_end"))
end
 
АазДата: Чт, 02.05.2013, 22:17 | Сообщение # 115
Хозяин Зоны
Зомби
Награды: 30
Репутация: [ 0 ]

Возник вопрос:
Есть рабочий квест на поиск и возвращение дробовика. В общем-то квест работает, но метка на сам дробовик не вешается, не смотря на то, что он прописан как квестовый предмет и имеет собственный стори ид, который использован в логике квеста (tm_zaton.ltx).

[cut noguest=Квест в tm_zaton.ltx][zat_noah_shotgun_quest]
icon = ui_inGame2_Bezopasnoe_mesto
storyline = false
title = {+zat_actor_have_noah_quest_shotgun} zat_noah_shotgun_quest_name_1, {-zat_actor_have_noah_quest_shotgun} zat_noah_shotgun_quest_name
descr = {+zat_actor_have_noah_quest_shotgun} zat_noah_shotgun_quest_text_1, {-zat_actor_have_noah_quest_shotgun} zat_noah_shotgun_quest_text
target = {+zat_actor_have_noah_quest_shotgun} zat_b18_noah, {-zat_actor_have_noah_quest_shotgun} wpn_spas12_noah_quest
condlist_0 = {+zat_noah_shotgun_quest_end} complete
condlist_1 = {+zat_b18_noah_dead} fail[/cut]

[cut noguest=Сам квестовый предмет в fcop_quest_items.ltx (инклуд файла прописан в system.ltx)];-----------------------------------------------------------------------------
; Уникальный SPAS-12 по квесту Ноя
;-----------------------------------------------------------------------------
[wpn_spas12_noah_quest]:device_pda ;В configs/weapons/spas12.ltx внизу есть практчный вариант дробовика. Фактически, полностью аналогичен "Карабинеру". Хотите, можете опробовать
GroupControlSection = spawn_group
discovery_dependency =
$spawn = "weapons\wpn_spas12_noah_quest" ; name and section in level editor
cform = skeleton
class = II_ATTCH
visual = dynamics\weapons\wpn_spas12\wpn_spas12.ogf
cost = 17500
quest_item = true
inv_name = st_wpn_spas12_noah_quest
inv_name_short = st_wpn_spas12_noah_quest
description = st_wpn_spas12_noah_quest_descr
inv_grid_width = 5
inv_grid_height = 1
inv_grid_x = 12
inv_grid_y = 3
story_id = wpn_spas12_noah_quest
auto_attach = false
;Strap postion
attach_bone_name = bip01_spine2
;variation 1 - better
attach_position_offset = -0.245, -0.11, -0.265
attach_angle_offset = 1.326452, -0.15708, 1.919862
;variation 2 - from weapons ltx
;attach_position_offset = -0.25, -0.11, -0.26
;attach_angle_offset = 1.308999, -0.15708, 1.919862[/cut]

[cut noguest=Диалоги квеста в dialogs_fcop.xml (файл прописан в system.ltx)]<dialog id="zat_noah_shotgun_quest_end_dialog">
<precondition>dialogs_zaton.zat_noah_have_shotgun</precondition>
<has_info>zat_noah_shotgun_quest_init</has_info>
<dont_has_info>zat_noah_shotgun_quest_end</dont_has_info>
<phrase_list>
<phrase id="2">
<text>zat_noah_shotgun_quest_end_dialog_2</text>
<next>3</next>
</phrase>
<phrase id="1">
<text>zat_noah_shotgun_quest_end_dialog_1</text>
<next>2</next>
</phrase>
<phrase id="0">
<text>zat_noah_shotgun_quest_end_dialog_0</text>
<give_info>zat_noah_shotgun_quest_end</give_info>
<action>dialogs_zaton.zat_noah_shotgun_quest_relocate_shotgun_from_actor</action>
<next>1</next>
</phrase>
<phrase id="3">
<text>zat_noah_shotgun_quest_end_dialog_3</text>
<next>4</next>
</phrase>
<phrase id="4">
<text>zat_noah_shotgun_quest_end_dialog_4</text>
<next>5</next>
</phrase>
<phrase id="5">
<text>zat_noah_shotgun_quest_end_dialog_5</text>
<action>dialogs_zaton.zat_noah_shotgun_quest_relocate_award_to_actor</action>
<next>6</next>
</phrase>
<phrase id="6">
<text>zat_noah_shotgun_quest_end_dialog_6</text>
<action>dialogs.break_dialog</action>
</phrase>
</phrase_list>
</dialog>
<dialog id="zat_noah_shotgun_quest_dialog">
<precondition>dialogs_zaton.zat_noah_not_have_shotgun</precondition>
<dont_has_info>zat_noah_shotgun_quest_init</dont_has_info>
<dont_has_info>zat_noah_shotgun_quest_no</dont_has_info>
<phrase_list>
<phrase id="100">
<text>zat_noah_shotgun_quest_dialog_100</text>
<give_info>zat_noah_shotgun_quest_no</give_info>
<next>101</next>
</phrase>
<phrase id="102">
<text>zat_noah_shotgun_quest_dialog_102</text>
<action>dialogs.break_dialog</action>
</phrase>
<phrase id="101">
<text>zat_noah_shotgun_quest_dialog_101</text>
<next>102</next>
</phrase>
<phrase id="4">
<text>zat_noah_shotgun_quest_dialog_4</text>
<action>dialogs.break_dialog</action>
</phrase>
<phrase id="2">
<text>zat_noah_shotgun_quest_dialog_2</text>
<next>3</next>
</phrase>
<phrase id="3">
<text>zat_noah_shotgun_quest_dialog_3</text>
<action>dialogs_zaton.zat_noah_shotgun_quest_give</action>
<give_info>zat_noah_shotgun_quest_init</give_info>
<next>4</next>
</phrase>
<phrase id="1">
<text>zat_noah_shotgun_quest_dialog_1</text>
<next>2</next>
<next>100</next>
</phrase>
<phrase id="0">
<text>zat_noah_shotgun_quest_dialog_0</text>
<next>1</next>
</phrase>
</phrase_list>
</dialog>[/cut]

[cut noguest=Инфопоршни из info_fcop.xml (файл прописан в system.ltx)]<info_portion id="zat_noah_shotgun_quest_init"></info_portion>
<info_portion id="zat_zat_noah_shotgun_quest_no"></info_portion>
<info_portion id="zat_noah_shotgun_quest_end"></info_portion>
<info_portion id="zat_noah_quest_shotgun_spawn"></info_portion>
<info_portion id="zat_actor_have_noah_quest_shotgun"></info_portion>[/cut]

Вот что тут не так? Подскажите пожалуйста.


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

Ааз, пересоздай заново секцию квестового предмета по образцу из оригинала (quest_items.ltx) . Сделай ее классом device_pda, или identity_immunities.

Смерти Вопреки
Spectrum Project
AP_Prodaction
 
denis2000Дата: Чт, 02.05.2013, 23:08 | Сообщение # 117
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Ааз, Согласен с многоуважаемым Geonezis. Нужен другой класс предмета, достаточно просто закоментировать переменную class = II_ATTCH и этот параметр будет унаследован, как раз из секции device_pda.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
СтранныыйДата: Сб, 04.05.2013, 19:55 | Сообщение # 118
Удаленные



Как сделать квест на ЧН? Видел что ранее об этом спрашивал Kosha, можете рассказать поподробнее? начать например с второстепенного квеста (уничтожить отряд врага или вернуть аптечку)

Встречное предложение: Вы разберетесь в этом вопросе сами и сделаете урок в теме КМБ и многие вас за это поблагодарят. denis2000
 
АазДата: Вт, 07.05.2013, 21:59 | Сообщение # 119
Хозяин Зоны
Зомби
Награды: 30
Репутация: [ 0 ]

Снова обращаюсь за помощью. Понимаю, что возможно уже достал)
Собственно, в чем проблема. Диалог при взятии квеста у НПС работает, но дальше никакой реакции. То есть квест не выдается, я пробежался по местам предполагаемого спавна предметов - там везде пусто. То бишь квест не запускается элементарно.
[cut noguest=Диалоги в dialogs_fcop.xml (файл прописан в систем.лтх)]<dialog id="zat_demiurg_search_documents">
<dont_has_info>zat_search_documents_start</dont_has_info>
<phrase_list>
<phrase id="0">
<text>Привет, звал?</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>Да, есть кое-что любопытное. Про лабораторию Х17 слышал чего-нибудь? Если нет, то оно и понятно - деятельность её была засекречена, чем они там занимались, никто не знает. Но прошел слух, будто диггеры накопали документы из этой лаборатории. Однако диггеров потом кто-то убил. Мои люди выяснили, что это были 2 отряда Ренегатов, они явно спешили и очень наследили. На месте убийств остались эти самые документы. Нужно забрать их и принести мне.</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>А где искать-то?</text>
<next>3</next>
</phrase>
<phrase id="3">
<text>Одна часть документов лежит здесь, на Затоне, где-то под землей, скорее всего это пещера или даже лаборатория. Хотя нет, в лабораторию под "Железным лесом" диггеры не смогли бы попасть, значит остаются пещеры. Вторая часть документов находится в окрестностях Юпитера, в одном из железнодорожных тоннелей.</text>
<action>dialog_zaton.give_demiurg_search_documents_quest</action>
<give_info>zat_search_documents_start</give_info>
<next>4</next>
</phrase>
<phrase id="4">
<text>Ну тогда я отправляюсь на поиски.</text>
<action>dialog_zaton.jup_document_x17_create</action>
</phrase>
</phrase_list>
</dialog>
<dialog id="zat_demiurg_search_doсuments_complete">
<has_info>zat_search_documents_have_2</has_info>
<dont_has_info>zat_search_documents_end</dont_has_info>
<precondition>dialog_zaton.actot_have_all_documents</precondition>
<phrase_list>
<phrase id="0">
<text>Нашел я эти документы, побегать солидно пришлось.</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>Главное, что нашел.</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>Держи.</text>
<action>dialog_zaton.actot_to_demiurg_give_documents</action>
<next>3</next>
</phrase>
<phrase id="3">
<text>Отлично, вот твоя награда и можешь быть свободен. Если ты мне понадобишься, я тебя найду.</text>
<give_info>zat_search_documents_end</give_info>
</phrase>
</phrase_list>
</dialog>[/cut]

[cut noguest=Инфопоршни]<!--Квест на поиск двух частей документов-->
<info_portion id="zat_search_documents_start"></info_portion>
<info_portion id="zat_search_documents_end"></info_portion>
<info_portion id="zat_search_documents_have_1"></info_portion>
<info_portion id="zat_search_documents_create_2"></info_portion>
<info_portion id="zat_search_documents_have_2"></info_portion>[/cut]

[cut noguest=Задание в tm_zaton.ltx][zat_demiurg_search_documents]
icon = ui_inGame2_Gipoteza
storyline = false
title = {+zat_search_documents_have_2} zat_demiurg_search_documents_name2, {+zat_search_documents_create_2 -zat_search_documents_have_2} zat_demiurg_search_documents_name1, {-zat_search_documents_have_1} zat_demiurg_search_documents_name
descr = {+zat_search_documents_have_2} zat_demiurg_search_documents_text2, {+zat_search_documents_create_2 -zat_search_documents_have_2} zat_demiurg_search_documents_text1, {-zat_search_documents_have_1} zat_demiurg_search_documents_text
target = {+zat_search_documents_have_2} zat_demiurg, nil
condlist_0 = {+zat_search_documents_end} complete
on_complete = %=inc_faction_goodwill_to_actor(stalker:70)%
reward_money = 7500[/cut]

[cut noguest=dialogs_zaton.script]--Квест на поиск документов
function jup_document_x17_create(first_speaker, second_speaker)
alife():create("jup_document_x17_part_1_info",vector():set(-196.644760,3.487357,-436.577667),383164,480)
end

function give_demiurg_search_documents_quest()
task_manager.get_task_manager():give_task("zat_demiurg_search_documents")
end

function actot_to_demiurg_give_documents(first_speaker, second_speaker)
local items_table = {"jup_document_x17_part_1_info","zat_document_x17_part_2_info"}
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_documents(first_speaker, second_speaker)
return db.actor:object("jup_document_x17_part_1_info")~=nil and db.actor:object("zat_document_x17_part_2_info")~=nil
end[/cut]

[cut noguest=new_tasks.script]function task_spec()
local level_name=level.name()
if level_name=="zaton" then
if has_alife_info("zat_search_documents_start") and (not has_alife_info("zat_search_documents_have_1")) and
db.actor:object("jup_document_x17_part_1_info") then
db.actor:give_info_portion("zat_search_documents_have_1")
end
if has_alife_info("zat_search_documents_have_1") and (not has_alife_info("zat_search_documents_create_2")) then
alife():create("zat_document_x17_part_2_info",vector():set(19.153345,3.747883,369.347382),984300,59)
db.actor:give_info_portion("zat_search_documents_create_2")
end
if has_alife_info("zat_search_documents_create_2") and (not has_alife_info("zat_search_documents_have_2")) and
db.actor:object("zat_document_x17_part_2_info") then
db.actor:give_info_portion("zat_search_documents_have_2")
end
end
end[/cut]




Сообщение отредактировал Ааз - Вт, 07.05.2013, 21:59
 
GeonezisДата: Вт, 07.05.2013, 22:40 | Сообщение # 120
Разработчик «Смерти вопреки»
Свобода
Сообщений: 2360
Награды: 30
Репутация: [ 71 ]

Ааз,
1. Выдача квеста была?
2. Функцию task_spec() ты на апдейт в биндере повесил?


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