Активность
- Сегодня
-
Я наверное неправильно выразился и вы не так поняли. А. Если этот синдром наблюдается только в русской версии от 1с, то решение сейчас лежит у меня в файлах в пк. Б. Если это проблема обеих версий, то решение лежит в morrowind.exe, который надо дизассемблить и искать байты памяти в которых задаются координаты, что явно дольше будет. В text.dll и фикса бездоспешного боя не должно было быть и других фиксов, потому что это TEXT dll изначально был (насколько я понимаю) для простого перевода x) Решение № 1: Double - самое сложное техническое решение, вы предлагаете вручную в 32 битный оригинальный движок внести 64 бита, что требует глубокой переработки. Решение № 2: Смещение координатной системы: вместо 0.0 использовать локальные координаты относительно региона, которые будут идти к какому то одному "центральному региону" Решение №3: самое глупое привязать центр мира к игроку. И получится как в том кошмаре, когда вы бежите и не занимаетесь с места одновременно, потому что здания как-то-привязаны к координатам (хотя почему тогда они не трясутся, а только НПС и тарелки/ложки) Я не модостроитель, я не знаю как влияют координаты на моддинг и как Tes construction set с ними воздействует. На данный момент я могу просто строить гипотизы, пока четко не увижу код-цифры
-
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.