Модостроение. Редактирование и создание скриптов
|
|
denis2000 | Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Редактирование и создание скриптов Редактирование и создание скриптов на языке LUA Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Много интересного материала здесь (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 за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 08.03.2016, 14:42 | Сообщение # 751 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Готовый скрипт не предложу, могу посоветовать алгоритм: 1. Задайте индекс найденных предметов = 0 и пустую таблицу найденных предметов find_items 2. Итерируясь по инвентарю ищите предметы с именами секций из таблицы item_sections и помещаете их в новую таблицу find_items, увеличивая при этом индекс найденных предметов 3. Если индекс найденных предметов равен 1, то предмет только один придется передать его (даже если он в слоте) 4. Если индекс найденных предметов больше 1, то итерируясь по таблице find_items отдайте первый же предмет который не находиться при этом в слоте.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
makdm | Дата: Ср, 09.03.2016, 00:24 | Сообщение # 752 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 ( ) Вопросы такие. Как доработать функцию передачи, чтобы проверить, не в слоте ли костюм? И передать тот, который в рюкзаке.
Если переданный костюм - экзоскелет: alfa_exo_outfit или reduce_alfa_exo_outfit, то нужно выдать инфопорцию. Она нужна для выбора визуала непися после "переодевания". Как отследить тип костюма и выдать инфопорцию?
Вот так попробуй: [cut noguest] function zat_b38_plennic_outfit_otdat(first_speaker, second_speaker) local actor = ( first_speaker and first_speaker:id() == db.actor:id() ) or second_speaker local npc = ( first_speaker and first_speaker:id() ~= db.actor:id() ) or second_speaker local actor_outfit_id = actor:item_in_slot( 7 ):id() local item_sections = { ["alfa_outfit"] = true, ["alfa_exo_outfit"] = true, ["reduce_alfa_outfit"] = true, ["reduce_alfa_exo_outfit"] = true } local outfit_tbl = {} local count = 0 local function calc( temp, item ) if item:id() ~= actor_outfit_id then local section = item:section() if item_sections[ section ] == true then count = count + 1 outfit_tbl[ count ] = item:id() end end end actor:iterate_inventory( calc, actor ) local need_count = 3 -- Здесь количество необходимых бронекостюмов для передачи for k,v in pairs( outfit_tbl ) do if k > need_count then break else local obj = level.object_by_id( v ) local sect = obj:section() actor:transfer_item( obj, npc ) news_manager.relocate_item( actor, "out", sect, 1 ) if sect == "alfa_exo_outfit" or sect == "reduce_alfa_exo_outfit" then give_info("exo_outfit_done") end end end end[/cut]
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
tema796 | Дата: Вс, 13.03.2016, 00:36 | Сообщение # 753 |
Гражданский
Пользователи
Сообщений: 20
| Доброго времени суток. Решил написать функцию на проверку что костер горит но тут случился такой вылет:
Код [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 : ...r. - Зов Припяти\gamedata\scripts\_tkp_s_data.script:64: attempt to index local 'Alife' (a nil value)
Я не могу понять в чем причина. Вот сама функция, которую я вызываю:
Код function Turn_On_Koster() for i =1,65535 do local Alife = alife():object(i) local Obj_id = level.object_by_id(Alife.id) local FireCamp = Obj_id:get_campfire() if FireCamp and FireCamp:is_on() and Obj_id:position():distance_to(db.actor:position()) < 5 then _tkp_send_tips.Koster_On() end end end
Сообщение отредактировал tema796 - Вс, 13.03.2016, 00:37 |
|
|
Эти 0 пользователя(ей) поблагодарили tema796 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 13.03.2016, 18:02 | Сообщение # 754 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| tema796, Для одного из значений i, переменная Alife = nil, в результате попытка получить Alife.id оборачивается вылетом.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
tema796 | Дата: Вс, 13.03.2016, 21:43 | Сообщение # 755 |
Гражданский
Пользователи
Сообщений: 20
| denis2000, Тогда можешь подсказать как лучше сделать, я в этом просто еще новичок
|
|
|
Эти 0 пользователя(ей) поблагодарили tema796 за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 14.03.2016, 09:05 | Сообщение # 756 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата tema796 ( ) Тогда можешь подсказать как лучше сделать Основное правило написание бес сбойных скриптов в LUA проверка переменных перед использованием (к сожалению в LUA это единственный способ). Поэтому применяете переменную Alife, перед использованием пишете:
Код if Alife ~= nil then -- Все хорошо можно работать дальше end И так далее, учитесь за вас изучать программирование и в частности LUA никто не будет.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
men_stalker | Дата: Пн, 02.05.2016, 14:48 | Сообщение # 757 |
Инженер «Свободы»
Свобода
Сообщений: 184
| Здравствуйте, такой вопрос: можно ли добавить новые генерационные имена и их категории
|
|
|
Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
Сахар | Дата: Пн, 02.05.2016, 17:46 | Сообщение # 758 |
Гражданский
Пользователи
Сообщений: 2
| men_stalker, Доброго времени суток. Да можно, сначала в файле system.ltx ищешь там блоки stalker_names_stalker, stalker_names_bandit и т.д там уведешь строчки
Код name_cnt -- Имя или звание НПС т,е сколько всего задействовано имён для данной типа генератора. last_name_cnt --"Фамилия" НПС Дальше находишь файлы st_generate_fnames.xml, st_generate_snames.xml. st_generate_fnames.xml -- Текстовое описание имени НПС st_generate_snames.xml -- Фаммилия НПС. Тоесть тебе нужно добавить новые ноды в XML по аналогий с имеющимися, а потом system.ltx нудно поменять циферки на то число сколько у тебя используется "имен" или "фамилий" в данном генераторе.
|
|
|
Эти 0 пользователя(ей) поблагодарили Сахар за это полезное сообщение: |
|
|
men_stalker | Дата: Вт, 03.05.2016, 15:48 | Сообщение # 759 |
Инженер «Свободы»
Свобода
Сообщений: 184
| Сахар, здравствуйте. Извините, но немного не понял механику, например:
[stalker_names_stalker] name_cnt = 104 - то есть идёт первые 104 имени для сталкеров
[stalker_names_bandit] name_cnt = 38 - а потом идёт потом 38 имён для бандитов
Так?
Сообщение отредактировал men_stalker - Вт, 03.05.2016, 16:06 |
|
|
Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 03.05.2016, 16:58 | Сообщение # 760 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| men_stalker, 104 имени для сталкеров и 38 для бандитов.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
men_stalker | Дата: Ср, 04.05.2016, 08:47 | Сообщение # 761 |
Инженер «Свободы»
Свобода
Сообщений: 184
| А как создать группу имён например:
[stalker_names_test] name_cnt = 1 last_name_cnt = 200
Только так или ещё где нибудь надо прописывать кроме этого и транскрипции? И как это имя задействовать в профиле?
|
|
|
Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
denis2000 | Дата: Ср, 04.05.2016, 09:59 | Сообщение # 762 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата men_stalker ( ) Только так или ещё где нибудь надо прописывать кроме этого и транскрипции? Нет более нигде не надо.
Цитата men_stalker ( ) И как это имя задействовать в профиле? <name>GENERATE_NAME_test</name>
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
lychagin0 | Дата: Вс, 08.05.2016, 10:06 | Сообщение # 763 |
Легенда Зоны
Вольные сталкеры
Сообщений: 1303
| Last_Dawn, Скачай из шапки темы Сборник модостроения ЗП v10.10.11 (автор: XOBAH) там есть соответствующий урок с готовым спавном дин. аномалий.
|
|
|
Эти 0 пользователя(ей) поблагодарили lychagin0 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 08.05.2016, 12:36 | Сообщение # 764 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата Last_Dawn ( ) полезли неясные вылеты. Логи вылетов и правки приводить не модно?
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Last_Dawn | Дата: Вс, 08.05.2016, 14:35 | Сообщение # 765 |
Удаленные
| lychagin0, только вот оба расширения не работают у меня. В первом случае при нажатии на мануал (такой с вопросиком) справа девственная чистота, никакого текста нет. А во втором случае при нажатии на иконку книжки с текстом "Зов Припяти" (и вообще любой) ничего не происходит.
Цитата denis2000 ( ) Если у вас не открывается файл CHM Не помогло, команда "выполнить" выписывает ошибку 0х80004005 в DllRegisterServer. Десятая винда.
denis2000, посредственно адаптировал я, поэтому мне скорее посмотреть сначала надобно, что точно адаптировать, а потом уже вылеты ловить. А то это бредом попахивает: [cut=Спойлер]LUA error: c:\coc\gamedata\scripts\state_mgr_animation.script:161: attempt to index field 'animations' (a nil value)[/cut] Насчёт правок, то трогал сугубо bind_anomaly_field (реагирование аномалий на НПЦ, там вылет ругался на попытку сравнить нуль с числом в 140 строке), bind_stalker, xr_effects и xrs_random_anomaly (для динамических), вылет при загрузке игры.
Сообщение отредактировал Last_Dawn - Вс, 08.05.2016, 14:36 |
|
|
Эти 0 пользователя(ей) поблагодарили Last_Dawn за это полезное сообщение: |
|
|