Arsitektur Paket & Mixin
Referensi teknis ini merinci hierarki paket, tata letak kode sumber, dan titik injeksi Mixin.
📊 Diagram Arsitektur Paket
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🧩 Tabel Rincian Target Mixin
| Kelas Mixin | Kelas Target Minecraft | Metode / Titik Target | Tipe Injeksi | Tujuan |
|---|---|---|---|---|
DebugScreenEntriesMixin | net.minecraft.client.gui.components.debug.DebugScreenEntries | <clinit> @At("TAIL") | @Inject | Mendaftarkan ID entri speedometer dan membungkus entri asli player_speed jika ada. |
DebugScreenEntriesMixin | net.minecraft.client.gui.components.debug.DebugScreenEntries | register | @Invoker | Memanggil metode privat vanilla register(Identifier, DebugScreenEntry). |
DebugScreenEntryListMixin | net.minecraft.client.gui.components.debug.DebugScreenEntryList | rebuildCurrentList @At("HEAD") | @Inject | Memastikan status speedometer secara default menjadi DebugScreenEntryStatus.IN_OVERLAY. |
🔒 Keamanan Thread & Garansi Non-Blocking
- Semua injeksi Mixin dieksekusi secara eksklusif pada Thread Render Klien Minecraft.
- Implementasi non-blocking tanpa kunci menjamin nol penurunan frame ($<0.001\text{ ms}$).
