Skip to content

🏛️ Arquitectura y Análisis de Mixins

📌 Aviso sobre el código fuente del repositorio: La documentación de esta Wiki refleja el estado actual del código fuente en el repositorio, que puede incluir confirmaciones recientes no publicadas o características en desarrollo antes de los lanzamientos públicos en CurseForge y Modrinth.


🔬 Arquitectura General y Flujo del Ciclo de Vida

True Sleep intercepta el ciclo de sueño a nivel de servidor, sustituyendo el salto temporal por un bucle sincronizado gobernado por 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 ]

🧩 Inventario Completo de Mixins y Puntos de Inyección

Clase MixinClase Objetivo de MinecraftPunto de InyecciónMétodo InterceptadoPropósito y Función
BedRuleMixinnet.minecraft.world.attribute.BedRule$Rule@At("HEAD") (Cancellable)test(Level)Sobrescribe la comprobación WHEN_DARK frente a truesleep:sleep_threshold.
ServerLevelMixinnet.minecraft.server.level.ServerLevel@At("INVOKE") (Redirect)areEnoughSleeping / areEnoughDeepSleepingDevuelve false para cancelar el salto temporal instantáneo vanilla.
ServerLevelMixinnet.minecraft.server.level.ServerLevel@At("TAIL")tick(BooleanSupplier)Evalúa las condiciones y ejecuta TimeWarpManager.tick().
LevelMixinnet.minecraft.world.level.Level@At("INVOKE") (Redirect)TickingBlockEntity.tick()Ejecuta ráfagas de ticks en máquinas y tolvas acopladas por stride.
MobMixinnet.minecraft.world.entity.Mob@At("HEAD") (Cancellable)tick()Cancela IA de movimiento y ejecuta el envejecimiento biológico.
EntityMixinnet.minecraft.world.entity.Entity@At("HEAD")baseTick()Rellena el aire para evitar ahogamientos con drown_immunity.
LivingEntityMixinnet.minecraft.world.entity.LivingEntity@At("HEAD")baseTick()Avanza la duración de pociones activas en stride - 1 ticks.
MobEffectInstanceMixinnet.minecraft.world.effect.MobEffectInstanceInterface Injectiontruesleep$ageEffect(int)Avanza efectos de poción anidados sin provocar bucles infinitos.
VibrationSystemListenerMixinnet.minecraft.world.level.gameevent.vibrations.VibrationSystem$Listener@At("HEAD") (Cancellable)handleGameEvent(...)Suprime vibraciones acústicas del Warden durante el salto temporal.
client.HudMixinnet.minecraft.client.gui.Hud@At("HEAD") (Cancellable)extractSleepOverlay(...)Anula la pantalla negra opaca vanilla al dormir.
client.SkyRendererMixinnet.minecraft.client.renderer.SkyRenderer@At("TAIL")extractRenderState(...)Interpola la posición de los astros con factor 0.35 para una visual fluida.

⚡ Caching en Rutas Críticas con Cero Asignación de Memoria

A velocidades extremas ($50\text{ TPS} \times 50\text{ paso} = 2{,}500\text{ iteraciones/s}$), asignar objetos genera pausas severas de Garbage Collection (GC).

True Sleep recurre a cachés estáticas concurrentes sin bloqueos:

  1. truesleep$unfreezeCache: Almacena GameRules por EntityType<?>, eliminando la creación de cadenas.
  2. truesleep$WORKER_CACHE: Guarda la pertenencia a la etiqueta #truesleep:worker_mobs.
  3. truesleep$PRODUCTION_MACHINE_CACHE: Almacena tipos de bloques compatibles con #truesleep:accelerated_machines.
  4. Captura de GameRules en TimeWarpManager: Consulta los valores booleanos una vez por tick en vez de hacerlo en cada bucle de entidad.

Official documentation & web portal for Dasik Igaijinn mods.