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

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

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


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

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

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

 

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

 

Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу.

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

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


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

[ЧН 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

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

Шпаргалка

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

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

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

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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

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

 

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

 

 

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

Шпаргалка

5 часов назад, Norman Eisenherz сказал:

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

Возможно.

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

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

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

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

  • Полезно 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

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

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

 

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

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

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

Шпаргалка

1 час назад, Norman Eisenherz сказал:

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

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

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

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

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

  • Нравится 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, 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
Дополнение
Скрытый текст

AMD Ryzen 5 3600, 32GB DDR4-3200, AFOX GeForce GTX1050Ti и нормально сталкерим в НА5.1, НА7, OGSE-0693, OGSR, НС2016, OLR, OFFLIFE, CoC, LADC, CoP Gunslinger, CoP SGM Gunslinger, ShoC GA, Legend Return, Anomaly, CS OGSM, ОП-2.2 ZC!

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

4 часа назад, Black_Raven_03 сказал:
local sil_obj = level.object_by_id(0)

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

  • Спасибо 1

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

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

6 часов назад, Zander_driver сказал:

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

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

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

Изменено пользователем Black_Raven_03
Скрытый текст

AMD Ryzen 5 3600, 32GB DDR4-3200, AFOX GeForce GTX1050Ti и нормально сталкерим в НА5.1, НА7, OGSE-0693, OGSR, НС2016, OLR, OFFLIFE, CoC, LADC, CoP Gunslinger, CoP SGM Gunslinger, ShoC GA, Legend Return, Anomaly, CS OGSM, ОП-2.2 ZC!

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

13 часов назад, Black_Raven_03 сказал:
db.actor:inventory_for_each( function( temp_sil, db.actor)

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

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

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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

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

43 минуты назад, Kirgudu сказал:

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

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

  • Полезно 2

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

7 часов назад, abramcumner сказал:

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

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

Изменено пользователем Black_Raven_03
Скрытый текст

AMD Ryzen 5 3600, 32GB DDR4-3200, AFOX GeForce GTX1050Ti и нормально сталкерим в НА5.1, НА7, OGSE-0693, OGSR, НС2016, OLR, OFFLIFE, CoC, LADC, CoP Gunslinger, CoP SGM Gunslinger, ShoC GA, Legend Return, Anomaly, CS OGSM, ОП-2.2 ZC!

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

В Зове Припяти при покупке патронов учитывается кол-во патронов в пачке, оно влияет на цену. Хочу в ТЧ это дело поправить. Где в trade_manager.script смотреть это?

  • Полезно 1
1 час назад, Black_Raven_03 сказал:

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

Такое не должно и на ТЧ/ОГСР парситься. Что было под рукой, на том и проверил.

  • Полезно 1

Можно ли отключить  add_call скриптом? 

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

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

"Справочник", функция level.remove_call.

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

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

Например, сделать запись лога через flush и поискать в нем часть фразы "* Game … is successfully loaded from file '…sav' …" – если встречается только один раз, значит первая загрузка. В ТЧ можно добраться до файла через класс fs(), в ЧН/ЗП через библиотеку io.

  • Нравится 1
  • Согласен 1

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

Шпаргалка

Если колбек объекта не перевести в nil в net_destroy, то при удалении объекта колбек так и будет болтаться всю игру?

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

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

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

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

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

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

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

Войти

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

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

×
×
  • Создать...