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

Помощь тем кто хочет знать больше о игре и модах

Если у вас появились вопросы по модостроению в игре S.T.A.L.K.E.R. Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (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)", ее и надо расскомментировать, должно получиться вот так:
Код
function abort(fmt, ...)
                     local reason = string.format(fmt, ...)
                     error_log(reason)
end

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

Первый:
Код
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)

Второй:
Код
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 по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


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


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


[cut noguest=Первый юбилей нашей темы]

Здравствуйте господа модостроители, и все так или иначе причастные к этому.
Нашей теме исполнился 1 год.
От души поздравляю Всех Вас дорогие друзья, творческих успехов.
Хочу так же выразить отдельную благодарность denis2000 и ХОВАН.

tracker 23.06.11



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

Кошелев,

Не уверен, что функция сработает. Лучше писать так.

function esc_sidor_actor_money_klad(first_speaker, second_speaker)
return db.actor:money() >= 5000
end

function not_esc_sidor_actor_money_klad(first_speaker, second_speaker)
return db.actor:money() < 5000
end

Диалог можно написать такой.

[cut=Диалог]
<dialog id="sidor_dialog">
<phrase_list>
<phrase id="1">
<text>sidor_dialog_1</text>
<next>3</next>
<next>4</next>
<next>5</next>
</phrase>
<phrase id="5">
<text>sidor_dialog_5</text>
</phrase>
<phrase id="4">
<text>sidor_dialog_4</text>
<precondition>dialogs.not_esc_sidor_actor_money_klad</precondition>
</phrase>
<phrase id="0">
<text>sidor_dialog_0</text>
<next>1</next>
</phrase>
<phrase id="3">
<text>sidor_dialog_3</text>
<precondition>dialogs.esc_sidor_actor_money_klad</precondition>
<next>6</next>
</phrase>
<phrase id="6">
<text>sidor_dialog_6</text>
<action>dialogs.функция выдачи тайника</action>
</phrase>
</phrase_list>
</dialog>[/cut]

[cut=Фразы]
<string id="sidor_dialog_0">
<text>Хочу купить тайник.</text>
</string>
<string id="sidor_dialog_1">
<text>Гони 5000.</text>
</string>
<string id="sidor_dialog_3">
<text>Держи</text>
</string>
<string id="sidor_dialog_4">
<text>У меня столько нет.</text>
</string>
<string id="sidor_dialog_5">
<text>Я в другой раз зайду.</text>
</string>
<string id="sidor_dialog_6">
<text>Получай наводку.</text>
</string>[/cut]

Прекондишионы <precondition>dialogs.not_esc_sidor_actor_money_klad</precondition> и <precondition>dialogs.esc_sidor_actor_money_klad</precondition> проверяют, сколько денег у игрока. И блокируют одну из фраз.

Акшион <action>dialogs.функция выдачи тайника</action> выдает тайник. Фраза "Я в другой раз зайду" не имеет прекондишиона и доступна всегда.
 
КошелевДата: Ср, 13.07.2016, 22:58 | Сообщение # 1982
Гражданский
Пользователи
Сообщений: 19
Награды: 0
Репутация: [ 0 ]

sergej5500, Спасибо большое, работает.

Добавлено (13.07.2016, 22:58)
---------------------------------------------
Имеется кат-сцена. Ее логика выглядит так

Код
[logic]
active = sr_idle

[sr_idle]
on_info = {=actor_on_level(escape)} sr_cutscene@esc

[sr_cutscene@esc]
point = esc_walk
look = esc_look
cam_effector = scenario_cam\escape\actor_start_cam
global_cameffect = true
enable_ui_on_end = true
on_signal = cameff_end | %=stop_sr_cutscene%


Из-за функции {=actor_on_level(escape)}, кат-сцена воспроизводится всегда, когда я на Кордоне. Как сделать, чтобы она воспроизводилась только при попадании в зону спейс рестриктора?
 
