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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
asd123Дата: Ср, 05.02.2014, 09:36 | Сообщение # 406
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

sergej5500, в повелителе зоны я добавил возможность вступать в СБУ (agent), и всe группировки становятся нейтральными. Наёмники и  спецназ в результате нейтралы, но у них нет диалогов привествия, типа: "Привет брат, здавия желаю и т.д." так же, как и у ренегатов с враждебными бандитами.

По поводу рассветовцев - в их диалогах у меня притензий нет, но я бы хотел добавить им диалоги как у сталкеров, типо: "Подскажи мне насчет одного дела, кто мог-бы предложить работу и т.д."

По поводу военных - я и удалял, и комментировал строчку по поводу военных в travel mаnаger, но в результате получаю вылет при попытке поговорить с ними вот в такой форме:


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




Сообщение отредактировал asd123 - Ср, 05.02.2014, 10:09
 
sergej5500Дата: Ср, 05.02.2014, 11:14 | Сообщение # 407
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

asd123,
Покажите полный код функции, которую вы правили.

По диалогам. Диалоги симуляционных НПС заданы в файле gamedata\configs\misc\dialog_manager. Там есть несколько секции по смыслу.

1. Диалоги dm_job_1, _2, и т.д.  отвечают на вопрос о работе. Ниже секция:

[dm_job_1]
category = job
npc_community = stalker
level = zaton
info = -zat_b38_disappearance_stalkers_get_out_from_den_of_the_bloodsucker_give

В ней указано, что отвечать на вопрос этой фразой могут сталкеры  на Затоне (npc_community = stalker   level = zaton), если не выдана инфопорция zat_b38_disappearance_stalkers_get_out_from_den_of_the_bloodsucker_give.

2. Диалоги dm_anomalies_  отвечают на вопросы об артефактах.  Секция

[dm_anomalies_1]
category = anomalies
npc_community = stalker
level = zaton
smart = zat_b14_smart_terrain

Тут указывается местность  (smart = zat_b14_smart_terrain).

3.  Диалоги dm_information_ отвечают на вопрос, что нового в Зоне.

4. Диалоги dm_hello_0 отвечают за приветствия сталкеров.

5. Диалоги dm_help_0 используют раненые НПС.


Сообщение отредактировал sergej5500 - Ср, 05.02.2014, 11:23
 
NIVДата: Ср, 05.02.2014, 13:57 | Сообщение # 408
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Здравствуйте! Подскажите, пожалуйста как для inventory_box с конкретным стори_ид:
1) получить содержимое (имена секций?);
2) ограничить вместимость, например тремя штуками предметов?
P.S. Помню, что где-то было что-то похожее, но найти не смог. Смотрел treasure_manager.script, ничего не понял.


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
makdmДата: Ср, 05.02.2014, 18:12 | Сообщение # 409
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

NIV, используйте метод box:iterate_inventory_box( calc, box)
где box - клиентский объект ящика.

В функции calc( temp, item ) получите все секции объектов в ящике и их количество.


Терпение......
И все получится!
 
asd123Дата: Ср, 05.02.2014, 21:41 | Сообщение # 410
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
Награды: 10
Репутация: [ 423 ]

sergej5500, по поводу travel_manager:
Вот что оригинально

Вот что удалил


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


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

asd123
Попробуй функцию в таком виде.

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

sergej5500, помогло, но вот добавление диалогов не помогло... нуу, вылет при попытке говорить с наёмным спецназом исчез, но диалоги не добавились.. может, что-нибуть еще подправить?

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


 
NIVДата: Чт, 06.02.2014, 21:15 | Сообщение # 413
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Здравствуйте! А как можно запустить функцию ПОСЛЕ закрытия инвентарного ящика? В схеме [ph_idle] параметр on_use срабатывает на открытие.

Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
denis2000Дата: Чт, 06.02.2014, 21:58 | Сообщение # 414
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

NIV, Могу предложить отслеживать закрытие окна обыска трупа/ящика.

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

