🏛️ Architecture et Analyse des Mixins
📌 Avertissement concernant le code source du dépôt : La documentation de ce Wiki reflète l'état actuel du code source dans le dépôt, qui peut inclure des commits récents non publiés ou des fonctionnalités en cours de développement avant les versions publiques sur CurseForge et Modrinth.
🔬 Architecture Globale et Cycle de Vie
True Sleep intercepte le sommeil au niveau serveur, remplaçant le saut instantané par une boucle d'accélération régie par 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 ]🧩 Inventaire Complet des Mixins et Points d'Injection
| Classe Mixin | Classe Cible Minecraft | Point d'Injection | Méthode | Rôle et Fonctionnalité |
|---|---|---|---|---|
BedRuleMixin | net.minecraft.world.attribute.BedRule$Rule | @At("HEAD") (Cancellable) | test(Level) | Remplace WHEN_DARK par la règle truesleep:sleep_threshold. |
ServerLevelMixin | net.minecraft.server.level.ServerLevel | @At("INVOKE") (Redirect) | areEnoughSleeping / areEnoughDeepSleeping | Renvoie false pour bloquer le saut immédiat de la nuit. |
ServerLevelMixin | net.minecraft.server.level.ServerLevel | @At("TAIL") | tick(BooleanSupplier) | Contrôle les dormeurs et pilote TimeWarpManager.tick(). |
LevelMixin | net.minecraft.world.level.Level | @At("INVOKE") (Redirect) | TickingBlockEntity.tick() | Multi-ticke les machines et entonnoirs selon le stride. |
MobMixin | net.minecraft.world.entity.Mob | @At("HEAD") (Cancellable) | tick() | Suspend l'IA des créatures et simule le vieillissement des fermes. |
EntityMixin | net.minecraft.world.entity.Entity | @At("HEAD") | baseTick() | Recharge l'air pour annuler la noyade si drown_immunity est actif. |
LivingEntityMixin | net.minecraft.world.entity.LivingEntity | @At("HEAD") | baseTick() | Écoule la durée des potions actives de stride - 1 ticks. |
MobEffectInstanceMixin | net.minecraft.world.effect.MobEffectInstance | Interface Injection | truesleep$ageEffect(int) | Fait expirer les effets cachés sans boucle infinie. |
VibrationSystemListenerMixin | net.minecraft.world.level.gameevent.vibrations.VibrationSystem$Listener | @At("HEAD") (Cancellable) | handleGameEvent(...) | Supprime les vibrations perçues par le Warden pendant le sommeil. |
client.HudMixin | net.minecraft.client.gui.Hud | @At("HEAD") (Cancellable) | extractSleepOverlay(...) | Supprime le voile noir opaque vanille durant le coucher. |
client.SkyRendererMixin | net.minecraft.client.renderer.SkyRenderer | @At("TAIL") | extractRenderState(...) | Lisse la course des astres avec un facteur de 0.35. |
⚡ Mise en Cache sans Allocation sur les Chemins Critiques
À haute fréquence ($50\text{ TPS} \times 50\text{ pas} = 2{,}500\text{ itérations/s}$), allouer de la mémoire déclenche de lourdes pauses Garbage Collection (GC).
True Sleep emploie des caches statiques sans verrou :
truesleep$unfreezeCache: Met en cache les règles parEntityType<?>pour éviter les chaînes de caractères.truesleep$WORKER_CACHE: Mémorise les résultats pour#truesleep:worker_mobs.truesleep$PRODUCTION_MACHINE_CACHE: Mémorise les correspondances pour#truesleep:accelerated_machines.- Instantané dans
TimeWarpManager: Lit les règles une fois par tick au lieu de répéter les requêtes dans les boucles.