asd123Дата: Чт, 14.07.2016, 00:20 | Сообщение # 1983
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Кошелев, попробуйте это: on_info = {=actor_on_level(escape) -esc_scene} sr_cutscene@esc %+esc_scene%
Объясню smile Если игрок находится на Кордоне и не имеет инфопоршня esc_scene - переключаемся на секцию sr_cutscene@esc и выдаём инфопоршень. В связи с тем, что инфопоршень мы получили, сцена во 2 раз не запустится. happy


У мутантов тоже есть группировки. © Движок X-Ray




Сообщение отредактировал asd123 - Чт, 14.07.2016, 00:23
 
КошелевДата: Чт, 14.07.2016, 01:37 | Сообщение # 1984
Гражданский
Пользователи
Сообщений: 19
Награды: 0
Репутация: [ 0 ]

asd123, Спасибо!

Добавлено (14.07.2016, 01:37)
---------------------------------------------
Почему-то перестали выдаваться все созданные квесты. Диалоги в порядке, хотя я не уверен. В СДК dialog editor может нарушить работу диалогов по какой-либо причине?

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

Цитата Кошелев ()
Почему-то перестали выдаваться все созданные квесты.


Если все квесты разом перестали работать, значит все они выдаются в одном файле. Вероятнее всего, в файле dialogs,scripts. Или аналогичном. Проверяйте файл на синтаксис. Где то не поставлена скобка. Или кавычки. Или запятая. Или стоит что-то лишнее.
 
КошелевДата: Чт, 14.07.2016, 11:13 | Сообщение # 1986
Гражданский
Пользователи
Сообщений: 19
Награды: 0
Репутация: [ 0 ]

Как заюзать диалог с НПС, стоящим рядом, сразу после кат-сцены?

Добавлено (14.07.2016, 11:13)
---------------------------------------------
sergej5500, Спасибо, была ошибка в функции выдачи квеста.

 
asd123Дата: Чт, 14.07.2016, 15:22 | Сообщение # 1987
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Доброго времени суток smile Вообщем, решил бороться с бестолочью-вертолётом. Создал в xr_effects.script вызов функции на принудительное обновление цели вертолёту. Вызов скопировал с вызова удаления целей(но тут уже отсылка на heli_fire, а не на heli_combat. Функция ведь находится в другом файле):
Код
function heli_update_enemy(actor, npc)
    heli_fire.heli_fire:update_enemy_arr( npc )
end

Собственно, сама функция:
[cut=тык]
function heli_fire:update_enemy_arr()
--'printf("update_enemy_arr()")
local heli = self.obj:get_helicopter()
local index = 0
local min_dist2D = 65000
--' printf("heli_enemy_count=%d", db.heli_enemy_count)
while index < db.heli_enemy_count do
if db.heli_enemies[index] then
if heli:isVisible( db.heli_enemies[index] ) then
if distance_2d( self.obj:position(), db.heli_enemies[index]:position() ) < min_dist2D then
self.enemy = db.heli_enemies[index]
min_dist2D = distance_2d( self.obj:position(), db.heli_enemies[index]:position() )
self.flag_by_enemy = true
end
end
end
index = index + 1
end
if heli:isVisible( db.actor ) and random_choice( false, true) or db.heli_enemy_count==0 then
if distance_2d( self.obj:position(), db.actor:position() ) <= min_dist2D*2 then
self.enemy = db.actor
min_dist2D = distance_2d( self.obj:position(), db.actor:position() )
end
end
end[/cut]
Добавил в логику вертолёту
Код
on_timer = 5000 | %=heli_update_enemy%

Спустя 5 секунд стрельбы, игра вылетает с таким логом:
Код
FATAL ERROR

[error]Expression    : !m_error_code
[error]Function      : raii_guard::~raii_guard
[error]File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line          : 748
[error]Description   : ...e.r. - Зов Припяти\gamedata\scripts\heli_fire.script:173: attempt to index field 'obj' (a nil value)

stack trace:

0023:69737365 d3dx9_41.dll

Как бы мне решить эту проблему?

Добавлено (14.07.2016, 15:22)
---------------------------------------------
Кстати, в логике вертолёта для эвакуации военных из Припяти заметил строку:

Код
on_info2 = {+pri_a28_cutscene_start} heli_move@land %+pri_a28_helis_added =spawn_object(pri_a28_earth_helli_1:pri_a28_heli_landing_way_1:0:215) =spawn_object(pri_a28_earth_helli_2:pri_a28_heli_landing_way_2:0:210)%

Вопрос: а что обозначают числа :0:215 и :0:210 ?


У мутантов тоже есть группировки. © Движок X-Ray




Сообщение отредактировал asd123 - Чт, 14.07.2016, 15:07
 
КошелевДата: Чт, 14.07.2016, 17:45 | Сообщение # 1988
Гражданский
Пользователи
Сообщений: 19
Награды: 0
Репутация: [ 0 ]

asd123, Вопросом на вопрос, лично к Вам smile

Ваша функция из поста 1983, увы, не работает
Код
on_info = {=actor_on_level(escape) -esc_scene} sr_cutscene@esc %+esc_scene%

Добавлено (14.07.2016, 17:45)
---------------------------------------------
;Зов Припяти
Имеется квест на "Найти и принести" в моем случае артефакт. Скелет квеста выглядит так:

Код
[wolf_dolg_sidor_art]
icon = ui_inGame2_Artefakti_na_zakaz
prior = 106
storyline = false
title = {=actor_has_item(af_medusa)} wolf_dolg_sidor_money_text, wolf_dolg_sidor_sam_text
descr = {=actor_has_item(af_medusa)} wolf_dolg_sidor_money_text_descr, wolf_dolg_sidor_sam_text_descr
target = {=actor_has_item(af_medusa)} esc_trader, nil
condlist_0 = {+wolf_dolg_sidor_money_done} complete
on_complete = %=inc_faction_goodwill_to_actor(stalker:200)%


То есть, квест "Найти" после того, как ГГ подбирает артефакт, обновляется на "Принести". Он обновляется. Я отдаю артефакт Сидоровичу, квест идет как "Выполнен", но сразу "Задание обновлено: Найти артефакт". То есть, по новой. Почему так? В чем проблема? Прошу внести правки.
 
sergej5500Дата: Чт, 14.07.2016, 18:16 | Сообщение # 1989
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Цитата Кошелев ()
Почему так? В чем проблема? Прошу внести правки.


Вероятно, не выдается инфопорция завершения квеста wolf_dolg_sidor_money_done.
 
КошелевДата: Чт, 14.07.2016, 18:34 | Сообщение # 1990
Гражданский
Пользователи
Сообщений: 19
Награды: 0
Репутация: [ 0 ]

sergej5500, Выдается
Код

            <phrase id="5">
                <text>esc_sidor_rabota_1_done_5</text>
                <action>dialogs_escape.wolf_dolg_sidor_money_to_actor</action>
                <give_info>wolf_dolg_sidor_money_done</give_info>
                <give_info>close_dialog_sidor_2</give_info>
            </phrase>


Сообщение отредактировал Кошелев - Чт, 14.07.2016, 18:35
 
asd123Дата: Чт, 14.07.2016, 18:37 | Сообщение # 1991
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Кошелев, так.. У вас после выдачи награды и потери артефакта обновляется задание?

У мутантов тоже есть группировки. © Движок X-Ray




Сообщение отредактировал asd123 - Чт, 14.07.2016, 18:39
 
КошелевДата: Чт, 14.07.2016, 18:47 | Сообщение # 1992
Гражданский
Пользователи
Сообщений: 19
Награды: 0
Репутация: [ 0 ]

