🏛️ 架構解析與 Mixin 注入剖析
📌 程式碼儲存庫原始碼聲明:本 Wiki 中的文件反映了程式碼儲存庫目前的最新原始碼狀態,可能包含尚未在 CurseForge 和 Modrinth 上發布的開發中功能或最新提交。
🔬 頂層架構與生命週期流轉
True Sleep 在伺服端攔截原版睡眠生命週期,將瞬間時間跳轉替換為受 TimeWarpManager 嚴格管轄的同步 Tick 加速循環。
[ 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 跨步執行多重 Tick 推進。 |
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 係數對天體角度執行平滑角插值,呈現電影級夜空。 |
⚡ 零分配熱路徑快取技術 (Zero-Allocation)
在超高速時間推進期間($50\text{ 實體 TPS} \times 50\text{ 跨步} = 2{,}500\text{ 次有效迭代/秒}$),實體與方塊循環中的記憶體物件分配極易引發劇烈的垃圾回收 (GC) 停頓。
True Sleep 在所有熱路徑上全面採用 靜態並行無鎖快取結構:
truesleep$unfreezeCache:針對每個EntityType<?>快取動態 GameRule 實例,徹底消除字串拼接與雜湊搜尋開銷。truesleep$WORKER_CACHE:快取#truesleep:worker_mobs標籤包含性判定結果。truesleep$PRODUCTION_MACHINE_CACHE:快取#truesleep:accelerated_machines方塊實體型別比對結果。TimeWarpManager欄位級規則快照:每實體刻僅獲取一次規則布林狀態,而非在成千上萬次實體循環內反覆查詢註冊表。
