Привет фанатам NoX !!! > Моддинг

UniMod3

(1/1)

Dio:
Здравствуйте друзья, меня уже давно не было. Я вернулся, чтобы предложить очередную больную идею.
Да, я всё ещё брежу UniMod и речь пойдёт именно о его дальнейшем развитии.
У первой версии UniMod есть масса проблем. Они касаются не только безопасности выполнения скриптов, но и поддержки разработки - весь процесс крайне неудобный и небезопасный.

Ещё года три назад у меня была идея как это преодолеть - использовать lua 5.2. Я начал другой проект, назвал его UniMod2. Идея была в том, чтобы собрать функционал с первого UniMod, но сделать всё безопаснее и красивее. С его помощью я хотел создать sandbox-ы для каждой карты: отдельно sandbox для модов, и отдельно глобальный. То есть выстроить некую иерархию, где скрипты карты не могли бы нарушить выполнение более высокоуровневых скриптов (допустим после смены карты, все таймеры должны были бы отключаться. Ещё была идея добавить события как объекты). Перейти на full userdata для внутриигровых объектов, там образом добавить им контекст, как следствие сделать безопаснее (playerLook мог бы проверять какой параметр игрок, а какой - объект, и не вызывать падение игры, если их перепутать).
Так же у проекта была четкая цель - как минимум создать альтернативу внутренним скриптам Nox. Как результат работы - переписать скрипты какой-нибудь карты из компании на UniMod2.

Прошло уже много времени, я увидел возможность сделать сам процесс разработки более продуктивным и понятным. Для связывания lua кода и C++ существуют разные проекты. Год назад я впервые услышал о sol2.

Что я предлагаю?
UniMod3!

Под спойлером я приведу ключевые идеи UniMod3, все они являются объектом для обсуждения. В целом если наберётся команда, дальнейшее документирование считаю целесообразным перенести на некую wiki (ту же с github).
: Основные идеи UnidMod3 Документирование
Есть у оригинального UniMod такая важная проблема, что документации почти нет. Много неописанных возможностей и так далее. Это касается и пользовательского интерфейса, так и исходников.

Четыре уровня выполнения кода:
Иерархия уровней выполнения кода позволит обезопасить код, сделать отладку более дружелюбной, а выполнение скриптов более надёжным.
Каждый из уровней имеет свою точку (момент времени) загрузки и выгрузки из игры.
Предлагаю следующие уровни:

* Уровень C++
* Основные скрипты - core-script действующие для всей игры в целом
* Mod-script, скрипты которые пользователь может добавлять по желанию. Они так же действуют для всей игры в целом
* Map-scirpt, скрипты, действующие на конкретной карте.Теперь чуть подробнее о каждом из уровней.

Уровень C++
UniMod3 будет использовать тот же способ загрузки, что и UniMod2 (что отличается от первой версии): загрузка ложной dll.
Хак следующий: выбирается одна из dll, загружаемых Nox: "a.dll", вместо неё кладётся другая с таким же названием. Она загружает UniMod3.dll и оригинальную dll.
Таким образом оригинальный файл выполнения Nox.exe остаётся нетронутым.

На этом уровне выполнения инициализируются все необходимые процессы. Предполагаемый порядок примерно следующий:

* Инициализируется Lua
* Загружается файл конфигураций UniModConfig.lua. В нём устанавливаются важные флаги.
* В зависимости от установленных флагов выполняются или не выполняются дальнейшие действия
* Загружаются скрипты уровня core-scirptПримеры флагов:

* DebugMode - активировать возможность исполнять небезопасные функции (например из lua.debug). Необходим для упрощения отладки при написании скриптов
* AllowStartMultipleNoxs - позволяет запустить несколько экземпляров Nox
* EnhanceConsole - активировать улучшенную консоль (в первом UniMod мы немного изменили консоль: добавили возможность редактирования введённого текста, историю)
* CoreLevelFiles - lua-файлы, которые будут загружены на уровне core-script
Core-script
После инициализации первого уровня загружаются эти скрипты.
Я пока слабо представляю основные их функции.
Если будет такая возможность, я бы хотел возложить на них инициализацию части lua-среды. То есть создание каких-то глобальные переменных и так далее.
Возможно именно тут будет реализована возможность загрузки модов.
Так же есть идея разделять эти скрипты на модули, чтобы была возможность поставлять их отдельно, обновлять и так далее.

Mod-script
Пользовательские глобальные скрипты. Действуют после core-script. Пока не знаю можно ли будет их включать и отключать во время игры и что им можно будет, а что нельзя.
Их можно использовать как некие библиотеки функций, которыми пользователи могут делиться друг с другом и использовать в скриптах карт.
Тема для активного обсуждения.
Для упрощения разработки, пока предлагаю обойтись без поддержки модов. Держать в голове мысль, что они могут быть добавлены позже.

Map-scirpt
Загружаются вместе с картой.
Предлагаю как в первом UniMod сделать .tar архив с возможностью сжатия для хранения всех связанных файлов.
В самом скрипте необходимо так же несколько функций инициализации. Вроде предварительной загрузки (чтобы как-то настроить загрузку карты - отключить стандартные скрипты). Постинициализации - после того, как все объекты были загружены на карту.
Выгружаются при переходе на следующую карту или выходе из режима игры.

Full userdata вместо light userdata.
В первой версии UniMod взаимодействие с объектами происходило с помощью light userdata (фактически - указатель). Теперь же каждому полученному с помощью lua объекту будет соответствовать userdata. 
Это даст следующие преимущества:

* Методы связанные с объектом будут реализованы как методы объекта (доступ через двоеточие ":" в Lua)
* Исчезнет проблема с "битыми" объектами. Например, есть удалить монстра из игры, его userdata узнает об этом и не даст выполнить код, вызывающий падение игры (например перемещение удалённого объекта)
* Есть возможность связать lua объекты с объектами из игры в направлении lua -> Nox. Чуть подробнее в Event System
* Для разных типов объектов можно добавлять специфичные для них функции. Например тот же playerLook только для игроков
Event system. Внутриигровые события
В оригинальном UniMod была возможность выполнять скрипт после какого-то времени, или выполнить скрипт при смерти монстра. Однако управлять этими событиями было совсем непросто.
Предлагаю каждому событию поставить в соответствие lua-объект: при создании таймера, создаётся объект taimer, с помощью него таймер можно остановить, перезапустить или удалить (и это удалит сам таймер).

Lua-scope как основной инструмент безопасности кода
Если отключить функции lua.debug, то по умолчанию нельзя выйти за пределы своей основной таблицы. То есть уже существует некий sandbox механизм.

Покажу как можно развить эту идею на примере map-script:
Для каждой карты создаётся отдельная lua таблица, куда загружаются все функции, что может использовать игрок через консоль (или они доступны через метаметод _index).
Игрок не может сохранить ссылку на объект за пределами этой таблицы (это очень тонкий момент, его необходимо гарантировать).
Таким образом, если игрок создал timer, то ссылку на него вынужден хранить он сам. При загрузке другой карты, lua таблица соответствующая карте удаляется, затем необходимо вызывать дважды garbage collector. Это и удалит все созданные таймеры и прочее. Поэтому скрипты уровня карты не смогут больше никак влиять на дальнейшую игру. По этой же причине игрок не может влиять на скрипты более высокого уровня.

Получается что механизмы sandboxing-а можно реализовать используя Lua и ничего более.

Что я жду в качестве помощи?

* Основное и самое болезненное для меня - помощь в дизассемблировании Nox. Конечно, многое уже сделано в этом направлении, но много всё ещё не хватает. Это было самой большой проблемой во время разработки UniMod2 (не считая моей безграмотности)
* Разработчик С++. Любая помощь или идеи
* Если наберётся больше одного человека, необходимо будет как-то организовывать процесс разработки. С этим тоже нужна помощь.
* Знаю, что идея UniMod не новая в мире игр. Уже есть подобные примеры (Garry's mod?). Если кто знает как они работают внутри, было бы интересно послушать
Хотел бы выделить некие цели для проекта. Достижение этих целей будет означать что проект дошёл до версии 1.0. Это не означает что кроме этого больше ничего не будет, но предлагаю сконцентрировать усилия именно в этих направлениях.
: ToDo 1.0
* Система загрузки скриптов по указанной выше иерархии
* Рабочая userdata для динамических объектов в игре. Необходимо именно поддержка не меньше, чем предлагают скрипты Nox
* ?Функции для сервера?
* Реализация на UniMod3 скриптов из какой-то карты компании
Куда писать?
Пишите в эту тему. Или мне на почту: Darkclainer@gmail.com
Если наберутся люди - придумаем как лучше организовать связь.

Ещё момент...
Зная, что осталось мало людей интересующихся Nox, планирую перевести этот призыв на английский и опубликовать ещё где. Расскажите, какие сейчас есть популярные международные форумы посвящённые Nox, а я пока сделаю перевод.
UPD: Нашёл noxcommunity.com, пост там. Перевод немного отличается, чуть более чётко сформулирвал мысли, но не уверен, что мой английский очень понятный.

А теперь неприятный момент...
Я потерял свою IDA бд для Nox. Надеюсь у кого осталась..?
UPD2: БД вернулась! Большое спасибо KirConjurer!

KirConjurer:
Привет. Я бы рад помочь, но... не вижу смысла. Коммьюнити Нокса сейчас опять впало в спячку -- начало лета, сдача экзаменов...
Катарсис занимается своим проектом по Nox-тематике, в свободное время я занимаюсь своим. Там тоже будет применён Lua, кстати.
Из зарубежных моддеров сейчас активен только Panic (который всё делает на скриптах редактора).
Грустно, но не думаю, что сейчас время начинать делать новый Юнимод.

Свою базу данных, однако, выслал на e-mail. Осторожно, структуры малость глюченые.
ЗЫ: Да что с форумом творится, ё-моё! Шрифты бунтуют.

Dio:
Большое спасибо! Если бы не нашлась бд, то было бы совсем грустно.
Сильно удивлён, что за последние три года форум так сильно исхудал. К сожалению, ничего не поделать - люди теряют интерес. Мало чего нового происходит и многие проблемы, чтобы были у игры с рождения устранены только недавно. Ещё сильно картину портит отсутствие полноценного WOL.
Как бы то не было, мне просто всё ещё нравится Nox и идея UniMod-а. Так что если у кого есть время и желание - присоединяйтесь.

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

PS. Где можно скачать базу игры для IDA? Поглядел бы хоть.

Навигация

[0] Главная страница сообщений

Перейти к полной версии