NIV,  в файле actor_menu.script, как только вы открываете ящик,то  в функции dead_body_search_wnd_opened устанавливается флаг dead_body_searching = true
Как только закрываете ящик, то флаг в функции dead_body_search_wnd_closed  сбрасывается в false:
dead_body_searching = false
Есть одно неудобство. Этот флаг также устанавливается и сбрасывается при обыске мертвых тел. А так как нам нужен только инвентарный ящик, то делаем следующее. 

Добавляем в файл свой флаг, например,

open_inventory_box = false  и инициализируем его в файле.

Теперь в метод action_idle:use_callback(obj, actor) в файле ph_idle.script пишем

if obj:clsid() == clsid.inventory_box then
actor_menu.open_inventory_box = true
end

Ящик открыт - флаг "поднят".

Теперь отследим его закрытие.
Для этого в файле actor_menu.script в функции dead_body_search_wnd_closed пишем

if open_inventory_box == true then
ТРА-ТА-ТА
open_inventory_box = false
end

Вместо ТРА-ТА-ТА  Ваша функция, которая выполняется при закрытии ящика.
И сброс флага в false.


Терпение......
И все получится!
 
NIVДата: Пн, 10.02.2014, 17:48 | Сообщение # 416
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

makdm, идея понятна, но где-то есть проблемы. Если вписать выполняемую функцию в функцию dead_body_search_wnd_closed, то она выполняется отлично. Но если сделать, как у вас, проверку на open_inventory_box == true, то она не выполняется, как будто значение флага не поменялось.  Если флаг инициализировать, как true, то проверка проходит успешно.
И потом, я хотел, чтобы эта функция выполнялась только при закрытии одного конкретного ящика. Пробовал менять значение  флага в файле bind_physic_object.script, функция generic_physics_binder:use_callback.
После слов local box_name = obj:name(), вписал
Код
if box_name == ("jup_b43_machine_inv_box") then
actor_menu.open_inventory_box = true
end

эффекта нет. Может у вас есть ещё идеи, где можно поменять флаг?


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
makdmДата: Пн, 10.02.2014, 21:04 | Сообщение # 417
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

NIV, сами то как думаете? Если у вас флаг не принимает значение true ни в скриптах, что я вам предложил, ни в скриптах разработчиков stalkera, то возможно причина в чем-то другом?  wink

Терпение......
И все получится!
 
NIVДата: Вт, 11.02.2014, 10:25 | Сообщение # 418
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Если говорить о моих домыслах, то мне кажется, проблема в том, что каждый раз при обращении к actor_menu.script переменная open_inventory_box сбрасывается в false (при инициализации), и ей плевать на то, как её меняли в других функциях. В отличие от неё, переменная dead_body_searching принимает значение true в функции "открытие окна обыска" ВНУТРИ файла actor_menu.script, и меняется на false в функции "закрытие окна". Скорее всего, я не прав.

Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
makdmДата: Вт, 11.02.2014, 14:14 | Сообщение # 419
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

NIV,  немного не так.
В файле ph_idle. script вместо того, что я писал раньше

Цитата makdm ()
if obj:clsid() == clsid.inventory_box then actor_menu.open_inventory_box = true
end

Пишем

local name = obj:name()
if string.find( name, "jup_b43_machine_inv_box" ) ~= nil then
actor_menu.inv_box_open = true
end

И всё должно работать. ( По крайней мере у меня работает на "пять" )


Терпение......
И все получится!
 
sergej5500Дата: Вт, 18.02.2014, 18:24 | Сообщение # 420
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. В xr_effects имеется функция.


Допустим, мы применили эту функцию к какому либо объекту. Объект удалился.  При повторном вызове функции к этому же
объекту следует вылет.



Строка 1266:
printf("You are trying to set non-existant target [%s] for object [%s] in section [%s]", tostring(target_str), tostring(obj:name()), tostring(db.storage[obj:id()].active_section))

Возможно ли подправить функцию так, чтобы при отсутствии объекта она не давала вылетов?  Допустим, что сохранение произошло сразу после удаления объекта и рестриктор еще не переключился. Тогда после загрузки сейва возможен вызов функции к уже удаленному объекту. Желательно иметь "страховку" на этот случай.

Награда: + в репутацию.


Сообщение отредактировал sergej5500 - Вт, 18.02.2014, 18:32
 
Поиск: