🏛️ 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 Mixin | Clase Objetivo de Minecraft | Punto de Inyección | Método Interceptado | Propósito y Función |
|---|---|---|---|---|
BedRuleMixin | net.minecraft.world.attribute.BedRule$Rule | @At("HEAD") (Cancellable) | test(Level) | Sobrescribe la comprobación WHEN_DARK frente a truesleep:sleep_threshold. |
ServerLevelMixin | net.minecraft.server.level.ServerLevel | @At("INVOKE") (Redirect) | areEnoughSleeping / areEnoughDeepSleeping | Devuelve false para cancelar el salto temporal instantáneo vanilla. |
ServerLevelMixin | net.minecraft.server.level.ServerLevel | @At("TAIL") | tick(BooleanSupplier) | Evalúa las condiciones y ejecuta TimeWarpManager.tick(). |
LevelMixin | net.minecraft.world.level.Level | @At("INVOKE") (Redirect) | TickingBlockEntity.tick() | Ejecuta ráfagas de ticks en máquinas y tolvas acopladas por stride. |
MobMixin | net.minecraft.world.entity.Mob | @At("HEAD") (Cancellable) | tick() | Cancela IA de movimiento y ejecuta el envejecimiento biológico. |
EntityMixin | net.minecraft.world.entity.Entity | @At("HEAD") | baseTick() | Rellena el aire para evitar ahogamientos con drown_immunity. |
LivingEntityMixin | net.minecraft.world.entity.LivingEntity | @At("HEAD") | baseTick() | Avanza la duración de pociones activas en stride - 1 ticks. |
MobEffectInstanceMixin | net.minecraft.world.effect.MobEffectInstance | Interface Injection | truesleep$ageEffect(int) | Avanza efectos de poción anidados sin provocar bucles infinitos. |
VibrationSystemListenerMixin | net.minecraft.world.level.gameevent.vibrations.VibrationSystem$Listener | @At("HEAD") (Cancellable) | handleGameEvent(...) | Suprime vibraciones acústicas del Warden durante el salto temporal. |
client.HudMixin | net.minecraft.client.gui.Hud | @At("HEAD") (Cancellable) | extractSleepOverlay(...) | Anula la pantalla negra opaca vanilla al dormir. |
client.SkyRendererMixin | net.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:
truesleep$unfreezeCache: Almacena GameRules porEntityType<?>, eliminando la creación de cadenas.truesleep$WORKER_CACHE: Guarda la pertenencia a la etiqueta#truesleep:worker_mobs.truesleep$PRODUCTION_MACHINE_CACHE: Almacena tipos de bloques compatibles con#truesleep:accelerated_machines.- Captura de GameRules en
TimeWarpManager: Consulta los valores booleanos una vez por tick en vez de hacerlo en cada bucle de entidad.
