🏛️ Arsitektur & Analisis Injeksi Mixin
📌 Pemberitahuan Sumber Repositori: Dokumentasi dalam Wiki ini mencerminkan kondisi kode sumber terkini dalam repositori, yang mungkin mencakup komit terbaru yang belum dirilis atau fitur dalam pengembangan sebelum rilis publik di CurseForge dan Modrinth.
🔬 Gambaran Arsitektur Tingkat Tinggi & Siklus Hidup
True Sleep mencegat siklus tidur vanilla di tingkat server, menggantikan lompatan instan dengan loop akselerasi tick yang dikendalikan oleh TimeWarpManager.
[ Player Enters Bed ]
│
▼
[ BedRule.Rule.test() Intercept ]
(Check truesleep:sleep_threshold)
│
▼
[ ServerLevel.tick() Sleep Check ]
(SleepStatus.areEnoughDeepSleeping())
│
+------------+------------+
│ │
[ Not All Sleeping ] [ All Sleeping (Enough) ]
│ │
▼ ▼
[ Initiate Wind-Down ] [ Engage Time Warp Engine ]
(15-tick Deceleration) │
├─► Set Physical Rate (ENGINE_TPS: 50 TPS)
├─► Compute Stride: round(VIRTUAL_TPS / ENGINE_TPS)
├─► Scale RANDOM_TICK_SPEED by Stride
├─► Multi-Tick Machines & Coupled Hoppers
├─► Freeze Mob AI / Age Farm Biology
├─► Apply Sleep Hunger Exhaustion
└─► Smooth Celestial Sun/Moon (Client Lerp)
│
▼
[ Destination Arrival ]
(Cycle Dist < 20 Ticks)
│
▼
[ Snap Monotonic Clock ]
(Set Time to WAKE_TIME: 0)
│
▼
[ Wake Up All Players ]🧩 Daftar Lengkap Injeksi Mixin & Deskriptor Metodenya
| Kelas Mixin | Kelas Target Minecraft | Titik Injeksi | Metode yang Di-hook | Tujuan & Fungsi |
|---|---|---|---|---|
BedRuleMixin | net.minecraft.world.attribute.BedRule$Rule | @At("HEAD") (Cancellable) | test(Level) | Menimpa pemeriksaan WHEN_DARK dengan truesleep:sleep_threshold. |
ServerLevelMixin | net.minecraft.server.level.ServerLevel | @At("INVOKE") (Redirect) | areEnoughSleeping / areEnoughDeepSleeping | Mengembalikan false untuk menekan lompatan instan vanilla. |
ServerLevelMixin | net.minecraft.server.level.ServerLevel | @At("TAIL") | tick(BooleanSupplier) | Memeriksa kondisi tidur dan menggerakkan TimeWarpManager.tick(). |
LevelMixin | net.minecraft.world.level.Level | @At("INVOKE") (Redirect) | TickingBlockEntity.tick() | Menjalankan multi-tick mesin dan hopper terhubung berdasarkan stride. |
MobMixin | net.minecraft.world.entity.Mob | @At("HEAD") (Cancellable) | tick() | Membatalkan AI gerakan mob yang beku dan memproses penuaan biologis. |
EntityMixin | net.minecraft.world.entity.Entity | @At("HEAD") | baseTick() | Mengisi pasokan oksigen agar tidak tenggelam saat drown_immunity aktif. |
LivingEntityMixin | net.minecraft.world.entity.LivingEntity | @At("HEAD") | baseTick() | Memajukan durasi efek ramuan aktif sebesar stride - 1 tick. |
MobEffectInstanceMixin | net.minecraft.world.effect.MobEffectInstance | Interface Injection | truesleep$ageEffect(int) | Menghabiskan efek ramuan bertingkat tanpa terjadi rekursi berulang. |
VibrationSystemListenerMixin | net.minecraft.world.level.gameevent.vibrations.VibrationSystem$Listener | @At("HEAD") (Cancellable) | handleGameEvent(...) | Meredam getaran Warden selama percepatan waktu aktif. |
client.HudMixin | net.minecraft.client.gui.Hud | @At("HEAD") (Cancellable) | extractSleepOverlay(...) | Menghapus layar hitam tidur vanilla. |
client.SkyRendererMixin | net.minecraft.client.renderer.SkyRenderer | @At("TAIL") | extractRenderState(...) | Menghaluskan sudut langit dengan faktor 0.35 untuk visual sinematik. |
⚡ Caching Jalur Cepat Tanpa Alokasi Memori (Zero-Allocation)
Pada kecepatan tinggi ($50\text{ TPS} \times 50\text{ langkah} = 2{,}500\text{ iterasi/s}$), alokasi memori dapat memicu lag Garbage Collection (GC).
True Sleep menggunakan cache statis non-blocking di semua jalur penting:
truesleep$unfreezeCache: Menyimpan instance GameRule perEntityType<?>, menghindari pembuatan string.truesleep$WORKER_CACHE: Menyimpan hasil pengecekan tag#truesleep:worker_mobs.truesleep$PRODUCTION_MACHINE_CACHE: Menyimpan tipe blok dari#truesleep:accelerated_machines.- Snapshot GameRule
TimeWarpManager: Mengambil nilai boolean sekali per tick alih-alih berulang kali di dalam loop.
