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


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Сб, 11.01.2014, 21:33 | Сообщение # 376
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Цитата strelok200 ()
логика, пути для неписей задавались рандомно

Создать несколько секций с путями, потом случайно переходить на одну из них? Или внутри одного пути сделать переход на случайные точки. Но пути придётся ставить в любом случае.


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

strelok200,
Сам по себе путь - это и есть случайный маршрут между двумя (или более) конкретно заданными точками.
НПС уже давно прокладывают себе такие пути причем во всех играх и модуль делающий такое называется модуль поиска путей (есть несколько алгоритмов которые растут ногами из дискретной математики и теории графов)
Если хотите можно сделать путь со случайным выбором точек прохождения или случайный выбор готовых путей в логике, а то что вы делаете это не просто преизобретение велосипеда, а пересоздание колеса. Впрочем не мне вас ограничивать - может что-то интересное получиться.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Вс, 12.01.2014, 13:28 | Сообщение # 378
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Здравствуйте! Необходим совет по удалению динамического объекта (physic_object).

Сейчас я удаляю его функцией перебора объектов, описанной здесь, [cut=function release_object_by_sections(text)]
Код
function release_objects_by_section(find_string)  
  for a=1,65534 do  
  local obj = alife():object(a)  
  if obj then  
  if obj:section_name()~=nil and string.find(obj:section_name(),find_string) and obj.id~=nil then  
  local sect=obj:section_name()  
  alife():release(alife():object(obj.id),true)  
  end  
  end  
  end  
  end
[/cut]

Существует ли более "тонкий" способ удаления динамического объекта, например, когда их несколько одинаковых, а удалить нужно только один?

Пробовал использовать функцию из оригинала xr_effects.destroy_object(,,), которая например использовалась так: destroy_object(actor, npc, {"story", "jup_b206_plant_ph"}).
Но похоже, она предназначена только для удаления разрушаемых динамических объектов, на моём не срабатывает.


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
 
FantomICWДата: Вс, 12.01.2014, 13:44 | Сообщение # 379
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

NIV, странно, что не работает. Функция destroy_object действует для всей динамики, как минимум. Те же сканнеры и аномальное растение - это не какой-нибудь physic_destroyable_object. Они просто берут характеристики от physic_object. Сама функция удаляет объект через известный оборот alife():release. Грани его возможностей мне не известны. Так что все должно работать.


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

NIV, На каком объекте и как пытался использовать функцию xr_effects.destroy_object()?

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Вс, 12.01.2014, 14:18 | Сообщение # 381
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

denis2000, я писал destroy_object(actor, npc, {"story", "имя_объекта"}), где имя_объекта - это новый объект, зарегистрированный в dynamic_objects.ltx, например [jup_b43_af_blood]:physic_object, его остальные параметры брал по аналогии с существующими объектами.

Лог:
Код
[error]Description   : ...lishing\stalker3p\gamedata\scripts\xr_effects.script:1277: attempt to index global 'npc' (a nil value)

Движок не может понять, кто такой нпс, хотя функция имеет вид
Код
function jup_b43_unload_machine_tutor(actor, npc)
  destroy_object(actor, npc, {"story", "jup_b43_af_fuzz_kolobok"})
, вроде должно быть нормально

Больше всего смущает параметр "story" в функции destroy_object. Может, объект надо еще где-то прописывать?


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"

Сообщение отредактировал NIV - Вс, 12.01.2014, 14:25
 
FantomICWДата: Вс, 12.01.2014, 14:23 | Сообщение # 382
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Цитата NIV ()
story

Имеется ввиду, что в секции объекта должен быть story_id.



 
NIVДата: Вс, 12.01.2014, 14:35 | Сообщение # 383
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

FantomICW, возможно, так и есть. У некоторых объектов есть story_id. Стало быть, если хочется, чтобы было несколько объектов с одним визуалом, то надо создавать столько же разных объектов с уникальными story_id?! И потом удалять их по story_id?

Добавлено (12.01.2014, 14:35)
---------------------------------------------
И правда, добавил стори_ид - заработала функция destroy_object. Спасибо!


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

NIV, Что значит возможно? Ты применял функцию не проанализировав ее работу? Да! Передача параметров у тебя не корректна! Вот такие параметры передаются:
destroy_object(actor, npc, {"story", "story_id-обекта"}), или
destroy_object(actor, npc, {"path", "имя пути"}), или
destroy_object(actor, npc, {"job", "имя работы"})


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Вс, 12.01.2014, 18:28 | Сообщение # 385
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Подскажите, пожалуйста, как вызывается окно GUI и где искать сопутствующие функции при обыске ящика или при торговле?

Хотел изменить это окно для создания нового типа взаимодействия предметов из инвентаря с объектами.

Единственное, что удалось найти - это то, что в файлах actor_menu.script и pda.script содержится одинаковая функция actor_menu_mode(mode), у которой возможны следующие значения параметров:
Код
-- int mode:
-- 0 =  Undefined = закрыто
-- 1 =  Inventory
-- 2 =  Trade
-- 3 =  Upgrade
-- 4 =  DeadBodySearch
-- 10 =  Talk dialog  show
-- 11 =  Talk dialog  hide

Добавлено (12.01.2014, 18:28)
---------------------------------------------
Файл inventory_new.ltx (как было в ТЧ) - весь закомментирован


Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"

