|
Модостроение. Редактирование и создание скриптов
|
|
| 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 за это полезное сообщение: |
|
|
| tema796 | Дата: Вс, 13.03.2016, 21:43 | Сообщение # 751 |
|
Гражданский
Пользователи
Сообщений: 20
| denis2000, Тогда можешь подсказать как лучше сделать, я в этом просто еще новичок
|
| |
|
| Эти 0 пользователя(ей) поблагодарили tema796 за это полезное сообщение: |
|
|
| denis2000 | Дата: Пн, 14.03.2016, 09:05 | Сообщение # 752 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата tema796 (  ) Тогда можешь подсказать как лучше сделать Основное правило написание бес сбойных скриптов в LUA проверка переменных перед использованием (к сожалению в LUA это единственный способ). Поэтому применяете переменную Alife, перед использованием пишете:
Код if Alife ~= nil then -- Все хорошо можно работать дальше end И так далее, учитесь за вас изучать программирование и в частности LUA никто не будет.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| men_stalker | Дата: Пн, 02.05.2016, 14:48 | Сообщение # 753 |
 Инженер «Свободы»
Свобода
Сообщений: 184
| Здравствуйте, такой вопрос: можно ли добавить новые генерационные имена и их категории
|
| |
|
| Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
| Сахар | Дата: Пн, 02.05.2016, 17:46 | Сообщение # 754 |
 Гражданский
Пользователи
Сообщений: 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 | Сообщение # 755 |
 Инженер «Свободы»
Свобода
Сообщений: 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 | Сообщение # 756 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| men_stalker, 104 имени для сталкеров и 38 для бандитов.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| men_stalker | Дата: Ср, 04.05.2016, 08:47 | Сообщение # 757 |
 Инженер «Свободы»
Свобода
Сообщений: 184
| А как создать группу имён например:
[stalker_names_test] name_cnt = 1 last_name_cnt = 200
Только так или ещё где нибудь надо прописывать кроме этого и транскрипции? И как это имя задействовать в профиле?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили men_stalker за это полезное сообщение: |
|
|
| denis2000 | Дата: Ср, 04.05.2016, 09:59 | Сообщение # 758 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата men_stalker (  ) Только так или ещё где нибудь надо прописывать кроме этого и транскрипции? Нет более нигде не надо.
Цитата men_stalker (  ) И как это имя задействовать в профиле? <name>GENERATE_NAME_test</name>
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| lychagin0 | Дата: Вс, 08.05.2016, 10:06 | Сообщение # 759 |
 Легенда Зоны
Вольные сталкеры
Сообщений: 1303
| Last_Dawn, Скачай из шапки темы Сборник модостроения ЗП v10.10.11 (автор: XOBAH) там есть соответствующий урок с готовым спавном дин. аномалий.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили lychagin0 за это полезное сообщение: |
|
|
| denis2000 | Дата: Вс, 08.05.2016, 12:36 | Сообщение # 760 |
 Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата Last_Dawn (  ) полезли неясные вылеты. Логи вылетов и правки приводить не модно?
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
| |
|
| Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
| Last_Dawn | Дата: Вс, 08.05.2016, 14:35 | Сообщение # 761 |
|
Удаленные
| 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 за это полезное сообщение: |
|
|
| sergej5500 | Дата: Вс, 22.05.2016, 22:33 | Сообщение # 762 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер. Попробовал в чистом Зове Припяти сделать закладываемый рюкзак для хабара. Как в СГМ. В упрощенном варианте. Без ГУИ-окон.
[cut=Бустер][personal_rukzak]:booster $spawn = "devices\personal_rukzak" visual = dynamics\devices\dev_rukzak\dev_rukzak.ogf.ogf inv_name = st_personal_rukzak inv_name_short = st_personal_rukzak description = st_personal_rukzak_descr inv_grid_width = 2 inv_grid_height = 2 inv_grid_x = 0 inv_grid_y = 38 inv_weight = 4.0 cost = 6000[/cut]
[cut=Инвентарный рюкзак][personal_rukzak_box]:inventory_box $spawn = "devices\personal_rukzak box" visual = dynamics\devices\dev_rukzak\dev_rukzak.ogf.ogf[/cut]
[cut=Колбэк на использование бустера]if s_obj and s_obj:section_name()=="personal_rukzak" then local sobj=alife():create("personal_rukzak_box",vector():set(db.actor:position().x,db.actor:position().y,db.actor:position().z),db.actor:level_vertex_id(),db.actor:game_vertex_id()) level.map_add_object_spot_ser(s_obj, "treasure", "") end[/cut]
Для тестов использовал метку оригинальных тайников ЗП. Рюкзаки отлично спавнятся. В них можно класть вещи.
Если строка level.map_add_object_spot_ser(s_obj, "treasure", "") активна, то появляется метка тайника.
Но метка почему то ставится на актора, а не на рюкзак. И перемещается вместе с актором по локации. Где я допустил ошибку?
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| makdm | Дата: Пн, 23.05.2016, 09:58 | Сообщение # 763 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 (  ) Где я допустил ошибку? Вот здесь:
Цитата sergej5500 (  ) level.map_add_object_spot_ser(s_obj, "treasure", "")
Нужно передавать id объекта, а не сам объект:
level.map_add_object_spot_ser( sobj.id, "treasure", "" )
И вот это
sobj=alife():create("personal_rukzak_box",vector():set(db.actor:position().x,db.actor:position().y,db.actor:position().z),db.actor:level_vertex_id(),db.actor:game_vertex_id())
можно написать короче и выполняться будет быстрее:
local actor = db.actor local sobj=alife():create("personal_rukzak_box", actor:position(), actor:level_vertex_id(), actor:game_vertex_id())
Терпение...... И все получится!
Сообщение отредактировал makdm - Пн, 23.05.2016, 10:17 |
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
| sergej5500 | Дата: Пн, 23.05.2016, 22:06 | Сообщение # 764 |
 Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| makdm,
За помощь спасибо. С метками всё в порядке. Возник новый вопрос.
Попробовал реализовать подбор рюкзака. За основу взял скрипты из СГМ.
[cut=Предмет для подъёма рюкзака][use_personal_rukzak]:identity_immunities GroupControlSection = spawn_group discovery_dependency = $spawn = "devices\use_personal_rukzak" $prefetch = 16 class = D_PDA cform = skeleton visual = dynamics\devices\dev_decoder\dev_decoder.ogf inv_grid_width = 1 inv_grid_height = 1 inv_grid_x = 0 inv_grid_y = 40 slot = 7 radius = 50 default_to_ruck = false can_trade = false inv_weight = 0.0 inv_name = st_use_personal_rukzak_title inv_name_short = st_use_personal_rukzak_title description = st_use_personal_rukzak_descr cost = 0[/cut]
[cut=Колбэк спавна]if s_obj and s_obj:section_name()=="personal_rukzak" then local actor = db.actor local sobj=alife():create("personal_rukzak_box",actor:position(),actor:level_vertex_id(),actor:game_vertex_id()) alife():create("use_personal_rukzak",vector(),0,0,sobj.id) level.map_add_object_spot_ser(sobj.id,"treasure","") end[/cut]
[cut=Скрипты для подбора рюкзака]function actor_binder:take_item_from_box(box, item) local box_name = box:name() addon_callbacks.on_take_item_from_box(box,item) end
function on_take_item_from_box(box,item) local box_name=box:section() local box_id=box:id() local box_item=item:section() if box_name="personal_rukzak_box" and box_item=="use_personal_rukzak" then if box:is_inv_box_empty()==false then relocate_items_with_inv_box(box,db.actor) end end news_manager.send_tip(db.actor,"st_treasure_rukzak_title",0,"got_ammo",3600,nil,"st_bring_obj") give_object_to_actor("personal_rukzak") game_hide_menu() alife():release(alife():object(box:id()),true) end
-- 'Переброска предметов от одного обьекта к другому. function relocate_items_with_inv_box(box,victim) local function calc(temp,item) if item~=nil then box:transfer_item(item,victim) end end box:iterate_inventory_box(calc,box) end[/cut]
При попытке взять предмет use_personal_rukzak получаю вылет.
[cut=Лог]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 : ...ing\Зов Припяти\gamedata\scripts\bind_stalker.script:126: attempt to index global 'addon_callbacks' (a nil value)
stack trace:
0023:69737365 igdumd32.dll[/cut]
Ошибка где-то в функции
[cut=Функция]function on_take_item_from_box(box,item) local box_name=box:section() local box_id=box:id() local box_item=item:section() if box_name="personal_rukzak_box" and box_item=="use_personal_rukzak" then if box:is_inv_box_empty()==false then relocate_items_with_inv_box(box,db.actor) end end news_manager.send_tip(db.actor,"st_treasure_rukzak_title",0,"got_ammo",3600,nil,"st_bring_obj") give_object_to_actor("personal_rukzak") game_hide_menu() alife():release(alife():object(box:id()),true) end[/cut]
Но я её не вижу. Проверка синтаксиса на LUA ничего не даёт.
|
| |
|
| Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
| makdm | Дата: Вт, 24.05.2016, 07:38 | Сообщение # 765 |
 Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, у тебя функция выполняется всегда, даже если ты не "нажал кнопку" в рюкзаке. Вот здесь добавь:
if box_name="personal_rukzak_box" and box_item=="use_personal_rukzak" then if box:is_inv_box_empty()==false then relocate_items_with_inv_box(box,db.actor) end else return end
В функции Цитата sergej5500 (  ) relocate_items_with_inv_box(box,victim) строчку
Цитата sergej5500 (  ) local function calc(temp,item) замени на
local function calc( box,item )
И САМОЕ главное: вот это if box_name="personal_rukzak_box" and box_item=="use_personal_rukzak" then замени на: if box_name=="personal_rukzak_box" and box_item=="use_personal_rukzak" then
Терпение...... И все получится!
Сообщение отредактировал makdm - Вт, 24.05.2016, 10:13 |
| |
|
| Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
|