Это популярное сообщение. Malandrinus 615 Опубликовано 8 Июля 2009 Это популярное сообщение. Поделиться Опубликовано 8 Июля 2009 (изменено) В данной теме собраны сведения по скриптовой модели сталкера: функции и классы, методы и свойства, взаимосвязь классов и последовательность работы с ними, связь работы классов и файлов конфигураций. К наполнению темы приглашаются все желающие. В наполнении темы непосредственно участвовали и существенно мне помогли: @Monnoroch, @Kolmogor, @Unnamed Black Wolf, @меченый(стрелок), @IQDDD, @Kirag, @Taroz, @dan, @7.9, @Garry_Galler, @AKKK1, @Bak и много других людей. Скрытый текст Скрытый текст класс alife_simulator. Базовые операции с серверными объектами. Пространства имён. Глобальные функции для большого числа задач. "Создание своего класса" и "Наследование от экспортированных классов". Базовые сведения об объектно-ориентированном программировании для сталкера. Необходимо прочитать, для понимания темы про биндер и некоторых других. В одном посте: Общие слова об архитектуре и скриптовой модели сталкера "Класс object_binder" расширение онлайновых объектов, колбеки, сохранение состояния. "Класс net_packet" Регистрация скриптовых классов с помощью object_factory Серверные классы. Часть 1 Иерархия серверных классов, описание не закончено. Серверные классы. Часть 2 Картинка структуры наследования и несколько заключительных слов Клиентские классы Скрытый текст Класс game_object Интерфейс ко всем онлайновым (клиентским объектам) Класс hit для нанесения урона скриптом и другая информация (IQDDD) Некоторая информация по управлению путями патрулирования здесь (Kirag) и здесь (Taroz) Неполная информация по управлению памятью неписей с примером здесь (Bak) Физическая оболочка объектов (Garry_Galler) Пост о выборе (подборе) оружия НПС и стрельбы (*Shoker*) Скрытый текст Управление заданиями Класс CGameTask и другие вспомогательные классы и функции. Управление инфопорциями Функции, колбеки, форматы файлов Список специальных системных инфопорций (Unnamed Black Wolf) Система профилей и алгоритм генерации имён. Форматы файлов, функции Дополнительная информация по параметрам профилей terrain_sect (Kolmogor) Диалоги. Часть 1 Форматы файлов, базовые сведения Диалоги. Часть 2 Скриптовые диалоги Диалоги. Часть 3 Тематическая подборка функций управления диалогами Скрытый текст Функции времени Тематическая подборка функций, связанных с управлением игровым временем. Класс CTime Вспомогательный класс для управления игровым временем Полезная скриптовая функция с использованием CTime (Garry_Galler) Скрытый текст class ini_file (меченый(стрелок)) Класс FS и CSavedGameWrapper Бинарный доступ к файлам, в том числе в игровых архивах, управление сохранёнными играми. Скрипт уровня. Забытая фишка с колбеком на заход на уровень Класс vector Некоторая полезная информация о разных вещах (меченый(стрелок)) "Класс render_device" Направление и положение камеры, характеристики экрана, программная пауза игры и др. Некоторая информация о различиях между ТЧ и ЗП в системе оконных классов и колбеков. (lekzd) Неплохо бы развить эту тему! Некоторая полезная информация о скриптовых функциях из модуля _g.script. (lekzd) Также требует развития! Полезные функции для работы с графом игры (Garry_Galler) В одном посте: Класс profile_timer Отладочные измерения скорости работы фрагментов программы Класс client_spawn_manager Колбек на выход в онлайн без использования биндера. Работа с консолью. Класс CConsole Анимации цвета. Класс color_animator Всякие моргающие элементы в окнах и пр. Управление постэффектами. Скриптовые постэффекты. Класс effector Класс sound_object. Проигрывание звуков в игре в произвольном месте, от произвольного объекта, в голове актора. (Shadows) Пост удалён автором (прим. Kirgudu) Скрытый текст Оконные классы Некоторая общая информация о создании окон Список методов, XML-тегов и событий для оконных классов (ТЧ/ЧН/ЗП) (Norman Eisenherz) Представление материала в моих статьях оптимизировано для онлайнового просмотра. Если кому не хочется лазить по спойлерам, а нужно просмотреть текст какого-либо поста "потоком", то могу рекомендовать просмотр в режиме "текстовая версия". В этом же режиме удобно сохранять содержимое темы на диск. (прим. Malandrinus) Изменено 30 Июля пользователем Kirgudu 5 5 16 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Полтергейст 37 Опубликовано 25 Марта 2011 Поделиться Опубликовано 25 Марта 2011 Вчера обнаружил, что зависимость онлайн-статуса npc от этого статуса смарта прошита в движок. Как обнаружил - в se_stalker убрал перегрузку функций can_switch_*, в смарте в этих же функций поставил проверку условий существования смарта (smart.gparams.cond). Короче говоря, как только это условие не выполняется, смарт переходит в оффлайн. Первый же удобный случай - смарт, в котором прописан раненый у вагончика на Кордоне - показал, что этот раненый после перехода смарта в оффлайн тоже переходит в оффлайн (при этом выходит из смарта). Ссылка на комментарий
_Призрак_ 11 Опубликовано 30 Марта 2011 Поделиться Опубликовано 30 Марта 2011 Хочу спросить - если ГГ допустим ранил бандита, и скрылся (но находится в радиусе а-лайфа) то метод best_enemy() так и будет возвращать актора, как последнего кто был врагом бандита, или же этот метод будет возвращать nil после определенного времени? Freedom Ссылка на комментарий
Garry_Galler 7 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 (изменено) _Призрак_ Не уверен, но мне кажется что он должен возвращать nil после выхода врага из определенного радиуса от объекта, к которому метод был применен. По крайне мере аналогичный метод monstr:get_corpse() возвращает юзердату ближайшего трупа только в определенном радиусе от монстра. Изменено 31 Марта 2011 пользователем Garry_Galler Ссылка на комментарий
Полтергейст 37 Опубликовано 20 Апреля 2011 Поделиться Опубликовано 20 Апреля 2011 Однако ж. Оказывается, радиус переключения в онлайн не является одинаковым для всех объектов. К примеру, для смартов он намного больше, чем для неписей. Похоже, что именно поэтому и наблюдаются баги при попытке заставить смарт быть в оффлайне до перехода любого его NPC в онлайн. И ещё, насчёт перегрузки клиентских классов. Похоже, это всё-таки возможно. Есть такой файлик - ce_switcher.script. Там наглядно показано, как это делается. Ссылка на комментарий
Malandrinus 615 Опубликовано 20 Апреля 2011 Автор Поделиться Опубликовано 20 Апреля 2011 (изменено) Полтергейст, насчёт перегрузки клиентских классов. Похоже, это всё-таки возможно. Есть такой файлик - ce_switcher.script. Там наглядно показано, как это делается. Если почитать документацию по luabind, то там это написано. Если попытаться перегрузить класс, который для перегрузки не предназначен, то ничего хорошего не получится. Похоже на то. Пытался в своё время воспроизвести это со своим классом. Ничего не вышло. Если правильно помню, то объект создаётся при спавне, а затем сразу удаляется, хотя вроде должен существовать дальше. Да и если посмотреть повнимательней, то этот сет (O_SWITCH) в игре не используется. Сет есть, секция есть, а объекта такого нет. Возможно, остался рудимент от старых времён, а сейчас попросту никто не заморачивается с выпиливанием мусора. Впрочем, в ЧН убрали секцию, а в ЗП уже и сет убрали, и остался, не понять зачем, только файлик скрипта. Так что он нерабочий и никогда рабочим не был. Я должен заметить, что особенно в ТЧ имеется довольно много нерабочих фрагментов и файлов. Во-первых, на каком-то этапе сильно поменяли скриптовую модель в целом. Надо ведь понимать, что то, что мы сейчас воспринимаем как данность, для разрабов таковым не было. Они же это придумывали. Поэтому многие вещи менялись, переписывались, а в скриптах оставался старый хлам и остатки от экспериментов. От той эпохи кое-где остались функции main, которые вроде как должны выполняться автоматически, а кое-где они даже работают, как например в скриптах уровня. От того же времени в модуле _g.script остался класс FSM - скриптовый конечный автомат, который должен был управлять неписями. В старом варианте некоторые классы были более навороченные, как к примеру vector и matrix, которые вполне годились для нормальных вычислений векторной алгебры. Сейчас вектор урезан очень сильно и позволяет только ограниченное подмножество операций. От матрицы вообще остался жалкий огрызок, по сути только хранилище для чисел. Был класс скриптового постэффекта (собственно и остался), а потом видимо его внесли в движок, и теперь постэффекты можно делать двумя способами, хотя скриптовый в игре не используется. Думаю, можно и ещё примеров набрать. Во-вторых, движок делали разные люди в разное время, а скрипты писали ещё другие люди (и похоже в гораздо большем количестве) и также в очень разное время. У меня есть очень стойкое ощущение, что все эти люди жили в каких-то параллельных мирах. Особенно в ТЧ заметно, что скриптёры попросту не знают, как пользоваться некоторыми классами движка (хотя бы вектором, даже в его урезанном варианте). Более того, они и просто с Lua были не в ладах, судя по убогой реализации некоторых функций. При этом часть кода явно была написана людьми определённо понимающими. С чем это связано, сложно сказать. Может сказалась текучка кадров, или учились на ходу. Наконец, я почти на 99% уверен, что у разработчиков попросту нет документации на свой собственный движок. Сообществу так и не дали описания скриптовой части. Точнее дали, но это по большей части описание той первой реализации, про которую см. выше. Мы думаем, что они жлобятся, но что более вероятно - что это на самом деле всё, что у них есть. По славной традиции постсовковой разработки документацию пишет разработчик (всем известный документ написан Ясеневым). Потом начался бардак и раздрай и на документацию забили. Я практически уверен, что последние скриптёры просто смотрели в исходники, и это и была вся их документация. Ко всему, похоже и на любую систему в скриптах забили. Разрабы просто стали добавлять экспортированные функции по запросу скриптёров. Это видно по некоторым высказываниям на выложенной wiki разработчиков образца 2004 г. Так что относитесь критически особенно к тому, что можно найти в ТЧ. Там многое реально не работает. Изменено 20 Апреля 2011 пользователем malandrinus Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
дядяСаша 0 Опубликовано 28 Апреля 2011 Поделиться Опубликовано 28 Апреля 2011 Прошу подсказать: Куда и что дописать..... в ТЧ 1006 в продуктах есть порционность. Но она работает пока не закрылось меню использования. Как только закрыл меню. Порционность продукта опять становиться полной. И получается что ГГ может есть бесконечно один сухпай или по стандарту сжирает его за раз. Ссылка на комментарий
Malandrinus 615 Опубликовано 2 Мая 2011 Автор Поделиться Опубликовано 2 Мая 2011 Ранее здесь был разговор по поводу игрового счётчика времени. Колмогор был совершенно прав, а я ошибался. Счётчик времени в движке на самом деле 64-х разрядный и с ним как таковым проблем нет. Заворачивание даты у меня происходило в искусственном эксперименте, когда я выкручивал таймфактор на 20000 и без промежуточных перезагрузок крутил время. При этом действительно происходит заворачивание счётчика примерно через игровой месяц, но на практике такая ситуация не возникает. Однако проблема есть с функцией game.time(), которая возвращает только младшие 32 разряда от этого счётчика. Эта функция используется повсеместно и соответственно через игровой месяц от начала игры начинает выдавать совершенно неправильное значение (и это никак не исправить). Используется она достаточно много где. В принципе, если вместо неё использовать game.get_game_time() и класс CTime, то проблем быть не должно. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
ber188 1 Опубликовано 14 Мая 2011 Поделиться Опубликовано 14 Мая 2011 (изменено) В игровом программировании делаю первые шаги, поэтому прошу извинить возможную неточность в формулировках. Существует ли способ подключить в ТЧ анимацию обьектов из ЗП. Конкретно - анимацию транспортного лифта на Юпитере, который использует методы (такие как anim_time_get и пр.), отсутствующего в ТЧ класса CPhysicObject? Изменено 14 Мая 2011 пользователем ber188 Ссылка на комментарий
Whisper 29 Опубликовано 16 Мая 2011 Поделиться Опубликовано 16 Мая 2011 (изменено) Много чего перепробовал, но есть ли вариант приостановить скрипт, запускаемый <action> в диалоге? То есть приостановить диалог, по сути? Суть в том, чтобы очередная фраза была озвучена(это не сложно сделать), но диалог останавливался, пока этот звук не будет проигран до конца - никаких вариантов ответа до этого момента и т.п. Нужна, буквально, секунда, но ее нет. Добавлено через 114 мин.: То есть, должно быть так, в диалоге: 1. Фраза непися, звук который ей соответствует начинает проигрываться. 2. В диалоге ничего не меняется в течение заданной паузы, диалог не закрывается, но и вариантов ответа ГГ не появляется. 3. Звук закончился, появились возможные ответы ГГ. Диалог движется дальше. Изменено 16 Мая 2011 пользователем Whisper Ссылка на комментарий
_Призрак_ 11 Опубликовано 16 Мая 2011 Поделиться Опубликовано 16 Мая 2011 Есть вариант просто заблокировать средства ввода Freedom Ссылка на комментарий
Malandrinus 615 Опубликовано 16 Мая 2011 Автор Поделиться Опубликовано 16 Мая 2011 Так к сожалению нельзя "остановить скрипт", что нужно в данном случае. И опасаюсь, что эта задача нерешаемая. "Остановить" скрипт можно только поставив на бесконечный цикл. Но как в этом случае узнать, когда выходить? И будет ли в этом случае отыгрываться звук? В общем приличных вариантов решения задачи не вижу. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Desertir 202 Опубликовано 16 Мая 2011 Поделиться Опубликовано 16 Мая 2011 (изменено) А если узнать точное количество милисекунд сколько длится запись, поставить цикл на сравнение времени, потом выдать инфопршен. Так можно? Плохо дело. При выводе сообщения на экран можно сделать аля реализм, чтобы сообщения показывались через интервал времени. Это можно как-то использовать? Изменено 16 Мая 2011 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Malandrinus 615 Опубликовано 16 Мая 2011 Автор Поделиться Опубликовано 16 Мая 2011 Пока ты крутишь цикл, время будет стоять на месте. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Whisper 29 Опубликовано 17 Мая 2011 Поделиться Опубликовано 17 Мая 2011 (изменено) _Призрак_, Да, этот вариант тоже рассматривался, можно сделать так(но это не то, сейчас будет понятно почему): 1. Дать начало фразы непися, запустить звук. 2. Отложить по времени вывод конца фразы непися, например амк стартером 3. Заблокировать возможность выбора фразы ГГ, отключив у него управление. 4. Включить обратно управление, сразу по выводу фразы в пункте 2 НО Строчки возможных ответов ГГ УЖЕ будут на экране, они динамические и зависят, например, от той самой фразы в п.2 и уже могут ей не соответствовать. То есть ответы не должны появляться раньше вывода фразы, вот в чем дело. malandrinus, А что делает функция wait() в _g.script? При исполнении вылетает с малопонятным сообщением об ошибке. Еще, можно, конечно, крутить что-то в цикле, замеряя время profile_timer - но работает ли функция time(), если не "закрыт" таймер по stop()? И чтобы такое покрутить безопасно и лучше? Или делать что-то, на что игра тратит порядком времени в любом случае? Например, создавать объект и удалять его или что-то другое. Изменено 17 Мая 2011 пользователем Whisper Ссылка на комментарий
Kirag 39 Опубликовано 17 Мая 2011 Поделиться Опубликовано 17 Мая 2011 Такая идея пришла: Озвучка ведь запускается какой-то функцией. Длительность звукового файла определить реально. В этой же функции запуска озвучки можно добавить строчку, устанавливающую некую глобальную переменную х в 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 Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем. Ссылка на комментарий
Desertir 202 Опубликовано 17 Мая 2011 Поделиться Опубликовано 17 Мая 2011 (изменено) malandrinus, а можно ли ожидать описание класса CScriptXmlInit? Изменено 17 Мая 2011 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Whisper 29 Опубликовано 17 Мая 2011 Поделиться Опубликовано 17 Мая 2011 (изменено) Kirag, Собственно, я об этом и писал, когда говорил о амк-таймерах. Все дело в том, что ответы не должны выводится сразу, они зависят от этой функции с задержкой вывода, там устанавливаются инфопоушены, от них и ответы зависят. Получится, что игрок ждет неизвестную ему пока фразу непися, а уже может появится единственно возможный ответ и испортить всю интригу. Изменено 17 Мая 2011 пользователем Whisper Ссылка на комментарий
7.9 174 Опубликовано 18 Мая 2011 Поделиться Опубликовано 18 Мая 2011 (изменено) Whisper, посмотри на иерархию диалога творчески - попробуй разделить весь диалог на автономные поддиалоги и организовать активацию нужных в нужные моменты. PS Придётся разобраться в скриптовой активировации диалога. Если у тебя получиться - мы то-же будем так делать :-) Изменено 18 Мая 2011 пользователем 7.9 всё легко Ссылка на комментарий
Garry_Galler 7 Опубликовано 18 Мая 2011 Поделиться Опубликовано 18 Мая 2011 Whisper А что делает функция wait() в _g.script? Она там... присутствует. Как памятник нерукотворный гению разрабов. Собственно в оригинале она(если я не ошибаюсь) никак задействована, так как скрипты в которых ее можно найти - тестовый мусор. Впрочем, попробовать применить ее можно - только скрипт нужно запустить как подпрограмму(тогда и малопонятных вылетов не будет) - по идее она должна тормозить выполнение только данного скрипта, а не весь процесс игры. Впрочем, тестил я это дело давно и сейчас даже не помню какие результаты были. ЗЫ: для запуска скрипта как подпрограммы нужно использовать lua пространство имен coroutine. Ссылка на комментарий
Whisper 29 Опубликовано 18 Мая 2011 Поделиться Опубликовано 18 Мая 2011 7.9, Не понимаю, при чем тут это. Есть четкий момент: исполнение фразы диалога(время стоит игровое, то есть это считается мгновенным) - следующая фраза. Нужна пауза между двумя этими событиями, которые движок выполняет всегда моментально - сам он останавливается только на фразах\е ГГ. Как тут поможет разделение и творчество? Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти