Архитектура пакетов и миксины
В этом техническом справочнике подробно описана иерархия пакетов, структура исходного кода и точки внедрения миксинов.
📊 Архитектурная диаграмма пакетов
text
net.vanillaoutsider.speedometer
├── SpeedometerMod.java <-- Constants & Identifier definitions
├── client
│ ├── SpeedometerClient.java <-- ClientModInitializer entrypoint
│ ├── DebugEntrySpeedometer.java <-- Custom DebugScreenEntry implementation
│ └── DebugEntryPlayerSpeedWrapper.java <-- Interceptor spy-wrapper for player_speed
└── mixin
├── DebugScreenEntriesMixin.java <-- Hooks into DebugScreenEntries static init
└── DebugScreenEntryListMixin.java <-- Enforces default IN_OVERLAY status🧩 Таблица разбора целей Mixin
| Класс Mixin | Целевой класс Minecraft | Целевой метод / точка | Тип инъекции | Назначение |
|---|---|---|---|---|
DebugScreenEntriesMixin | net.minecraft.client.gui.components.debug.DebugScreenEntries | <clinit> @At("TAIL") | @Inject | Регистрирует идентификатор записи speedometer и оборачивает нативную запись player_speed, если она есть. |
DebugScreenEntriesMixin | net.minecraft.client.gui.components.debug.DebugScreenEntries | register | @Invoker | Вызывает приватный ванильный метод register(Identifier, DebugScreenEntry). |
DebugScreenEntryListMixin | net.minecraft.client.gui.components.debug.DebugScreenEntryList | rebuildCurrentList @At("HEAD") | @Inject | Гарантирует, что статус speedometer по умолчанию равен DebugScreenEntryStatus.IN_OVERLAY. |
🔒 Потокобезопасность и гарантия неблокирующей работы
- Все инъекции Mixin выполняются исключительно в потоке рендеринга клиента Minecraft.
- Неблокирующая реализация без блокировок гарантирует отсутствие просадок кадров ($<0.001\text{ мс}$).
