SDK для 4A Engine своими руками |
Здравствуйте, гость ( Авторизация | Регистрация )
SDK для 4A Engine своими руками |
01.03.2019, 00:36
Сообщение
#681
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
Мне тут предложили создать отдельную тему по поводу редактора уровней который я показывал в теме "Вскрытие ресурсов Метро 2033", так что теперь все новости и прочее будет здесь.
Скачать актуальную версию можно тут: Скачать последнюю тестовую версию можно тут: Чейнджлог Версия от 28 февраля 2019:
Версия от 17 марта 2019:
Версия от 23 марта 2019:
Версия от 30 апреля 2019:
Версия от 18 августа 2019:
Версия от 25 августа 2019:
Версия от 20 января 2020:
Версия от 30 марта 2020:
Версия от 28 июня 2021:
Версия от 20 сентября 2021:
Версия от 4 ноября 2021:
Версия от 18 ноября 2021:
Версия от 6 февраля 2022:
Консольные утилиты Полноценный распаковщик и запаковщик для Last Light, readme в архиве Программы для работы с конфигами и конвертер моделей Исходники можно найти в исходниках level_editor'а. В архиве содержится три программы: split.exe, binunp.exe и model.exe. Первая split.exe, предназначена для разбития scripts.bin на отдельные файлы и сборки обратно. Для разбития поместить файл scripts.bin в рабочей папке и запустить без параметров или с одним параметром -d(без разницы). Код split.exe Если всё прошло хорошо должна появится папка scripts с большим количеством .bin файлов в ней. Для обратной сборки запустить с ключом -c: Код split.exe -c Скрипты при сборке опять таки берутся из папки scripts в рабочей папке. Вторая binunp.exe, предназначена для конвертирования .bin конфигов(файлы добытые из scripts.bin, level.bin и некоторые другие) в человеко-читаемый формат и обратно. Именно на её основе строится редактор уровней. Что умеет:
Распаковка level.bin осуществляется следующим образом: Код binunp.exe -l -d level.bin level.txt Где level.bin - имя файла для распаковки. Где level.txt - имя распакованного текстового файла. Запаковка level.bin: Код binunp.exe -l [-k N] -c level.txt level.bin Где level.txt - имя текстового файла для запаковки. Где level.bin - имя нового двоичного файла. Параметр -k необязательный, на месте N указывается тип .bin файла, по умолчанию 5. В 2033 используется 5, в last light 4, в следующих играх 36. Распаковка конфигов с отладочной инфой: Код binunp.exe -l -d file.bin file.txt Где file.bin - имя файла для распаковки. Где file.txt - имя распакованного текстового файла. При попытке распаковать таким образом конфиг без отладочной информации будет выведено сообщение об ошибке следующего вида: Код Exception: Cannot decompile config with kind=4 Распаковка конфигов без отладочной инфы(при помощи скрипта): Код binunp [-v] -s js\script.js file.bin file.txt Где js\script.js - имя скрипта в папке js используемого для разбора конфига. Где file.bin - имя файла для распаковки. Где file.txt - имя распакованного текстового файла. Параметр -v необязательный, если указать то будет выводиться предупреждение в том случае если данные были прочитаны не до конца. Есть специальный случай, если имя файла для распаковки textures.bin, то скрипт не используется, вместо него нужно указать пустую строчку. Код binunp -s "" textures.bin textures.txt Запаковка конфигов: Код binunp.exe [-k N] -c file.txt file.bin Где file.txt - имя текстового файла для запаковки. Где file.bin - имя нового двоичного файла. Параметр -k необязательный, на месте N указывается тип .bin файла, по умолчанию 5. Желательно указывать такой же какой был показан при распаковке. Последняя model.exe, конвертер моделей. Умеет следующее:
Краткая справка доступна при запуске без параметров. Эта инструкция будет дописываться. Сторонние утилиты Сообщение отредактировал Modera - 06.02.2022, 08:21 |
 
|
|
|
|
27.05.2021, 01:42
Сообщение
#682
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
Могу попробовать, но есть-ли в этом смысл, если можно только заменять существующие файлы без загрузки новых файлов? Или я ошибаюсь? Ну я как минимум добавлял новый уровень эталон, хотя и с оговорками, и .dds текстуры, так что возможность добавлять файлы есть. Скорее всего и с моделями тоже сработает. Исходники ДЛЛ с хаком и EXE-шник который я использую отправил в ЛС. Но для импорта своих моделей пока решения нет, верно? Уже года два в model_Editor'е можно открыть в меню Model -> Set Version и выбрать Metro Exodus. У меня даже что-то получалось заменять. Хотя это очень экспериментальная функция. |
 
|
|
28.05.2021, 04:05
Сообщение
#683
|
|
Продвинутый геймер Репутация: 48 Группа: Участник Сообщений: 275 Награды: 3 Регистрация: 30.11.2010 |
Могу попробовать, но есть-ли в этом смысл, если можно только заменять существующие файлы без загрузки новых файлов? Или я ошибаюсь? Ну я как минимум добавлял новый уровень эталон, хотя и с оговорками, и .dds текстуры, так что возможность добавлять файлы есть. Скорее всего и с моделями тоже сработает. Исходники ДЛЛ с хаком и EXE-шник который я использую отправил в ЛС. Но для импорта своих моделей пока решения нет, верно? Уже года два в model_Editor'е можно открыть в меню Model -> Set Version и выбрать Metro Exodus. У меня даже что-то получалось заменять. Хотя это очень экспериментальная функция. Ну с геометрией проблем нет. Хотя есть подозрение, что моделька чуток бьется, но возможно это сделал actoreditor. Только не понимаю, как ему текстуры подкинуть? Model editor текстуры видит. Запаковываю. Игра не видит. Открываю архив через metroex, текстуры в архиве есть, но его просмотрщик их не видит. Распаковываю архив, подкидываю текстуры из архива ME и он их видит. WTF? Кстати, при загрузке уровня в LE не работает кнопка отмена во время Loading entities UPD: Разобрался почему новая версия исхода не принимала изменений. Изменился путь до модели, был: "content\meshes\static\vehicles\funicular\funicular_base.model" стал: "content\meshes\static\cars\funicular\funicular_base.model" Но с моделькой ренджа игра вылетела на моменте загрузки главы. UPD2: Фуникулер не победился, зато победилась дверь в EnhancedEdition) Текстуры все равно почему-то не подцепляются. Сообщение отредактировал Rolan96 - 28.05.2021, 05:41 |
 
|
|
28.05.2021, 17:38
Сообщение
#684
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
Только не понимаю, как ему текстуры подкинуть? Хороший вопрос. У меня редакс тоже текстуры новые никак не принимает, ни через патчи, ни через расширение архива в MetroEX, ни через хак файловой системы. Кстати, при загрузке уровня в LE не работает кнопка отмена во время Loading entities Да, есть такое. А Redux даже умеет в реальном времени считать отражённый свет, прикольно. С розовой текстурой очень сильно заметно. Как же я отстал от прогресса ковыряясь только в сталкере... Ну с геометрией проблем нет. Коллизию тоже можешь проверить, новую тестовую версию с сохранением nxcform33x из model_Editor я уже закинул: С редаксом точно работает, а с исходом не факт, т.к. разные версии PhysX 3, а для него это вроде критично. |
 
|
|
28.05.2021, 19:47
Сообщение
#685
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
Могу попробовать, но есть-ли в этом смысл, если можно только заменять существующие файлы без загрузки новых файлов? Или я ошибаюсь? Ну я как минимум добавлял новый уровень эталон, хотя и с оговорками, и .dds текстуры, так что возможность добавлять файлы есть. Скорее всего и с моделями тоже сработает. Исходники ДЛЛ с хаком и EXE-шник который я использую отправил в ЛС. Но для импорта своих моделей пока решения нет, верно? Уже года два в model_Editor'е можно открыть в меню Model -> Set Version и выбрать Metro Exodus. У меня даже что-то получалось заменять. Хотя это очень экспериментальная функция. Глянул исходники, как будет время, переделаю. Их потом опубликовать с дллкой? И да, есть-ли включение консоли под оригинальное метро? Сообщение отредактировал TheStalkerNest - 28.05.2021, 19:50 |
 
|
|
28.05.2021, 19:51
Сообщение
#686
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
Глянул исходники, как будет время, переделаю. Их потом опубликовать с дллкой? Если хочешь, можешь опубликовать. И да, заметил в исходниках включение консоли. Есть-ли такое под оригинальную метро? Под оригинальную метро ещё не делал, только под редакс и ласт лайт 2013 года. |
 
|
|
28.05.2021, 23:03
Сообщение
#687
|
|
Ветеран Репутация: 10 Группа: Участник Сообщений: 99 Регистрация: 28.11.2018 |
И да, есть-ли включение консоли под оригинальное метро? Речь же про внутри игровую консоль? iOrange сделал скриптик для этого, спроси у него. Model editor текстуры видит. Запаковываю. Игра не видит. Открываю архив через metroex, текстуры в архиве есть, но его просмотрщик их не видит. Распаковываю архив, подкидываю текстуры из архива ME и он их видит. WTF? Для текстур в Редуксах и Исходе надо отдельные .bin'ы создавать чтобы игра их увидела. Сделать этого пока нельзя. -------------------- |
 
|
|
28.05.2021, 23:22
Сообщение
#688
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
И да, есть-ли включение консоли под оригинальное метро? Речь же про внутри игровую консоль? iOrange сделал скриптик для этого, спроси у него. Я ему уже писал. Его разработка превратилась в долгострой, который непонятно, выйдет-ли когда-нибудь вообще. Ещё в начале 19го года SunBeam делал консоль для оригинальной метро, но публиковал только для исхода. Связаться с ним, так и не удалось. Я уже думал свою консоль написать на ImGui, т.к. есть метод выполнения команд в консоли. |
 
|
|
29.05.2021, 14:48
Сообщение
#689
|
|
Ветеран Репутация: 10 Группа: Участник Сообщений: 99 Регистрация: 28.11.2018 |
Ну с геометрией проблем нет. Коллизию тоже можешь проверить, новую тестовую версию с сохранением nxcform33x из model_Editor я уже закинул: С редаксом точно работает, а с исходом не факт, т.к. разные версии PhysX 3, а для него это вроде критично. Попробовал боевую классику из ТЧ перенести. Коллизия работает. Сообщение отредактировал JackieR - 29.05.2021, 14:50 -------------------- |
 
|
|
29.05.2021, 15:31
Сообщение
#690
|
|
Продвинутый геймер Репутация: 48 Группа: Участник Сообщений: 275 Награды: 3 Регистрация: 30.11.2010 |
|
 
|
|
29.05.2021, 15:46
Сообщение
#691
|
|
Ветеран Репутация: 10 Группа: Участник Сообщений: 99 Регистрация: 28.11.2018 |
Modera, новая версия работает прекрасно, коллизия создалась без проблем и работает. JackieR, опередил меня) ты заменил существующую текстуру? Да, заменил существующую. По другому то пока никак. -------------------- |
 
