Новый контекст - #103
Conversation
bat1set
commented
Aug 28, 2026
- Добавлена новая прослойка между he и аддонами
- Добавлена новая прослойка между minecraft и аддонами
- Добавлена документация по аддонам
- Добавлен тестовый аддон для демонстрации возможности улучшения ui ide
- Добавлена новая прослойка между he и аддонами - Добавлена новая прослойка между minecraft и аддонами - Добавлена документация по аддонам - Добавлен тестовый аддон для демонстрации возможности улучшения ui ide
|
|
||
| val nowNanos = System.nanoTime() | ||
| val addonContext = HollowAddonHudRenderContext(window, guiGraphics, partialTick) | ||
| HollowAddonClientRendering.renderLayers(layer, HollowAddonHudPlacement.BEFORE, addonContext) |
There was a problem hiding this comment.
Нафига аддонам своя система оверлеев? Аддоны же уже имеют возможность добавления своих скриптов с .ui.kts, зачем тут дублировать код ещё одной системой?
| } | ||
|
|
||
| override fun onLevelClosed(level: Level) { | ||
| if (level.isClientSide) RegisterClientCommandsEvent.clearReplay() |
| extensions: Collection<String>, | ||
| analyzer: () -> ScriptingAnalyzer, | ||
| ): HollowIdeLanguageService { | ||
| val normalized = extensions.map { it.trim().removePrefix(".").lowercase() } |
There was a problem hiding this comment.
Хм, а не проще было вместо всего этого послать событие вроде ResolveLanguageServiceEvent, чтобы напрямую там передавать подходящий сервис, причём с возможностью легко перезаписать типы файлов как самого движка, так и перезаписать сервисы добавленные аддонами?
| } | ||
| } | ||
|
|
||
| private class ContributingScriptingAnalyzer( |
There was a problem hiding this comment.
Напомни, а в чём вообще смысл этих расширений анализатора? Тем более если они все по сути привязаны к одному типу файла?...
| val annotation = requireNotNull(type.getAnnotation(HollowPacketHandler::class.java)) { | ||
| "Addon packet must be annotated with @HollowPacketHandler: ${type.name}" | ||
| } | ||
| register(addonId, type, annotation.toTarget) |
There was a problem hiding this comment.
А что изменилось? Что было не так с прошлой системой?
This change replaces the legacy IDE code-insight and HUD layer APIs with a shared language-service registry, and updates docs to describe the new language and UI model. Addon packet registration is now annotation-driven and cleaned up with the addon lifecycle, while command replay snapshot handling is kept separate from scoped subscriptions. Tests were updated to cover the new language override behavior, cleanup semantics, and command replay edge cases.
HollowHorizon
left a comment
There was a problem hiding this comment.
Как минимум нужно основательно переделать документацию, либо вообще её убрать
| ├── HollowEngine events/commands/scripts | ||
| ├── addon packets → client/server | ||
| └── IDE/HUD extensions | ||
| ``` |
There was a problem hiding this comment.
Если делаешь такие диаграммы, то лучше реализуй их на Mermaid / UML как картинку, такой вариант не читаемый, к тому же тут уже и англоязычная диаграмма для русскоязычных пользователей
|
|
||
| - небольшой и ориентирован на возможности, а не на внутреннее устройство мода; | ||
| - использует immutable data и стабильные Minecraft/shared types; | ||
| - не возвращает внутренние collections, event instances, registries или implementation classes; |
There was a problem hiding this comment.
Что значит "не возвращает внутренние collections, event instances, registries и impl classes"? Что имеется ввиду под HE-facing контрактом?
| - небольшой и ориентирован на возможности, а не на внутреннее устройство мода; | ||
| - использует immutable data и стабильные Minecraft/shared types; | ||
| - не возвращает внутренние collections, event instances, registries или implementation classes; | ||
| - явно описывает thread и logical side каждого метода; |
| - явно описывает thread и logical side каждого метода; | ||
| - возвращает `AutoCloseable`/registration token для подписок; | ||
| - не передаёт наружу addon `CoroutineScope`, Koin или classloader; | ||
| - допускает появление новых полей/операций без breaking change. |
There was a problem hiding this comment.
допускает где и для чего?
| ## Обязательная интеграция | ||
|
|
||
| Если без целевого мода аддон бессмысленен, добавь его API только в compile classpath и потребуй | ||
| стабильный публичный class в descriptor. |
There was a problem hiding this comment.
Требования классов вообще говоря были скорее для тестов, сейчас я бы их заменил на требования к mod-id или addon-id
|
|
||
| Минимальный набор проверок: | ||
|
|
||
| 1. unit-тесты доменной логики без Minecraft thread; |
There was a problem hiding this comment.
Ни фига себе требования к разработчикам аддонов, ещё и Unit тесты написать))
| Минимальный набор проверок: | ||
|
|
||
| 1. unit-тесты доменной логики без Minecraft thread; | ||
| 2. тест успешного `load` и повторного cleanup/`close`; |
|
|
||
| 1. unit-тесты доменной логики без Minecraft thread; | ||
| 2. тест успешного `load` и повторного cleanup/`close`; | ||
| 3. ошибка в середине `load` без оставшихся registrations; |
There was a problem hiding this comment.
На это тоже тесты писать?)
Я ещё думал я тут требования к докам большие написал))
| } | ||
|
|
||
| override fun onLevelClosed(level: Level) { | ||
| if (level.isClientSide) RegisterClientCommandsEvent.clearReplaySnapshot() |
There was a problem hiding this comment.
Всё ещё как будто это событие можно упростить или переделать, мне прям не нравится то, что там буквально с нуля переписана логика его обработки, ты уверен, что оно точно нужно? Можешь объяснить зачем ты его добавил?
| scope: CoroutineScope, | ||
| listener: EventListener<RegisterClientCommandsEvent>, | ||
| ): EventListener<RegisterClientCommandsEvent> { | ||
| val registration = ScopedCommandRegistration<SharedSuggestionProvider>(scope, ::executeCommandMutation) |
There was a problem hiding this comment.
Ну вот реально, что это и зачем?
- Добавлена поддержка мода Acoustic через аддоны

