Skip to content

1.8.1: краш при клике по сущности, потерянный HUD и контекст сущности - #40

Merged
KoSHeroff merged 4 commits into
mainfrom
release/1.8.1
Sep 11, 2026
Merged

KoSHeroff merged 4 commits into
mainfrom
release/1.8.1

Conversation

@KoSHeroff

Copy link
Copy Markdown
Member

Три исправления, найденные разбором мода и покрытые сценариями стенда.

  • Краш на NeoForge при первом правом клике по сущности с привязанной страницей: событие взаимодействия приходит на обе стороны, а клиентская копия игрока уходила в серверный код.
  • Страница, открытая от сущности, не знала о ней ничего — window.webgui.entity был null. Контекст отправлялся на мгновение раньше экрана, который его и сбрасывал.
  • HUD пропадал, когда одна страница заменяла другую: смерть с открытым магазином или второй /webgui gui — и HUD не возвращался, пока сервер не пришлёт его заново.

Плюс токен страниц сервера переставал действовать не сразу после выхода.

Проверено на 26.2-neoforge: 11/11 сценариев стенда, включая новый на жизненный цикл HUD, который этот баг и ловит (до исправления 6/12).

Кирилл Гринев added 4 commits September 12, 2026 01:57
PlayerInteractEvent.EntityInteract приходит на обеих сторонах, и на клиенте
игрок — LocalPlayer. Приведение к ServerPlayer роняло игру на первом же правом
клике по сущности с привязанным GUI.

Обработчик теперь выходит, если это не ServerPlayer: открыть GUI игроку может
только сервер, ровно как это уже сделано в fabric-ветке.
Порядок пакетов. Открытие GUI создаёт новый браузер и сбрасывает кэш
клиентского пуша, а контекст сущности живёт именно в этом кэше — отправленный
до пакета открытия, он затирался тем самым экраном, для которого и был нужен,
и страница получала null.

Теперь контекст уходит после открытия: пакеты одного соединения сохраняют
порядок, так что он приходит уже после сброса.
Игра при замене экрана зовёт removed() у уходящего, а не onClose(), и мод
переопределяет только второй — восстановление HUD не срабатывало. Заодно
входящий экран закрывал припаркованный HUD-браузер по дороге: openForGui делал
closeSuspendedHudBrowser() безусловно, хотя заменял всего лишь GUI. А
onGuiOpened, вызываемый до openForGui, к этому моменту видел режим GUI_SCREEN
и гасил флаг восстановления.

Итог: умереть с открытым магазином (экран смерти заменяет GUI) или получить
второй `webgui gui` — и HUD не возвращался, пока сервер не пришлёт его заново.

Теперь HUD паркуется только при переходе из HUD, а флаг пересчитывается только
тогда же. Сценарий стенда на этот путь ходит: hud, gui, gui, escape.

Отдельно: sessionToken, port и server в сервере статики стали volatile. Их
пишут под замком, а читают восемь потоков пула без него, из-за чего отозванный
при выходе токен мог продолжать работать.
Три исправления после разбора. Подробности в CHANGELOG.
@KoSHeroff
KoSHeroff merged commit ca33847 into main Sep 11, 2026
8 checks passed
@KoSHeroff
KoSHeroff deleted the release/1.8.1 branch September 11, 2026 21:11
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