DEVLOG · АРХИВ
Дневник разработки: август 2026
Что команда MineAge 2 сделала в августе 2026: 51 запись о переносе мира Lineage 2, движке FractureFront и игровом клиенте.
Фонтан Инадрила снова с водой
Что сделали. Вода в фонтане Инадрила снова переливается; рябь и прозрачность движутся отдельно.
Для чего. Фонтан выглядит живым и заметным в городе.
Огни и пламя снова светят
Что сделали. Факелы, огни и подводные светильники теперь добавляют свет поверх фона, а не закрывают его.
Для чего. Игроки видят светильники такими, как они работают в мире.
Листва и решётки стали прозрачными
Что сделали. Прозрачность и вырезание по маске теперь работают для листвы, лиан, цепей и травы. В трёх регионах найдено 114 таких поверхностей.
Для чего. Теперь объекты выглядят как должны и не закрывают сцену сплошными…
Подземелье Аннигиляции: вернулись поверхности
Что сделали. Движок начал отдельно обрабатывать две текстуры у материалов с маской. В кадр вернулись 8 поверхностей, аудит материалов снизился с 69 до 61.
Для чего. Так пропавшие части подземелья снова видны игрокам.
Текстуры старых Gludio моделей
Что сделали. Два входа в подземелье Gludio теперь получают RGBA8 текстуру 512×512 со всеми mip уровнями.
Для чего. Модели выглядят стабильнее и чище в игре.
Плотность материалов теперь считается точнее
Что сделали. Texel density теперь считается по реальным граням, а не по старому material byte. Убрано 8 ложных отказов.
Для чего. Проверка локаций стала точнее и не режет хорошие объекты.
Прозрачность локаций из VertexColor
Что сделали. Прозрачность материалов теперь берётся из ColorStream.A, а AlphaStream с 255 больше её не заменяет.
Для чего. Это делает маску прозрачности точной для локаций.
Отдельная opacity для материалов локаций
Что сделали. Shader.Opacity теперь берёт альфу из отдельной opacity текстуры, а не из diffuse. StaticSceneIndex V4 хранит обе текстуры.
Для чего. Так прозрачность в локациях работает точнее и стабильнее.
Материалы локаций теперь берутся точно
Что сделали. Материалы StaticMesh теперь привязаны по точному UObject ссылочному совпадению; 12 спорных случаев Field Deco убраны.
Для чего. Игроки получают стабильные материалы без подмен.
Первые UV анимации из L2 работают
Что сделали. Первые 4 UE2 материала с UV анимацией теперь работают в static runtime и сохраняют свои параметры.
Для чего. Это делает локации ближе к оригиналу и живее для игроков.
Cruma Tower на настоящем рельефе
Что сделали. Регион 20 21 теперь собирается как единая локация: рельеф, 2040 объектов и collision идут вместе.
Для чего. Игроки видят цельный мир без подмен.
Цельный персонаж игрока
Что сделали. Мужской fighter собран из пяти частей с текстурами клиента. В игре видны стойка, боевая стойка и удар без пропусков.
Для чего. Игроки сразу видят цельного персонажа в бою.
Игрок теперь бьёт в реальном бою
Что сделали. Fighter игрока подключён к сессии и повторяет удар по подтверждённой атаке; PvE сохранил смерть, награду и инвентарь.
Для чего. Бой стал заметно ближе к реальной игре.
Каталог рас и классов для персонажей
Что сделали. Выбор внешности вынесен в каталог архетипов; неизвестная раса или класс больше не подменяется Fighter.
Для чего. Так игра не путает внешность персонажа.
Закрыт хвост текстур региона
Что сделали. Representative регион 20 21 теперь публикует 2040 размещений и 133 модели без пропусков и подмены текстур.
Для чего. Игроки видят статические объекты так, как они заданы в оригинале.
Бой стал понятнее
Что сделали. Появилась панель цели с HP и состоянием, лента награды и счётчик инвентаря; бой показывает 70/70→0/70 и DEFEATED.
Для чего. Так проще читать бой и видеть награду сразу.
Для fighter выбран точный L2 набор
Что сделали. Персонаж fighter теперь связан с 5 исходными частями модели и проверенными анимациями ожидания, стойки и удара.
Для чего. Это убирает заглушки и делает бой понятнее для игрока.
Для PvE закреплён точный персонаж L2
Что сделали. Тренировочная цель теперь берёт свой skeletal mesh, материалы и анимации ожидания и смерти. Без них замены не будет.
Для чего. Игроки видят ровно тот образ, который задан для PvE.
Починили проверочный набор
Что сделали. Проверка теперь сверяет опись с размерами и суммами, а не только список файлов. Все 53 набора проходят.
Для чего. Так проверка ловит реальные расхождения.
PvE цель ожила в игре
Что сделали. Текстурированный wharfinger теперь виден в Luanti: есть idle и точная death поза после поражения.
Для чего. Так цель выглядит понятнее в бою.
AnimationIR читает точные события из UKX
Что сделали. Теперь AnimationIR берёт события прямо из исходного UKX и сверяет их с клипом Wait Hand: 54 кадра, 30 fps, без notify.
Для чего. Это убирает ложные статусы и даёт точные данные для игры.
Golden проверяет реальный UKX
Что сделали. Приёмка AnimationIR теперь меняет реальный байт UKX и проверяет, что клип и notify остаются теми же.
Для чего. Это подтверждает, что игра видит настоящие изменения в пакете.
Декор стал отдельными живыми объектами
Что сделали. В регионе 20 21 три Mover с разными смещениями и collision state теперь остаются отдельными entity; mesh и материалы переиспользуются.
Для чего. Так декор двигается и сталкивается правильно.
Контракт анимаций для Lineage 2
Что сделали. Добавлен первый source backed AnimationIR для NPC хранителя склада: 63 кости, клип Wait Hand на 54 кадра, root motion без серверного движения.
Для чего. Это сохраняет точную анимацию и не ломает перемещение в игре.
Регион держит лимит генерации
Что сделали. Collision теперь работает с уже подготовленным массивом; total p95 в 4 прогонах остался ниже 100 мс.
Для чего. Регион загружается стабильнее без лишней задержки.
Будущие городские сцены получили честную точку отсчёта
Что сделали. Мы выбрали насыщенный реальными объектами регион для тестирования крупных локаций. Это позволит нам получить более точные замеры производительности.
Для чего. Теперь тесты будут отражать нагрузку полноценного мира, что поможет улучшить оптимизацию и сделать игру более стабильной для всех игроков.
Быстрый контур одного объекта
Что сделали. Отладка движкового рендера больше не требует подготовки всего тяжёлого региона: выбранный объект компилируется отдельно вместе с точными материалами и коллизией, не затрагивая моды, террейн и соседние объекты.
Для чего. Цель этой работы в патчноуте пока не указана.
C++ spatial manager для StaticSceneIndexV1
Что сделали. В движке появился payload-free consumer для статического индекса: ресурсы группируются по activation cell, при активации выдаются в стабильном порядке, а неполные и дублирующиеся ссылки отклоняются fail-closed. Startup transport и renderer пока не переключены — это отдельный проверенный gate.
Для чего. Цель этой работы в патчноуте пока не указана.
Чистая проверка объекта с двух сторон
Что сделали. Движковый объект теперь автоматически проверяется сверху и в изометрии в пустой лаборатории — без HUD, руки, террейна и соседних акторов. Оба ракурса воспроизводятся одинаково на чистом и повторном запуске.
Для чего. Цель этой работы в патчноуте пока не указана.
Чистая сборка больше не ломает короткий цикл отладки
Что сделали. После полной очистки движок автоматически восстанавливает готовый отладочный клиент и проверяемый список его файлов. Минимальная сцена снова запускается сразу, без ручной пересборки и влияния устаревшего кэша.
Для чего. Цель этой работы в патчноуте пока не указана.
Движковый объект появился в настоящем ландшафте
Что сделали. Первый выбранный объект загружается напрямую движком в своей исходной позиции среди обычного ландшафта. Чистый кадр подтверждает отсутствие отладочного интерфейса, Lua-дубликатов и тяжёлой загрузки всех объектов региона.
Для чего. Цель этой работы в патчноуте пока не указана.
Движок читает StaticSceneIndexV1
Что сделали. C++ spatial manager теперь напрямую принимает JSON partition статического индекса и до активации проверяет ResourceId, хэши, bounds, материалы, collision linkage и принадлежность объектов своим spatial cells. Несвязный или повреждённый индекс отклоняется целиком без частичной регистрации.
Для чего. Цель этой работы в патчноуте пока не указана.
Единая коллизия WorldManifest
Что сделали. Коллизия и навигация теперь загружаются из той же версии мира, что рельеф и объекты.
Для чего. Мир открывается только после полной готовности всей территории.
Холодная генерация мира стала быстрее
Что сделали. Генератор мира больше не повторяет обработку климата, воды и растительности в подземных вертикальных чанках. Холодная загрузка тестовой сцены ускорилась, а скрытые подземные водяные и почвенные слои устранены без отключения терраформирования.
Для чего. Цель этой работы в патчноуте пока не указана.
Крепостная башня стала настоящей частью игрового пространства
Что сделали. Теперь крепостная башня имеет полноценную физическую модель. Персонажи могут останавливаться на её площадках и конструкциях, а форма здания осталась без изменений.
Для чего. Это улучшение делает взаимодействие с окружением более реалистичным и увлекательным для игроков, добавляя новые тактические возможности.
Перенесённые постройки Крумы впервые увидели в игре — акведук стоит целиком, без единого разрыва
Что сделали. Мы улучшили отображение построек региона Крумы, теперь акведук и осадная башня выглядят целостно и без разрывов.
Для чего. Это важно для стабильности игры и эстетики мира. Теперь игроки могут наслаждаться красивыми и непрерывными постройками без визуальных артефактов.
Первый объект напрямую в движке
Что сделали. Исходная секция стены теперь загружается и рисуется прямым C++-контуром без модового реестра, террейна и соседних объектов. Движок корректно удерживает её на больших мировых координатах при смещении камеры и полностью выгружает после выхода из зоны.
Для чего. Цель этой работы в патчноуте пока не указана.
Починили проверку набора ассетов
Что сделали. Один проверочный набор снова проходит. Теперь он сверяет опись, размеры и контрольные суммы, и все 53 набора зелёные.
Для чего. Это убирает скрытые ошибки в проверках.
Половина построек Крумы не переносилась из-за текстур, которых нигде не видно
Что сделали. Разбирались, почему часть подземелья нельзя загрузить в игру: у зданий якобы не хватало текстур. Оказалось, что многие такие "нехватки" — фикция. В моделях Lineage 2 нередко объявлен материал, которым в итоге не покрашена ни одна грань: слот есть, а поверхности у него нет. Наш конвейер честно отказывался придумывать для него параметры и помечал здание неполным — хотя показывать там нечего и терять нечего. Теперь такой слот отмечается как неиспользуемый: ничего не подставляется, просто фиксируется, что потребителя нет. Доставка построек региона выросла с 1034 до 1537 из 2040. Отдельно стоит сказать про метод: сперва мы решили, что дело в неподдержанном типе блеска, потому что так выглядела первая же попавшаяся диагностика. Пересчитали причины по всем материалам — блеск оказался виноват в трёх случаях из сорока шести. Если бы взялись починять по первому впечатлению, потратили бы время и не сдвинули почти ничего.
Для чего. Цель этой работы в патчноуте пока не указана.
Проверили ограничение, из-за которого не переносятся последние залы — оно защищает не то, что мы думали
Что сделали. После сегодняшних правок не переносятся только 35 построек, и все по одной причине: у них слишком дробная физическая поверхность, а в движке стоит предел на её дробность. Откуда взялось само число, в проекте не записано нигде, поэтому мы не стали его двигать наугад, а проверили. Предположение было такое: чем больше кусочков физики, тем дольше строится кусок мира. Загрузили в мир вчетверо больше таких кусочков, чем сейчас, и замерили время постройки — разницы нет, она тонет в обычном разбросе между запусками. То есть на генерацию мира это ограничение не влияет. Предел мы всё равно не подняли: доказано только то, что он не бережёт генерацию, а не то, что он не нужен вовсе — расход памяти, размер сохранения и стоимость столкновений при беге игрока ещё не мерили. Отдельно стоит сказать, что первый заход этот замер провалил: инструмент незаметно пересобирал данные и обе половины опыта оказались одинаковыми. Ошибку нашли, опыт переделали, и в записях осталось описание ловушки, чтобы на неё не наступили снова.
Для чего. Цель этой работы в патчноуте пока не указана.
Пустая static стадия больше не грузит чанк
Что сделали. Пустая static стадия теперь завершается до копирования чанка. static p95 упал с 13–21 до 3.449 и 3.217 мс.
Для чего. Это ускоряет загрузку региона и снижает лишнюю нагрузку.
Регион переносится целиком: 2040 построек из 2040, ни одного отказа
Что сделали. Утром собиралось три четверти построек региона, теперь собираются все. Последней помехой было ограничение на дробность физической поверхности — число, которое когда-то поставили, но нигде не объяснили. Мы его не стали просто поднимать. Сначала проверили, что оно бережёт: время постройки мира, размер сохранения, служебные файлы — ничего из этого от него не зависит. А потом выяснилось главное: после недавней правки, которая режет геометрию по границам ячеек мира, деталь физически не может выйти за свою ячейку. Значит у её сложности появился естественный потолок, и ограничение теперь не выдумано, а посчитано от размера ячейки — ровно половина от предельно возможного. Самая тяжёлая деталь во всём регионе использует меньше половины этого запаса. Отдельно скажем о том, чего делать не стали: цифру 100% легко нарисовать, отключив проверки. Здесь она получена компиляцией — число кусков геометрии совпало с независимым замером, сделанным до правки, а проверка того, что движок вообще умеет сообщать об ошибках, осталась в тестах отдельным пунктом.
Для чего. Цель этой работы в патчноуте пока не указана.
Runtime не примет подменённый слой террейна
Что сделали. Проверка terrain провайдера дошла до запуска игры, а вода теперь принимается только как 0 или 1.
Для чего. Так мир не подменить между проверкой и стартом.
Сборка мира больше не оставляет мусор
Что сделали. Отменённая сборка мира теперь удаляет всё записанное, а принятый мир сохраняется для следующего запуска.
Для чего. Мир не засоряется и не пересобирается без нужды.
StaticSceneIndexV1 для статической сцены
Что сделали. Статическая сцена региона 20_21 теперь передаётся в runtime через версионированный индекс: 2039 размещений, 13061 render chunk и 13061 collision reference разбиты на 44 проверяемые partition. Контракт сохраняет исходные ResourceId, хэши, bounds, материалы и collision-ссылки без копирования GLB/PNG в runtime payload.
Для чего. Цель этой работы в патчноуте пока не указана.
Столкновения готовы только после расстановки
Что сделали. Столкновения с постройками теперь помечаются готовыми только после первой записи в карту. Проверка: 1189 из 1189, без ошибок.
Для чего. Мир стартует в правильном порядке и без ложной готовности.
Террейн подключён к поколению WorldManifest
Что сделали. Luanti теперь проверяет content-addressed terrain root и строит из одного поколения высоту, тип поверхности и воду. Terrain подтверждает готовность только после установки реального consumer; за пределами bounded tile старый рельеф не подмешивается. Полная активация всё ещё ждёт collision/navigation.
Для чего. Цель этой работы в патчноуте пока не указана.
Точный движковый объект подключён к реальной сцене
Что сделали. Отладочный контур теперь может загрузить один выбранный объект напрямую в движок вместе с обычным ландшафтом, не собирая весь регион и не создавая вторую Lua-копию. Контур также отличает подземные объекты от подходящих видимых примеров и учитывает точный объект в адресе кэша.
Для чего. Цель этой работы в патчноуте пока не указана.
Впервые собрали движок из исходников и увидели башню Lineage 2 внутри него своими глазами
Что сделали. Мы успешно собрали движок из исходников и увидели осадную башню из Lineage 2 в мире Luanti. Это первая демонстрация реальных текстур и геометрии из оригинального клиента.
Для чего. Теперь мы можем уверенно утверждать, что процесс переноса зданий завершён. Это важно для дальнейшей работы над миром Luanti и для создания качественного игрового опыта.
Выяснили, во что на самом деле обходится физика залов — три статьи расходов проверены, предел не оправдался ни одной
Что сделали. Продолжаем разбираться с ограничением, из-за которого не переносятся последние 35 построек. Проверили три возможные причины, ради которых его когда-то поставили. Время постройки куска мира — не меняется даже при вчетверо большей нагрузке. Размер сохранения игры — не меняется вовсе, и этому есть внятное объяснение: мир хранится блоками целиком, а физика лишь занимает место воздуха внутри блоков, которые и так сохранялись. Единственная найденная цена — служебный файл с описанием построек: он растёт ровно на 27 байт за каждую ячейку физики. Это немного, но это первое настоящее число вместо догадок. Ограничение мы по-прежнему не трогаем: непроверенными остаются расход памяти и стоимость столкновений, когда игрок бежит вдоль стены. Смысл этой работы не в том, чтобы поскорее поднять предел, а в том, чтобы он однажды опирался на замер, а не на чьё-то давнее предположение.
Для чего. Цель этой работы в патчноуте пока не указана.
Загрузили в движок половину региона разом и нашли, где он действительно упрётся
Что сделали. Раз постройки теперь переносятся все, пора было узнать, выдержит ли движок целый район. Загрузили нарастающими порциями — двести домов, пятьсот, а потом всё, что вообще можно доставить сегодня, тысячу с лишним. Хорошая новость: время постройки куска мира не выросло ни на сколько, от малой порции до полной оно одинаковое. То есть сам способ показывать здания движок тянет. Плохая новость нашлась в другом месте: служебный список построек, который движок читает при запуске, разросся до 24 мегабайт — и это лишь на половину района. Игра с ним запускается, но это уже та величина, с которой придётся что-то делать. Отдельно выяснилось, что доставить сегодня можно ровно половину района: у остальных зданий не находятся текстуры, и это отдельная задача, которая раньше не значилась помехой.
Для чего. Цель этой работы в патчноуте пока не указана.