🏛️ Architektur & Mixin-Analyse
📌 Hinweis zum Quellcode des Repositorys: Die Dokumentation in diesem Wiki spiegelt den aktuellen Quellcode-Zustand im Repository wider, der neuere, unveröffentlichte Commits oder Entwicklungsfunktionen vor den öffentlichen Release-Builds auf CurseForge und Modrinth enthalten kann.
🔬 High-Level-Architektur & Ablaufdiagramm
True Sleep fängt den Schlaf-Lebenszyklus auf dem Server ab und ersetzt den Zeitsprung durch eine synchronisierte Beschleunigungsschleife unter 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 ]🧩 Vollständiges Mixin-Inventar & Injektionsdeskriptoren
| Mixin-Klasse | Minecraft-Zielklasse | Injektionspunkt | Methode | Zweck und Funktion |
|---|---|---|---|---|
BedRuleMixin | net.minecraft.world.attribute.BedRule$Rule | @At("HEAD") (Cancellable) | test(Level) | Überschreibt WHEN_DARK zugunsten von truesleep:sleep_threshold. |
ServerLevelMixin | net.minecraft.server.level.ServerLevel | @At("INVOKE") (Redirect) | areEnoughSleeping / areEnoughDeepSleeping | Gibt false zurück, um das abrupte Überspringen der Nacht zu verhindern. |
ServerLevelMixin | net.minecraft.server.level.ServerLevel | @At("TAIL") | tick(BooleanSupplier) | Prüft Schlafzustände und treibt TimeWarpManager.tick() an. |
LevelMixin | net.minecraft.world.level.Level | @At("INVOKE") (Redirect) | TickingBlockEntity.tick() | Multi-tickt Maschinen und Trichter basierend auf stride. |
MobMixin | net.minecraft.world.entity.Mob | @At("HEAD") (Cancellable) | tick() | Pausiert Mob-KI und führt biologische Farmalterung durch. |
EntityMixin | net.minecraft.world.entity.Entity | @At("HEAD") | baseTick() | Füllt Atemluft auf, um Ertrinken bei drown_immunity zu verhindern. |
LivingEntityMixin | net.minecraft.world.entity.LivingEntity | @At("HEAD") | baseTick() | Lässt Trankeffekte um stride - 1 Ticks altern. |
MobEffectInstanceMixin | net.minecraft.world.effect.MobEffectInstance | Interface Injection | truesleep$ageEffect(int) | Lässt kaskadierende Effekte ohne Endlosschleifen altern. |
VibrationSystemListenerMixin | net.minecraft.world.level.gameevent.vibrations.VibrationSystem$Listener | @At("HEAD") (Cancellable) | handleGameEvent(...) | Dämpft Warden-Vibrationen während des Zeitraffers. |
client.HudMixin | net.minecraft.client.gui.Hud | @At("HEAD") (Cancellable) | extractSleepOverlay(...) | Deaktiviert das schwarze Ausblendfenster beim Schlafen. |
client.SkyRendererMixin | net.minecraft.client.renderer.SkyRenderer | @At("TAIL") | extractRenderState(...) | Interpoliert Himmelskörperwinkel mit Faktor 0.35. |
⚡ Null-Allokations-Caching auf Hot-Paths
Bei hohen Durchläufen ($50\text{ TPS} \times 50\text{ Stride} = 2{,}500\text{ Iterationen/s}$) belasten Objektallokationen die Garbage Collection (GC).
True Sleep verwendet statische, sperrenfreie Caches:
truesleep$unfreezeCache: Cached GameRule-Instanzen proEntityType<?>, vermeidet String-Erzeugung.truesleep$WORKER_CACHE: Speichert Tag-Prüfungen für#truesleep:worker_mobs.truesleep$PRODUCTION_MACHINE_CACHE: Speichert passende Typen für#truesleep:accelerated_machines.- Feld-Caching in
TimeWarpManager: Fragt GameRule-Booleans einmal pro Tick ab statt in Schleifen.
