Перейти к контенту

Рекомендуемые сообщения

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

  Информация (Показать)

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

  Читать рекомендуется. (Показать)

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
  16.05.2024 в 18:16, Balavnik сказал:

Каким образом лучше всего отслеживать события?

А что такое, по твоему, биндер вообще? Это скриптовой объект, который позволяет скриптам отслеживать события забинденного объекта. Т.е. он буквально вот для этого и создан.

В биндерах находятся (могут находиться) обработчики всех событий которые могут происходить с объектом и отслеживаются движком.

  16.05.2024 в 19:52, Balavnik сказал:

А не будет ли это шибко сильно тормозить игру?

А каким образом? Код метода-обработчика вызывается только при срабатывании соответствующего колбека события.

На каждом фрейме вызывается только update.

  16.05.2024 в 19:52, Balavnik сказал:

обработать +- 70 объектов.

Все в on_item_take?

switch case по секции в помощь, Ну или по тому признаку по которому они у тебя различаются. Еще можно таблицу функций сделать с ключами-секциями, и по секции вызывать нужную из обработчика on_item_take. Как угодно можно.

  • Нравится 1
  • Полезно 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

Вырезаны ли функции работы с файловой системой? Хочу считать количество смертей актора. 

 

Какими командами можно редактировать user.ltx?

Изменено пользователем Balavnik

А где зима?

img.php?nick=Balavnik&sert=2&text=t6

Ссылка на комментарий

1. Библиотека io – чтение и запись текстовых файлов (есть ЧН/ЗП, про OGSR не знаю).

2. Написать в консоли help, искать примеры по названиям.

  • Полезно 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

@Balavnik , для оригинала ТЧ здесь про пространство имён IO недавно обсуждалось. См. здесь или здесь. Пример использования, например, здесь.

  • Нравится 1
  • Полезно 1
Ссылка на комментарий
  20.05.2024 в 10:04, Norman Eisenherz сказал:

про OGSR не знаю

В OGSR тоже есть. Везде есть, кроме оригинала ТЧ и основанных на нём без расширения или редактирования движка модов.

  • Полезно 3

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

Ссылка на комментарий

Товарищи, parent_id ящика в  оффлайне как получить? Что-то не нашел нигде инфы.

 

Прикладываю код. Суть: спавн объекта секции(пока водки) в ящике по известному sid. Пока не выходит реализовать.

 

  Код (Показать)

 

Изменено пользователем Balavnik

А где зима?

img.php?nick=Balavnik&sert=2&text=t6

Ссылка на комментарий

@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

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

Ссылка на комментарий

[ЧН 1.5.10]

При захвате смарта выдается два типовых сообщения "Спасибо за помощь, приходи за наградой". Тест показывает, что сообщения выдаются из [task_objects.script]:

  Показать

Дальше странное:

• в переборе отрядов есть break, который почему-то не действует

• если добавить отсечку через логический флаг при запуске одного сообщения, второе сообщение все равно будет выдано

• если добавить счетчик, он покажет 1 для обоих сообщений

 

Почему выдается два сообщения?

  • Полезно 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

@Norman Eisenherz могу предположить только одно.

В той же функции check_task немного выше есть условие if self.state == "counter_attack", в котором выдаётся ровно то же самое сообщение. Раз break и отсечка по флагу не срабатывает, единственное, что приходит в голову - это что последовательно срабатывает выдача сообщений из разных частей условия, с действующей контратакой и без оной. Рекомендую расставить флаги и логирование в обеих частях и проверить.

Если я прав, дальше надо будет подумать, почему сначала запускается контратака, потом (видимо) практически сразу отменяется.

Могу ошибиться, но на ранних этапах работы над OGSM CS 1.8 (народный патч) что-то такое мы встречали... но в последнее время это уже не проявлялось. Точно уже не помню, давно это было.

  • Нравится 1
  • Полезно 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

Ссылка на комментарий

Дублировал запуск звука тестовыми сообщениями – обе реплики выдаются из указанного места почти одновременно. Может xr_sound не успевает зарегистрировать звук до запуска следующего…

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

