Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MetroEX - универсальный инструмент для работы с ресурсами игр серии Метро
GAMEINATOR forums > Общие разделы > Создание и модификация игр. Геймдев.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
happy sniper
Я вот не вижу в Метро какого-т большого потенциала для модинга. Не понимал желания модить его тогда,во времена 2033 и LL не понимаю и сейчас, во времена Исхода. Да, карты можно моделить но, как показывает сталкерский модострой, достойных модов с новыми картами единицы. Плюс ко всему нету системы квестов как таковой. Сталкер чем хорош? Наличием РПГ элементов, котрые, в принципе, легко поддаются изучению и модифкации, а Метро это срежиссированная игра в которой нужна хорошо поставленная линия сюжета.
kiperenok
Цитата(zubr14 @ 01.03.2019, 22:30) *
Я нихрена не понимаю в извлечении ресурсов и в целом в построении мода, но помню что с такого ажиатажа, с самодельных СДК начинался модинг сталкера. Прямой вопрос - что из этого выйдет в перспективе? Всё таки модить на метрохе или все утащить в нашу классику?

Как и в случае с первыми 2 частями ни чего не будет. В лучшем случае модельки из игры вставят в моды по сталкеру.
lafugix
Цитата(zubr14 @ 02.03.2019, 00:30) *
помню что с такого ажиатажа, с самодельных СДК начинался модинг сталкера

wink_old.gif с допила мультиплеерного СДК разве что, если говорить об СДК. Т.е. не с нуля в любом случае.
RayTwitty
Цитата(lafugix @ 01.03.2019, 22:46) *
Цитата(zubr14 @ 02.03.2019, 00:30) *
помню что с такого ажиатажа, с самодельных СДК начинался модинг сталкера

wink_old.gif с допила мультиплеерного СДК разве что, если говорить об СДК. Т.е. не с нуля в любом случае.

А в чем заключался допил? Я помню лишь один фикс-патч с исправлением вылета в каком-то окне.

Другое дело, Бардак, который разобрал чанки всех игровых объектов в игре и нет-пакет, а после чего запилил АСДС, что позволило без СДК редактировать спавн. Причем тулза используется до сих пор, ибо в некоторых случаях намного быстрее подправить циферку в блокноте, чем пересобирать кучу всего в СДК.
iOrange
Цитата(zubr14 @ 01.03.2019, 21:30) *
Я нихрена не понимаю

Цитата(happy sniper @ 01.03.2019, 21:41) *
Я вот не вижу

Цитата(kiperenok @ 01.03.2019, 21:42) *
ни чего не будет

Всем спасибо за поддержку, вдохновляет bravo7kg.gif dry.gif
lafugix
RayTwitty, это уже вам виднее, я-то васян ненастоящий smile.gif Ситуации разнятся, и приравнивать распаковку (лол) метро к старту моддинга ТЧ некорректно.
valer4ik145
Спасибо за софт) жду обновы под локации, так как хочу перенести под сталкер, еще раз огромное спасибо за ваш труд адский.
1001v
Цитата(valer4ik145 @ 01.03.2019, 23:48) *
хочу перенести под сталкер

О, началось
iOrange
Цитата(zubr14 @ 01.03.2019, 23:14) *
iOrange, ты чего агришься?

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

Цитата(zubr14 @ 01.03.2019, 23:14) *
И Почему тогда столько времени не могли вскрыть ресурсы?

Ну, я 9 лет назал ковырял Метро 2033. Просто случились обстоятельства, по которым я и разработку, и сам форум покинул на почти 9 лет. Вот, пытаюсь реабилитироваться так сказать wink.gif
RayTwitty
Цитата(zubr14 @ 02.03.2019, 00:14) *
или всё таки модить метро ( для этого его и вскрыли)

Моддинг пока на этапе "распаковки архивов", причем как я понял, даже не всех. Вот когда можно будет поправить "переносимый вес актора" и чтобы игра это скушала, тогда можно о чём-то говорить.
kiperenok
Цитата(iOrange @ 01.03.2019, 23:35) *
Цитата(zubr14 @ 01.03.2019, 21:30) *
Я нихрена не понимаю

Цитата(happy sniper @ 01.03.2019, 21:41) *
Я вот не вижу

Цитата(kiperenok @ 01.03.2019, 21:42) *
ни чего не будет

Всем спасибо за поддержку, вдохновляет bravo7kg.gif dry.gif

А причем тут поддержка тебя с твоими программами и плагинами и моддингом Метро ?
Ты делаешь программы для распаковки ресов, конвертора текстур и плагинов для 3д пакетов по импорту геометрии локаций и моделек из игры. Как и для прошлых частей, ОГРОМНЫЙ респект тебе за это и спасибо!
Но к моддингу самого Метро это ни как не относится. Как и с прошлыми частями его моддингом заниматься ни кто не будет, просто потому что это корридорный шутан, что там моддить ?
То ли дело сталкер, там простора для творчества хоть отбавляй.
Да кстати, если бы кто смог перенести локацию Волга со всеми объектами (деревья, столбы, транспорт, ящики и т.п.) на движок Чистого Неба, я думаю на максималках локация смотрелась бы не хуже оригинала. А уж системные требования на порядок снизились rolleyes.gif
DaaGuda
kiperenok, кто мог сделать - тому и не нужно было. Но не надо утверждать, что никто не был заинтересован в моддинге метро. Была бы возможность - были бы и школомоды по изменению звука выстрела на кукареканье и т.п.
D1325
Добрый день!
Кто-нибудь может рассказать полному нубу как пользоваться всем этим чтобы получить доступ к моделям из игры с текстурами. Вроде этого Моделька трактора
Скринить все объекты в игре не вариант, а разобраться сам я что-то не смог sad.gif
Распаковщик архивов Metro Exodus от abramcumner с первой страницы в папку игры я скинул, но при запуске он ничего не распаковывает. Архивы в папке bin, если что.
Буду благодарен за помощь! smile.gif
kiperenok
Уже есть возможность загрузить в 3дс макс модель Авроры, с нормальными текстурами, без артефактов геометрии ?
autistic
Цитата(abramcumner @ 02.03.2019, 17:33) *
По идее не должно срастись

Ну не знаю, я внедрил свою DLL в процесс MetroExodus.exe, создал поток, позвал из него мессадж бокс, все сработало. Мб при выделении/изменении страниц памяти какие-то проблемы будут, посмотрим.
+
Код
INT RoutineItself(LPVOID)
{
    if (!MessageBoxA(NULL, "Hello, World from Metro game!", "Injected message", MB_OK))
        return ERROR_INVALID_FUNCTION;

    return ERROR_SUCCESS;
}

bool StartRoutine()
{
    if (HANDLE hThread = CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(RoutineItself), 0, 0, NULL))
    {
        return true;
    }

    return false;
}

BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason) {
    case DLL_PROCESS_DETACH:
        break;
    case DLL_PROCESS_ATTACH:
        if (!StartRoutine())
            return FALSE;

        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    }

    return TRUE;
}



Modera
Цитата(abramcumner @ 02.03.2019, 15:33) *
Иначе я не понимаю, чем денува вообще занимается?

Кстати действительно, чем она занимается?
Спойлер
Я вот нашел код который читает секцию startup из level.bin.

Искал по референсу на строку next_level, по startup что-то не нашло.
SkyLoader
Довольно удобно получается, что можно сразу смотреть модели во вьювере smile.gif
Имеются пожелания для новой версии, если будет время на реализацию:
1) При загрузке модели где-нибудь отображать список используемых текстур у меши. Можно хоть при ПКМ добавить пункт вроде Summary, где будет описана основная информация о количестве полигонов, путей к задействованным текстурам и тд. Ибо текстуры экспортируются с моделью не со всеми картами, а только альбедо.
2) Добавить сортировку древа списка контента по алфавиту.
3) Реализовать поиск по списку. Чисто для удобства.
4) Добавить возможность экспортировать модель со всеми текстурами: _bump, _nm и тд.
5) Для файлов с неправильно названным форматом (mdel, 248 и т.п.) дать возможность экспортировать файл как модель/как текстуру. Допустим, пользователь знает, что mdel - это model, но программа этого не знает. Пользователь мог бы просто выбрать пункт вроде Export as model... и экспортировать.
6) Было бы неплохо в планируемый fbx добавить экспорт лод-моделей.
deonisii
Обойма для Вентиля на 15 патронов, а чуть выше, файлы bolt_adv, походу улучшение до автоматического затвора. Осталось только все это в игре найти sad.gif .



По всей видимости дополнительный приборчик в кабину паровоза(главное меня, как "Новая игра", "Главы", "Настройки" и пр.), которое будет(или должно) "включать" dlc.

Vasia1917
Можно ли сжать текстуры для большей производительности на слабых компах?
JackieR
Цитата(Vasia1917 @ 02.03.2019, 19:01) *
Можно ли сжать текстуры для большей производительности на слабых компах?

Я ради эксперимента экспортировал в оригинальное Metro 2033 файлы текстур с разрешением .256.
Игра видит только .512.

Вряд ли в Исходе ситуация иная.
Modera
JackieR, если в textures.bin поменять параметр streamable на False и сохранить текстуры как .dds с нужным разрешением то будет работать. wink.gif
В исходе тоже такой параметр есть, но нет возможности скормить изменённый файл игре.
Thekello
Ребята, подскажите пожалуйста, можно через эту программу вскрыть ресурсы Metro 2033 и Last Light(если нет, то подскажите пожалуйста какую программу использовать)? Я новичок, хочу вырезать пару моделей и уровней из Метро 2033(для личного пользования smile.gif) но не знаю какой программой это сделать smile.gif.
Thekello
Цитата(ed_rez @ 03.03.2019, 05:22) *

Спасибо smile.gif.
DaaGuda
Березка



iOrange
К сожалению, версия v0.29 немного задерживается sad1.gif
Если со скелетом особых проблем не возникло, то вот с его привязкой .... есть затыки пока.
У некоторых вершин индексы костей превышают количество костей в скелете.
Например у крысы - 28 костей, но вершины хвоста имеют индексы вплоть до 81 huh.gif
Таблицы ремапинга сквозные у этих моделей, так что проблема не в этом.
Вобщем пока пытаюсь решить эту проблему, как только поборю - выкачу новую версию и приймусь за анимации.
Modera
iOrange, я когда-то делал конвертер моделей для билда 2006 года, там индекс кости в вершине делился на три.
iOrange
Цитата(Modera @ 03.03.2019, 21:22) *
iOrange, я когда-то делал конвертер моделей для билда 2006 года, там индекс кости в вершине делился на три.

Хмм, интересная мысль, надо попробовать. А как узнали? Методом подбора?
DaaGuda
Попадается много моделей с назначенными текстурами которых нет вообще в игре. Интересно однако...
Modera
iOrange, уже точно не помню как к этому пришел. Скорее всего открыл какую-то простую модель с двумя или тремя костями и это было очевидно.
Cartoteka
Цитата(DaaGuda @ 03.03.2019, 22:52) *
Попадается много моделей с назначенными текстурами которых нет вообще в игре.



Можешь скинуть скрины посмотреть? Может, в DLC будут?
DaaGuda
Cartoteka, есть папки с моделями подписанные по типу "dlc_han_story" и т.д (upd/ это с ll осталось). Если опят попадётся, сделаю скрины. Просто не запоминал какие модели.
qvvxvvq
Цитата(Cartoteka @ 03.03.2019, 22:54) *
Цитата(DaaGuda @ 03.03.2019, 22:52) *
Попадается много моделей с назначенными текстурами которых нет вообще в игре.



Можешь скинуть скрины посмотреть? Может, в DLC будут?

Скорее всего он имеет виду немного иное, к примеру у одной модели есть текстура "trees_brunch_alpha", а у другой модели есть текстура "trees_brunch_alpha_broken", которой в файлах вообще нету, но текстура "trees_brunch_alpha" подойдет ко второй модели, что-то подобное есть в СДК нашем, где можно просто поменять цвет без фотошопа. Думаю я понятно разъяснил
Modera
Цитата(DaaGuda @ 03.03.2019, 22:52) *
Попадается много моделей с назначенными текстурами которых нет вообще в игре. Интересно однако...