При такой постановке при взятии задания выдается сразу два "Найти артефакт" и "Получить награду"
Код
title = {=actor_has_item(af_medusa)} wolf_dolg_sidor_money_text, wolf_dolg_sidor_sam_text
descr = {=actor_has_item(af_medusa)} wolf_dolg_sidor_money_text_descr, wolf_dolg_sidor_sam_text_descr


Поменял постановку на более рабочую, поменял местами
Код
title = wolf_dolg_sidor_sam_text, {=actor_has_item(af_medusa)} wolf_dolg_sidor_money_text
descr = wolf_dolg_sidor_sam_text_descr, {=actor_has_item(af_medusa)} wolf_dolg_sidor_money_text_descr


Теперь все хорошо, но при взятии артефакта задание не обновляется на "Получение награды". С чем теперь это связано?

Добавлено (14.07.2016, 18:45)
---------------------------------------------
asd123, Да, было так, исправил, теперь другая проблема (сообщение выше)

Добавлено (14.07.2016, 18:46)
---------------------------------------------
Конструкция квеста теперь выглядит так

Код
[wolf_dolg_sidor_art]
icon = ui_inGame2_Artefakti_na_zakaz
prior = 106
storyline = false
title = wolf_dolg_sidor_sam_text, {=actor_has_item(af_medusa)} wolf_dolg_sidor_money_text
descr = wolf_dolg_sidor_sam_text_descr, {=actor_has_item(af_medusa)} wolf_dolg_sidor_money_text_descr
target = {=actor_has_item(af_medusa)} esc_trader, nil
condlist_0 = {+wolf_dolg_sidor_money_done} complete
on_complete = %=inc_faction_goodwill_to_actor(stalker:200)%

Добавлено (14.07.2016, 18:47)
---------------------------------------------
Дело в том, что не работает проверка на взятие артефакта. Возможно, нужно записать функцию в скрипт на проверку. Если так, то как эту функцию выдать вне диалога, через квест, например?

 
asd123Дата: Чт, 14.07.2016, 18:57 | Сообщение # 1993
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Кошелев, скиньте свои правки в сторону этого задания из файла dialogs_escape.xml. Желательно так же и из файла dialogs_escape.script, а то я сейчас голову сломаю.. biggrin

У мутантов тоже есть группировки. © Движок X-Ray




Сообщение отредактировал asd123 - Чт, 14.07.2016, 18:59
 
КошелевДата: Чт, 14.07.2016, 19:08 | Сообщение # 1994
Гражданский
Пользователи
Сообщений: 19
Награды: 0
Репутация: [ 0 ]

asd123, Скрипт скинуть могу, а вот в диалоге "очень много букв". Квест с разветвлениями и 4 вариантами выполнения, два из них - провал. Три работают, а вот четвертый вариант, на поиск артефакта, ну никак не хочет работать.

Добавлено (14.07.2016, 19:08)
---------------------------------------------
Ладно, попробуем как-нибудь коротко. Вот функция выдачи именно этого задания

Код
function wolf_dolg_sidor_art_sam()  
task_manager.get_task_manager():give_task("wolf_dolg_sidor_sam")
end

Вот фраза диалога, в котором оно выдается
Код
            <phrase id="34">
                <text>wolf_dolg_sidor_34</text>
                <action>dialogs_escape.wolf_dolg_sidor_art_sam</action>
                <give_info>wolf_dolg_sidor_sam_give</give_info>
                <give_info>wolf_dolg_sidor_done</give_info>
                <give_info>close_dialog_wolf_3</give_info>
                <next>35</next>
            </phrase>
 
asd123Дата: Чт, 14.07.2016, 19:22 | Сообщение # 1995
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

Кошелев, ладно.. Давайте попробуете сделать так же, как я делал квест для своего персонажа. Вообщем, файл с квестом:
[cut=tm_agroprom.ltx(у меня)][agr_stalker_trader_job_1]
icon = ui_inGame2_CarryingAntidote
prior = 2
storyline = false
title = {=actor_has_item(drug_anabiotic)} agr_stalker_trader_job_1_have_item, {!actor_has_item(drug_anabiotic)} agr_stalker_trader_job_1_no_have_item
descr = {=actor_has_item(drug_anabiotic)} agr_stalker_trader_job_1_have_item_desc, {!actor_has_item(drug_anabiotic)} agr_stalker_trader_job_1_no_have_item_desc
target = {=actor_has_item(drug_anabiotic)} agr_stalker_trader, nil
condlist_0 = {+job_1_completed} complete
[/cut]
Тут идёт проверка на то, что актёр имеет предмет. Так же здесь прописана выдача награды.
[cut=dialogs_agroprom.script(у меня)]function agr_stalker_trader_find_1_have(first_speaker, second_speaker)
return ((db.actor:object("drug_anabiotic") ~= nil))
end

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

function agr_stalker_trader_give_item_of_find_1(first_speaker, second_speaker)
dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "drug_anabiotic")
end

function agr_stalker_trader_give_reward_of_find_1(first_speaker, second_speaker)
dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, "wpn_ak74")
dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, "ammo_5.45x39_ap", 6)
dialogs.relocate_money_to_actor(first_speaker, second_speaker, 30000)
end[/cut]

Дальше кость диалога. 2 секции: первая до находки нужного предмета, вторая после того, как находите предмет(так сказать, после обновления задания.)
[cut=dialogs_agroprom.xml(у меня)]
<dialog id="agr_stalker_trader_job_1">
<precondition>dialogs_agroprom.agr_stalker_trader_find_1_start</precondition>
<dont_has_info>job_1_start</dont_has_info>
<phrase_list>
<phrase id="0">
<text>agr_stalker_trader_dialog_1</text>
<next>111</next>
</phrase>
<phrase id="111">
<text>agr_stalker_trader_dialog_2</text>
<next>221</next>
<next>2212</next>
</phrase>
<phrase id="2212">
<text>agr_stalker_trader_dialog_no</text>
<action>dialogs.break_dialog</action>
</phrase>
<phrase id="221">
<text>agr_stalker_trader_dialog_3</text>
<next>222</next>
</phrase>
<phrase id="222">
<text>agr_stalker_trader_dialog_4</text>
<next>232</next>
</phrase>
<phrase id="232">
<text>agr_stalker_trader_dialog_5</text>
<action>dialogs_agroprom.job_1_start</action>
<give_info>job_1_start</give_info>
</phrase>
</phrase_list>
</dialog>
<dialog id="agr_stalker_trader_job_1_completed">
<precondition>dialogs_agroprom.agr_stalker_trader_find_1_have</precondition>
<has_info>job_1_start</has_info>
<dont_has_info>job_1_completed</dont_has_info>
<phrase_list>
<phrase id="0">
<text>agr_stalker_trader_dialog_6</text>
<next>1116</next>
<action>dialogs_agroprom.agr_stalker_trader_give_item_of_find_1</action>
</phrase>
<phrase id="1116">
<text>agr_stalker_trader_dialog_7</text>
<action>dialogs_agroprom.agr_stalker_trader_give_reward_of_find_1</action>
<give_info>job_1_completed</give_info>
</phrase>
</phrase_list>
</dialog>[/cut]
agr,agroprom,job и прочие слова поменяйте под свой квест(типа esc, escape, af_medusa), дополните кости своими диалоговыми фразами и всё - рабочий вариант. smile Скорее всего, у Вас проблема в том, что вы не добавили в скрипты проверку на наличие артефактов(или где-то в костях диалога допустили ошибку. Вы ведь не показали свой диалог полностью). Так что, пробуйте, пишите happy


У мутантов тоже есть группировки. © Движок X-Ray




Сообщение отредактировал asd123 - Чт, 14.07.2016, 19:27
 
Поиск: