Skyrim SE/AE "Библиотека адресов для плагинов SKSE" [v2/10]

Библиотека адресов для плагинов SKSE является набором библиотек, необходимых для работы некоторых плагинов SKSE. Адресная библиотека для SKSE плагинов AE делает так, что в Skyrim AE больше не нужно будет ждать авторов, пока они обновят свои моды, которые имеют .dll плагины работающие через SKSE64 и имеют зависимость от версии игры и SKSE64 соответственно. то есть его главной задачей является устранение необходимости в обновлении всех плагинов при каждом обновлении игры и SKSE.

В обновлении от 13 мая 2022 г. добавленна поддержка Skyrim SE и обновленна до версии 2, также обновили "Библиотека адресов для плагинов SKSE" для Skyrim AE до версии 5

Это вы должны знать и иметь в виду:

Спойлер
  1. Вы можете включить любые (или все) файлы базы данных с вашим плагином, но это может значительно увеличить размер файла (примерно на 2,5 МБ). До сих пор было принято помечать этот мод как зависимость.

    2. Вы должны ВСЕГДА загружать базу данных только один раз при запуске, инициализировать/кэшировать нужные вам адреса и дать ей выгрузиться. Выгрузка просто означает, что структура VersionDb удаляется или теряется (если вы выделили ее в стеке). Это позволит вам не использовать ненужный объем памяти во время работы игры. Нет необходимости загружать базу данных во время игры. Это спорный вопрос, если вы используете CommonLib, поскольку он загружает его только один раз, а не для каждой DLL.

    3. База данных содержит адреса функций, глобальные переменные, RTTI, vtables и все остальное, что может иметь на это ссылку. Он не содержит адресов, которые находятся в середине функций или в середине глобальных переменных. Если вам нужен адрес в середине функции, вы должны найти базовый адрес функции и самостоятельно добавить дополнительное смещение. Он также не содержит бесполезных вещей, таких как выравнивание вокруг функций (на которые есть ссылки в rdata), раздел pdata отбрасывается, а некоторая информация SEH, сгенерированная компилятором из rdata, отбрасывается.

    4. Вы всегда должны проверять результат, чтобы убедиться, что база данных загружена успешно (bool Load вернул true) и что запрошенные адреса действительно вернули правильный результат (не NULL). Если он не загружается, это означает, что файл скорее всего отсутствует или неправильная версия (например, попытка использовать заголовок SE в AE). Если запрос не выполнен, это означает, что адрес не может быть найден в этой версии. Это может означать, что либо код игры изменился настолько, что адрес больше не действителен для этой версии, либо сама база данных не смогла определить правильный адрес. Если произойдет что-либо из этого, вы должны завершить инициализацию плагина, чтобы сообщить SKSE, что вы загрузились неправильно. Или вручную показать сообщение об ошибке.

    5. Также было бы лучше, если бы вы проверили, что адрес существует во всех версиях игры, прежде чем публиковать свой DLL-плагин. Для этого загрузите каждую версию файла базы данных и запросите один и тот же идентификатор адреса в каждой из них, чтобы убедиться, что он существует:

bool LoadAll(std::vector<VersionDb*>& all)
{
static int versions[] = { 3, 16, 23, 39, 50, 53, 62, 73, 80, 97, -1 };
for (int i = 0; versions[i] >= 0; i++)
{
VersionDb * db = new VersionDb();
if (!db->Load(1, 5, versions[i], 0))
{
delete db;
return false;
}
all.push_back(db);
}
return true;
}

bool ExistsInAll(std::vector<VersionDb*>& all, unsigned long long id)
{
unsigned long long result = 0;
for (auto db : all)
{
if (!db->FindOffsetById(id, result))
return false;
}
return true;
}

void FreeAll(std::vector<VersionDb*>& all)
{
for (auto db : all)
delete db;
all.clear();
}

bool IsOk()
{
std::vector<VersionDb*> all;
if (!LoadAll(all))
{
_FATALERROR("Failed to load one or more version databases for current executable!");
FreeAll(all);
return false;
}

if (!ExistsInAll(all, 517014))
{
_FATALERROR("517014 does not exist in all versions of the database!");
FreeAll(all);
return false;
}

FreeAll(all);
// Ok!
return true;
}

Таким образом, вы можете быть уверены, что ваш мод DLL будет работать во всех версиях, или, если он не работает в некоторых версиях, вы можете написать об этом на странице вашего мода.

6. Иногда вам нужно будет сделать что-то другое в зависимости от запущенной версии игры. Вы можете сделать это с помощью этого фрагмента кода:

int major = 0, minor = 0, revision = 0, build = 0;
if (!db.GetExecutableVersion(major, minor, revision, build))
{
_FATALERROR("Something went wrong!");
return false;
}

// Running game is 1.5.x and at least version 1.5.39.0
if (major == 1 && minor == 5 && revision >= 39)
{
// Stuff ... ?
}

7. Пожалуйста, имейте в виду: если вы компилируете свою SKSE DLL в режиме отладки, время загрузки базы данных может составлять около 14 секунд! В режиме выпуска это около 0,2 секунды. Это связано с тем, что стандартные контейнеры библиотек работают очень медленно в этом режиме (стандартная карта).

Установка: Через NMM или вручную - скопировать содержимое архива в папку "Data"

Оригинальное название: Address Library for SKSE Plugins

Автор: meh321

Комментарии: 4
Ваш комментарий
что в Skyrim AE больше не нужно будет ждать авторов, пока они обновят свои моды, которые имеют .dll плагины

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

1