Это потому что в модели хранится не имя текстуры в папке с текстурами, а имя конфига в textures_handles_storage.bin, в котором уже указывается настоящее имя текстуры. Имя текстуры иногда совпадает с именем конфига и часть текстур успешно открывается. smartass.gif
iOrange
Цитата(Modera @ 03.03.2019, 21:54) *
iOrange, уже точно не помню как к этому пришел

Блин, а ведь действительно. Вот я маху дал. Они же когда кости сетапят, смещение делят на 0x90, при том что размер кости - 0x30.
Спасибо за подсказку!

Цитата(Modera @ 03.03.2019, 22:08) *
Это потому что в модели хранится не имя текстуры в папке с текстурами, а имя конфига в textures_handles_storage.bin, в котором уже указывается настоящее имя текстуры

Спасибо, загляну туда.
DaaGuda
Цитата(iOrange @ 03.03.2019, 23:18) *
Спасибо, загляну туда.

Было бы неплохо.
autistic
Похукал ф-ию открытия файлов MetroExodus.exe. Вроде работает, но толком не проверил т.к. все файловые дескрипторы открываются еще до появления окна отрисовки.
Для всех кто интересуется этой темой делюсь наработками:
Исходный код приложения, которое инжектит код
Код
#include <algorithm>
#include <cassert>
#include <cstdio>
#include <iostream>

#include <Windows.h>
#include <psapi.h>
#include <shlwapi.h>
#include <tlhelp32.h>

#pragma comment(lib, "Shlwapi.lib")

enum ErrorCodes
{
    ERROR_LOAD_LIBRARY = -3,
    ERROR_OPEN_PROCESS = -2,
    ERROR_DEBUG_PRIVILEGE = -1,
    ERROR_SUCCEEDED = 0
};

struct HandleHolder
{
    HandleHolder() : handle() {}
    HandleHolder(HANDLE handle) : handle(handle) {}
    HandleHolder(const HandleHolder &) = delete;
    HandleHolder(HandleHolder &&rhs) : handle(NULL) { std::swap(handle, rhs.handle); }
    ~HandleHolder() { CloseHandle(handle); }
    operator HANDLE() { return handle; }
    HandleHolder &operator = (const HandleHolder &) = delete;
    HandleHolder &operator = (HandleHolder &&rhs) { std::swap(handle, rhs.handle); }
    HANDLE handle;
};

struct VirtualAllocHolder
{
    VirtualAllocHolder(const VirtualAllocHolder &) = delete;
    VirtualAllocHolder(HANDLE process, LPVOID address) : process(process), address(address) {}
    ~VirtualAllocHolder() { VirtualFreeEx(process, address, 0, MEM_RELEASE);  }
    VirtualAllocHolder &operator = (const VirtualAllocHolder &) = delete;
    operator LPVOID() { return address; }
    HANDLE process;
    LPVOID address;
};

struct CmdLine
{
    CmdLine() { argv = CommandLineToArgvW(GetCommandLineW(), &argc); }
    INT GetArgumentCount() const { return argc; }
    LPCWSTR GetArgument(INT index) const { assert(index < argc); return argv[index]; }
    INT argc;
    LPWSTR *argv;
};

HandleHolder OpenProcess(LPCWSTR processName)
{
#define OPEN_PROCESS_ERROR() \
    do { \
        std::fwprintf(stderr, \
        L"Failed to open system process '%s' with error code '%d'", \
        processName, \
        GetLastError()); \
    } \
    while (0)

    HandleHolder snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (snapshot == INVALID_HANDLE_VALUE) {
        OPEN_PROCESS_ERROR();
        return NULL;
    }

    PROCESSENTRY32 processEntry;
    if (Process32First(snapshot, &processEntry) == FALSE) {
        if (GetLastError() != ERROR_NO_MORE_FILES)
            OPEN_PROCESS_ERROR();
        return NULL;
    }

    do {
        HandleHolder process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processEntry.th32ProcessID);
        if (process != NULL) {
            WCHAR imagePath[MAX_PATH];
            if (GetProcessImageFileNameW(process, imagePath, MAX_PATH) != 0) {
                LPCWSTR moduleName = PathFindFileNameW(imagePath);
                if (lstrcmpiW(processName, moduleName) == 0)
                    return process;
            }
        }
    }
    while (Process32Next(snapshot, &processEntry) != FALSE);

    return NULL;

# undef OPEN_PROCESS_ERROR
}

BOOL InjectDLL(HANDLE process, LPCWSTR libraryPath)
{
#define LOAD_LIBRARY_ERROR() \
    do { \
        std::fwprintf(stderr, \
        L"Failed to load library '%s' with error code '%d'", \
        libraryPath, \
        GetLastError()); \
    } \
    while (0)

    FARPROC startRoutine = GetProcAddress(GetModuleHandle("KERNEL32.DLL"), "LoadLibraryW");
    if (startRoutine == NULL) {
        LOAD_LIBRARY_ERROR();
        return FALSE;
    }

    CONST SIZE_T length = (lstrlenW(libraryPath) + 1) * sizeof(WCHAR);
    VirtualAllocHolder argument(process, VirtualAllocEx(process, NULL, length, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));
    if (argument == NULL) {
        LOAD_LIBRARY_ERROR();
        return FALSE;
    }

    SIZE_T bytesWritten;
    if (WriteProcessMemory(process, argument, libraryPath, length, &bytesWritten) == FALSE) {
        LOAD_LIBRARY_ERROR();
        return FALSE;
    }

    HandleHolder remoteThread = CreateRemoteThread(process, NULL, 0, LPTHREAD_START_ROUTINE(startRoutine), argument, 0, NULL);
    if (remoteThread == NULL) {
        LOAD_LIBRARY_ERROR();
        return FALSE;
    }

    if (WaitForSingleObject(remoteThread, INFINITE) != WAIT_OBJECT_0)
        return FALSE;

    return TRUE;

#undef LOAD_LIBRARY_ERROR
}

BOOL SetDebugPrivilege(BOOL onoff)
{
#define SET_DEBUG_PRIVILEGE_ERROR() \
    do { \
        std::fwprintf(stderr, \
        L"Failed to set debug privilege with error code '%d'", \
        GetLastError()); \
    } \
    while (0)

    HandleHolder token;
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token.handle) == FALSE) {
        SET_DEBUG_PRIVILEGE_ERROR();
        return FALSE;
    }

    LUID luid;
    if (LookupPrivilegeValueA(NULL, "SeDebugPrivilege", &luid) == FALSE) {
        SET_DEBUG_PRIVILEGE_ERROR();
        return FALSE;
    }

    TOKEN_PRIVILEGES privileges;
    privileges.PrivilegeCount = 1;
    privileges.Privileges[0].Luid = luid;
    privileges.Privileges[0].Attributes =
        (onoff) ? SE_PRIVILEGE_ENABLED : SE_PRIVILEGE_REMOVED;

    if (AdjustTokenPrivileges(token, FALSE, &privileges, 0, NULL, NULL) == FALSE) {
        SET_DEBUG_PRIVILEGE_ERROR();
        return FALSE;
    }

    return TRUE;

#undef SET_DEBUG_PRIVILEGE_ERROR
}

int main()
{
    CmdLine cmdLine;
    if (cmdLine.GetArgumentCount() != 3) {
        std::puts("USAGE: dllinject <process name> <DLL module full path>");
        return ERROR_SUCCEEDED;
    }

    if (SetDebugPrivilege(TRUE) == FALSE)
        return ERROR_DEBUG_PRIVILEGE;

    LPCWSTR processName = cmdLine.GetArgument(1);
    HandleHolder process = OpenProcess(processName);
    if (process == NULL)
        return ERROR_LOAD_LIBRARY;

    LPCWSTR dllPath = cmdLine.GetArgument(2);
    if (InjectDLL(process, dllPath) == FALSE)
        return ERROR_OPEN_PROCESS;

    return ERROR_SUCCEEDED;
}


Исходный код внедряемой DLL
Код
#define _CRT_SECURE_NO_WARNINGS

#include <fcntl.h>
#include <io.h>
#include <sys/stat.h>

#include <cstdlib>

#include <Windows.h>
#include <tlhelp32.h>

#define PROCESS_NAME "MetroExodus.exe"

struct ReaderData
{
    int FileDescriptor;
    long FilePointer;
    long FileLength;
};

BYTE *FindTargetFunctionAddress(BYTE *mem, INT length)
{
    CONST BYTE pattern[] =
    {
        '\x83', '\xEC', '\x20', '\x48', '\x89', '\xD6', '\x41', '\xF7',
        '\xD8', '\x48', '\x89', '\xCB', '\x48', '\x89', '\xF1', '\x19',
        '\xFF', '\x83', '\xE7', '\x20', '\x0F', '\xBA', '\xEF', '\x0F',
        '\x89', '\xFA', '\xFF', '\x15', '\xB4', '\xF9', '\x6A', '\x04',
        '\x89', '\x03', '\x83', '\xF8', '\xFF', '\x75', '\x35', '\xFF',
        '\x15', '\x1F', '\xF9', '\x6A', '\x04', '\x83', '\x38', '\x02',
    };

    INT i, j;
    CONST INT count = sizeof(pattern);
    for (i = 0; i <= length - count; ++i)
    {
        for (j = 0; j < count; ++j)
        {
            if (mem[i + j] != pattern[j])
            {
                break;
            }
        }

        if (j == count)
        {
            return mem + i;
        }
    }

    return NULL;
}

LPVOID GetTargetFunctionAddress()
{
    MODULEENTRY32 entry = MODULEENTRY32();
    entry.dwSize = sizeof(MODULEENTRY32);
    HANDLE hProcess = GetCurrentProcess();
    DWORD processId = GetProcessId(hProcess);
    HANDLE hModuleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processId);

    if (Module32First(hModuleSnapshot, &entry) == FALSE)
    {
        return NULL;
    }

    do
    {
        if (strcmp(entry.szModule, PROCESS_NAME) == 0)
        {
            return FindTargetFunctionAddress(entry.modBaseAddr, entry.modBaseSize);
        }
    }
    while (Module32Next(hModuleSnapshot, &entry) == TRUE);

    return NULL;
}

void Metro_OpenFile(ReaderData *reader, const char *path)
{
    int fd = _open(path, _O_BINARY, 0);
    if (fd == -1)
    {
        if (errno == ENOENT)
        {
            return;
        }

        Sleep(10);
        fd = _open(path, _O_BINARY, 0);
        if (fd == -1)
        {
            return;
        }
    }

    long length = _filelength(fd);
    if (length == -1)
    {
        _close(fd);
        return;
    }

    reader->FileDescriptor = fd;
    reader->FileLength = length;
}

BOOL SetHook(LPVOID address, LPVOID detour)
{
    DWORD oldProtection;
    CONST SIZE_T length = 32;
    CONST DWORD64 offset = reinterpret_cast<DWORD64>(detour) - reinterpret_cast<DWORD64>(address) - 9;

    if (VirtualProtect(address, length, PAGE_EXECUTE_READWRITE, &oldProtection) != TRUE)
    {
        return NULL;
    }

    memset(address, 0x90, length);
    CHAR *p = reinterpret_cast<CHAR*>(address);
    *reinterpret_cast<BYTE*>(p++) = 0xEB;
    *reinterpret_cast<DWORD64*>(p) = offset;

    VirtualProtect(address, length, oldProtection, &oldProtection);

    return TRUE;
}

INT RoutineItself(LPVOID)
{
    LPVOID detour = Metro_OpenFile;
    LPVOID target = GetTargetFunctionAddress();

    if (target == NULL)
    {
        std::abort();
    }

    if (SetHook(target, detour) == FALSE)
    {
        return ERROR_INVALID_FUNCTION;
    }

    return ERROR_SUCCESS;
}

bool StartRoutine()
{
    if (HANDLE hThread = CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(RoutineItself), 0, 0, NULL))
    {
        return true;
    }

    return false;
}

BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason) {
    case DLL_PROCESS_DETACH:
        break;
    case DLL_PROCESS_ATTACH:
        if (!StartRoutine())
        {
            return FALSE;
        }
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    }

    return TRUE;
}


