Repository navigation
2.0.0: движок браузера внутри мода, поддержка 26.2 Fabric и 26.3 - #41
Merged
Merged
Conversation
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 в лаунчер. Так было со сторонней библиотекой, где командная строка фиксировалась до старта мода; теперь порт назначаем мы сами, и адрес инспектора показывается, когда он действительно поднят.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что меняется
Мод больше не зависит от стороннего мода-библиотеки: движок браузера и адаптер к нему лежат внутри. Установка WebGUI — один файл. Chromium по-прежнему скачивается при первом запуске один раз на машину, вне папки игры, и общий для всех инстанций.
Добавлены таргеты
26.2-fabric,26.3-fabricи26.3-neoforge. Поддерживается и публикуется десять таргетов вместо семи; обе сборки 26.3 помеченыbeta, потому что сама игра ещё в снапшотах.Версия мажорная ровно по одной причине — снятая зависимость. Страничный API и сетевой протокол не менялись: существующие страницы работают как работали, клиент 2.0.0 разговаривает с сервером 1.8.x.
Обращения к игре, переехавшие между версиями, собраны в
land.webgui.compat, чтобы при следующем переходе править одно место, а не дюжину.Исправления
Всё перечисленное найдено запуском игры — ни компиляция, ни тесты этого не ловят.
Minecraft.setScreen, которого там нет: экран переехал наGui. Конфигурация миксинов требует применения каждого инжектора, так что игра не стартовала вовсе. Затрагивало оба новых Fabric-таргета.Ctrl+AиCtrl+Vработали, а буквы — нет.textareaи не отправлял форму — ни на одной версии, с самого начала.logoFileпри каждом запуске 26.3.Проверка
Вручную, запуском. Все десять таргетов подняты хотя бы раз; на перечисленных прогнана функциональность:
Прочерк — не проверялось, а не сломано.
1.20.1-fabricвзят отдельно как самая дальняя от правок ветка кода: там GLFW вместо SDL, старый рендерер и другой миксин экрана смерти.Сборка с тестами зелёная на
1.20.1-fabric,1.21.11-neoforge,26.2-fabricи26.3-neoforge.Что осталось за рамками
event.codeприходит пустым. Страницы из-за этого не сделают раскладко-независимые хоткеи. Похоже на давнюю особенность java-cef, а не следствие перехода на SDL; нужно сверить с 26.2.