Skip to content

2.0.0: движок браузера внутри мода, поддержка 26.2 Fabric и 26.3 - #41

Merged
KoSHeroff merged 14 commits into
mainfrom
feat/bundled-browser-engine
Oct 13, 2026
Merged

KoSHeroff merged 14 commits into
mainfrom
feat/bundled-browser-engine

Conversation

@KoSHeroff

Copy link
Copy Markdown
Member

Что меняется

Мод больше не зависит от стороннего мода-библиотеки: движок браузера и адаптер к нему лежат внутри. Установка WebGUI — один файл. Chromium по-прежнему скачивается при первом запуске один раз на машину, вне папки игры, и общий для всех инстанций.

Добавлены таргеты 26.2-fabric, 26.3-fabric и 26.3-neoforge. Поддерживается и публикуется десять таргетов вместо семи; обе сборки 26.3 помечены beta, потому что сама игра ещё в снапшотах.

Версия мажорная ровно по одной причине — снятая зависимость. Страничный API и сетевой протокол не менялись: существующие страницы работают как работали, клиент 2.0.0 разговаривает с сервером 1.8.x.

Обращения к игре, переехавшие между версиями, собраны в land.webgui.compat, чтобы при следующем переходе править одно место, а не дюжину.

Исправления

Всё перечисленное найдено запуском игры — ни компиляция, ни тесты этого не ловят.

  • Экран смерти на Fabric 26.2 и новее. Миксин целился в Minecraft.setScreen, которого там нет: экран переехал на Gui. Конфигурация миксинов требует применения каждого инжектора, так что игра не стартовала вовсе. Затрагивало оба новых Fabric-таргета.
  • Клиент не завершался при выходе. Процесс держали два не-демонских потока: диспетчер сервера страниц и AWT, который не отпускал, пока жив Chromium. До 1.21.1 клиент висел молча, с 1.21.11 его добивал сторож завершения с crash-report. Воспроизводилось на всех версиях и обоих лоадерах.
  • Ввод текста на 26.3. SDL отдаёт символы только при включённом text input, а включает его игра для своих полей. Клавиши доходили, Ctrl+A и Ctrl+V работали, а буквы — нет.
  • Курсор на 26.3. С этой версии игра решает форму раз в кадр и затирает всё, что выставлено помимо её прохода.
  • Enter внутри страницы. Не давал перевод строки в textarea и не отправлял форму — ни на одной версии, с самого начала.
  • Предупреждение NeoForge про устаревшее logoFile при каждом запуске 26.3.
  • Из описания публикуемых версий убрана зависимость от стороннего мода: её больше нет, а игрокам она предлагалась к установке.

Проверка

Вручную, запуском. Все десять таргетов подняты хотя бы раз; на перечисленных прогнана функциональность:

запуск ввод курсор смерть выход
1.20.1-fabric ✓ ✓ ✓ ✓ ✓
26.2-fabric ✓ — ✓ ✓ ✓
26.2-neoforge ✓ — ✓ — ✓
26.3-fabric ✓ ✓ ✓ ✓ ✓
26.3-neoforge ✓ ✓ ✓ ✓ ✓

Прочерк — не проверялось, а не сломано. 1.20.1-fabric взят отдельно как самая дальняя от правок ветка кода: там GLFW вместо SDL, старый рендерер и другой миксин экрана смерти.

Сборка с тестами зелёная на 1.20.1-fabric, 1.21.11-neoforge, 26.2-fabric и 26.3-neoforge.

Что осталось за рамками

  • Логи выбора курсора пишутся на INFO — перед релизом стоит опустить до DEBUG.
  • event.code приходит пустым. Страницы из-за этого не сделают раскладко-независимые хоткеи. Похоже на давнюю особенность java-cef, а не следствие перехода на SDL; нужно сверить с 26.2.

Кирилл Гринев added 14 commits October 13, 2026 02:39
Chromium сам открывает окно инструментов — это его окно, не AWT и не игры,
и порт отладки для этого не нужен. Внутри веб-экрана F12 перехватывается до
страницы, вне экрана работает как кейбинд и открывает инспектор для HUD.
Движок и адаптер к нему лежат внутри мода, отдельная мод-библиотека
больше не нужна. Chromium по-прежнему скачивается при первом запуске
один раз на машину, вне папки игры.

Добавлены таргеты 26.2-fabric, 26.3-fabric и 26.3-neoforge. Обращения к
игре, переехавшие между версиями, собраны в land.webgui.compat, чтобы
при следующем переходе править одно место.

Найдено ручной проверкой и исправлено здесь же:
- миксин экрана смерти целился в Minecraft.setScreen, которого нет с
  26.2, из-за чего игра не стартовала на Fabric 26.2 и 26.3;
- клиент не завершался при выходе: сервер страниц и Chromium держали
  процесс живым;
- на 26.3 не доходил текстовый ввод (SDL отдаёт символы только при
  включённом text input) и не менялся курсор (форма запрашивается
  покадрово);
- Enter не давал перевод строки и не отправлял форму ни на одной версии.
Публиковались семь из десяти: не хватало 26.2-fabric и обоих 26.3.
26.3 помечены beta. Список ожидаемых версий в verify-modrinth.py
дополнен, иначе проверка пропустила бы недоехавшую версию и зелёный
прогон соврал бы.

Убрана зависимость от стороннего мода в описании публикуемых версий:
её больше нет, а игрокам она предлагалась к установке.
Набор страниц под dev/testpages: мост, ввод и курсоры, загрузки, HUD и
экран смерти. Нужны потому, что половина найденных сегодня ошибок не
ловится ни компиляцией, ни тестами — только запуском.
Мажорная из-за того, что мод лишился зависимости от стороннего мода.
Страничный API и протокол не менялись.
Loom 1.18.4 требует JVM 25 уже на этапе конфигурации, а оба плагина
объявлены в общем блоке plugins — Gradle резолвит их classpath для
каждого проекта, даже если применяется только один. Из-за этого на
Java 21 падала конфигурация всех таргетов, включая 1.20.1.

CI теперь ставит оба JDK, а org.gradle.java.installations.fromEnv
указывает Gradle, где их искать: байткод старых версий по-прежнему
собирается под 21 через options.release и toolchain.

Заодно в матрицу добавлены 26.2-fabric, 26.3-fabric и 26.3-neoforge —
они собирались только в релизном workflow и на PR не проверялись.
Пять мест пересказывали ход отладки: под каким отладчиком ловился
SIGSEGV, какие сигналы прилетали на каких раннерах, как именно
заметили подмену курсора. Осталось то, что нужно читающему код:
что ломается, почему и чего делать нельзя.

Javadoc на интерфейсах движка не трогал — для публичного API объём
нормальный.
На INFO оставались строки, которые пишутся на каждое действие игрока:
выбор формы курсора, частота отрисовки при создании браузера и
нераспознанные сообщения страницы. Для игрока это шум, а в логе он
перекрывает то, ради чего лог читают.

Уровнем ниже они никуда не делись — включается отладочным логом.
Сообщения жизненного цикла и вывод консоли страницы, который и так
за настройкой, оставлены как были.
Проверка больше не требует настройки и выполняется всегда при старте
сервера. Спрашиваем Modrinth по своей версии игры и лоадеру — он не
предложит сборку, которую сюда не поставить. Если Modrinth недоступен,
спрашиваем последний релиз на GitHub: ответ грубее, но лучше, чем
ничего.

Раньше проверка молчала, пока оператор не найдёт updateCheckUrl и не
впишет туда свой адрес. Настройку убрал, адрес зафиксирован в коде.

Оператору, который зашёл на сервер, теперь говорим в чат — иначе про
обновление знает только лог при старте. Выключается через
updateNotifyInChat; обычным игрокам не пишем никогда.
Резолвер возвращал нетронутым всё, что не начиналось с webgui: — то
есть открыл бы и file://, и javascript:, и data:. URL страницы приходит
с сервера, так что это граница доверия, а не удобство: file:// читает
диск игрока, javascript: выполняется в открытой странице.

Теперь чужая схема не открывается, а в лог идёт причина с перечнем
допустимых.

Заодно одна форма вместо трёх: webgui:name.html и webgui:/name.html
раньше значили то же, что webgui://name.html. Проверять одно написание
проще, чем три. Так же поправлен разбор на стороне страницы, иначе
ссылка вела бы себя иначе, чем настройка.

Поведение закрыто тестом: шесть случаев, включая те формы, что раньше
работали.
Сервер отдавал на старте только полноэкранную страницу, а HUD оператору
приходилось писать с нуля — и первая же ошибка там одна и та же: фон на
html или body закрывает игру, потому что оверлей рисуется поверх мира.

Теперь рядом создаётся hud.html: карточка в углу с горячими клавишами
(F6, `, F12) и ссылкой на webgui.space, прозрачная как положено.
autoHudUrl по умолчанию указывает на неё, но показ при входе
по-прежнему выключен — само ничего не появится.
autoHudOnJoin теперь включён по умолчанию: страницу для HUD сервер
создаёт сам, а показывать её было некому. autoHudUrl уже указывал на
неё. Сервер, где любая из двух настроек задана явно, сохраняет своё.

Запасной адрес был https://example.com — заглушка, и именно её видел
человек, нажавший F6 на титульном экране, где сервер ещё ничего не
прислал. Теперь это сайт проекта.
Семь ставили, когда колесо почти не двигало страницу. На длинной
странице это всё ещё читается как медленно. Шаги в настройках
пересобраны под новый диапазон.

Клиент, у которого значение уже сохранено, остаётся при своём: менять
чужой выбор при обновлении неправильно.
Экран показывал две опции из трёх существующих и объяснял их текстом
внизу, привязанным к одной из них. Теперь у каждой опции подсказка:
что делает и чем за это платишь — как в настройках графики самой игры.

Добавлены две настройки, которые движок умел, а мод жёстко задавал:
спрашивать место для скачиваемого файла и разрешать странице включать
звук самой. Обе читаются при старте Chromium, и подсказки об этом
говорят. Частота отрисовки была только в json — вынесена в экран.

Убрана неправда: экран советовал добавить --remote-debugging-port в
лаунчер. Так было со сторонней библиотекой, где командная строка
фиксировалась до старта мода; теперь порт назначаем мы сами, и адрес
инспектора показывается, когда он действительно поднят.
@KoSHeroff
KoSHeroff merged commit 6ad3fa6 into main Oct 13, 2026
11 checks passed
@KoSHeroff
KoSHeroff deleted the feat/bundled-browser-engine branch October 13, 2026 00:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant