Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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Дата: Вс, 30.12.2012, 15:21 | Сообщение # 76
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

9vova8
Скорее всего, у Вас ошибка здесь create_squad(zat_beta_artef_squad:zat_beta_art_spawn)
Я порылся в конфигах ЗП. В чистом ЗП вроде нельзя после названия сквада писать секции типа zat_beta_art_spawn.
Там должно быть название смарта, на котором спавнят сквад. Если all.spawn не собирается, то где то в секциях ошибка.
И еще, в конфиге сквада нет параметра target_smart. Мой совет убрать spawn_point ошибочен. Приношу извинения.


Сообщение отредактировал sergej5500 - Вс, 30.12.2012, 15:25
 
9vova8Дата: Сб, 05.01.2013, 17:24 | Сообщение # 77
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

Как написать перед началом диалога условие на наличие предмета?

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

9vova8
Для проверки наличия предмета перед началом диалога используютя прекондишионы. Пример:
<precondition>dialogs_zaton.zat_b30_owl_stalker_trader_have_arts</precondition>. При выполнении условия, прописанного в функции, диалог будет активен.

Проверка функции precondition в скрипте:
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
В данном случае проверяется наличие у ГГ двух артефактов. Возможно, потребуется регистрация прекондишиона в xr_conditions.scripts.
Посмотрите КМБ. Урок 33.
 
9vova8Дата: Сб, 05.01.2013, 21:56 | Сообщение # 79
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

Вот такая ошибка, когда начинаю разговор с квестодателем:

stack trace:

001B:0488105B lua.JIT.1.1.4.dll




Сообщение отредактировал 9vova8 - Сб, 05.01.2013, 23:00
 
sergej5500Дата: Сб, 05.01.2013, 22:31 | Сообщение # 80
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

9vova8
Где то ошибка в скриптах. Опишите подробно, что и куда вставляли, что хотели сделать.
 
9vova8Дата: Вс, 06.01.2013, 15:26 | Сообщение # 81
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

dialogs_jupiter.script
[cut]function jup_b217_azot_give_tasks(first_speaker, second_speaker)
task_manager.get_task_manager():give_task("jup_b217_azot_new_task")
end

function jup_b217_azot_quest_create_item(first_speaker, second_speaker)
alife():create("jup_b217_quest_item",vector():set(272.273224,17.865562,500.726532),1428114,6)
end

function jup_azot_quest(second_speaker, first_speaker)
dialogs.relocate_money_to_actor(first_speaker, second_speaker, 3000)
end

function jup_b217_azot_quest_relocate_item(first_speaker, second_speaker)
local items_table = {
"jup_b217_quest_item",
}
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
[/cut]
xr_effects
[cut]function jup_azot_quest_1(actor, npc)
if xr_conditions.actor_in_zone(actor, npc, {"jup_test_quest_restrictor_1"})
then
db.actor:give_info_portion("jup_azot_quest_restr_1")
give_actor(db.actor,nil,{"jup_b217_quest_item"})
end
end [/cut]

Лишняя запятая в таблице итемов. denis2000

