Skip to content

GameRule Codec 및 직렬화

문제 항목상세 사양
직렬화 크래시월드 저장 시 SavedDataStorage.encodeUnchecked에서 발생했던 오류
수정 버전1.8.15
정수 허용 범위min = Integer.MIN_VALUE (또는 Math.min(Integer.MIN_VALUE, defaultValue))

🛠️ 정수 GameRule Codec 수정 배경

Minecraft 26.2에서 동적 GameRule은 SavedDataStorage.encodeUnchecked를 거쳐 level.dat / game_rules.dat에 직렬화됩니다. 초기 구현에서는 명시적 하한선이 없는 정수 규칙의 최소값이 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);
    }
}

🔒 네임스페이스 무결성 보장

동적 규칙에는 항상 modid:rule_name 형식을 지정해야 합니다([ERR-20260510-002]). 네임스페이스가 없는 키는 올바르게 저장되지 않아 서버 재시작 시 설정이 기본값으로 초기화될 수 있습니다.


🔗 관련 페이지

Official documentation & web portal for Dasik Igaijinn mods.