Сообщение отредактировал NIV - Вс, 12.01.2014, 18:15
 
FantomICWДата: Вс, 12.01.2014, 19:29 | Сообщение # 386
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

NIV, читай:
[cut=Много букв]Использования ящиков, трупов, inventory_box, прочих объектов фиксируют различные биндеры. К примеру, xr_motivator.script и bind_physic_object.script. Фиксируют по коллбеку use_object из таблицы class callback в lua_help.script. Вот она:
Код
C++ class callback {
      const action_animation = 21;
      const action_movement = 18;
      const action_object = 24;
      const action_particle = 23;
      const action_removed = 20;
      const action_sound = 22;
      const action_watch = 19;
      const actor_sleep = 25;
      const article_info = 12;
      const death = 8;
      const helicopter_on_hit = 27;
      const helicopter_on_point = 26;
      const hit = 16;
      const inventory_info = 11;
      const inventory_pda = 10;
      const level_border_enter = 7;
      const level_border_exit = 6;
      const map_location_added = 14;
      const on_item_drop = 29;
      const on_item_take = 28;
      const patrol_path_in_point = 9;
      const script_animation = 30;
      const sound = 17;
      const take_item_from_box = 34;
      const task_state = 13;
      const trade_perform_operation = 3;
      const trade_sell_buy_item = 2;
      const trade_start = 0;
      const trade_stop = 1;
      const trader_global_anim_request = 31;
      const trader_head_anim_request = 32;
      const trader_sound_end = 33;
      const use_object = 15;
      const weapon_no_ammo = 35;
      const zone_enter = 4;
      const zone_exit = 5;
        
};

Коллбек юза:
Код
const use_object = 15;

Еще коллбеки записаны в таблицу callbacks из xr_s.script. Оно нам сейчас не очень важно, но для общих знаний покажу:
Код
local callbacks={
   update={},
   game_load={},
   death={},
   npc_death={},
   monster_death={},
   offline_death={},
   net_spawn={},
   net_destroy={},
   info={},
   item_drop={},
   item_take={},
   item_take_from_box={},
   hit={},
   monster_hit={},
   npc_hit={},
   enemy_see_actor={},
   actor_see_enemy={},
   npc_shot_actor={},
   respawn={},
   use={},
   actor_destroy={},
   main_menu_on={},
   main_menu_off={}
}

Вот коллбек:
Код
use={},

Тут коллбеки прописываются, что можно было к ним подключать функции. В bind_stalker.script через данную таблицу подключается куча коллбеков. Например:
Код
self.object:set_callback(callback.use_object, nil)

Вообщем, если видишь callback.что-то, то скорее всего это отсылка к таблице из xr_s.script.
Вернемся к нашим биндерам. В нескольких местах в файлах можно найти примерно такие строки:
Код
self.object:set_callback(callback.use_object, generic_physics_binder.use_callback, self)

Эта строка из файла bind_physic_object.script. Разберем:
Код
self.object:set_callback(callback.коллбек_из_lua_help, название_биндера.название_нового_метода_биндера, self)

Т. е. устанавливается новый метод биндера через коллбек. Метод и будет фиксировать действие через коллбек. Вот он, метод:
Код
function generic_physics_binder:use_callback(obj, who)
   if obj:clsid() == clsid.inventory_box then
    local box_name = obj:name()
--  treasure_manager.use_box(obj, who)
   end
   if self.st.active_section then
    xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who)
   end
end

Последнее, что мне удалось отследить. Да, обращается к функции из xr_logic.script, она в логику дает какую-то информацию, дальше свое дело делает движок, запускающий окна.
Вот так вот.[/cut]



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

NIV, А при помощи функций из файла actor_menu.script, можно как раз отследить открытие этих окон. А вот функции придется писать свои.

Цитата FantomICW ()
обращается к функции из xr_logic.script, она в логику дает какую-то информацию, дальше свое дело делает движок, запускающий окна.

Собственно из биндера bind_physic_object.script (при наличии у объекта активной секции логики) приходит оповещение о событии в скрипт обработки логики объектов xr_logic.script, мало ли может нужны какие-то действия, например сменить активную секцию и т.п.
Только движок уже открыл окно, а событие объект "поюзан" приходит уже после.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
NIVДата: Пн, 13.01.2014, 06:44 | Сообщение # 388
Полевой исследователь
Ученые сталкеры
Сообщений: 167
Награды: 4
Репутация: [ 180 ]

Цитата FantomICW ()
дальше свое дело делает движок, запускающий окна.
Вот про это я и хотел уточнить. Кроме вывода текстуры фона, в этом окне отображается содержимое инвентаря Актора, т.е. его нужно перебрать, отрисовать, отсортировать по слотам, заполнить характеристики костюма, обеспечить перекладывание (в ящик или при торговле) и т.д. Есть ли доступ к функциям, выполняющим это? Или эти окна фиксированы на уровне движка?


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

Цитата NIV ()
Есть ли доступ к функциям, выполняющим это?

Нет. Но с оговоркой - возможность редактировать файл xrGame.dll никто не отменял.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
strelok200Дата: Пн, 13.01.2014, 18:22 | Сообщение # 390
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Подскажите пожалуйста, в чем причина неработоспособности ф-ции
Прописываю ее в xr_conditions, вызываю через логику рестриктора
on_info   = {=controller_xray} %=gar_message%
 
Поиск: