|
Модостроение. Создание и редактирование квестов
|
|
| denis2000 | Дата: Пн, 10.10.2011, 21:25 | Сообщение # 1 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Создание и редактирование квестов Создание новых квестов и редактирование существующих Если у вас появились вопросы по созданию и редактированию квестов, изменению существующих и добавлению новых в игру. Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Много интересного материала здесь (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 по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Чт, 04.04.2013, 22:12 | Сообщение # 106 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| 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. Попробуй запустить квест.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| mizabrik | Дата: Чт, 04.04.2013, 22:25 | Сообщение # 107 |
 Почетный инженер «Свободы»
Свобода
Сообщений: 360
| FantomICW, попробуй убрать лишнюю строчку <?xml… в файле с текстом.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили mizabrik за это полезное сообщение: |
|
|
| FantomICW | Дата: Чт, 04.04.2013, 22:37 | Сообщение # 108 |
 Лидер «Свободы»
Свобода
Сообщений: 4438
| sergej5500, не помогло. Сейчас попробую с функциями поделать.
Функции в порядке, xml вроде тоже в норме, по крайней мере проверь теги с подсветкой синтаксиса, шерсти логику. denis2000
|
| |
|
| Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
| sergej5500 | Дата: Чт, 04.04.2013, 22:47 | Сообщение # 109 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| 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
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| Ааз | Дата: Чт, 02.05.2013, 22:17 | Сообщение # 110 |
 Хозяин Зоны
Зомби
| Возник вопрос: Есть рабочий квест на поиск и возвращение дробовика. В общем-то квест работает, но метка на сам дробовик не вешается, не смотря на то, что он прописан как квестовый предмет и имеет собственный стори ид, который использован в логике квеста (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]
Вот что тут не так? Подскажите пожалуйста.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили Ааз за это полезное сообщение: |
|
|
| Geonezis | Дата: Чт, 02.05.2013, 22:44 | Сообщение # 111 |
 Разработчик «Смерти вопреки»
Свобода
Сообщений: 2360
| Ааз, пересоздай заново секцию квестового предмета по образцу из оригинала (quest_items.ltx) . Сделай ее классом device_pda, или identity_immunities.
Смерти Вопреки Spectrum Project AP_Prodaction
|
| |
|
| Эти 0 пользователя(ей) поблагодарили Geonezis за это полезное сообщение: |
|
|
| denis2000 | Дата: Чт, 02.05.2013, 23:08 | Сообщение # 112 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Ааз, Согласен с многоуважаемым Geonezis. Нужен другой класс предмета, достаточно просто закоментировать переменную class = II_ATTCH и этот параметр будет унаследован, как раз из секции device_pda.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| Странныый | Дата: Сб, 04.05.2013, 19:55 | Сообщение # 113 |
|
Удаленные
| Как сделать квест на ЧН? Видел что ранее об этом спрашивал Kosha, можете рассказать поподробнее? начать например с второстепенного квеста (уничтожить отряд врага или вернуть аптечку)
Встречное предложение: Вы разберетесь в этом вопросе сами и сделаете урок в теме КМБ и многие вас за это поблагодарят. denis2000
|
| |
|
| Эти 0 пользователя(ей) поблагодарили Странныый за это полезное сообщение: |
|
|
| Ааз | Дата: Вт, 07.05.2013, 21:59 | Сообщение # 114 |
 Хозяин Зоны
Зомби
| Снова обращаюсь за помощью. Понимаю, что возможно уже достал) Собственно, в чем проблема. Диалог при взятии квеста у НПС работает, но дальше никакой реакции. То есть квест не выдается, я пробежался по местам предполагаемого спавна предметов - там везде пусто. То бишь квест не запускается элементарно. [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 |
| |
|
| Эти 0 пользователя(ей) поблагодарили Ааз за это полезное сообщение: |
|
|
| Geonezis | Дата: Вт, 07.05.2013, 22:40 | Сообщение # 115 |
 Разработчик «Смерти вопреки»
Свобода
Сообщений: 2360
| Ааз, 1. Выдача квеста была? 2. Функцию task_spec() ты на апдейт в биндере повесил?
Смерти Вопреки Spectrum Project AP_Prodaction
|
| |
|
| Эти 0 пользователя(ей) поблагодарили Geonezis за это полезное сообщение: |
|
|
| sergej5500 | Дата: Вт, 07.05.2013, 22:42 | Сообщение # 116 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Ааз, Вы в диалоге пишете dialog_zaton.jup_document_x17_create, а файл скриптов называется dialogs_zaton
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| yakuti | Дата: Ср, 15.05.2013, 20:11 | Сообщение # 117 |
|
Отмычка
Пользователи
Сообщений: 46
| Можете объяснить как реализовать квест как в оригинале: группа сталкеров встречает контролера и все зомбируются. При убийстве контра все обратно становятся сталкерами
|
| |
|
| Эти 0 пользователя(ей) поблагодарили yakuti за это полезное сообщение: |
|
|
| sergej5500 | Дата: Ср, 15.05.2013, 20:36 | Сообщение # 118 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| yakuti, Как вариант, можно удалить сквад сталкеров и заспавнить сквад зомби. Послу убийства контролера удалить сквад зомби и заспавнить сквад сталкеров. Пример кода из оригинала: on_timer = 1000 | sr_idle@duty_go_home %+jup_b4_monolith_squad_in_duty =remove_squad(jup_b4_squad) =create_squad(jup_b4_squad_duty:jup_b4) =create_squad(jup_b4_squad_duty_leader:jup_b4) =enable_ui%. После прохождения инфопорции jup_b4_monolith_squad_in_duty удаляется сквад Монолита (=remove_squad(jup_b4_squad)) и спавнится сквад Долга (=create_squad(jup_b4_squad_duty:jup_b4) =create_squad(jup_b4_squad_duty_leader:jup_b4)).
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| denis2000 | Дата: Ср, 15.05.2013, 21:19 | Сообщение # 119 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| yakuti, Или другой вариант сделать сквад врагами, а после смерти контролера нейтралами к ГГ, при помощи функций из xr_effects.script: Код function set_squad_enemy_to_actor function set_squad_neutral_to_actor
sergej5500, При этом важно чтобы ГГ не видел сквады иначе получиться фигня с исчезновениями и появлениями сталкеров. Другой вариант реализовать все это при помощи жесткой логики для всех НПС сквада, где можно организовать все гораздо лучше.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Ср, 15.05.2013, 21:55 | Сообщение # 120 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| denis2000, yakuti, В примере с Монолитом данная логика используется вместе с функциями =disable_ui и =enable_ui. Используя их, экран на время удаления и спавна сквадов можно погасить.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
|