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

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

Тема для обсуждения скриптов всего и всех в серии игр 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
Ссылка на комментарий

@Kirgudu Привязка в play_rnd срабатывает почти правильно – заметное отставание есть только в том случае, когда прибывшего на точку NPC выталкивает с этой точки кто-то другой, и анимация "дойти + развернуться" отыгрывается повторно, но это уже мелочи.

  • Нравится 1

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

Шпаргалка

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

Столкнулся с весьма мерзким явлением. При сохранении (неважно каком - квиксейве или ручном) и попытке загрузиться с него происходит безлоговый вылет. При повторном заходе в игру сохранение исправно загружается. То же самое происходит даже с автосейвами при заходе на новую локацию (в т.ч. через чит-телепорт). Загрузка автосейва - безлоговый вылет. При перезаходе в игру автосейв грузится. Куда хоть копать? Уже попутно пару косяков отловил в попытке понять, в чём соль, а толку ноль.

Платформа ТЧ + x-ray extensions.

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

Вариант субтитров на ТЧ: в xr_sound.script, function play_sound

Добавить две строки:

			local sub_text = "%c[255, 238, 153, 23]"..game.translate_string(tostring(npc:character_name())).."\\n".."%c[255, 255, 255, 255]"..game.translate_string("st_"..snd.theme)
			db.actor:give_game_news(sub_text, "ui\\ui_iconsTotal", Frect():set(84,236,81,45), 0, 10000)


В данный блок:

			-- играем входные
			if db.sound[npc_id].last_snd[snd.into_id] == nil then db.sound[npc_id].last_snd[snd.into_id] = -1 end
			
			--printf("* SND: play seq [%s] for [%s]", db.sound[npc_id].last_snd[snd.into_id]+1, npc:name())
			process_tutor_on_sound(snd.theme)
			npc:play_sound(snd.into_id, 1, 0, 1, 0, db.sound[npc_id].last_snd[snd.into_id]+1)
			db.sound[npc_id].last_snd[snd.into_id] = db.sound[npc_id].last_snd[snd.into_id] + 1
			--printf("* SND: play seq [%s] for [%s]", db.sound[npc_id].last_snd[snd.into_id], npc:name())
			
			-- Вывести сабы
			-- ещё можно проверку на включение кон.команды. типа g_subtitles
			--local enable_subs = get_console():get_integer("g_subtitles")
			--if enable_subs == 1 then
			local sub_text = "%c[255, 238, 153, 23]"..game.translate_string(tostring(npc:character_name())).."\\n".."%c[255, 255, 255, 255]"..game.translate_string("st_"..snd.theme)
			db.actor:give_game_news(sub_text, "ui\\ui_iconsTotal", Frect():set(84,236,81,45), 0, 10000)
			--end
			return

Ещё нужно сделать локаль, типа st_название_темы из script_sound.ltx:

<string id="st_esc_wolf_radio">
<text>Мужики, я к вам посылаю человека. Действуйте по обстоятельствам. Если сочтёте нужным, атакуйте. Приём...</text>
</string>

 

Работает, как с флагом s=sound_theme в точки пути, так и snd = esc_wolf_radio в схеме ремарк:

soc-subtitles-test.jpg

  • Нравится 1
Ссылка на комментарий

Часть методов вывода звука указана в самих обработчиках:

[xr_effects.script] ответ по рации "пусть не мельтешит здесь" / Круглов / КПК Призрака

[ph_sound.script] пульты в X-16 / арена

[sr_sound2d.script] война на складах

 

Часть звуков выводится в голове ГГ. В db.sound[0] записей не появляется.

 

Значительная часть звуков ссылается на конфиг [script_sound.ltx], из которого еще надо вынуть определенную ссылку для получения номера фразы и времени отображения субтитров. Иногда надо делать поправку на номер ранее выведенной фразы с тем же заголовком (диалоги в ТД).

 

 

Я расставил ссылки в имеющихся скриптах и собрал пути/обертки в своем обработчике. Так получается значительно меньше мусорных звуков, вроде "привет / пока / убери ствол / анекдот / погода", чем при привязке ко всем звукам в [xr_sound.script] – из этого скрипта беру только номер звука при случайном выборе фразы (пленный Шустрый, например).

 

Выборочно потестил прямую привязку к [xr_sound.script]: ловятся, в основном, одинаковые типовые звуки, тогда как на фразы NPC по ходу квестов почти никакой реакции.

- АТП с Петрухой

- Бес на Свалке

- "деловое предложение" за 800 (есть только фразы охранников)

- вопли и бубнеж Круглова

- "мы не можем его так бросить"

- война Долга и Свободы

 

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

  • Полезно 3

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

