Модостроение. Редактирование и создание скриптов
|
|
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 за это полезное сообщение: |
|
|
NIV | Дата: Сб, 11.01.2014, 21:33 | Сообщение # 376 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| Цитата strelok200 ( ) логика, пути для неписей задавались рандомно Создать несколько секций с путями, потом случайно переходить на одну из них? Или внутри одного пути сделать переход на случайные точки. Но пути придётся ставить в любом случае.
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
|
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 11.01.2014, 22:16 | Сообщение # 377 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| strelok200, Сам по себе путь - это и есть случайный маршрут между двумя (или более) конкретно заданными точками. НПС уже давно прокладывают себе такие пути причем во всех играх и модуль делающий такое называется модуль поиска путей (есть несколько алгоритмов которые растут ногами из дискретной математики и теории графов) Если хотите можно сделать путь со случайным выбором точек прохождения или случайный выбор готовых путей в логике, а то что вы делаете это не просто преизобретение велосипеда, а пересоздание колеса. Впрочем не мне вас ограничивать - может что-то интересное получиться.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
NIV | Дата: Вс, 12.01.2014, 13:28 | Сообщение # 378 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| Здравствуйте! Необходим совет по удалению динамического объекта (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"
|
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
FantomICW | Дата: Вс, 12.01.2014, 13:44 | Сообщение # 379 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| NIV, странно, что не работает. Функция destroy_object действует для всей динамики, как минимум. Те же сканнеры и аномальное растение - это не какой-нибудь physic_destroyable_object. Они просто берут характеристики от physic_object. Сама функция удаляет объект через известный оборот alife():release. Грани его возможностей мне не известны. Так что все должно работать.
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 12.01.2014, 13:45 | Сообщение # 380 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| NIV, На каком объекте и как пытался использовать функцию xr_effects.destroy_object()?
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
NIV | Дата: Вс, 12.01.2014, 14:18 | Сообщение # 381 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| 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 |
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
FantomICW | Дата: Вс, 12.01.2014, 14:23 | Сообщение # 382 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| Цитата NIV ( ) story Имеется ввиду, что в секции объекта должен быть story_id.
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
NIV | Дата: Вс, 12.01.2014, 14:35 | Сообщение # 383 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| 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"
|
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 12.01.2014, 14:37 | Сообщение # 384 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| NIV, Что значит возможно? Ты применял функцию не проанализировав ее работу? Да! Передача параметров у тебя не корректна! Вот такие параметры передаются: destroy_object(actor, npc, {"story", "story_id-обекта"}), или destroy_object(actor, npc, {"path", "имя пути"}), или destroy_object(actor, npc, {"job", "имя работы"})
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
NIV | Дата: Вс, 12.01.2014, 18:28 | Сообщение # 385 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| Подскажите, пожалуйста, как вызывается окно 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 |
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
FantomICW | Дата: Вс, 12.01.2014, 19:29 | Сообщение # 386 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| 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={} } Вот коллбек: Тут коллбеки прописываются, что можно было к ним подключать функции. В 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]
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 12.01.2014, 20:34 | Сообщение # 387 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| NIV, А при помощи функций из файла actor_menu.script, можно как раз отследить открытие этих окон. А вот функции придется писать свои.
Цитата FantomICW ( ) обращается к функции из xr_logic.script, она в логику дает какую-то информацию, дальше свое дело делает движок, запускающий окна. Собственно из биндера bind_physic_object.script (при наличии у объекта активной секции логики) приходит оповещение о событии в скрипт обработки логики объектов xr_logic.script, мало ли может нужны какие-то действия, например сменить активную секцию и т.п. Только движок уже открыл окно, а событие объект "поюзан" приходит уже после.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
NIV | Дата: Пн, 13.01.2014, 06:44 | Сообщение # 388 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| Цитата FantomICW ( ) дальше свое дело делает движок, запускающий окна. Вот про это я и хотел уточнить. Кроме вывода текстуры фона, в этом окне отображается содержимое инвентаря Актора, т.е. его нужно перебрать, отрисовать, отсортировать по слотам, заполнить характеристики костюма, обеспечить перекладывание (в ящик или при торговле) и т.д. Есть ли доступ к функциям, выполняющим это? Или эти окна фиксированы на уровне движка?
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
|
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 13.01.2014, 10:35 | Сообщение # 389 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата NIV ( ) Есть ли доступ к функциям, выполняющим это? Нет. Но с оговоркой - возможность редактировать файл xrGame.dll никто не отменял.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
strelok200 | Дата: Пн, 13.01.2014, 18:22 | Сообщение # 390 |
Бывалый
Свобода
Сообщений: 126
| Подскажите пожалуйста, в чем причина неработоспособности ф-ции Прописываю ее в xr_conditions, вызываю через логику рестриктора on_info = {=controller_xray} %=gar_message%
|
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
|