|
|
29.05.2021, 16:08
Сообщение
#692
|
|
Продвинутый геймер Репутация: 48 Группа: Участник Сообщений: 275 Награды: 3 Регистрация: 30.11.2010 |
JackieR, Я так понял, что список текстур с параметрами хранится в textures_handles_storage.bin или где-то ещё?
Он нормально перегоняется в json конвертором для оружия из МетроЕх json" Код "ui\\ui_me_save_load_icon512": { "type": 0, "upgrade_id": 14453, "base_handle": "stringz", "data": { "shared_weapon_params": "", "priority": 0, "ui_tag_lib": 0, "tags": [], "excl_tags": [], "dep_tags": [], "autoinst_tags": [], "is_installed": false, "editor_name": "", "attach_hud_loc": "", "attach_offset": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "attach_to_root": false, "visual": "", "for_dlc2_only": false, "anim_track_prefix": "", "anim_track_suffix": "" } Были бы сорцы метроех можно было бы переписать это часть кода и разбирать файл в текстурами, тем более что вся инфа по этому файлу же есть в томже метроех: bin" Код void MetroTextureInfo::Serialize(MetroReflectionStream& s) { METRO_SERIALIZE_MEMBER(s, type); METRO_SERIALIZE_MEMBER(s, texture_type); METRO_SERIALIZE_MEMBER(s, source_name); METRO_SERIALIZE_MEMBER(s, surf_xform); METRO_SERIALIZE_MEMBER(s, format); METRO_SERIALIZE_MEMBER(s, width); METRO_SERIALIZE_MEMBER(s, height); METRO_SERIALIZE_MEMBER(s, animated); METRO_SERIALIZE_MEMBER(s, draft); METRO_SERIALIZE_MEMBER(s, override_avg_color); METRO_SERIALIZE_MEMBER(s, avg_color); METRO_SERIALIZE_MEMBER_CHOOSE(s, shader_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, gamemtl_name); METRO_SERIALIZE_MEMBER(s, priority); METRO_SERIALIZE_MEMBER(s, streamable); METRO_SERIALIZE_MEMBER(s, bump_height); METRO_SERIALIZE_MEMBER(s, displ_type); METRO_SERIALIZE_MEMBER(s, displ_height); METRO_SERIALIZE_MEMBER(s, parallax_height_mul); METRO_SERIALIZE_MEMBER(s, mipmapped); METRO_SERIALIZE_MEMBER(s, reflectivity); METRO_SERIALIZE_MEMBER(s, treat_as_metal); METRO_SERIALIZE_MEMBER_CHOOSE(s, det_name); METRO_SERIALIZE_MEMBER(s, det_scale_u); METRO_SERIALIZE_MEMBER(s, det_scale_v); METRO_SERIALIZE_MEMBER(s, det_intensity); METRO_SERIALIZE_MEMBER(s, aux_params); METRO_SERIALIZE_MEMBER(s, aux_params_1); // !!! Optional fields !!! if (this->texture_type == scast<uint8_t>(TextureType::Cubemap_hdr)) { METRO_SERIALIZE_ARRAY_MEMBER(s, sph_coefs); } else if (this->texture_type == scast<uint8_t>(TextureType::Unknown_has_lum)) { METRO_SERIALIZE_ARRAY_MEMBER(s, lum); } /////////////////////////// METRO_SERIALIZE_MEMBER_CHOOSE(s, bump_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux0_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux1_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux2_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux3_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux4_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux5_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux6_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux7_name); } но я смог найти только исходники версии, где не было конвертера конфига оружия. UPD: нашел ещё файл с текстурами texture_aliases.bin Сообщение отредактировал Rolan96 - 29.05.2021, 16:21 |
 
|
|
29.05.2021, 19:33
Сообщение
#693
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
JackieR, Я так понял, что список текстур с параметрами хранится в textures_handles_storage.bin или где-то ещё? Он нормально перегоняется в json конвертором для оружия из МетроЕх json" Код "ui\\ui_me_save_load_icon512": { "type": 0, "upgrade_id": 14453, "base_handle": "stringz", "data": { "shared_weapon_params": "", "priority": 0, "ui_tag_lib": 0, "tags": [], "excl_tags": [], "dep_tags": [], "autoinst_tags": [], "is_installed": false, "editor_name": "", "attach_hud_loc": "", "attach_offset": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "attach_to_root": false, "visual": "", "for_dlc2_only": false, "anim_track_prefix": "", "anim_track_suffix": "" } Были бы сорцы метроех можно было бы переписать это часть кода и разбирать файл в текстурами, тем более что вся инфа по этому файлу же есть в томже метроех: bin" Код void MetroTextureInfo::Serialize(MetroReflectionStream& s) { METRO_SERIALIZE_MEMBER(s, type); METRO_SERIALIZE_MEMBER(s, texture_type); METRO_SERIALIZE_MEMBER(s, source_name); METRO_SERIALIZE_MEMBER(s, surf_xform); METRO_SERIALIZE_MEMBER(s, format); METRO_SERIALIZE_MEMBER(s, width); METRO_SERIALIZE_MEMBER(s, height); METRO_SERIALIZE_MEMBER(s, animated); METRO_SERIALIZE_MEMBER(s, draft); METRO_SERIALIZE_MEMBER(s, override_avg_color); METRO_SERIALIZE_MEMBER(s, avg_color); METRO_SERIALIZE_MEMBER_CHOOSE(s, shader_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, gamemtl_name); METRO_SERIALIZE_MEMBER(s, priority); METRO_SERIALIZE_MEMBER(s, streamable); METRO_SERIALIZE_MEMBER(s, bump_height); METRO_SERIALIZE_MEMBER(s, displ_type); METRO_SERIALIZE_MEMBER(s, displ_height); METRO_SERIALIZE_MEMBER(s, parallax_height_mul); METRO_SERIALIZE_MEMBER(s, mipmapped); METRO_SERIALIZE_MEMBER(s, reflectivity); METRO_SERIALIZE_MEMBER(s, treat_as_metal); METRO_SERIALIZE_MEMBER_CHOOSE(s, det_name); METRO_SERIALIZE_MEMBER(s, det_scale_u); METRO_SERIALIZE_MEMBER(s, det_scale_v); METRO_SERIALIZE_MEMBER(s, det_intensity); METRO_SERIALIZE_MEMBER(s, aux_params); METRO_SERIALIZE_MEMBER(s, aux_params_1); // !!! Optional fields !!! if (this->texture_type == scast<uint8_t>(TextureType::Cubemap_hdr)) { METRO_SERIALIZE_ARRAY_MEMBER(s, sph_coefs); } else if (this->texture_type == scast<uint8_t>(TextureType::Unknown_has_lum)) { METRO_SERIALIZE_ARRAY_MEMBER(s, lum); } /////////////////////////// METRO_SERIALIZE_MEMBER_CHOOSE(s, bump_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux0_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux1_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux2_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux3_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux4_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux5_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux6_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux7_name); } но я смог найти только исходники версии, где не было конвертера конфига оружия. UPD: нашел ещё файл с текстурами texture_aliases.bin Отправил в лс исходники за 18 апреля 2019 |
 
|
|
29.05.2021, 19:53
Сообщение
#694
|
|
Продвинутый геймер Репутация: 48 Группа: Участник Сообщений: 275 Награды: 3 Регистрация: 30.11.2010 |
JackieR, Я так понял, что список текстур с параметрами хранится в textures_handles_storage.bin или где-то ещё? Он нормально перегоняется в json конвертором для оружия из МетроЕх json" Код "ui\\ui_me_save_load_icon512": { "type": 0, "upgrade_id": 14453, "base_handle": "stringz", "data": { "shared_weapon_params": "", "priority": 0, "ui_tag_lib": 0, "tags": [], "excl_tags": [], "dep_tags": [], "autoinst_tags": [], "is_installed": false, "editor_name": "", "attach_hud_loc": "", "attach_offset": [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], "attach_to_root": false, "visual": "", "for_dlc2_only": false, "anim_track_prefix": "", "anim_track_suffix": "" } Были бы сорцы метроех можно было бы переписать это часть кода и разбирать файл в текстурами, тем более что вся инфа по этому файлу же есть в томже метроех: bin" Код void MetroTextureInfo::Serialize(MetroReflectionStream& s) { METRO_SERIALIZE_MEMBER(s, type); METRO_SERIALIZE_MEMBER(s, texture_type); METRO_SERIALIZE_MEMBER(s, source_name); METRO_SERIALIZE_MEMBER(s, surf_xform); METRO_SERIALIZE_MEMBER(s, format); METRO_SERIALIZE_MEMBER(s, width); METRO_SERIALIZE_MEMBER(s, height); METRO_SERIALIZE_MEMBER(s, animated); METRO_SERIALIZE_MEMBER(s, draft); METRO_SERIALIZE_MEMBER(s, override_avg_color); METRO_SERIALIZE_MEMBER(s, avg_color); METRO_SERIALIZE_MEMBER_CHOOSE(s, shader_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, gamemtl_name); METRO_SERIALIZE_MEMBER(s, priority); METRO_SERIALIZE_MEMBER(s, streamable); METRO_SERIALIZE_MEMBER(s, bump_height); METRO_SERIALIZE_MEMBER(s, displ_type); METRO_SERIALIZE_MEMBER(s, displ_height); METRO_SERIALIZE_MEMBER(s, parallax_height_mul); METRO_SERIALIZE_MEMBER(s, mipmapped); METRO_SERIALIZE_MEMBER(s, reflectivity); METRO_SERIALIZE_MEMBER(s, treat_as_metal); METRO_SERIALIZE_MEMBER_CHOOSE(s, det_name); METRO_SERIALIZE_MEMBER(s, det_scale_u); METRO_SERIALIZE_MEMBER(s, det_scale_v); METRO_SERIALIZE_MEMBER(s, det_intensity); METRO_SERIALIZE_MEMBER(s, aux_params); METRO_SERIALIZE_MEMBER(s, aux_params_1); // !!! Optional fields !!! if (this->texture_type == scast<uint8_t>(TextureType::Cubemap_hdr)) { METRO_SERIALIZE_ARRAY_MEMBER(s, sph_coefs); } else if (this->texture_type == scast<uint8_t>(TextureType::Unknown_has_lum)) { METRO_SERIALIZE_ARRAY_MEMBER(s, lum); } /////////////////////////// METRO_SERIALIZE_MEMBER_CHOOSE(s, bump_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux0_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux1_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux2_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux3_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux4_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux5_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux6_name); METRO_SERIALIZE_MEMBER_CHOOSE(s, aux7_name); } но я смог найти только исходники версии, где не было конвертера конфига оружия. UPD: нашел ещё файл с текстурами texture_aliases.bin Отправил в лс исходники за 18 апреля 2019 У меня вроде свежее исходники, но этой фишки нет. Редактирование оружия появилось вроде как 2020 году. Пост iOrange В любом случае спасибо, посмотрю. |
 
|
|
30.05.2021, 12:57
Сообщение
#695
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
И да, есть-ли включение консоли под оригинальное метро? Как включить консоль в оригинальном метро 2033 Код #define _CRT_SECURE_NO_WARNINGS 1 // MSVS dno #include <windows.h> #include <string.h> #include <stdio.h> void (*real_clevel_r_on_key_press)(void *_this, int key, int arg2, int arg3); void **g_console; void (*uconsole_server_impl_show)(void *_this); extern "C" void replace_clevel_r_on_key_press(int key, int arg2, int arg3); __asm( ".text\n" ".global _replace_clevel_r_on_key_press\n" "_replace_clevel_r_on_key_press:\n" "movl 4(%esp), %eax;\n" "cmpl $0x27, %eax;\n" "jne not_console;\n" "pushl %ecx;\n" "movl (_g_console), %ecx;\n" "movl (%ecx), %ecx;\n" "movl (_uconsole_server_impl_show), %eax;\n" "call *%eax;\n" "popl %ecx;\n" "not_console:\n" "jmp *(_real_clevel_r_on_key_press);\n" ); LPVOID SetHookEx(LPVOID address, LPVOID detour, int preserve) { #if defined(_M_IX86) #pragma pack(push,1) struct JMP { UINT8 mov_eax; UINT32 address; UINT16 jmp_eax; }; #pragma pack(pop) struct JMP jmp = { 0xB8, 0x00000000, 0xE0FF }; CONST INT length = sizeof(struct JMP); DWORD oldProtection; char *code; code = (char*)LocalAlloc(LMEM_FIXED, preserve + length); memcpy(code, address, preserve); jmp.address = (UINT32)address + preserve; memcpy(code + preserve, &jmp, length); if(VirtualProtect(code, preserve + length, PAGE_EXECUTE_READWRITE, &oldProtection) != TRUE) { free(code); return NULL; } if(VirtualProtect(address, length, PAGE_EXECUTE_READWRITE, &oldProtection) != TRUE) return NULL; jmp.address = (UINT32)detour; memcpy(address, &jmp, length); VirtualProtect(address, length, oldProtection, &oldProtection); return code; #elif defined(_M_AMD64) #pragma pack(push,1) struct JMP { UINT16 mov_rax; UINT64 address; UINT16 jmp_rax; }; #pragma pack(pop) struct JMP jmp = { 0xB848, 0x0000000000000000ull, 0xE0FF }; CONST INT length = sizeof(struct JMP); DWORD oldProtection; char *code; code = (char*)LocalAlloc(LMEM_FIXED, preserve + length); memcpy(code, address, preserve); jmp.address = (UINT64)address + preserve; memcpy(code + preserve, &jmp, length); if(VirtualProtect(code, preserve + length, PAGE_EXECUTE_READWRITE, &oldProtection) != TRUE) { free(code); return NULL; } if (VirtualProtect(address, length, PAGE_EXECUTE_READWRITE, &oldProtection) != TRUE) return NULL; jmp.address = (UINT64)detour; memcpy(address, &jmp, length); VirtualProtect(address, length, oldProtection, &oldProtection); return code; #else #error Unknown processor acrhitecture #endif } // typedef HRESULT (WINAPI * LPFNDIRECTINPUT8CREATEPROC)(HINSTANCE, DWORD, REFIID, LPVOID, LPUNKNOWN); HMODULE real_dinput8; LPFNDIRECTINPUT8CREATEPROC real_DirectInput8Create; #pragma comment(linker, "/export:DirectInput8Create@20=DirectInput8Create") extern "C" __declspec(dllexport) HRESULT WINAPI DirectInput8Create(HINSTANCE hinst, DWORD dwversion, REFIID riidltf, LPVOID lpvout, LPUNKNOWN punkouter) { if(!real_dinput8) { char path[512]; GetSystemDirectory(path, sizeof(path)); strcat(path, "\\dinput8.dll"); real_dinput8 = LoadLibrary(path); real_DirectInput8Create = (LPFNDIRECTINPUT8CREATEPROC)GetProcAddress(real_dinput8, "DirectInput8Create"); } { HMODULE hMetro2033 = GetModuleHandle("metro2033.exe"); if(hMetro2033) { g_console = (void**)(LPBYTE(hMetro2033) + 0x00611214); LPVOID p0 = LPBYTE(hMetro2033) + 0x00444650; // uconsole::server_impl::show memcpy(&uconsole_server_impl_show, &p0, sizeof(void*)); LPVOID p1 = LPBYTE(hMetro2033) + 0x002DB2F0; // clevel_r_on_key_press LPVOID code = SetHookEx(p1, LPVOID(replace_clevel_r_on_key_press), 12); memcpy(&real_clevel_r_on_key_press, &code, sizeof(void*)); } } return real_DirectInput8Create(hinst, dwversion, riidltf, lpvout, punkouter); } BOOL DllMain(HINSTANCE hInstDLL, DWORD reason, LPVOID reserved) { if(reason == DLL_PROCESS_ATTACH) { } return TRUE; } Для той же версии для которой я делал сохранение nav_map. Из за замутов с соглашениями о вызовах на 32-бит архитектуре пришлось написать на асме врезку, вместо красивенькой сишной функции. А так как я в этот раз применил компилятор GCC синтаксис ассемблера тут AT&T, надеюсь это не пугает. Кстати для ласт лайта 2013 точно так же эта правка делается, только смещения другие. Консолька в 2033 немного не так выглядит как в ласт лайте или редаксе Но в ней хотя-бы есть интересная команда fly (аналог demo_record). В LL&Redux этой команды уже нет. Команда refly (аналог demo_play) не работает Сообщение отредактировал Modera - 30.05.2021, 12:59 |
 
|
|
30.05.2021, 13:17
Сообщение
#696
|
|
Опытный Игрок Репутация: 3 Группа: Участник Сообщений: 67 Регистрация: 06.02.2016 |
И да, есть-ли включение консоли под оригинальное метро? Как включить консоль в оригинальном метро 2033 Код #define _CRT_SECURE_NO_WARNINGS 1 // MSVS dno #include <windows.h> #include <string.h> #include <stdio.h> void (*real_clevel_r_on_key_press)(void *_this, int key, int arg2, int arg3); void **g_console; void (*uconsole_server_impl_show)(void *_this); extern "C" void replace_clevel_r_on_key_press(int key, int arg2, int arg3); __asm( ".text\n" ".global _replace_clevel_r_on_key_press\n" "_replace_clevel_r_on_key_press:\n" "movl 4(%esp), %eax;\n" "cmpl $0x27, %eax;\n" "jne not_console;\n" "pushl %ecx;\n" "movl (_g_console), %ecx;\n" "movl (%ecx), %ecx;\n" "movl (_uconsole_server_impl_show), %eax;\n" "call *%eax;\n" "popl %ecx;\n" "not_console:\n" "jmp *(_real_clevel_r_on_key_press);\n" ); LPVOID SetHookEx(LPVOID address, LPVOID detour, int preserve) { #if defined(_M_IX86) #pragma pack(push,1) struct JMP { UINT8 mov_eax; UINT32 address; UINT16 jmp_eax; }; #pragma pack(pop) struct JMP jmp = { 0xB8, 0x00000000, 0xE0FF }; CONST INT length = sizeof(struct JMP); DWORD oldProtection; char *code; code = (char*)LocalAlloc(LMEM_FIXED, preserve + length); memcpy(code, address, preserve); jmp.address = (UINT32)address + preserve; memcpy(code + preserve, &jmp, length); if(VirtualProtect(code, preserve + length, PAGE_EXECUTE_READWRITE, &oldProtection) != TRUE) { free(code); return NULL; } if(VirtualProtect(address, length, PAGE_EXECUTE_READWRITE, &oldProtection) != TRUE) return NULL; jmp.address = (UINT32)detour; memcpy(address, &jmp, length); VirtualProtect(address, length, oldProtection, &oldProtection); return code; #elif defined(_M_AMD64) #pragma pack(push,1) struct JMP { UINT16 mov_rax; UINT64 address; UINT16 jmp_rax; }; #pragma pack(pop) struct JMP jmp = { 0xB848, 0x0000000000000000ull, 0xE0FF }; CONST INT length = sizeof(struct JMP); DWORD oldProtection; char *code; code = (char*)LocalAlloc(LMEM_FIXED, preserve + length); memcpy(code, address, preserve); jmp.address = (UINT64)address + preserve; memcpy(code + preserve, &jmp, length); if(VirtualProtect(code, preserve + length, PAGE_EXECUTE_READWRITE, &oldProtection) != TRUE) { free(code); return NULL; } if (VirtualProtect(address, length, PAGE_EXECUTE_READWRITE, &oldProtection) != TRUE) return NULL; jmp.address = (UINT64)detour; memcpy(address, &jmp, length); VirtualProtect(address, length, oldProtection, &oldProtection); return code; #else #error Unknown processor acrhitecture #endif } // typedef HRESULT (WINAPI * LPFNDIRECTINPUT8CREATEPROC)(HINSTANCE, DWORD, REFIID, LPVOID, LPUNKNOWN); HMODULE real_dinput8; LPFNDIRECTINPUT8CREATEPROC real_DirectInput8Create; #pragma comment(linker, "/export:DirectInput8Create@20=DirectInput8Create") extern "C" __declspec(dllexport) HRESULT WINAPI DirectInput8Create(HINSTANCE hinst, DWORD dwversion, REFIID riidltf, LPVOID lpvout, LPUNKNOWN punkouter) { if(!real_dinput8) { char path[512]; GetSystemDirectory(path, sizeof(path)); strcat(path, "\\dinput8.dll"); real_dinput8 = LoadLibrary(path); real_DirectInput8Create = (LPFNDIRECTINPUT8CREATEPROC)GetProcAddress(real_dinput8, "DirectInput8Create"); } { HMODULE hMetro2033 = GetModuleHandle("metro2033.exe"); if(hMetro2033) { g_console = (void**)(LPBYTE(hMetro2033) + 0x00611214); LPVOID p0 = LPBYTE(hMetro2033) + 0x00444650; // uconsole::server_impl::show memcpy(&uconsole_server_impl_show, &p0, sizeof(void*)); LPVOID p1 = LPBYTE(hMetro2033) + 0x002DB2F0; // clevel_r_on_key_press LPVOID code = SetHookEx(p1, LPVOID(replace_clevel_r_on_key_press), 12); memcpy(&real_clevel_r_on_key_press, &code, sizeof(void*)); } } return real_DirectInput8Create(hinst, dwversion, riidltf, lpvout, punkouter); } BOOL DllMain(HINSTANCE hInstDLL, DWORD reason, LPVOID reserved) { if(reason == DLL_PROCESS_ATTACH) { } return TRUE; } Для той же версии для которой я делал сохранение nav_map. Из за замутов с соглашениями о вызовах на 32-бит архитектуре пришлось написать на асме врезку, вместо красивенькой сишной функции. А так как я в этот раз применил компилятор GCC синтаксис ассемблера тут AT&T, надеюсь это не пугает. Кстати для ласт лайта 2013 точно так же эта правка делается, только смещения другие. Консолька в 2033 немного не так выглядит как в ласт лайте или редаксе Но в ней хотя-бы есть интересная команда fly (аналог demo_record). В LL&Redux этой команды уже нет. Команда refly (аналог demo_play) не работает Спс, перенесу в утилиту. Пытался сделать консоль, аналогично redux версии, но тоже упёрся в соглашения о вызове, с которым я не разобрался, т.к. асм совсем чуть-чуть понимаю. А по поводу того, как она выглядит, то там просто текстура отличается. Лежит где-то в ресурсах. Хотя вижу, ещё шрифт отличается. Сообщение отредактировал TheStalkerNest - 30.05.2021, 13:18 |
 
|
|
30.05.2021, 15:35
Сообщение
#697
|
|
Продвинутый геймер Репутация: 9 Группа: Участник Сообщений: 201 Регистрация: 22.02.2020 |
Не экспортируются .mesh, а .model экспортируются. Так задумано или не допилили?
|
 
|
|
30.05.2021, 15:53
Сообщение
#698
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
Просто нет потребности в таком функционале.
|
 
|
|
30.05.2021, 15:58
Сообщение
#699
|
|
Продвинутый геймер Репутация: 9 Группа: Участник Сообщений: 201 Регистрация: 22.02.2020 |
|
 
|
|
30.05.2021, 16:03
Сообщение
#700
|
|
разраб одиночка Репутация: 2132 Группа: Модератор Сообщений: 3413 Награды: 13 Регистрация: 06.05.2004 |
Просто нет потребности в таком функционале. Хотел поинтересоваться, насколько вообще СДК функционален по части настройки ИИ на данный момент? Мобов спавнить можно без проблем? Для каких версий метра? Как там в нём по части "плиток" и логики у нпс? Или всё в зачаточном состоянии. Вижу утилиту от TheStalkerNest для генерации навмеша, оно имплементировано в сдк уже?-------------------- |
 
|
|
30.05.2021, 16:40
Сообщение
#701
|
|
. Репутация: 750 Куратор темы Сообщений: 7072 Регистрация: 30.07.2010 |
Лохотрон, с АИ всё не очень хорошо, по пунктам:
1. Спаунить мобов/неписей на оригинальных картах можно в 2033, Last Light, Redux. 2. На полностью новых картах АИ можно создавать только в оригинальной 2033 версии, и то с оговорками 3. Совершенно не изучены укрытия (AI Cover), на новых картах без них не работают некоторые фишки, типа боя НПС с перемещением, и некоторые монстры 4. Блоки визуалскрипта далеко не все описаны для 2033 (54 из 221), для LL и Redux не описано вообще ничего. 5. Создавать навмеш для 2033 можно уже очень давно, просто раньше это работало только на одной конкретной версии игры |
 
|
|
Текстовая версия | Сейчас: 19.04.2024, 19:51 |