Активность
- Последний час
-
ywunyx присоединился к сообществу
- Сегодня
-
Не для текущего конечно состояния DLL (он еще сырой), но для задела на будущее. Эта проблема наблюдалась и в английской версии? Или это "особенность" русской локализации? upd Вообще, после изучения console.cpp могу предположить вот что: Где-то в оригинальном движке есть что-то типа: struct Object { float x, y, z; (32-битные float) }; Что это значит? (все еще гипотеза): 1. Float (32-bit) имеет ограниченную точность ~6-7 знаков 2. При больших координатах (в тысячах единиц) младшие биты по просту теряются 3. Округление происходит "скачками" → объекты "дрожат"
-
routerbitmalls присоединился к сообществу
-
Итак, быстренько перед работой проанализировав Console.cpp (заметка: надо бы вообще полную ревизию .cpp файлов всего text.dll сделать на предмет уязвимостей и сделать их "современными"), я выявил несколько потенциальных проблем: Проблемное место №1: sprintf без ограничения. КОМБО sprintf(buf, "%s", raw)+char buf[1024]; вот как раз таки если raw будет длиннее 1024 символов — будет переполнение буфера!!! (как вариант заменить на char buf[1024] strncpy(buf, raw, sizeof(buf) - 1) buf[sizeof(buf) - 1] = '\0' (гарантирует нуль-терминацию, но надо смотреть). Потенциальная проблема №2: _vsnprintf с магическим числом. (в этом случае немного ЛУЧШЕ, но не идеально, надо думать). _vsnprintf(tmp, 1024, format, argptr)+char tmp[1024] _vsnprintf ограничивает вывод, но если строка слишком длинная, она может быть обрезана. (как вариант заменить char tmp[1024]; _vsnprintf(tmp, sizeof(tmp), format, argptr) tmp[sizeof(tmp) - 1] = '\0' (гарантирует нуль-терминацию, но надо смотреть) Потенциальная проблема №3: Работа с указателями: В функции GameCommandLineDump идёт опасное приведение типа: Сon_Printf( "%8.8X: %s", adress, ( char * ) adress ). Что это значит? Берется произвольный адрес памяти и трактуется как строка и если в этом участке памяти нет нуль-терминатора, то всё пиши прощай, привет "segfault". Вобщем тоже надо думать. Возможно что-то ещё. Выводы из быстрого анализа: buf имеет размер 1024 байта sprintf копирует ВСЮ строку raw в buf без проверки длины Если raw длиннее 1023 символов + нуль-терминатор - BUFFER OVERRUN! Почему это вызывает проблему с Tamriel Rebuilt, либо сложными скриптами, они: Переполняют buf[1024] в GameCommandLine Вызывают buffer overrun Ломают стек вызовов Приводят к Runtime Error Что я буду делать? Как уже описал выше - (сначала поищу есть ли лучшие решения) потом исправлю эти строки, А ТАК ЖЕ, подумаю на сколько можно увеличить буфер....если взять примеры скриптов Пирата (if-if-if-if-if....и так далее if через каждую строчку x15), то в тестовом режиме можно увеличить буфер до 2-4кб вместо 1 КБ который установил давным давно Angel Death. Я всё ещё нге знаю память игры и эксперименты с этим могут повлечь самые разные последствия. Если всё будет гладко, то ещё увеличу буфер до 8КБ (чтобы на века). Вот такой анализ, и чем я буду заниматься дальше, но это уже будет после того как вернусь с работы, всем хорошего дня! 😃
-
Небольшие подвижки для апгрейда моей версии 3.00 до эталонной 3.01: 1. Провел небольшой анализ и дизассемблинг, я нашёл функцию FixLevelUpMessages из версии text.dll GFM 5.7 if (DAT_1002a074 == 3) скорее всего проверяет версию исполняемого файла Патчит память по адресам 0x5d9281 - 0x5d92a6 с помощью FUN_10008460 Использует функцию FUN_10008460 для записи байтов в память Адреса 0x5d9281-0x5d928a: записывает байты [0xb8, 0x38, 0x0e, 0x7a, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90] Адреса 0x5d929d-0x5d92a6: записывает байты [0xb8, 0x7c, 0x35, 0x79, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90] Далее следует Функция, которая делает патчинг памяти (вообще простой wrapper): VirtualProtect(param_1,param_3,0x40,&local_4); - снимает защиту памяти (уже есть в text.dll 3.00) _memset(param_1,(uint)param_2,param_3); - записывает байты в память (уже есть в text.dll 3.00) VirtualProtect(param_1,param_3,local_4,&local_4); - восстанавливает защиту (уже есть в text.dll 3.00) Исходя из анализа я сделал вывод, что — эта функция не что иное, как функция FillBytes, из файла HelperFunctions.cpp 2. Приступил к реализации: - создал в папке "\morr_text_dll-master\src" новенький файл levelup_fix.cpp следующего содержания (отдал дань уважения Angel Death): 3. В файле morr_text_dll.cpp в функции Initialize, добавил после других Init...() функций: 4. В файле stafx.h объявил о функции: 4. В CmakeLists.txt добавил наш новенький патч табличек: 5. Компиляция прошла без ошибок!!! Файл "потолстел" на 1кб: 6. Запуск показал, что текст при повышении уровня в наличии. УРА! п.с. прикладываю "шакального качества" ролик для ирллайф подтверждения. ФАЙЛЫ В ШАПКЕ ТЕМЫ И НА СТРАНИЦЕ ЗАГРУЗКИ TEXT.DLL ПОКА НЕ МЕНЯЛ — НУЖНЫ ТЕСТЫ! (я записывал данный ролик на оригинальной игре МТВ БЕЗ МСР И МГЕ) text.dll 3.00 to 3.01.mov angel.ini text.dll
- Вчера
-
Ну это не настолько большая проблема, и сейчас в MWSE модах встречаются функции при настройке которых требуется перезапустить игру. Что бы изменить настройки вручную редактированием angel.ini, в любом случае придется игру закрыть и редактировать файл, а тут просто потыкал в меню и перезапустил. Даже в таком виде большинству будет удобнее чем ковырять какие то файлы. Если сможете сделать нативную поддержку lua то круто, если нет то костыль mwse вполне не плох. Ну вот у меня на MWSУ вот так получилось. При изменении параметров записывает новые значения в angel.ini и требует перезапуск. При открытии считывает существующие параметры, и если у пользователя стоит text.dll более младшей версии то отсутствующие настройки просто не показываются.
-
По поводу дрожания... Координаты объектов в экстерьере задаются глобальными. При прорисовке, за счет округления больших чисел происходит скачкообразное изменение (за счет ограничения количества действующих знаков), а следовательно и дрожь предметов. Я пробовал перенести свой остров далеко за карту. У меня там предметы на столе тряслись как в лихорадке при ходьбе.
-
Да, проблема в том, что НА ДАННЫЙ момент angel ини читается игрой только 1 раз - при запуске. Чем может обернуться постоянное обращение morrowind.exe к angel.ini - я не знаю, но гипотетически даже можно сделать полноценное меню и встроить его в меню игры, как это сделано в реализации mcm меню mwse. Отдельное меню Angel, в котором будет не только "горячая клавиша смены языка" но и другие параметры(с описанием), которые можно менять. Эти параметры сможет менять любой пользователь, даже не сведущий во всем этом "моддинге и патчинге"
-
так Бевезде оно видимо не мешает, это игроки собаки такие пилют тут всякие материки на 20 летнюю игру и жалуются :))) ну лично я тоже нейросетями пользуюсь, очень помогает. ну раскладку ваш text.dll будет переключать, а вот меню настройки клавиши, которое спросит у игрока нажмите желаемую клавишу, а потом запишет ее сканкод в angel.ini вполне можно сделать, собственно у меня уже есть рабочий вариант. Конечно новое значенеи только после перезапуска заработает. Я изначально хотел сделать проверку и переключение top\cel\rmk для плагинов, а то до сих пор попадаются игроки у которых оно в 0 стоит и они спрашивают почему локации в моде не переведены и топики не работают. А тут как раз вы загрузили свою версию, ну я и выбор клавиши прикрутил. Хотя конечно если вы это потом напрямую сделаете, то да mwse будет костылем
-
trevorphilips1 присоединился к сообществу
-
aoygyyd присоединился к сообществу
-
1. Ну тем не менее, даже тестер важен для любого проекта =) 2. После внесения исправления по "сообщениям при поднятии уровня" и "переполнения буфера", я как раз таки и возьмусь за то, что буду смотреть КАК именно MCP взаимодействует с text.dll, меняет ли он в нем что-то вообще (просто вносить правки в уже скомпилированный dll файл - занятие такое, неизвестно к чему может привести. А шлюз я хочу добавить как раз для того, чтобы отладка и разработка шла легче. Чтобы каждый раз не вписывать "экспериментальный код в здоровое тело text.DLL". Добавил модуль, ввел логирование - смотришь что получается. Медленно но верно.) 3. Вы меня не поняли. Разница между mwse и text.dll большая. Попробуйте написать мод.lua, который будет переключать русскую раскладку в игре =), я вам больше скажу, он даже будет вам выдавать сообщения и писать, что он работает, он меняет раскладку, но по факту раскладка меняться не будет. Приоритет доступа text.dll к памяти игры можно разобрать в сравнении, что у игры 2 сердца. Одно morrowind.exe, а второе text.dll. одно слушает другое. В этом и прелесть русской локализации. А вот mwse это грубо говоря "Lua- construction-set, который загружается уже после того, как загрузились morrowind.exe и text.DLL, подгружая свои плагины-модули =).) Также я тоже внесу ясность: мой text.dll будет не "врагом", но "исследователем", он не будет диктовать другим разработчикам по каким правилам жить и творить. Представьте что у вас есть папка, допустим от morrowind\text._DLL\lua\. В которую вы закинули свой lua мод по "смене раскладки" и он заработал так, как вы задумали =), не зависимо от версии mwse, потому что text_DLL обучен последней версии Lua, он знает как старые команды, так и новые." И, как вы уже сказали - text.dll в английской версии нет, потому я хочу внести полную совместимость с mwse как прямую, так и обратную..... А потом Morrowind.exe через text.dll спросит Вас в недалеком будущем "хм, господин пират, а не хотите ли вы скинуть мне какой-нибудь игровой скрипт по поведению НПС в формате . json? Я и их научился читать! А вам не надоело постоянно переключать кодировку с UTF-8 на cp1251? Пишите мне скрипты сразу в UTF-8, я и её читать научился! И так далее." Про "дрожание" нпс еще совсем рано рассуждать, для начала надо сделать ядро text.dll.
-
ynuksaa присоединился к сообществу
-
Что бы внести ясность я не из команды Тамриэль Ребилда, даже не переводчик, всего лишь бэта тестер перевода. так в MCP уже же есть исправления для text.dll, значит способ у них был, в любом случае МСP в первую очередь патчит exe, я так понимаю только русские исправления и заносятся в text.dll. Может быть им кто то предоставил правки и сказал куда вставить, ничего не знаю про то как в MCP появились правки для text.dll. И надо ли им оно сейчас. Общие правки они и так делают в exe. Если вдруг возникнут новые чисто русской локализации то проще вам их самим исправить чем вразумлять авторов MCP что и куда надо добавить. Ни к чему не призываю и и не убеждаю чисто мое мнение. Ну я бы не сказал что MWSE прям уж костыль. Так то и text.dll можно считать костылем, с помощью которого воткнули поддержку русского языка. Вот на новом движке OpenMW сделали свою реализацию lua, только путаница вышла из за отсутствия совместимости, извечный выбор какие моды нужнее, тот движок и использовать и т.д. И вечные вопросы в комментах а работает ли мод A на движке Х. Нужно ли делать еще 3 вариант Lua для Морровинда, пойдет ли это на пользу? И потом если вы lua через text.dll прикрутите, в английской версии этого файла нет, а в РФ полтора землекопа lua моды делают. Останется ли совместимость с MWSE не будет ли конфликтов? Все таки подавляющее большинство сделано на английской версии игры, нужно на это ориентироваться. Тоже чисто мое мнение, может вы какой прорыв совершите, просто лично я не вижу пока необходимости замены MWSE. PS Да кстати подкину еще одну мыслю. В оригинальном движке есть проблема, при отдалении от центра мира НПС начинают "дрожать" В Анвиле очень хорошо заметно.
-
Но в любом случае, сначала я доведу версию "моего" text.dll до эталонной 3.01, потом возможно ее чуточку модифицирую (фикс перегрузки для ребят с Тамриэль Ребилда), а потом уж сделаю а-ля шлюз, установлю зависимости доп библиотек, чтобы основной text.dll вливал в память игры помимо себя и соседние файлы (что является идеальным началом для тотального расширения инструментария text.dll) Как я вижу будущее: По поводу совместимости с mcp я принял решение оставить его "отдельным", не тащить оттуда все подряд и делать из чистого text.dll непонятную "цифровую химеру". Но добавить возможность авторам MCP добавлять свои модули через text.dll путем того же шлюза. По поводу lua: предстоит огромное количество работы, технически( пока в большей степени гипотетически) возможно убрать костыль mwse и научить Морровинд напрямую читать Lua файлы. По поводу кодировки - спорный момент, но я попытаюсь научить Морровинд читать и кодировку UTF-8, оставив при этом в нем знание родной кодировки cp1251. Идей очень много на самом деле. а за ссылки огромное спасибо!
-
Спасибо за прояснение! Теперь путаницав версиях text.dll окончательно исчезла ! Ваша команда проделала огромную работу! И я постараюсь, чтобы этот text.dll стал достойной базой для будущих творчеств мододелов и плагиностроителей ! Единственная полностью отличная версия - та о которой сказал Siberian Crab, та что весит 23 КБ (интересно что там)
-
MikhailTrick присоединился к сообществу
-
GFM, text.dll и MCP - это совершенно разные вещи. Ни я ни Fritz не имеем ни какого отношения к изменениям в text.dll и MCP. В свою очередь группа Angel и разработчики MCP не причастны к GFM. Есть text.dll поставляемой с игрой от 1С, которая может быть обновлена отдельно. Новый text.dll добавлен к GFM за неимением для него отдельного мода. В GFM 5x и 6x используется один и тот же файл, не знаю какой для 5х на FR (мне было запрещено выкладывание модов в базу и на FR выложен GFM не мной). Сами файлы могут отличаться из-за наложенных патчей MCP и 4Gb.
- Последняя неделя
-
Итак, спустя 7-8 часов анализа я готов предоставить следующий отчет исходя из источников темы про GFM на fullrest : исходя из readme и всех txt файлов в версий 5.7, 7.3.4: https://www.fullrest.ru/files/gfm5/files и исходя из readme и всех txt файлов версии 6.3.2 https://community.pcgamingwiki.com/files/file/1261-tes-iii-morrowind-general-fixes-mod/ в версиях 5.7 и 6.3.2 лежат АБСОЛЮТНО ОДИНАКОВЫЕ text.dll версии 3.01: с одной датой компиляции Sep 23 2010; один и тот же копирайт: Copyright (C) 2005; одну и ту же версию Angel, File Version 3.0.0.0 Главное отличие в них (text.dll+angel.ini) — до смешного простое, которое заключается в Angel.ini: в ini от Angel Death значение строки fix_unarmored_bug=1 в ini от Fritz значение строки fix_unarmored_bug=0 (он передал это исправление, судя по readme, полностью во власть Morrowind Code Patch, т.к. тот (со временем становился всё сильнее и обхватывать стал многое) Что это мне даёт? - Освобождение и полное спокойствие, то что моя версия 3.00 отличается от их одинакового dll всего на 0.01 - это фикс сообщений при поднятии уровня FixLevelUpMessages и никаких критических исправлений между ними не было! Ну и в оконцовке своего анализа я бы хотел добавить что я предположил, и, как я понял философии этих двух мастеров-мододелов, исходя из анализа их файлов, структуры их папок, их readme.txt и т.д.: Чтобы понять суть конфликта их философий, нужно понимать, что у этих двух мастеров были совершенно разные цели и подходы к «лечению» игры. Философия Angel Death: Хирург-Пурист (исходя из написанного в ридми) главная цель Angel Death и команды GFM 5.x заключалась в том, чтобы действовать как хирурги: вносить минимальные, но критически важные изменения, не нарушая целостности «тела» игры. Принцип «Чистоты»: Их девизом было «мухи отдельно, котлеты отдельно» о чём прямо указано в txt файле. Это означало строжайшее разделение исправлений (.esp, .dll) от любого нового или изменяющего визуал контента (моделей, текстур). Их мод должен был быть максимально совместимым с любыми другими плагинами. Ключевой Инструмент: Их главным «скальпелем» был text.dll. Они использовали его для исправления глубоких ошибок движка, которые невозможно было исправить обычным плагином, например, баг с бездоспешным боем или отсутствующие сообщения при повышении уровня. Стратегия: Они создавали фундамент, на который другие моддеры могли бы безопасно ставить свои творения. Философия Fritz: Прагматичный Архитектор (исходя из наполнения папок и содержимого txt файлов) Главная цель Fritz была другой. Он хотел создать не просто фундамент, а законченное, идеальное «здание». Он действовал как архитектор-модернист, готовый снести старые перегородки ради лучшей и более стабильной конструкции. Принцип «Всё включено»: Fritz отбросил старую философию. Он включил в свой мод всё, что считал нужным для идеального результата: и исправления кода, и новые модели, текстуры, иконки и звуки. Именно поэтому его версия требует начинать новую игру. Ключевой Инструмент: Его главным «инструментом» был прагматизм. Он понял, что Morrowind Code Patch (MCP) со временем стал лучше справляться с некоторыми задачами, чем старый text.dll. Поэтому он сознательно отключил в своей конфигурации (angel.ini) исправление бага бездоспешного боя (fix_unarmored_bug=0), передав эту задачу более современному инструменту, чтобы избежать конфликтов. Стратегия: Он создавал финальный, ультимативный продукт, который должен был работать «из коробки» как единое целое, пусть и ценой нарушения "принципа совместимости". Мой итог анализа: кто-то увидел в этих номерах 5.7 и 6.3.2 просто цифры, я увидел в этих цифрах и файлах столкновение двух идеологий: Консерватор (Angel Death/GFM 5.x): Считали, что исправления должны быть чистыми, отдельными и максимально ненавязчивыми. Модернист (Fritz/GFM 6.x): Считал, что цель (идеально работающая игра) оправдывает средства (нарушение "принципа совместимости", объединение всего в один пакет, зависимость от новых утилит). На этих словах я отправляюсь спать и думать теперь как: а) добавить этот фикс по всплывающим табличкам "о повышении уровня" б) латать дыру по ошибке переполнения буфера: "Microsoft Visual C++ Runtime Library - Buffer overrun detected" дабы ребята с Tamriel Rebuild могли спокойно и с комфортом продолжать своё творчество.