[ЧН 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 вызывает ожидаемый спам сообщения на каждом апдейте, который можно порезать через логический флаг и инфо-поршни задания, но это уже костыли.

 

  Показать

 

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
  01.06.2024 в 23:18, Norman Eisenherz сказал:

Возможно ли сделать вывод текста непосредственно через логику NPC

Возможно.

В xr_meet.init_meet(npc, ini, section, st, scheme) добавить новый параметр для идентификатора кастомного сообщения, указав в соотв. блоках как дефолтное значение "nil", так и парсинг строки из конфига.

В xr_meet.action_meet_wait:execute() при ненулевом значении прочитанного выше параметра добавить вывод сообщения параллельно со звуком и с учётом его условий.

Оригинальное сообщение при этом отвязать от звука, а в секцию логики [meet@1] добавить строку с новым параметром.

Это, конечно, не действия только с логикой, как, вероятно, хотелось, зато универсальное решение, которым можно будет воспользоваться и в других случаях.

  • Полезно 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

Ссылка на комментарий

1. Это примерно то же решение через скрипты с отсеиванием всех других приветствий. Хочется сделать правку именно в логике Левши.

 

2. Убрал звук start_sound – все равно выдается старое сообщение. Подозреваю, что отсюда: meet_state = 30 | hello_wpn@yan_levsha_hello_actor

Добавил в секцию [camper@wait_cut5] (ждать диалога после убийства шального снорка) строку on_timer = 3000 | %=play_sound(…)% – выдается только новое сообщение, повтора после перезагрузки нет. Вроде получилось…

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
  02.06.2024 в 15:35, Norman Eisenherz сказал:

Это примерно то же решение через скрипты с отсеиванием всех других приветствий. Хочется сделать правку именно в логике Левши.

Скорее решение наоборот. Не отсеивание ненужного с избыточными проверками "а то ли это", а адресная обработка нового параметра, который, разумеется, будет добавлен только там, где нужно.

Впрочем, условия для этой "нужности" достаточно специфические, почти разовые, так что решил сделать по-другому - и ладно.

@monk в Final Stroke вообще пошёл третьим путём: сократил расстояние (чтоб Левша не орал издалека) и убрал субтитры (за ненужностью, ибо лицом к лицу).

Подходов может быть много, главное чтобы выбранный способ удовлетворял автора.

  • Нравится 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

Ссылка на комментарий

Доброго времени суток, прошу помощи!

Делаю правку к Новому Арсеналу 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 - больше не вылетает...

Изменено пользователем Black_Raven_03
Дополнение
  Не очень старый, и потому небесполезный (Показать)

Мозг состоит на 80 процентов из жидкости, и мало того, что она тормозная, так многим еще конкретно не долили...@Denikius136
Black_Raven.gif
 

Ссылка на комментарий
  06.06.2024 в 19:56, Black_Raven_03 сказал:
local sil_obj = level.object_by_id(0)

Полагаю, вот это лишнее. Достаточно объявления local sil_obj

  • Спасибо 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
  07.06.2024 в 00:53, Zander_driver сказал:

Достаточно объявления local sil_obj

Привычка: приучил себя по совету:rtfm: небезизвестного Kamikazze:489: всегда инициализировать переменные в ЛуаДжите

Как позже выяснилось, проблема была в inventory_for_each - метод (почему-то:az1000106:) не мог перейти на след. предмет! :31:

Изменено пользователем Black_Raven_03
  Не очень старый, и потому небесполезный (Показать)

Мозг состоит на 80 процентов из жидкости, и мало того, что она тормозная, так многим еще конкретно не долили...@Denikius136
Black_Raven.gif
 

Ссылка на комментарий
  06.06.2024 в 19:56, Black_Raven_03 сказал:
db.actor:inventory_for_each( function( temp_sil, db.actor)

А мне вот эта строчка очень любопытна. Можно сказать, что второй параметр в функции-коллбэке не нужен, но не это главное.

Что-то я даже затрудняюсь сказать, что будет с глобальной кеширующей актора переменной db.actor, если её использовать в качестве выходного параметра. Обнулится со всеми вытекающими? Или будет создана локальная одноимённая переменная, не влияющая на глобальную, поскольку существует только внутри этой функции?

В любом случае делать так не стоит.

Изменено пользователем Kirgudu
  • Согласен 1
  • Полезно 2

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

Ссылка на комментарий
  07.06.2024 в 09:39, Kirgudu сказал:

Что-то я даже затрудняюсь сказать, что будет с глобальной кеширующей актора переменной db.actor, если её использовать в качестве выходного параметра. Обнулится со всеми вытекающими? Или будет создана локальная одноимённая переменная, не влияющая на глобальную, поскольку существует только внутри этой функции?

У меня скрипт с таким объявление функции вообще не распарсился lua в ЗП.

  • Полезно 2
Ссылка на комментарий

@Zander_driver @Kirgudu , огромное спасибо за предупреждение - учту и сделаю выводы

  07.06.2024 в 10:26, abramcumner сказал:

 вообще не распарсился lua в ЗП.

а какая связь между ЗП и ТЧ-ориентированным ОГСР-движком?! я же специально указал год сборки движка - 2020! ЛуаДжиты же разные!

Изменено пользователем Black_Raven_03
  Не очень старый, и потому небесполезный (Показать)

Мозг состоит на 80 процентов из жидкости, и мало того, что она тормозная, так многим еще конкретно не долили...@Denikius136
Black_Raven.gif
 

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...