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

[SoC] Ковыряемся в файлах


Halford

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

Wo1fRam, метод запуска звука play_no_feedback не даёт обратной связи (что явно следует из его названия, кстати). Ты просто дал команду проиграть звук и далее этот процесс не может быть подвержен твоим запросам (например, попытке проверить статус проигрывания).
Чтобы иметь возможность обращаться к запущенному процессу, следует использовать методы play или play_at_pos, примерно так:

local snd_obj = sound_object("affects\\tinnitus3a")
snd_obj:play(db.actor, 0, sound_object.s2d)
...
if snd_obj:playing() then
  snd_obj:stop()
end

 

 

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

Поделиться этим сообщением


Ссылка на сообщение

Нет, это задержка перед началом проигрывания звука. А громкость в данном случае можно перед проигрыванием установить так:

snd_obj.volume = 2

Правда, лично я не проверял, работает ли это.
Ну или, как вариант, по-прежнему пользоваться методом play_no_feedback, но без проверок на статус проигрывания.

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

Поделиться этим сообщением


Ссылка на сообщение

, я не совсем понял, ты хочешь, чтобы НПС в первой фразе актор диалога выдал нужные тебе слова вместо автогенерируемых?
Можно сделать небольшой финт ушами:


<dialog id="actor_dialog_1">
	<phrase id="0">
		<!-- Текст пустой, поэтому первая фраза актора в этом диалоге пропускается -->
		<text></text>
		<next>1</next>
	</phrase>
	<phrase id="1">
		<!-- А вот тут выдаём нужную фразу НПС, например, вопрос: -->
		<text>Ну что, согласен на моё предложение?</text>
		<next>11</next>
		<next>12</next>
	</phrase>
	<phrase id="11">
		<text>Да.</text>
	</phrase>
	<phrase id="12">
		<text>Нет.</text>
	</phrase>
</dialog>

 


Таким образом, при старте диалога ты получишь 2 фразы НПС: «Привет! Ну что, согласен на моё предложение?».

Поделиться этим сообщением


Ссылка на сообщение

@STRELOK-stalker, возможно, это из-за длины строки. Если это так, аналогичная ошибка будет на фразе 10.

Попробуй длинные фразы (>256 символов) не прямо в диалоге прописывать, а перенести их в xml с текстами.

  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

@AndreySol

on_info = {+val_escort_scene_end} | patrol@val_escort_npc2_leave

следует писать так:

on_info = {+val_escort_scene_end} patrol@val_escort_npc2_leave

Разделитель «|» лишний.

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

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

Поделиться этим сообщением


Ссылка на сообщение

@AndrewMor, не надо путать рюкзак как предмет инвентаря, и рюкзак как некий ящик, в который можно что-то складывать - это разные вещи.

При использовании инвентарного рюкзака необходимо спавнить скриптом рюкзак-ящик по текущим координатам (функцию спавна повесить на коллбек, например, use_object, правда, не в курсе, есть ли такой в ТЧ - в ЧН есть).

В свою очередь, секция рюкзака-ящика в его конфиге должна наследовать секцию inventory_box и, кроме того, иметь кастом дату, которая в ЧН берётся из файла «treasure_inventory_box.ltx». Если в ТЧ есть аналогичные ресурсы, в принципе, в поисках по Солянке можно отталкиваться от них.
Точнее подсказать не могу, так как работаю с ЧН. Может быть, кто-то меня дополнит или поправит.

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

Поделиться этим сообщением


Ссылка на сообщение

@AndrewMor, примерно так:

local obj = alife():create(...) --/ твой спавн рюкзака-ящика
level.map_add_object_spot_ser(obj.id, "my_treasure", "%c[255,255,255,255]Мой тайник")
где "my_treasure" - название элемента метки в конфиге меток (в ЧН это gamedata\configs\ui\map_spots.xml, в ТЧ должно быть что-то аналогичное), которое можно заменить на название любой из существующих меток. Но советую добавить свою, чтобы её легко можно было обнаружить на карте. Изменено пользователем Kirgudu

Поделиться этим сообщением


Ссылка на сообщение

@stalk9r, и не должна работать.
text = "..obj.." - это присвоение именно той строки, которая указана между кавычками. Никакой отсылки к полученному объекту тут нет.

Надо так:

local obj = alife():story_object(12345)
if obj then
  text = obj:name()
end
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@Romann, не занимайся ерундой. Если ты для того, чтобы проделать какие-то действия с единственным НПС, будешь каждый раз перебирать все игровые объекты, да ещё и размножишь потом такой перебор в сотне мест (а что, по-другому ведь не получилось, а так работает) - мод будет тормозить постоянно. Это крайне плохая практика.
Лучше сделай так, как тебе советовали выше - добавь в xr_effects.script функцию, а её вызов в логику НПС. Например, в ремарк с анимацией:

[remark@suicide]
anim = suicide
on_signal = anim_end | nil %=npc_suicide%

Сама же функция будет примерно такая, как написал @_Val_:

function npc_suicide(actor, npc, p)
  npc:kill(npc)
  -- плюс любые другие действия
end
  • Спасибо 1
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение

@nego, это прибавка к максимальному весу, после которого игрок не сможет не только бегать, но и сдвинуться с места.

Поделиться этим сообщением


Ссылка на сообщение

@Хемуль36рус, для амёбы надо задавать свойства idle_animation и attack_animation.

Например, если спавнишь скриптом и используешь модуль нетпакетов Артоса (я выкладывал недавно ссылку на модуль с исправлением найденных ошибок в Скриптовании), это может выглядеть так:

local sobj = alife():create('zone_ameba', pos, lvid, gvid)
local pk = get_netpk(sobj,1)
if pk:isOk() then
  local data = pk:get()
  data.shapes:addSphere(5, vector():set(0,0,0))
  data.idle_animation = 'idle'
  data.attack_animation = 'blast'
  pk:set(data)
end
Изменено пользователем Kirgudu

Поделиться этим сообщением


Ссылка на сообщение

Кроме того, проверкой во внешнем скрипте

if (mobile_binder.initialized) == true then 

ищется переменная initialized в модуле mobile_binder.script (может не быть модуля, либо переменной в нём - отсюда и ссылка на nil), в то время как здесь

function mobile_binder:__init( obj ) super( obj )
        self.object      = obj
	self.initialized = false 

значение присваивается свойству экземпляра класса mobile_binder, а не переменной скриптового модуля.

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

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@makdm, не всё так однозначно.

Этот пример годится только в том случае, если биндер один и инициализируется один раз. А если много и если один экземпляр может быть в данный момент времени инициализирован, а другой - нет? Яркий пример - биндеры любых множественных объектов в игре, таких как НПС, монстры, аномалии и т. д.

Файлов ТЧ под рукой нет, но подозреваю, что mobile_binder относится как раз к такому типу. В таком случае надо начинать плясать от конкретного объекта.

Поделиться этим сообщением


Ссылка на сообщение

@NL-Vincenz, если нужен только эффект опьянения, то как-нибудь так:

level.add_pp_effector("alcohol.ppe", 20081020, false)

А если надо ещё и озвучить, то можно заспавнить объект "vodka" в инвентаре актора и тут же его употребить.

Что же касается второго вопроса, запрет выхода из диалога нужно прописывать в настройках схемы meet логики того персонажа, диалог с которым нельзя прерывать:

 

 

[meet]
allow_break = false

Если этот диалог не единственный, причём остальные прерывать можно, в логике может присутствовать несколько секций настройки схемы meet с отличающимися настройками диалогов, например:

[meet]
meet_dialog = {условия} dialog_1, {другие условия} dialog_2
allow_break = true

[meet@no_break]
meet_dialog = dialog_3
allow_break = false

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

 

Поправка: похоже, с allow_break я погорячился, спутав платформу с ЧН/ЗП. Если в ТЧ данной опции нет, тогда такой способ не пойдёт. Написанное в спойлере прошу считать недействительным для ТЧ.

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

Поделиться этим сообщением


Ссылка на сообщение

@UnLoaded, для переноса строки в назначаемой скриптом кастом дате следует использовать "\n".

Да, ты уже и сам догадался. :)

 

Для изменения story_id необходимо поработать с абстрактной частью нет-пакета, которая доступна только в момент выхода объекта в онлайн или при сохранении.

За инструкцией лучше всего обратиться к руководству от автора:

Про специальный нет-пакет 'abstract':


Библиотека может работать с абстрактной частью пакета, которая доступна ТОЛЬКО в момент выхода объекта в онлайн или сохранении.
Поэтому напрямую (методами set и get) прочитать и записать такие данные нельзя.
Для чтения и/или изменения используется специальный пакет 'net_abstract'.
Хотя принцип работы отличается от работы остальных классов, но все же очень похож. Исключение составляет то, как изменять данные в пакете.
Рассмотрим сразу на примере:
а) создаем объект в игре:
local obj = alife():create("exo_outfit", pos, lv, gv)

б) получаем служебный пакет, которым будем менять свойства:

local pk = m_netpk.get(obj,0) -- или m_netpk.net_cse_abstract(obj)

в)

вариант-1: используем функцию:

pk:setCallback( function(data)
  data.direction = vector():set(1,1,1)
end )

вариант-2: задаем желаемые изменения таблицей:

pk:setCallback( {direction = vector():set(1,1,1)} )

Здесь мы создали объект и захотели изменить его абстрактную часть.
Мы указали пакету коллбек, который будет передан основному коллбэку, будучи вызванам как только станет доступна абстрактная часть объекта.
В колбек передается таблица с параметрами пакета, мы можем смело их менять, в примере мы наклонили объект по всем осям на 1 радиану.
При спавне нового игрового объекта:
изменения вступят в силу, как только мы выйдем из текущей скриптовой работы и управление вернется движку - он создаст объект и начнет записывать в него параметры.
Для уже существующих объектов в игре:
требуется после задания изменений свойст объекта, перевести объект в оффлайн и обратно в онлайн, что модулем делается автоматически.
Изменения вступят в силу в момент выхода объекта в онлайн.

Как получить возможность менять абстрактную часть пакетов?

1) этот тип объектов должен иметь класс, который представляет такой тип объектов в игре (можно назвать биндером, а можно никак не называть)
(то есть то, что будет вызвано, когда объект появится в игре)
Завязка из class_registrator.script:

cs_register (object_factory, "CStalkerOutfit", "se_item.se_outfit", "E_STLK", "equ_stalker_s")

2) обязательно добавить (если таковой отсутствует) метод биндера 'STATE_Write' (см. скрипты типа: 'se_XXX.script')
Для примера с костюмом:

function se_outfit:STATE_Write(packet)
  cse_alife_item_custom_outfit.STATE_Write(self, packet)
end

3) В метод STATE_Write (см. выше) добавить строку:

function se_outfit:STATE_Write(packet)
  if self.cb_netpk then self.cb_netpk(self, packet) end -- коллбэк для изменения свойств пакета
  cse_alife_item_custom_outfit.STATE_Write(self, packet)
end

Выполнение этих действий ОБЯЗАТЕЛЬНО.

Зачем это нужно? Ну, например, можно поменять дирекшн или позишн, так как это read_only свойства объектов.
А позишн при спавне смещается так, чтобы объект находился на ИИ сетке.
То есть, можем спавнить всякие там лампочки, физические объкты так, чтоб они оказывались повернутыми в пространстве.
Так же можно менять те свойства, которые, обычно, только для чтения. Например story_id, или position.

 

Но такие вопросы больше относятся к теме «Скриптование».

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

Поделиться этим сообщением


Ссылка на сообщение

@RafMadMan, очевидно, что отсутствует функция «on_item_drop», вызываемая в строке 236 модуля «bind_stalker».
Что делать? Запускать сравнение файлов «до» и «после» и проверять как и что совмещалось в скриптах.

Поделиться этим сообщением


Ссылка на сообщение

@NL-Vincenz

<has_info>nl_dialog_bar_voronin</has_info>
<dont_has_info>nl_dialog_bar_voronin</dont_has_info> 

Взаимоисключающие условия. То же самое во втором диалоге.

  • Спасибо 1
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение

@NL-Vincenz, почему-то мне кажется, что данный вопрос относится не к ТЧ, а всё-таки к ЧН. Если это так, прошу подтвердить - перенесу посты в соответствующую тему.

Ну а если речь действительно о ЧН, то необходимо не только установить группировку ГГ, но и в свойствах самой группировки обозначить, что она - группировка игрока.

Делается это комплексным методом симуляции sim_board:set_actor_community() примерно так:

sim_board.get_sim_board():set_actor_community("dolg")

Поделиться этим сообщением


Ссылка на сообщение

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

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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