Шпаргалка

Ссылка на комментарий
8 часов назад, Norman Eisenherz сказал:

[ph_sound.script] пульты в X-16 / арена

[sr_sound2d.script] война на складах

Просто для понимания - префиксы - сокращение от типа объекта, для которого работает схема. ph - physic object, sr - space restrictor (не исключены другие типы). Разница в том, что у физ. объекта есть кости, от которых можно играть звук + объект может двигаться. Рестрикторы не имеют шейпа (модели) и они статичны, поэтому звук играет просто на точке спавна. То есть, к субтитрам оно вряд ли имеет отношение. Нужно смотреть то, что играет в голове ГГ.

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

Похоже, недопонимание: для задачи вывода субтитров требуется выловить названия реплик от разных источников. То, что каждой секции логики соответствует (почти) одноименный скрипт-обработчик, уже пройдено.

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

Шпаргалка

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

Математики есть?
Имеем:

db.actor:position()

db.actor:direction()

db.actor:set_actor_position( vector():set( x, y, z ) )

Как высчитать координаты для перемещения ГГ от текущей позиции - на три метра вперёд по направлению взгляда?

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Ссылка на комментарий
10 часов назад, Баба ЯГА сказал:

на три метра вперёд по направлению взгляда

 

local position, direction, distance = db.actor:position(), db.actor:direction(), 3
local new_position = position:add(direction:normalize():mul(distance))

 

Вместо db.actor:direction() можно использовать device().cam_dir - тогда будет учитываться не только направление взгляда вправо-влево, но ещё и его наклон.

  • Согласен 1
  • Полезно 4

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

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

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

[ТЧ 1.0006]
Скриптовое деление текста на фразы по меткам "•" (Alt+7, даже простой Блокнот такие понимает).

Результат: деление по меткам и почему-то по буквам "в" (код 162). Сменил метку на "#" – деление строго по меткам.
Предположил, что проблема в кодовых страницах Win10: например, вместо знака диаметра (код 0216) теперь просто буква "Ш". Проверил аналогичный скрипт, написанный для ЧН еще под Win7, и деление работает без ошибок даже по меткам "•".

 

Чем вызвано такое пересечение знаков при поиске, и почему именно в ТЧ?

Spoiler
-- текст
<string id="val_desant_1">
	<text>
		– База, я 034-й, мы над точкой.
		•– Понял, начинайте работать.
		•– 032-й, выбрасывай своих на крыше. Как понял?
		•– 032-й принял. На крыше так на крыше.
	</text>
</string>


-- деление
local text = game.translate_string("val_desant_1")
local t = {}

