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

Редактирование и создание скриптов

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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
tema796Дата: Вс, 13.03.2016, 21:43 | Сообщение # 751
Гражданский
Пользователи
Сообщений: 20
Награды: 0
Репутация: [ -20 ]

denis2000, Тогда можешь подсказать как лучше сделать, я в этом просто еще новичок
 
denis2000Дата: Пн, 14.03.2016, 09:05 | Сообщение # 752
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата tema796 ()
Тогда можешь подсказать как лучше сделать

Основное правило написание бес сбойных скриптов в LUA проверка переменных перед использованием (к сожалению в LUA это единственный способ).
Поэтому применяете переменную Alife, перед использованием пишете:
Код
if Alife ~= nil then
-- Все хорошо можно работать дальше
end

И так далее, учитесь за вас изучать программирование и в частности LUA никто не будет.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
men_stalkerДата: Пн, 02.05.2016, 14:48 | Сообщение # 753
Инженер «Свободы»
Свобода
Сообщений: 184
Награды: 5
Репутация: [ 40 ]

Здравствуйте, такой вопрос: можно ли добавить новые генерационные имена и их категории
 
СахарДата: Пн, 02.05.2016, 17:46 | Сообщение # 754
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

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 нудно поменять циферки на то число сколько у тебя используется "имен" или "фамилий" в данном генераторе.


 
men_stalkerДата: Вт, 03.05.2016, 15:48 | Сообщение # 755
Инженер «Свободы»
Свобода
Сообщений: 184
Награды: 5
Репутация: [ 40 ]

Сахар, здравствуйте.
Извините, но немного не понял механику, например:

[stalker_names_stalker]
name_cnt = 104 - то есть идёт первые 104 имени для сталкеров

[stalker_names_bandit]
name_cnt = 38 - а потом идёт потом 38 имён для бандитов

Так?


Сообщение отредактировал men_stalker - Вт, 03.05.2016, 16:06
 
denis2000Дата: Вт, 03.05.2016, 16:58 | Сообщение # 756
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

men_stalker, 104 имени для сталкеров и 38 для бандитов.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
men_stalkerДата: Ср, 04.05.2016, 08:47 | Сообщение # 757
Инженер «Свободы»
Свобода
Сообщений: 184
Награды: 5
Репутация: [ 40 ]

А как создать группу имён например:

[stalker_names_test]
name_cnt = 1
last_name_cnt = 200

Только так или ещё где нибудь надо прописывать кроме этого и транскрипции?
И как это имя задействовать в профиле?
 
denis2000Дата: Ср, 04.05.2016, 09:59 | Сообщение # 758
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата men_stalker ()
Только так или ещё где нибудь надо прописывать кроме этого и транскрипции?

Нет более нигде не надо.
Цитата men_stalker ()
И как это имя задействовать в профиле?

<name>GENERATE_NAME_test</name>


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
lychagin0Дата: Вс, 08.05.2016, 10:06 | Сообщение # 759
Легенда Зоны
Вольные сталкеры
Сообщений: 1303
Награды: 9
Репутация: [ 278 ]

Last_Dawn, Скачай из шапки темы Сборник модостроения ЗП v10.10.11 (автор: XOBAH) там есть соответствующий урок с готовым спавном дин. аномалий.

 
denis2000Дата: Вс, 08.05.2016, 12:36 | Сообщение # 760
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата Last_Dawn ()
полезли неясные вылеты.

Логи вылетов и правки приводить не модно?


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
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
 
sergej5500Дата: Вс, 22.05.2016, 22:33 | Сообщение # 762
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Попробовал в чистом Зове Припяти сделать закладываемый рюкзак для хабара. Как в СГМ. В упрощенном варианте. Без ГУИ-окон.

[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", "") активна, то появляется метка тайника.

Но метка почему то ставится на актора, а не на рюкзак. И перемещается вместе с актором по локации. Где я допустил ошибку?
 
makdmДата: Пн, 23.05.2016, 09:58 | Сообщение # 763
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата 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
 
sergej5500Дата: Пн, 23.05.2016, 22:06 | Сообщение # 764
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

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 ничего не даёт.
 
makdmДата: Вт, 24.05.2016, 07:38 | Сообщение # 765
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

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
 
Поиск: