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

Справочник по функциям и классам


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

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

Как обнаружил - в se_stalker убрал перегрузку функций can_switch_*, в смарте в этих же функций поставил проверку условий существования смарта (smart.gparams.cond). Короче говоря, как только это условие не выполняется, смарт переходит в оффлайн. Первый же удобный случай - смарт, в котором прописан раненый у вагончика на Кордоне - показал, что этот раненый после перехода смарта в оффлайн тоже переходит в оффлайн (при этом выходит из смарта).

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

Хочу спросить - если ГГ допустим ранил бандита, и скрылся (но находится в радиусе а-лайфа) то метод best_enemy() так и будет возвращать актора, как последнего кто был врагом бандита, или же этот метод будет возвращать nil после определенного времени?

Freedom

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

_Призрак_

Не уверен, но мне кажется что он должен возвращать nil после выхода врага из определенного радиуса от объекта, к которому метод был применен.

По крайне мере аналогичный метод monstr:get_corpse() возвращает юзердату ближайшего трупа только в определенном радиусе от монстра.

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

Однако ж. Оказывается, радиус переключения в онлайн не является одинаковым для всех объектов. К примеру, для смартов он намного больше, чем для неписей. Похоже, что именно поэтому и наблюдаются баги при попытке заставить смарт быть в оффлайне до перехода любого его NPC в онлайн.

 

И ещё, насчёт перегрузки клиентских классов. Похоже, это всё-таки возможно. Есть такой файлик - ce_switcher.script. Там наглядно показано, как это делается.

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

Полтергейст,

насчёт перегрузки клиентских классов. Похоже, это всё-таки возможно. Есть такой файлик - ce_switcher.script. Там наглядно показано, как это делается.

Если почитать документацию по luabind, то там это написано. Если попытаться перегрузить класс, который для перегрузки не предназначен, то ничего хорошего не получится. Похоже на то. Пытался в своё время воспроизвести это со своим классом. Ничего не вышло. Если правильно помню, то объект создаётся при спавне, а затем сразу удаляется, хотя вроде должен существовать дальше.

 

Да и если посмотреть повнимательней, то этот сет (O_SWITCH) в игре не используется. Сет есть, секция есть, а объекта такого нет. Возможно, остался рудимент от старых времён, а сейчас попросту никто не заморачивается с выпиливанием мусора. Впрочем, в ЧН убрали секцию, а в ЗП уже и сет убрали, и остался, не понять зачем, только файлик скрипта. Так что он нерабочий и никогда рабочим не был.

 

Я должен заметить, что особенно в ТЧ имеется довольно много нерабочих фрагментов и файлов.

Во-первых, на каком-то этапе сильно поменяли скриптовую модель в целом. Надо ведь понимать, что то, что мы сейчас воспринимаем как данность, для разрабов таковым не было. Они же это придумывали. Поэтому многие вещи менялись, переписывались, а в скриптах оставался старый хлам и остатки от экспериментов. От той эпохи кое-где остались функции main, которые вроде как должны выполняться автоматически, а кое-где они даже работают, как например в скриптах уровня. От того же времени в модуле _g.script остался класс FSM - скриптовый конечный автомат, который должен был управлять неписями. В старом варианте некоторые классы были более навороченные, как к примеру vector и matrix, которые вполне годились для нормальных вычислений векторной алгебры. Сейчас вектор урезан очень сильно и позволяет только ограниченное подмножество операций. От матрицы вообще остался жалкий огрызок, по сути только хранилище для чисел. Был класс скриптового постэффекта (собственно и остался), а потом видимо его внесли в движок, и теперь постэффекты можно делать двумя способами, хотя скриптовый в игре не используется. Думаю, можно и ещё примеров набрать.

Во-вторых, движок делали разные люди в разное время, а скрипты писали ещё другие люди (и похоже в гораздо большем количестве) и также в очень разное время. У меня есть очень стойкое ощущение, что все эти люди жили в каких-то параллельных мирах. Особенно в ТЧ заметно, что скриптёры попросту не знают, как пользоваться некоторыми классами движка (хотя бы вектором, даже в его урезанном варианте). Более того, они и просто с Lua были не в ладах, судя по убогой реализации некоторых функций. При этом часть кода явно была написана людьми определённо понимающими. С чем это связано, сложно сказать. Может сказалась текучка кадров, или учились на ходу.

Наконец, я почти на 99% уверен, что у разработчиков попросту нет документации на свой собственный движок. Сообществу так и не дали описания скриптовой части. Точнее дали, но это по большей части описание той первой реализации, про которую см. выше. Мы думаем, что они жлобятся, но что более вероятно - что это на самом деле всё, что у них есть. По славной традиции постсовковой разработки документацию пишет разработчик (всем известный документ написан Ясеневым). Потом начался бардак и раздрай и на документацию забили. Я практически уверен, что последние скриптёры просто смотрели в исходники, и это и была вся их документация. Ко всему, похоже и на любую систему в скриптах забили. Разрабы просто стали добавлять экспортированные функции по запросу скриптёров. Это видно по некоторым высказываниям на выложенной wiki разработчиков образца 2004 г.

 

Так что относитесь критически особенно к тому, что можно найти в ТЧ. Там многое реально не работает.

 

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

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

Прошу подсказать: Куда и что дописать.....

 

в ТЧ 1006 в продуктах есть порционность. Но она работает пока не закрылось меню использования. Как только закрыл меню. Порционность продукта опять становиться полной. И получается что ГГ может есть бесконечно один сухпай или по стандарту сжирает его за раз.

 

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

Ранее здесь был разговор по поводу игрового счётчика времени. Колмогор был совершенно прав, а я ошибался. Счётчик времени в движке на самом деле 64-х разрядный и с ним как таковым проблем нет. Заворачивание даты у меня происходило в искусственном эксперименте, когда я выкручивал таймфактор на 20000 и без промежуточных перезагрузок крутил время. При этом действительно происходит заворачивание счётчика примерно через игровой месяц, но на практике такая ситуация не возникает.

 

Однако проблема есть с функцией game.time(), которая возвращает только младшие 32 разряда от этого счётчика. Эта функция используется повсеместно и соответственно через игровой месяц от начала игры начинает выдавать совершенно неправильное значение (и это никак не исправить). Используется она достаточно много где. В принципе, если вместо неё использовать game.get_game_time() и класс CTime, то проблем быть не должно.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

В игровом программировании делаю первые шаги, поэтому прошу извинить возможную неточность в формулировках.

Существует ли способ подключить в ТЧ анимацию обьектов из ЗП. Конкретно - анимацию транспортного лифта на Юпитере, который использует методы (такие как anim_time_get и пр.), отсутствующего в ТЧ класса CPhysicObject?

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

Много чего перепробовал, но есть ли вариант приостановить скрипт, запускаемый <action> в диалоге?

 

То есть приостановить диалог, по сути? Суть в том, чтобы очередная фраза была озвучена(это не сложно сделать), но диалог останавливался, пока этот звук не будет проигран до конца - никаких вариантов ответа до этого момента и т.п. Нужна, буквально, секунда, но ее нет.

 

Добавлено через 114 мин.:

То есть, должно быть так, в диалоге:

 

1. Фраза непися, звук который ей соответствует начинает проигрываться.

2. В диалоге ничего не меняется в течение заданной паузы, диалог не закрывается, но и вариантов ответа ГГ не появляется.

3. Звук закончился, появились возможные ответы ГГ. Диалог движется дальше.

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

Так к сожалению нельзя "остановить скрипт", что нужно в данном случае. И опасаюсь, что эта задача нерешаемая. "Остановить" скрипт можно только поставив на бесконечный цикл. Но как в этом случае узнать, когда выходить? И будет ли в этом случае отыгрываться звук? В общем приличных вариантов решения задачи не вижу.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

А если узнать точное количество милисекунд сколько длится запись, поставить цикл на сравнение времени, потом выдать инфопршен. Так можно?

 

Плохо дело.

При выводе сообщения на экран можно сделать аля реализм, чтобы сообщения показывались через интервал времени. Это можно как-то использовать?

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

ТЧ 1.0004. SAP и Trans mod

github

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

Пока ты крутишь цикл, время будет стоять на месте.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

_Призрак_, Да, этот вариант тоже рассматривался, можно сделать так(но это не то, сейчас будет понятно почему):

 

1. Дать начало фразы непися, запустить звук.

2. Отложить по времени вывод конца фразы непися, например амк стартером

3. Заблокировать возможность выбора фразы ГГ, отключив у него управление.

4. Включить обратно управление, сразу по выводу фразы в пункте 2

 

НО

 

Строчки возможных ответов ГГ УЖЕ будут на экране, они динамические и зависят, например, от той самой фразы в п.2 и уже могут ей не соответствовать. То есть ответы не должны появляться раньше вывода фразы, вот в чем дело.

 

malandrinus, А что делает функция wait() в _g.script? При исполнении вылетает с малопонятным сообщением об ошибке.

 

Еще, можно, конечно, крутить что-то в цикле, замеряя время profile_timer - но работает ли функция time(), если не "закрыт" таймер по stop()? И чтобы такое покрутить безопасно и лучше?

 

Или делать что-то, на что игра тратит порядком времени в любом случае? Например, создавать объект и удалять его или что-то другое.

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

Такая идея пришла:

Озвучка ведь запускается какой-то функцией. Длительность звукового файла определить реально. В этой же функции запуска озвучки можно добавить строчку, устанавливающую некую глобальную переменную х в time_global() + длительность_озвучки.

И выключить ввод. Как-нибудь так:

 

    local snd = xr_sound.get_safe_sound_object([[файл_озвучки]])
    snd:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
    level.disable_input()
    x = time_global() + snd:length()

 

А в многострадальном апдейте актора добавить проверку, что-то вроде

if x then
    if x <= time_global() then
        x = nil
        level.enable_input()
    end
end

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

 

Whisper Не совсем понял, зачем разбивать фразу НПС, и задерживать вторую половину. Пусть весь текст реплики непися будет сразу, а озвучка пусть идет, как идет. И список ответов ГГ, и файл озвучки определяются единственно фразой НПС, которая в момент запуска озвучки уже известна.

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

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

Kirag, Собственно, я об этом и писал, когда говорил о амк-таймерах.

 

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

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

Whisper, посмотри на иерархию диалога творчески - попробуй разделить весь диалог на автономные поддиалоги и организовать активацию нужных в нужные моменты.

 

PS

Придётся разобраться в скриптовой активировации диалога.

Если у тебя получиться - мы то-же будем так делать :-)

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

всё легко

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

Whisper

А что делает функция wait() в _g.script?

Она там... присутствует. Как памятник нерукотворный гению разрабов.

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

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

ЗЫ: для запуска скрипта как подпрограммы нужно использовать lua пространство имен coroutine.

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

7.9, Не понимаю, при чем тут это. Есть четкий момент: исполнение фразы диалога(время стоит игровое, то есть это считается мгновенным) - следующая фраза. Нужна пауза между двумя этими событиями, которые движок выполняет всегда моментально - сам он останавливается только на фразах\е ГГ.

 

Как тут поможет разделение и творчество?

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

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

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

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

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

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

Войти

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

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

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

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