Skip to content

遊戲規則 Codec 與序列化

主題規格說明
序列化失敗問題世界保存期間 SavedDataStorage.encodeUnchecked 崩潰
修復版本1.8.15
整數邊界min = Integer.MIN_VALUE (或 Math.min(Integer.MIN_VALUE, defaultValue))

🛠️ 整數 GameRule Codec 修復

在 Minecraft 26.2 中,動態 GameRules 透過 SavedDataStorage.encodeUnchecked 被序列化寫入 level.dat / game_rules.dat。在庫的早期版本中,註冊整數 GameRule 若未明確指定下界,GameRule 編解碼器會預設強制嚴格的正數範圍(min = 0),在序列化負整數值或特定預設值時會拋出 IllegalStateException 崩潰。

DynamicGameRuleManager 中的修復實現

java
// IntegerBuilder initialization fix in DynamicGameRuleManager
public class IntegerBuilder {
    private int min = Integer.MIN_VALUE;
    private int max = Integer.MAX_VALUE;

    public GameRule<Integer> register() {
        int effectiveMin = Math.min(min, defaultValue);
        int effectiveMax = Math.max(max, defaultValue);
        // Uses Codec.INT.intRange(effectiveMin, effectiveMax) to prevent encodeUnchecked bounds check failure
        GameRule<Integer> rule = new GameRule<>(
            GameRuleType.INT, defaultValue, Codec.INT.intRange(effectiveMin, effectiveMax), 
            FeatureFlagSet.of(), category, visitor
        );
        return Registry.register(BuiltInRegistries.GAME_RULE, Identifier.parse(ruleName), rule);
    }
}

🔒 NBT 命名空間安全性

請務必使用 modid:rule_name 格式為動態 GameRules 添加命名空間([ERR-20260510-002])。未添加命名空間的動態 GameRules 無法乾淨地序列化到原生世界的存檔數據中,會導致伺服器重啟時數據靜默丟失。


🔗 相關頁面

Official documentation & web portal for Dasik Igaijinn mods.