Хотя, что-то мне подсказывает, что с соглашением о вызове тут явно неладно. Непонятно как аргументы передаются, выглядит так словно через регистры.
Не будет это работать, короче.
iOrange
Цитата(autistic @ 04.03.2019, 01:37) *
Хотя, что-то мне подсказывает, что с соглашением о вызове тут явно неладно. Непонятно как аргументы передаются, выглядит так словно через регистры.

Metro Exodus - скомпилирована в x64, а значит все вызовы - fastcall, первые 4 параметра через регистры (rcx, rdx, r8, r9), остальные - через стек.
Флоаты передаются через SSE регистры (xmm0, xmm1, xmm2, xmm3).
iOrange
Делюсь промежуточными результатами - анимированные модели успешно экспортируются в FBX с костями и корректно зариганы.
Но вот при тестировании экспорта оказалось что более сложные модели (люди например) - у них скелеты составные, и внутри скелета могут быть ссылки на другие скелеты. С этим я еще разбираюсь, так что выход v0.29 все еще откладывается sad1.gif

shareware
Цитата(iOrange @ 04.03.2019, 07:47) *
Делюсь промежуточными результатами - анимированные модели успешно экспортируются в FBX с костями и корректно зариганы.
Но вот при тестировании экспорта оказалось что более сложные модели (люди например) - у них скелеты составные, и внутри скелета могут быть ссылки на другие скелеты. С этим я еще разбираюсь, так что выход v0.29 все еще откладывается sad1.gif



А не могли бы вы выложить версию с доступным FBX экспортом ? Уж очень сильно жду этот вариант экспорта smile.gif
autistic
Цитата(iOrange @ 04.03.2019, 07:36) *
Metro Exodus - скомпилирована в x64, а значит все вызовы - fastcall, первые 4 параметра через регистры

Тогда должно работать. Попробую тем же компилятором собрать которым игра собрана, чтоб c runtimes были одинаковые.
qvvxvvq
Может выложишь хоть 0.28?)
mmyr
Цитата(qvvxvvq @ 04.03.2019, 14:35) *
Может выложишь хоть 0.28?)


Может наберёшься терпения и немного подождёшь? Он это делает на чистом энтузиазме, за что ему огромное человеческое спасибо. Прояви уважение.
qvvxvvq
Цитата(mmyr @ 04.03.2019, 16:57) *
Цитата(qvvxvvq @ 04.03.2019, 14:35) *
Может выложишь хоть 0.28?)


Может наберёшься терпения и немного подождёшь? Он это делает на чистом энтузиазме, за что ему огромное человеческое спасибо. Прояви уважение.

Различай уважение и просьбу
P.S тут нет ни одного человека, который был бы не рад тому, что делает автор
iOrange
Цитата(shareware @ 04.03.2019, 07:15) *
А не могли бы вы выложить версию с доступным FBX экспортом ? Уж очень сильно жду этот вариант экспорта

Цитата(qvvxvvq @ 04.03.2019, 14:35) *
Может выложишь хоть 0.28?)

Ок, вечером соберу что есть. Тем более что там есть исправления и улучшения.
shareware
Цитата(iOrange @ 04.03.2019, 17:57) *
Цитата(shareware @ 04.03.2019, 07:15) *
А не могли бы вы выложить версию с доступным FBX экспортом ? Уж очень сильно жду этот вариант экспорта

Цитата(qvvxvvq @ 04.03.2019, 14:35) *
Может выложишь хоть 0.28?)

Ок, вечером соберу что есть. Тем более что там есть исправления и улучшения.

Большое спасибо )
Yurii2033
Спасибо! Буду очень ждать!

waxtinoff
iOrange, вопрос небольшой. Чисто теоретически, реально ли в ближайшем будущем сделать на основе твоего проекта полноценный инструмент для создания модов? Задумывался ли ты об подобном варианте развития своего проекта?
Будет ли допил для просмотра и экспорта ресурсов из предыдущих версий игры?
iOrange
Цитата(waxtinoff @ 04.03.2019, 20:05) *
Задумывался ли ты об подобном варианте развития своего проекта?

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

Цитата(waxtinoff @ 04.03.2019, 20:05) *
Будет ли допил для просмотра и экспорта ресурсов из предыдущих версий игры?

Сомнительно.
Thekello
Ребята, в какой папке находится поезд Аврора целиком и трупы?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.