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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
denis2000Дата: Вт, 08.03.2016, 14:42 | Сообщение # 751
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Готовый скрипт не предложу, могу посоветовать алгоритм:
1. Задайте индекс найденных предметов = 0 и пустую таблицу найденных предметов find_items
2. Итерируясь по инвентарю ищите предметы с именами секций из таблицы item_sections и помещаете их в новую таблицу find_items, увеличивая при этом индекс найденных предметов
3. Если индекс найденных предметов равен 1, то предмет только один придется передать его (даже если он в слоте)
4. Если индекс найденных предметов больше 1, то итерируясь по таблице find_items отдайте первый же предмет который не находиться при этом в слоте.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
makdmДата: Ср, 09.03.2016, 00:24 | Сообщение # 752
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата 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]


Терпение......
И все получится!
 
tema796Дата: Вс, 13.03.2016, 00:36 | Сообщение # 753
Гражданский
Пользователи
Сообщений: 20
Награды: 0
Репутация: [ -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
 
denis2000Дата: Вс, 13.03.2016, 18:02 | Сообщение # 754
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

tema796, Для одного из значений i, переменная Alife = nil, в результате попытка получить Alife.id оборачивается вылетом.

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

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

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

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

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


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

Здравствуйте, такой вопрос: можно ли добавить новые генерационные имена и их категории
 
СахарДата: Пн, 02.05.2016, 17:46 | Сообщение # 758
Гражданский
Пользователи
Сообщений: 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 | Сообщение # 759
Инженер «Свободы»
Свобода
Сообщений: 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 | Сообщение # 760
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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

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

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

[stalker_names_test]
name_cnt = 1
last_name_cnt = 200

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

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

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

<name>GENERATE_NAME_test</name>


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

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

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

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

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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
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
 
Поиск: