Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий
Zander_driver 10348 Опубликовано 16 Мая 2024 Поделиться Опубликовано 16 Мая 2024 2 часа назад, Balavnik сказал: Каким образом лучше всего отслеживать события? А что такое, по твоему, биндер вообще? Это скриптовой объект, который позволяет скриптам отслеживать события забинденного объекта. Т.е. он буквально вот для этого и создан. В биндерах находятся (могут находиться) обработчики всех событий которые могут происходить с объектом и отслеживаются движком. 1 час назад, Balavnik сказал: А не будет ли это шибко сильно тормозить игру? А каким образом? Код метода-обработчика вызывается только при срабатывании соответствующего колбека события. На каждом фрейме вызывается только update. 1 час назад, Balavnik сказал: обработать +- 70 объектов. Все в on_item_take? switch case по секции в помощь, Ну или по тому признаку по которому они у тебя различаются. Еще можно таблицу функций сделать с ключами-секциями, и по секции вызывать нужную из обработчика on_item_take. Как угодно можно. 1 1 Ссылка на комментарий
Balavnik 151 Опубликовано 20 Мая 2024 Поделиться Опубликовано 20 Мая 2024 (изменено) Вырезаны ли функции работы с файловой системой? Хочу считать количество смертей актора. Какими командами можно редактировать user.ltx? Изменено 20 Мая 2024 пользователем Balavnik Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 20 Мая 2024 Поделиться Опубликовано 20 Мая 2024 1. Библиотека io – чтение и запись текстовых файлов (есть ЧН/ЗП, про OGSR не знаю). 2. Написать в консоли help, искать примеры по названиям. 1 Ссылка на комментарий
Купер 3303 Опубликовано 20 Мая 2024 Поделиться Опубликовано 20 Мая 2024 @Balavnik , для оригинала ТЧ здесь про пространство имён IO недавно обсуждалось. См. здесь или здесь. Пример использования, например, здесь. 1 1 Ссылка на комментарий
Kirgudu 1323 Опубликовано 20 Мая 2024 Поделиться Опубликовано 20 Мая 2024 4 часа назад, Norman Eisenherz сказал: про OGSR не знаю В OGSR тоже есть. Везде есть, кроме оригинала ТЧ и основанных на нём без расширения или редактирования движка модов. 3 Ссылка на комментарий
Balavnik 151 Опубликовано 21 Мая 2024 Поделиться Опубликовано 21 Мая 2024 (изменено) Товарищи, parent_id ящика в оффлайне как получить? Что-то не нашел нигде инфы. Прикладываю код. Суть: спавн объекта секции(пока водки) в ящике по известному sid. Пока не выходит реализовать. Скрытый текст function spawn_remkom(first_speaker, second_speaker) local sim = alife() local obj = level.object_by_sid(5003) alife():create("vodka",vector():set(39.420829772949,-0.10841239988804,25.139078140259), 1, obj:game_vertex_id(), obj:id()) end Изменено 21 Мая 2024 пользователем Balavnik Ссылка на комментарий
Kirgudu 1323 Опубликовано 21 Мая 2024 Поделиться Опубликовано 21 Мая 2024 @Balavnik function spawn_remkom(first_speaker, second_speaker) local sobj = alife():story_object(5003) alife():create("vodka", vector(), 0, 0, sobj.id) end Примечание: при спавне в контейнере точные координаты и вертексы указывать не обязательно, можно обойтись значениями по умолчанию. 1 2 Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 31 Мая 2024 Поделиться Опубликовано 31 Мая 2024 [ЧН 1.5.10] При захвате смарта выдается два типовых сообщения "Спасибо за помощь, приходи за наградой". Тест показывает, что сообщения выдаются из [task_objects.script]: Spoiler --' Контратаку запустиь не получилось, выполняем квест. if self.actor_helped then self.last_check_task = "complete" --' Кидаем озвучку. for kk,vv in pairs(self.board.smarts[target_obj.id].squads) do if(self.play_regard=="") then xr_sound.set_sound_play(vv.commander_id, "alife_defence_actor_help", self.community, self.target) -- здесь elseif(self.play_regard~="nil") then xr_sound.set_sound_play(vv.commander_id, self.play_regard, self.community, self.target) end break end target_obj.combat_manager.combat_quest = "nil" else self.last_check_task = "reversed" target_obj.combat_manager.combat_quest = "nil" end Дальше странное: • в переборе отрядов есть break, который почему-то не действует • если добавить отсечку через логический флаг при запуске одного сообщения, второе сообщение все равно будет выдано • если добавить счетчик, он покажет 1 для обоих сообщений Почему выдается два сообщения? 1 Ссылка на комментарий
Kirgudu 1323 Опубликовано 31 Мая 2024 Поделиться Опубликовано 31 Мая 2024 @Norman Eisenherz могу предположить только одно. В той же функции check_task немного выше есть условие if self.state == "counter_attack", в котором выдаётся ровно то же самое сообщение. Раз break и отсечка по флагу не срабатывает, единственное, что приходит в голову - это что последовательно срабатывает выдача сообщений из разных частей условия, с действующей контратакой и без оной. Рекомендую расставить флаги и логирование в обеих частях и проверить. Если я прав, дальше надо будет подумать, почему сначала запускается контратака, потом (видимо) практически сразу отменяется. Могу ошибиться, но на ранних этапах работы над OGSM CS 1.8 (народный патч) что-то такое мы встречали... но в последнее время это уже не проявлялось. Точно уже не помню, давно это было. 1 1 Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 31 Мая 2024 Поделиться Опубликовано 31 Мая 2024 Дублировал запуск звука тестовыми сообщениями – обе реплики выдаются из указанного места почти одновременно. Может xr_sound не успевает зарегистрировать звук до запуска следующего… Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 1 Июня 2024 Поделиться Опубликовано 1 Июня 2024 [ЧН 1.5.10] Задача: исправить заголовок сообщения, которое выдается вместе с приветствием sound_start через одноименный звуку текст. Условия: приветствие Левши перед входом на завод выдается через конфиг логики [configs\scripts\yantar\yan_scene_6_stalker_5.ltx], при этом в заголовке сообщения не указывается имя NPC, хотя сообщение выдается от определенного объекта NPC с привязкой id. (Кроме Левши, такой подход применяется для торговцев – без дублирования субтитрами.) Решение через скрипты: переименовать текст для вывода отдельно от звука, отследить запуск реплики yan_levsha_hello_actor в [xr_meet.script] и добавить свое сообщение с заголовком и оформлением. Проблемы: приходится проверять все приветствия, и после перезагрузки текст выводится повторно – видимо, нужна еще привязка где-то в [xr_sound.script]. Возможно ли сделать вывод текста непосредственно через логику NPC, причем так, чтобы оно отобразилось только один раз при запуске звука приветствия? Добавление действия в строку victim вызывает ожидаемый спам сообщения на каждом апдейте, который можно порезать через логический флаг и инфо-поршни задания, но это уже костыли. Spoiler [meet@1] meet_state = 30 | hello_wpn@yan_levsha_hello_actor | 10 | guard@yan_levsha_hello_actor meet_state_wpn = 15 | backoff@meet_weapon_wait use_wpn = false sound_start = yan_levsha_hello_actor sound_start_wpn = meet_weapon_wait victim = 30 | actor victim_wpn = 30 | actor use = true use_wpn = true meet_dialog = yan_levsha_hello_dialog Ссылка на комментарий
Kirgudu 1323 Опубликовано 2 Июня 2024 Поделиться Опубликовано 2 Июня 2024 5 часов назад, Norman Eisenherz сказал: Возможно ли сделать вывод текста непосредственно через логику NPC Возможно. В xr_meet.init_meet(npc, ini, section, st, scheme) добавить новый параметр для идентификатора кастомного сообщения, указав в соотв. блоках как дефолтное значение "nil", так и парсинг строки из конфига. В xr_meet.action_meet_wait:execute() при ненулевом значении прочитанного выше параметра добавить вывод сообщения параллельно со звуком и с учётом его условий. Оригинальное сообщение при этом отвязать от звука, а в секцию логики [meet@1] добавить строку с новым параметром. Это, конечно, не действия только с логикой, как, вероятно, хотелось, зато универсальное решение, которым можно будет воспользоваться и в других случаях. 1 Ссылка на комментарий
Norman Eisenherz 354 Опубликовано 2 Июня 2024 Поделиться Опубликовано 2 Июня 2024 1. Это примерно то же решение через скрипты с отсеиванием всех других приветствий. Хочется сделать правку именно в логике Левши. 2. Убрал звук start_sound – все равно выдается старое сообщение. Подозреваю, что отсюда: meet_state = 30 | hello_wpn@yan_levsha_hello_actor … Добавил в секцию [camper@wait_cut5] (ждать диалога после убийства шального снорка) строку on_timer = 3000 | %=play_sound(…)% – выдается только новое сообщение, повтора после перезагрузки нет. Вроде получилось… Ссылка на комментарий
Kirgudu 1323 Опубликовано 2 Июня 2024 Поделиться Опубликовано 2 Июня 2024 1 час назад, Norman Eisenherz сказал: Это примерно то же решение через скрипты с отсеиванием всех других приветствий. Хочется сделать правку именно в логике Левши. Скорее решение наоборот. Не отсеивание ненужного с избыточными проверками "а то ли это", а адресная обработка нового параметра, который, разумеется, будет добавлен только там, где нужно. Впрочем, условия для этой "нужности" достаточно специфические, почти разовые, так что решил сделать по-другому - и ладно. @monk в Final Stroke вообще пошёл третьим путём: сократил расстояние (чтоб Левша не орал издалека) и убрал субтитры (за ненужностью, ибо лицом к лицу). Подходов может быть много, главное чтобы выбранный способ удовлетворял автора. 1 Ссылка на комментарий
Black_Raven_03 37 Опубликовано 6 Июня 2024 Поделиться Опубликовано 6 Июня 2024 (изменено) Доброго времени суток, прошу помощи! Делаю правку к Новому Арсеналу 7 (движок ОГСР от сен 2020, без возможности смены версии) с таким кодом: local sect = wpn:section() local sil_sect = get_string( sect, "silencer_name" ) if not sil_sect then return end local sil_obj = level.object_by_id(0) db.actor:inventory_for_each( function( temp_sil, db.actor) if temp_sil and db.actor:is_in_ruck(temp_sil) and temp_sil:is_silencer() and temp_sil:section() == sil_sect then sil_obj = temp_sil end end ) , на что получаю ошибку "invalid key to next" Вопрос: а куда копать-то? Правка: сделал через iterate_inventory - больше не вылетает... Изменено 6 Июня 2024 пользователем Black_Raven_03 Дополнение Ссылка на комментарий
Zander_driver 10348 Опубликовано 7 Июня 2024 Поделиться Опубликовано 7 Июня 2024 4 часа назад, Black_Raven_03 сказал: local sil_obj = level.object_by_id(0) Полагаю, вот это лишнее. Достаточно объявления local sil_obj 1 Ссылка на комментарий
Black_Raven_03 37 Опубликовано 7 Июня 2024 Поделиться Опубликовано 7 Июня 2024 (изменено) 6 часов назад, Zander_driver сказал: Достаточно объявления local sil_obj Привычка: приучил себя по совету небезизвестного Kamikazze всегда инициализировать переменные в ЛуаДжите Как позже выяснилось, проблема была в inventory_for_each - метод (почему-то) не мог перейти на след. предмет! Изменено 7 Июня 2024 пользователем Black_Raven_03 Ссылка на комментарий
Kirgudu 1323 Опубликовано 7 Июня 2024 Поделиться Опубликовано 7 Июня 2024 (изменено) 13 часов назад, Black_Raven_03 сказал: db.actor:inventory_for_each( function( temp_sil, db.actor) А мне вот эта строчка очень любопытна. Можно сказать, что второй параметр в функции-коллбэке не нужен, но не это главное. Что-то я даже затрудняюсь сказать, что будет с глобальной кеширующей актора переменной db.actor, если её использовать в качестве выходного параметра. Обнулится со всеми вытекающими? Или будет создана локальная одноимённая переменная, не влияющая на глобальную, поскольку существует только внутри этой функции? В любом случае делать так не стоит. Изменено 7 Июня 2024 пользователем Kirgudu 1 2 Ссылка на комментарий
abramcumner 1229 Опубликовано 7 Июня 2024 Поделиться Опубликовано 7 Июня 2024 43 минуты назад, Kirgudu сказал: Что-то я даже затрудняюсь сказать, что будет с глобальной кеширующей актора переменной db.actor, если её использовать в качестве выходного параметра. Обнулится со всеми вытекающими? Или будет создана локальная одноимённая переменная, не влияющая на глобальную, поскольку существует только внутри этой функции? У меня скрипт с таким объявление функции вообще не распарсился lua в ЗП. 2 Ссылка на комментарий
Black_Raven_03 37 Опубликовано 7 Июня 2024 Поделиться Опубликовано 7 Июня 2024 (изменено) @Zander_driver @Kirgudu , огромное спасибо за предупреждение - учту и сделаю выводы 7 часов назад, abramcumner сказал: вообще не распарсился lua в ЗП. а какая связь между ЗП и ТЧ-ориентированным ОГСР-движком?! я же специально указал год сборки движка - 2020! ЛуаДжиты же разные! Изменено 7 Июня 2024 пользователем Black_Raven_03 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти