Jump to content
Sign in to follow this  
elma

"подгонка" версий плагинов для Fallou4 и Skyrim SE

Recommended Posts

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

1. автор мода перестраховывается от того, что со следующей версией f4se/skse64 мод перестанет работать или глюканет

2. популярность модов на нексусе расчитывается не от количества уникальных скачиваний, а просто от общего количества скачиваний

3. есть жывотные, которых сильно прёт, когда их на коленях умоляют обновить их творение

     предположим, игрока такая ситуация не устраивает и он хочет за пару минут самостоятельно обновить мод. фантастика? отнюдь. дело в том, что проверки версий игры для модов в 99.9% случаев не нужны, т.е. почти любой мод для Ф4 версии с 10.26+ будет после "доработки напильником" работать хоть на 10.75, хоть на 10.130. так же 95-98% модов старших версий будет работоспособно на младших версиях игры. это связано с тем, что разработка f4se немного переместилась в морг. с skse64 ситуация несколько иная- дело в том, что релиз skse64 был сильно преждевременным и имел работоспособный функционал относительно обычного skse менее половины. что это означает? это означает лишь то, что в отличии от ситуации с Ф4 моды старших версий с гораздо меньшей вероятностью "взлетят" на старых версиях игры.

     теперь о той "магии", что потребуется чтоб совершить сие страшное и великое колдунство, занимающее минуту-две. для совершения сего волшебства не потребуются ни девственницы, ни кровь, ни жабы ни иная ***а. потребуется всего лишь исходник библиотеки dll, но тут будет ожидать сюрприз- в 99% случаях авторы не выкладывают исходники. но есть и другие пути получения исходников- наплакать, насосать, отжать в подворотне ... ну или просто декомпилировать библиотеку.

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

     в качестве подопытного для проведения вскрытия возьмем мод MCM

Скрытый контент

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

Скрытый контент

    Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое.
. под спойлером для удобства чтения приведу интересующий нас код, содержащийся в MCM.cpp . ни на какие права/свободы и прочее при этом я не покушаюсь...

Спойлер

#include "f4se/PluginAPI.h"
#include "f4se/GameAPI.h"
#include <shlobj.h>

#include "f4se/PluginManager.h"

#include "f4se_common/f4se_version.h"

#include "f4se/ScaleformValue.h"
#include "f4se/ScaleformMovie.h"
#include "f4se/ScaleformCallbacks.h"

// Translation
#include "f4se/ScaleformLoader.h"
#include "f4se/Translation.h"

#include "f4se/PapyrusVM.h"
#include "f4se/PapyrusNativeFunctions.h"

#include "Config.h"
#include "rva/RVA.h"

#include "Globals.h"
#include "PapyrusMCM.h"
#include "ScaleformMCM.h"
#include "SettingStore.h"
#include "MCMInput.h"
#include "MCMSerialization.h"
#include "MCMTranslator.h"

IDebugLog gLog;
PluginHandle g_pluginHandle = kPluginHandle_Invalid;

F4SEScaleformInterface        *g_scaleform = NULL;
F4SEPapyrusInterface        *g_papyrus = NULL;
F4SEMessagingInterface        *g_messaging = NULL;
F4SESerializationInterface    *g_serialization = NULL;

//-------------------------
// Event Handlers
//-------------------------

bool RegisterPapyrus(VirtualMachine *vm) {
    PapyrusMCM::RegisterFuncs(vm);
    _MESSAGE("Registered Papyrus native functions.");

    return true;
}

void OnF4SEMessage(F4SEMessagingInterface::Message* msg) {
    switch (msg->type) {
        case F4SEMessagingInterface::kMessage_GameLoaded:
            MCMInput::GetInstance().RegisterForInput(true);

            // Inject translations
            BSScaleformTranslator* translator = (BSScaleformTranslator*)(*G::scaleformManager)->stateBag->GetStateAddRef(GFxState::kInterface_Translator);
            if (translator) {
                MCMTranslator::LoadTranslations(translator);
            }
            break;
    }
}

extern "C"
{

bool F4SEPlugin_Query(const F4SEInterface * f4se, PluginInfo * info)
{
    gLog.OpenRelative(CSIDL_MYDOCUMENTS, "\\My Games\\Fallout4\\F4SE\\MCM.log");

    _MESSAGE("MCM v%s", PLUGIN_VERSION_STRING);
    _MESSAGE("MCM query");

    // populate info structure
    info->infoVersion =    PluginInfo::kInfoVersion;
    info->name      = PLUGIN_NAME_SHORT;
    info->version   = PLUGIN_VERSION;

    // store plugin handle so we can identify ourselves later
    g_pluginHandle = f4se->GetPluginHandle();

    // Check game version
    if (f4se->runtimeVersion != SUPPORTED_RUNTIME_VERSION) {
        char str[512];
        sprintf_s(str, sizeof(str), "Your game version: v%d.%d.%d.%d\nExpected version: v%d.%d.%d.%d\n%s will be disabled.",
            GET_EXE_VERSION_MAJOR(f4se->runtimeVersion),
            GET_EXE_VERSION_MINOR(f4se->runtimeVersion),
            GET_EXE_VERSION_BUILD(f4se->runtimeVersion),
            GET_EXE_VERSION_SUB(f4se->runtimeVersion),
            GET_EXE_VERSION_MAJOR(SUPPORTED_RUNTIME_VERSION),
            GET_EXE_VERSION_MINOR(SUPPORTED_RUNTIME_VERSION),
            GET_EXE_VERSION_BUILD(SUPPORTED_RUNTIME_VERSION),
            GET_EXE_VERSION_SUB(SUPPORTED_RUNTIME_VERSION),
            PLUGIN_NAME_LONG
        );

        MessageBox(NULL, str, PLUGIN_NAME_LONG, MB_OK | MB_ICONEXCLAMATION);
        return false;
    }

    // Get the scaleform interface
    g_scaleform = (F4SEScaleformInterface *)f4se->QueryInterface(kInterface_Scaleform);
    if(!g_scaleform) {
        _MESSAGE("couldn't get scaleform interface");
        return false;
    }

    // Get the papyrus interface
    g_papyrus = (F4SEPapyrusInterface *)f4se->QueryInterface(kInterface_Papyrus);
    if (!g_papyrus) {
        _MESSAGE("couldn't get papyrus interface");
        return false;
    }

    // Get the messaging interface
    g_messaging = (F4SEMessagingInterface *)f4se->QueryInterface(kInterface_Messaging);
    if (!g_messaging) {
        _MESSAGE("couldn't get messaging interface");
        return false;
    }

    // Get the serialization interface
    g_serialization = (F4SESerializationInterface *)f4se->QueryInterface(kInterface_Serialization);
    if (!g_serialization) {
        _MESSAGE("couldn't get serialization interface");
        return false;
    }

    return true;
}

bool F4SEPlugin_Load(const F4SEInterface *f4se)
{
    _MESSAGE("MCM load");

    // Initialize globals and addresses
    G::Init();
    RVAManager::UpdateAddresses(f4se->runtimeVersion);

    g_scaleform->Register("f4mcm", ScaleformMCM::RegisterScaleform);
    g_papyrus->Register(RegisterPapyrus);
    g_messaging->RegisterListener(g_pluginHandle, "F4SE", OnF4SEMessage);

    g_serialization->SetUniqueID(g_pluginHandle, 'MCM');
    g_serialization->SetRevertCallback(g_pluginHandle, MCMSerialization::RevertCallback);
    g_serialization->SetLoadCallback(g_pluginHandle, MCMSerialization::LoadCallback);
    g_serialization->SetSaveCallback(g_pluginHandle, MCMSerialization::SaveCallback);

    // Create Data/MCM if it doesn't already exist.
    if (GetFileAttributes("Data\\MCM") == INVALID_FILE_ATTRIBUTES)
        CreateDirectory("Data\\MCM", NULL);

    SettingStore::GetInstance().ReadSettings();

    return true;
}

};

 

 

 

    да, буков, да еще и импортных- много, но не стоит пугаться раньше времени. нас интересует то, что ниже объявления функции " bool F4SEPlugin_Query(const F4SEInterface * f4se, PluginInfo * info) " . там запрашивается версия игры/f4se и сравнивается с интересующей автора:

if (f4se->runtimeVersion != SUPPORTED_RUNTIME_VERSION)

эту строчку не надо трогать- она для нас не опасней сломанной мышеловки, нас на самом деле интересуют две строки ниже:

        MessageBox(NULL, str, PLUGIN_NAME_LONG, MB_OK | MB_ICONEXCLAMATION);
        return false;

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

       далее удаляем/закоменчиваем эти 2 строки, компилируем библиотеку, засовываем её куда положено и наслаждаемся.

 

       теперь немного о другом. описанное здесь отнюдь не панацея и по возможности следует избегать данной процедуры, если есть возможность обновить мод. далее- для Skyrim SE нельзя пытаться новые версии Racemenu прикрутить на старые версии игры, это связано с тем, что мод развивается/восстанавливает функционал и это напрямую связано с развитием/восстановлением skse64. с Ф4 подобное несколько получше- например Looksmrnu для версии 10.120 великолепно взлетит на версии игры 10.75 (на сильно старых версиях, скажем, 10.26 или 10.40 не опробовано).

 

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

 

     данный текст являет собой инструкцию и не призывает срать автору в личку навроде "плизя, сделяй мине №№№", "слышь, не в падлу, наваяй №№№" . я человек грубый и неженственный и любящий посылать на**** такие просьбы.

 

Продолжение темы смотрим тут: 

 

Edited by Barmailley
  • Like 4

Share this post


Link to post
Share on other sites

Замечательно! Хотелось бы добавить несколько слов об использовании "Resource Hacker": если он находит в длл-ке раздел Version Info - можно прямо там попытаться поправить версию F4SE. Иногда прокатывает.

Share this post


Link to post
Share on other sites

миниинструкция для F4z-Ro-D-oh (фузродох для ф4) для отпиливания проверки версии в dll.

сорсы находятся в

Скрытый контент

    Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое.

нас интересует файл main.cpp, а точнее участок кода в нем:

Спойлер
bool F4SEPlugin_Query(const F4SEInterface * F4SE, PluginInfo * info)
{
gLog.OpenRelative(CSIDL_MYDOCUMENTS, "\\My Games\\Fallout4\\F4SE\\F4z Ro D-oh.log");
_MESSAGE("%s Initializing...", MakeSillyName().c_str());
 
// populate info structure
info->infoVersion = PluginInfo::kInfoVersion;
info->name = "F4z Ro D'oh";
info->version = PACKED_SME_VERSION;
 
interfaces::kPluginHandle = F4SE->GetPluginHandle();
interfaces::kMsgInterface = (F4SEMessagingInterface*)F4SE->QueryInterface(kInterface_Messaging);
 
if (F4SE->isEditor)
return false;
else if (F4SE->runtimeVersion != RUNTIME_VERSION_1_10_138)
{
_MESSAGE("Unsupported runtime version %08X", F4SE->runtimeVersion);
return false;
}
else if (!interfaces::kMsgInterface)
{
_MESSAGE("Couldn't initialize messaging interface");
return false;
}
 
// supported runtime version
return true;

}

это стартовые проверки для подрубания dll, все их убирать не нужн, достаточно изменить строку

else if (F4SE->runtimeVersion != RUNTIME_VERSION_1_10_138)

на чтонибудь типа :

else if (F4SE->runtimeVersion = null)

или иную лабуду, которая не даст телу условия сработать.

далее просто компилим и пользуемся.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By stas2503
      Скрытый контент
      Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое.
      Данный мод является ресурсом для других BDSM-модов и позволяет им использовать мебель и Анимации связывания из этого мода... Мебель изготавливается в мастерской в отдельном разделе...
      Требования: Fallout 4

      Скрытый контент
      Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое.
    • By Barmailley
      Wasteland Dairy Framework
       
      Молочные пустоши
       
      Автор : Invictusblade
       
      Страница мода <
      Скрытый контент
      Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое. >  
      Описание
       
      Расширение функций мода Улучшенное планирование семьи.
       
      Добавление функций для разнообразных существ.
       
      Внедрение мастерских, взаимодействия с материалами для крафта, употребления продуктов и предметов помощи.
       
      Разнообразие приобретения беременности: от существ, предметов мебели, шприцами.
       
      Простое порабощение НПС и существ, для получения ресурсов.
       
      Клонирование.
       
      Заболевания и зависимости.
       
      Каннибализм, так что впечатлительным не стоит использовать эту функцию (Зависит от стандартного перка ГГ)
       
      Новые предметы обмундирования, включая переноску детей на нпс, которое можно улучшить на верстаке улучшения брони
       
      И многое другое, подробнее в отдельном файле помощи МСМ для мода.
       
       
       
      Требования
       
      AAF и Анимации
       
      AAF Family Planning Enhanced  Желательно версию Redux
       

      Скрытый контент
      Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое. Моя редакция от Palistrio  

      Скрытый контент
      Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое.  
      Дополнительная информация
      Не используйте ESPExplorer на More Creatures (FPEAIOCreatureAddon.esp)  (это вызовет проблемы с напарниками)
      Не используйте ESPExplorer на FPE_BabyAddons.esp (это вызовет проблемы с напарниками)
      Отключите моды Авто подбора при использовании Молоко взросления с ВРЭ, потому что автоматический лут, может забрать ребенка до того, как скрипт сработает.
       
      Версия 2.30а <<
      Скрытый контент
      Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое. >>  
      архив версий
       
       
      P.S. Скрипты мода и некоторых патчей, пока оставил без изменений.
       
       
       
      Принимаются варианты по улучшению перевода.
      О найденных ошибках, можно сообщить в этой теме.
       
       
      Скриншоты
       
       
       
       
    • By stas2503

      Скрытый контент
      Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое.
      Данный мод представляет собой набор ограничивающих устройств для вашей ЖГГ или вашей компаньонки, запирающихся под ключи... И эти устройства не просто выглядят ограничительными. Эти наручные манжеты действительно запирают ваши руки за спиной и не позволяют вам сражаться. Сбежать? Ни за что! И да, одетый кляп не позволит вам говорить!
      Вопросы/ответы(только часть)
      В: Как заставить этот мод не скрывать PipBoy? Я хочу использовать свой собственный дизайн PipBoy hider! 
      О: Введите в консоли Set DD_PipBoyAlwaysHide to -1. Это полностью отключит функцию hider. Предупреждение: некоторые ограничители будут выглядеть крайне глупо, если PipBoy не будет скрыт. Используйте это, только если у вас есть PipBoy, постоянно скрытый другим модом, и НЕ используйте этот параметр, когда функция hider от DD активна.
      В: Где взять ограничители и ключи к ним?
      О: В добрососедстве в зале воспоминаний найдите Kimy, Она вам с удовольствием продаст и ограничители и ключи к ним... Предупреждаю, цены на ключи кусаются
      02: Ограничители можно создать на специальном верстаке, который можно установить в вашем поселении... Ключи создавать нельзя...
      Установка:
      Установите архив Devious Devices 2.0.7z - это оригинальный непереведенный мод...
      Затем поверх накатите содержимое архива DD2.0Rus.7z, согласившись на замену - это перевод...
      Требования:
      DLC Automatron
      DLC Wasteland Workshop
      DLC Far Harbor
      DLC Contraptions Workshop
      DLC Vault-Tec Workshop
      DLC Nuka-World
      Тело CBBE - Скрытый контент
      Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое. другие не подойдут
      Bodyslide and Outfit Studio -  Скрытый контент
      Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое.
      AWKCR -  Скрытый контент
      Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое.
      Torture Devices -

      Скрытый контент
      Дайте реакцию или ответ на эту тему, чтобы увидеть скрытое содержимое.
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.