for x in text:gmatch("[^•]+") do		-- всё, кроме меток
	t[#t +1] = x
end


-- результат
– База, я 034-й, мы над точкой.
– Понял, начинайте работать.
032-й, 
ыбрасы
ай с
оих на крыше. Как понял?
032-й принял. На крыше так на крыше.

 

 

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

Шпаргалка

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

Нашел – все-таки кодировка: некоторые спецзнаки, не требующие сохранения в TXT-файл с расширенной поддержкой Unicode, не указаны в дефолтной кодировке UTF-8 – скрипт с шаблоном поиска необходимо сохранять если не в Windows-1251 как XML-файлы с текстом, то хотя бы в ANSI.
"Безопасными" являются знаки с кодами 33–126 (от !"#$%&@ до ^_|~, включая цифры и пунктуацию), меняются знаки в начале кодовой таблицы (• ¶ §) и после алфавита (° … ‰ — « » ±).
Аналогично с соединением строк: game.translate_string(str_id) .. "" – крокозябры на выходе, если не задать кодировку для многоточия.

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

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

Шпаргалка

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

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

Рылся в файлах игры, в модах для CoC со звуками одевания противогаза, пытался что-то там адаптировать, не получилось. Коллбек use_object я так понял не реагирует на броню и оружие, только на расходники.

 

Изменено пользователем boneset-hq

"Do you like what you see?" © Billy Herrington

Boneset-HQ.gif

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

@boneset-hq, закатать в файл или отдельную функцию и на апдейт.
 

Скрытый текст


local item_in_slot_1 = db.actor:item_in_slot(1)
local item_in_slot_2 = db.actor:item_in_slot(2)
local item_in_slot_6 = db.actor:item_in_slot(6)
	if item_in_slot_1 ~= nil then 
		-- функция для первого слота (пистоль)
	end
	if item_in_slot_2 ~= nil then
		-- функция для второго слота (ружжо)
	end
	if item_in_slot_6 ~= nil then
		-- функция для брони
	end


 

 

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

@Chypakabra Не, я скорее всего неправильно вопрос поставил, или Вы его не правильно поняли. Нужен момент именно когда происходит помещение оружия\брони в её слот. Тоесть не просто проверка, а что-то вроде одиночной функции, чтобы например при одевании брони, проигрывался звук, и всё замолкало. Я конечно могу что-то сообразить из того что Вы скинули, но было бы признательно если бы Вы скинули свою версию скрипта.

"Do you like what you see?" © Billy Herrington

Boneset-HQ.gif

Ссылка на комментарий
6 часов назад, boneset-hq сказал:

Коллбек

На модифицированных движках есть коллбек on_slot, на оригинале же, наверное, надо что-то городить на обновлениях, но я бы уже перестал противиться переходу на что-то более продвинутое.

Здесь могла быть ваша реклама.

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

@Chypakabra Всё, поковырялся и получилось. Не хотел прибегать к апдейту но похоже в ТЧ без этого никак. 

Скрытый текст
local currentWeapon1 = 0
local currentWeapon2 = 0
local currentArmor = 0

function check_slots()
	local arm = db.actor:item_in_slot(6)
	local weap1 = db.actor:item_in_slot(1)
	local weap2 = db.actor:item_in_slot(2)
	if arm then
		if arm:id() ~= currentArmor then
			currentArmor = arm:id()
			-- функция при одевании костюма
		end
	else
		currentArmor = 0
	end
	if weap1 then
		if weap1:id() ~= currentWeapon1 then
			currentWeapon1 = weap1:id()
			-- функция при одевании пистолета
		end
	else
		currentWeapon1 = 0
	end
	if weap2 then
		if weap2:id() ~= currentWeapon2 then
			currentWeapon2 = weap2:id()
			-- функция при одевании автомата
		end
	else
		currentWeapon2 = 0
	end
end

 

 

Изменено пользователем boneset-hq
  • Нравится 1

"Do you like what you see?" © Billy Herrington

Boneset-HQ.gif

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

Требуется мнение.
Навело на мысль обсуждение из соседней темы по Enhanced Edition. В нем также как и в кастомных движках обновили библиотеку lua, из-за чего кое-какие места в скриптах перестали нормально работать (ТЧ).
В частности task_manager.script, функция CRandomTask:load. Если я все правильно помню, то local selected_target = p:r_u32() в оригинальном движке при передаче туда u32(-1) возвращал 0, а теперь возвращает 4294967295, из-за чего ломалась вся дальнейшая логика.
И я, и новоПЫС придумали затычку, на скрине (мое снизу).

1.jpg

По своей затычке могу объяснить логику - коль уж в оригинальном движке у нас selected_target получал 0 при передаче туда u32(-1), тогда если случается local defend_object = alife():object(4294967295), что результате всегда дает nil, то мы просто присваиваем переменной серверный объект актора. То есть, поведение оригинала 1.0006 не меняется.
А вот у новоПЫС получается так - self.task_info[id].selected_target и self.task_info[id].defend_target просто не заполняются. Какие от этого могут быть последствия я даже не знаю. Так в чем вопрос - кто тут прав? И почему вообще r_u32() стало по-другому работать? Из-за обновленного lua ли? Или может из-за другого компилятора и пр.?

  • Нравится 1
Ссылка на комментарий

[ТЧ 1.0006]
Хочу сделать принудительный перевод артефактов в оффлайн до выполнения определенных условий, примерно как в ЧН. Добавляю в [se_artefact.script] показанный ниже код, скидываю пару артов (не электрической природы), отхожу, перезагружаюсь вблизи и вдали – никакого эффекта. Как правильно оформить код?

 

Spoiler
function se_artefact:can_switch_online ()
    if self.is_day_night == false then
(+) перед обычным выходом
		if level.vertex_position (self.m_level_vertex_id):distance_to (db.actor:position ()) > 10 then
			return false
		end

 

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

Шпаргалка

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

Арты дефолтные, класс общий.

 

Spoiler
function se_artefact:can_switch_online ()
    if self.is_day_night == false then				-- кроме электро-артов
		if level.vertex_position (self.m_level_vertex_id):distance_to (db.actor:position ()) > 10 then
			return false
		end

       return cse_alife_item_artefact.can_switch_online (self)			-- обычное переключение (150 м)
    end

-- дальше дефолтный перебор условий для электро-артов: день/ночь + ГГ за дальностью 50 м

 

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

Шпаргалка

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

@Norman Eisenherz , твои изменеия будут действовать только для тех артов, в конфиге у которых стоит класс SCRPTART (см. скрипт class_registrator).

  • Полезно 3

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

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

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

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

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

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

Войти

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

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

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