Skip to content

🏛️ 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 MixinClasse Cible MinecraftPoint d'InjectionMéthodeRôle et Fonctionnalité
BedRuleMixinnet.minecraft.world.attribute.BedRule$Rule@At("HEAD") (Cancellable)test(Level)Remplace WHEN_DARK par la règle truesleep:sleep_threshold.
ServerLevelMixinnet.minecraft.server.level.ServerLevel@At("INVOKE") (Redirect)areEnoughSleeping / areEnoughDeepSleepingRenvoie false pour bloquer le saut immédiat de la nuit.
ServerLevelMixinnet.minecraft.server.level.ServerLevel@At("TAIL")tick(BooleanSupplier)Contrôle les dormeurs et pilote TimeWarpManager.tick().
LevelMixinnet.minecraft.world.level.Level@At("INVOKE") (Redirect)TickingBlockEntity.tick()Multi-ticke les machines et entonnoirs selon le stride.
MobMixinnet.minecraft.world.entity.Mob@At("HEAD") (Cancellable)tick()Suspend l'IA des créatures et simule le vieillissement des fermes.
EntityMixinnet.minecraft.world.entity.Entity@At("HEAD")baseTick()Recharge l'air pour annuler la noyade si drown_immunity est actif.
LivingEntityMixinnet.minecraft.world.entity.LivingEntity@At("HEAD")baseTick()Écoule la durée des potions actives de stride - 1 ticks.
MobEffectInstanceMixinnet.minecraft.world.effect.MobEffectInstanceInterface Injectiontruesleep$ageEffect(int)Fait expirer les effets cachés sans boucle infinie.
VibrationSystemListenerMixinnet.minecraft.world.level.gameevent.vibrations.VibrationSystem$Listener@At("HEAD") (Cancellable)handleGameEvent(...)Supprime les vibrations perçues par le Warden pendant le sommeil.
client.HudMixinnet.minecraft.client.gui.Hud@At("HEAD") (Cancellable)extractSleepOverlay(...)Supprime le voile noir opaque vanille durant le coucher.
client.SkyRendererMixinnet.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 :

  1. truesleep$unfreezeCache : Met en cache les règles par EntityType<?> pour éviter les chaînes de caractères.
  2. truesleep$WORKER_CACHE : Mémorise les résultats pour #truesleep:worker_mobs.
  3. truesleep$PRODUCTION_MACHINE_CACHE : Mémorise les correspondances pour #truesleep:accelerated_machines.
  4. Instantané dans TimeWarpManager : Lit les règles une fois par tick au lieu de répéter les requêtes dans les boucles.

Official documentation & web portal for Dasik Igaijinn mods.