🏛️ Архитектура и Анализ внедрения Mixin
📌 Отказ от ответственности за исходный код: Документация в этой Вики отражает текущее состояние исходного кода в репозитории, которое может включать недавние невыпущенные коммиты или разрабатываемые функции до публичных релизов на CurseForge и Modrinth.
🔬 Высокоуровневая архитектура и жизненный цикл
True Sleep перехватывает жизненный цикл сна на сервере, заменяя мгновенный скачок циклом ускорения тиков под управлением 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 ]🧩 Полный реестр инъекций Mixin и дескрипторов
| Класс Mixin | Целевой класс Minecraft | Точка внедрения | Метод | Назначение и функционал |
|---|---|---|---|---|
BedRuleMixin | net.minecraft.world.attribute.BedRule$Rule | @At("HEAD") (Cancellable) | test(Level) | Переопределяет проверку WHEN_DARK с учетом truesleep:sleep_threshold. |
ServerLevelMixin | net.minecraft.server.level.ServerLevel | @At("INVOKE") (Redirect) | areEnoughSleeping / areEnoughDeepSleeping | Возвращает false, предотвращая ванильный мгновенный пропуск ночи. |
ServerLevelMixin | net.minecraft.server.level.ServerLevel | @At("TAIL") | tick(BooleanSupplier) | Проверяет условия сна и запускает TimeWarpManager.tick(). |
LevelMixin | net.minecraft.world.level.Level | @At("INVOKE") (Redirect) | TickingBlockEntity.tick() | Выполняет мульти-тики машин и соединенных воронок на величину stride. |
MobMixin | net.minecraft.world.entity.Mob | @At("HEAD") (Cancellable) | tick() | Блокирует AI замороженных мобов и запускает биологическое старение. |
EntityMixin | net.minecraft.world.entity.Entity | @At("HEAD") | baseTick() | Пополняет запас кислорода для предотвращения удушья при drown_immunity. |
LivingEntityMixin | net.minecraft.world.entity.LivingEntity | @At("HEAD") | baseTick() | Ускоряет окончание эффектов зелий на stride - 1 тиков. |
MobEffectInstanceMixin | net.minecraft.world.effect.MobEffectInstance | Interface Injection | truesleep$ageEffect(int) | Рекурсивно обновляет каскадные скрытые эффекты без ошибок переполнения стека. |
VibrationSystemListenerMixin | net.minecraft.world.level.gameevent.vibrations.VibrationSystem$Listener | @At("HEAD") (Cancellable) | handleGameEvent(...) | Подавляет вибрации Хранителя во время деформации времени. |
client.HudMixin | net.minecraft.client.gui.Hud | @At("HEAD") (Cancellable) | extractSleepOverlay(...) | Отменяет ванильное затемнение экрана во время сна. |
client.SkyRendererMixin | net.minecraft.client.renderer.SkyRenderer | @At("TAIL") | extractRenderState(...) | Сглаживает вращение светил с коэффициентом 0.35 для кинематографичности. |
⚡ Нулевое выделение памяти и горячее кеширование
При высоких скоростях ($50\text{ TPS} \times 50\text{ шагов} = 2{,}500\text{ итераций/с}$) выделение памяти в циклах приводит к частым паузам сборщика мусора (GC).
True Sleep использует статические неблокирующие кеши на всех критических путях:
truesleep$unfreezeCache: Кеширует правила GameRules для каждогоEntityType<?>, исключая создание строк.truesleep$WORKER_CACHE: Кеширует принадлежность к тегу#truesleep:worker_mobs.truesleep$PRODUCTION_MACHINE_CACHE: Кеширует типы блоков из#truesleep:accelerated_machines.- Кеширование полей в
TimeWarpManager: Опрашивает флаги GameRules один раз за такт, не перегружая циклы сущностей.