Не помогло((
Это может быть ошибка в *.xml *.ltx файлах

Это может быть ошибка где угодно, даже в диалогах. denis2000

Синтаксические ошибки, или как?
И почему при попытке юзания не любого НПС, пока вычислил только гавайца и азота

Файлы то у вас, вот вы нам и скажите почему. denis2000

Заглючение только Азот, Гаваец, Борода, Кардан, медик на Янове.

Добавлено (06.01.2013, 15:26)
---------------------------------------------
Ещё одна проблема, но она была ещё сначала: не всегда нажимаются реплики в диалоге, иногда просто при нажатии диалог закрывается




Сообщение отредактировал 9vova8 - Вс, 06.01.2013, 14:08
 
denis2000Дата: Вс, 06.01.2013, 16:12 | Сообщение # 82
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

9vova8, В функции jup_azot_quest_with_death не было ключевого слова end.

Цитата (9vova8)
не всегда нажимаются реплики в диалоге, иногда просто при нажатии диалог закрывается

Как написал диалог так он и работает: поскольку в одной из веток на которые разделяется диалог безусловное закрытие диалогового окна!


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
ПpизpакДата: Вс, 06.01.2013, 20:06 | Сообщение # 83
Новичок
Пользователи
Сообщений: 64
Награды: 0
Репутация: [ 14 ]

А вот как прописать перед квестом проверку на наличие определенного ранга и группировки у гг?

Комп: Intel Core i5 2400 3.1GHz, 8gb RAM, GeForce GTX 570 1gb, Win 7 64bit
Stalker 1.0004 + НС от 03.09.10 + DMX 1.3.5 + фикс 1.3.5 + свои правки
Stalker 1.6.02 + SGM 1.7 + свои правки


Сообщение отредактировал Пpизpак - Вс, 06.01.2013, 20:55
 
denis2000Дата: Вс, 06.01.2013, 22:57 | Сообщение # 84
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (Пpизpак)
А вот как прописать перед квестом проверку на наличие определенного ранга и группировки у гг?


Например так, если ранг больше 1 и ГГ сталкер:
Код
if (alife():actor():rank()>1) and (alife():actor():community()=="stalker") then


В чистом ЗП Ранг - бессмысленный параметр!


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
ПpизpакДата: Пн, 07.01.2013, 18:54 | Сообщение # 85
Новичок
Пользователи
Сообщений: 64
Награды: 0
Репутация: [ 14 ]

denis2000, Я про ранги из СГМ

А сразу поделиться тайнами Мадридского двоора - слабо? Не смотря на то что это предписано шапкой темы.
denis2000

xr_conditions.check_actor_rank(nil,nil,{min,max})
denis2000


Комп: Intel Core i5 2400 3.1GHz, 8gb RAM, GeForce GTX 570 1gb, Win 7 64bit
Stalker 1.0004 + НС от 03.09.10 + DMX 1.3.5 + фикс 1.3.5 + свои правки
Stalker 1.6.02 + SGM 1.7 + свои правки
 
9vova8Дата: Пн, 07.01.2013, 19:19 | Сообщение # 86
Новичок
Пользователи
Сообщений: 91
Награды: 2
Репутация: [ 6 ]

При таком условии получается такая ошибка
[cut noguest=ошибка]stack trace:

001B:0387105B lua.JIT.1.1.4.dll[/cut]

[cut=условие] <precondition>actor_has_item("jup_b217_quest_item")</precondition>[/cut]

В диалогах невозможно использование аргументов функций. Создавайте новую функцию в скриптах и используйте ее. XOBAH


 
prohodchikДата: Вс, 17.02.2013, 15:50 | Сообщение # 87
Новичок
Пользователи
Сообщений: 50
Награды: 0
Репутация: [ 0 ]

Цитата (denis2000)
zat_b101_logic.ltx

у меня нет такого файла в чистой gamedata


Проект в разработке – "Болотные легенды"
 
АазДата: Вс, 17.02.2013, 17:40 | Сообщение # 88
Хозяин Зоны
Зомби
Награды: 30
Репутация: [ 0 ]

Я делаю квест на чистый Зов Припяти 1.6.02, тип квеста: "убить сталкера", при этом возникло несколько казусов:
- при убийстве сталкера не выдается инфопоршень, квест висит.
- проблемы с описанием задания
- не получается сделать метки в задании на НПСа, которого требуется убить и после убийства метка должна переходить на квестодателя (в моём случае убиваемый НПС и НПС-квестодатель спавнятся скриптами).
Ниже привожу все изменения в файлах.
[cut noguest=Файл zat_stalkers.ltx (инклуд прописан в spawn_sections.ltx)][zat_demiurg]:stalker_trader
$spawn = "respawn\zat_demiurg"
character_profile = zat_demiurg
spec_rank = master
community = stalker
custom_data = scripts\zaton\zat_demiurg.ltx

[zat_renegat]:stalker
$spawn = "respawn\zat_renegat"
character_profile = zat_renegat
spec_rank = veteran
community = stalker
story_id = zat_renegat
custom_data = scripts\zaton\zat_renegat.ltx[/cut]

[cut noguest=character_desc_zaton_new.xml (зарегистрирован в system.ltx)]<?xml version='1.0' encoding="windows-1251"?>

<xml>

<specific_character id="zat_demiurg" team_default="1">
<name>zat_demiurg</name>
<icon>ui_inGame2_neutral_1</icon>
<map_icon x="1" y="0">
</map_icon>
<bio>Опытный сталкер. Детальная информация отсутствует.</bio>
<class>zat_demiurg</class>
<community>stalker</community>
<terrain_sect>stalker_terrain</terrain_sect>
<snd_config>characters_voice\human_01\stalker\</snd_config>
<rank>635</rank>
<reputation>10</reputation>
<money min="15000" max="18000" infinitive="0" />
<visual>actors\stalker_neutral\stalker_neutral_nauchniy</visual>

<supplies>
[spawn] \n
wpn_sig550 \n
ammo_5.56x45_ss190 = 1 \n

#include "gameplay\character_items_nd_nl.xml"
#include "gameplay\character_food.xml"
#include "gameplay\character_drugs.xml"
</supplies>

<actor_dialog>zat_renegat_kill</actor_dialog>
<actor_dialog>zat_renegat_kill_complete</actor_dialog>

<actor_dialog>actor_break_dialog</actor_dialog>

#include "gameplay\character_criticals_4.xml"
</specific_character>

<specific_character id="zat_renegat" team_default="1">
<name>zat_renegat</name>
<icon>ui_inGame2_bandit_2</icon>
<map_icon x="1" y="0">
</map_icon>
<bio>Опытный сталкер. Детальная информация отсутствует.</bio>

<class>zat_renegat</class>
<community>stalker</community>
<terrain_sect>stalker_terrain</terrain_sect>
<snd_config>characters_voice\human_02\bandit\</snd_config>

<rank>310</rank>
<reputation>-5</reputation>

<visual>actors\stalker_bandit\stalker_bandit_2</visual>
<supplies>

[spawn] \n
wpn_ak74 \n
ammo_5.45x39_fmj = 1 \n
wpn_pm \n
ammo_9x18_fmj = 1 \n
grenade_rgd5 = 2 \n

#include "gameplay\character_items_nd.xml"
#include "gameplay\character_drugs.xml"
#include "gameplay\character_drugs_mil.xml"
</supplies>
#include "gameplay\character_criticals_4.xml"
</specific_character>

</xml>[/cut]

[cut noguest=dialogs_zaton_new.xml (зарегистрирован в system.ltx)]<?xml version="1.0" encoding="windows-1251" ?>
<game_dialogs>
<dialog id="zat_renegat_kill">
<dont_has_info>zat_renegat_kill_done</dont_has_info>
<dont_has_info>zat_renegat_kill_give</dont_has_info>
<phrase_list>
<phrase id="0">
<text>Привет, работа есть?</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>Да, работа для тебя будет. Но прежде спрошу: ты знаешь что-нибудь о Ренегатах?</text>
<next>2</next>
<next>21</next>
</phrase>
<phrase id="2">
<text>Нет, впервые слышу, а что?</text>
<next>3</next>
</phrase>
<phrase id="21">
<text>Ну слышал кое-что от сталкеров. А в чем собственно проблема?</text>
<next>3</next>
</phrase>
<phrase id="3">
<text>Вообщем, я тебе вот что скажу - я Демиург, один из оставшихся в живых чистонебовцев. Ренегаты - наши заклятые враги. С ними мы, чистонебовцы, воевали в 2011 году. Однако после боя на ЧАЭС, когда почти весь клан погиб, я думал, что они успокоятся и не станут искать оставшихся в живых. Однако я ошибался.
Один из Ренегатов находится сейчас здесь, на Затоне. Не иначе, как по мою душу явился, гад смердячий, а ведь я подозревал, что за мной непременно будет слежка. Поэтому нашел прикид, в котором меня хрен кто раскусит. Ну а тебя я попрошу расправиться с идущим по моему следу противником. Оплату гарантирую. Как вернешься, побеседуем обстоятельнее. Берешься?</text>
<next>4</next>
</phrase>
<phrase id="4">
<text>Берусь.</text>
<give_info>zat_renegat_kill_give</give_info>
<action>dialogs_zaton.zat_renegat_kill_quest</action>
<action>renegat_spawn.spawn_zat_renegat</action>
</phrase>
</phrase_list>
</dialog>

<dialog id="zat_renegat_kill_complete">
<has_info>zat_renegat_kill_give</has_info>
<dont_has_info>zat_renegat_kill_done</dont_has_info>
<has_info>zat_renegat_mertv</has_info>
<phrase_list>
<phrase id="0">
<text>Ренегата я устранил, от греха подальше.</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>Вот спасибо, выручил ты меня. Я уж думал, что всё - кирдык тебе...</text>
<give_info>zat_renegat_kill_done</give_info>
</phrase>
</phrase_list>
</dialog>
</game_dialogs>[/cut]

Добавлено (17.02.2013, 17:28)
---------------------------------------------
[cut noguest=info_zaton.xml]<info_portion id="zat_renegat_kill_done"></info_portion>
<info_portion id="zat_renegat_kill_give"></info_portion>
<info_portion id="zat_renegat_mertv"></info_portion>[/cut]

[cut noguest=zat_profiles.xml (зарегистрирован в system.ltx)]<?xml version='1.0' encoding="windows-1251"?>

<xml>

<character id="zat_demiurg">
<class>zat_demiurg</class>
</character>

<character id="zat_renegat">
<class>zat_renegat</class>
</character>

</xml>[/cut]

[cut noguest=tm_zaton.ltx][zat_renegat_kill]
icon = ui_inGame2_Bezopasnoe_mesto
storyline = false
title = zat_renegat_kill_quest_name
descr = zat_renegat_kill_quest_text
target = zat_demiurg
condlist_0 = {+zat_renegat_kill_done} complete
on_complete = %=inc_faction_goodwill_to_actor(stalker:40)%
reward_money = 4500[/cut]

[cut noguest=st_quests_zaton.xml]<string id="zat_renegat_kill_quest_name">
<text>Ренегат: убрать сталкера из группировки Ренегаты.</text>
</string>
<string id="zat_renegat_kill_quest_text">
<text>Убить ренегата, который расположился где-то неподалеку от Скадовска, после чего доложить Демиургу о выполнении задания.</text>
</string>[/cut]

[cut noguest=demiurg_spawn.script]function spawn_demiurg()
if not has_alife_info("spawn_demiurg_complite") then
local p=vector(),lv,gv
p.x = 113.776520
p.y = -7.348208
p.z = 186.347198
lv = 1162412
gv = 316
alife():create("zat_demiurg",p,lv,gv)
give_info("spawn_demiurg_complite")
end
end[/cut]

[cut noguest=renegat_spawn.script]function spawn_zat_renegat()
if not has_alife_info("spawn_renegat_complite") then
local p=vector(),lv,gv
p.x = 173.417191
p.y = 11.494859
p.z = -264.904175
lv = 1262839
gv = 23
alife():create("zat_renegat",p,lv,gv)
give_info("spawn_renegat_complite")
end
end[/cut]

[cut noguest=dialogs_zaton.script]function zat_renegat_kill_quest()
task_manager.get_task_manager():give_task("zat_renegat_kill_give")
end[/cut]

Добавлено (17.02.2013, 17:40)
---------------------------------------------
[cut noguest=zat_demiurg.ltx][logic]
active = remark@trader

[remark@trader]
invulnerable = true
on_combat = combat
meet = meet_trader

[combat]
combat_type =

[meet_trader]
abuse = false
use = true
allow_break = false
meet_on_talking = true[/cut]

[cut noguest=zat_renegat.ltx][logic]
on_death = death
active = remark1
danger = danger_ignore

[danger_ignore]
ignore_distance = 5

[death]
on_info = %+zat_renegat_mertv%

[remark1]
no_move = true
anim = sit_ass
on_actor_dist_le = 2| remark@hello
meet = meet_guide

[meet_guide]
abuse = false
use = false
allow_break = false
meet_on_talking = false

[remark@hello]
no_move = true
meet = meet_guide
on_actor_dist_le = 10| remark1[/cut]


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

Ааз,
Я бы подправил квест таким образом.

[cut=Квест]Файл tm_zaton.
target = zat_demiurg -- это квестовая метка. Она у Вас постоянно висит на квестодателе.
Надо писать так:
target = {+zat_renegat_mertv} zat_demiurg, zat_renegat
Метка повиснет на ренегате, после смерти перескочит на квестодателя.

Секцию
title = zat_renegat_kill_quest_name
descr = zat_renegat_kill_quest_text
лучше писать так:
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


Текстовое содержание квеста:
<string id="zat_renegat_kill_quest_name">
<text>Ренегат: убрать сталкера из группировки Ренегаты.</text>
</string>
<string id="zat_renegat_kill_quest_text">
<text>Убить ренегата, который расположился где-то неподалеку от Скадовска.</text>
</string>
<string id="zat_renegat_kill_quest_name1">
<text>Ренегат: получить награду.</text>
</string>
<string id="zat_renegat_kill_quest_text1">
<text>Доложить Демиургу о выполнении задания.</text>
</string>
[/cut]


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

sergej5500, внёс исправления, начал новую игру, отметил опять отсутствие описания, при убийстве НПС задание естественно опять не обновилось. Я уж не знаю, как и быть-то...

 
Поиск: