Skip to content

Codec y Serialización de GameRules

TemaEspecificación
Problema de SerializaciónCierre inesperado en SavedDataStorage.encodeUnchecked al guardar
Versión de Corrección1.8.15
Límites de Enterosmin = Integer.MIN_VALUE (o Math.min(Integer.MIN_VALUE, defaultValue))

🛠️ Corrección del Codec de GameRule para Enteros

En Minecraft 26.2, las GameRules dinámicas se serializan en level.dat / game_rules.dat a través de SavedDataStorage.encodeUnchecked. En versiones anteriores, registrar reglas sin un límite mínimo explícito hacía que el codec impusiera min = 0, lanzando un error IllegalStateException al guardar valores negativos.

Solución en 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);
    }
}

🔒 Seguridad de Nombres de Espacio NBT

Utilice siempre el formato modid:rule_name ([ERR-20260510-002]). Las reglas sin espacio de nombres no se serializan correctamente en los datos de nivel, lo que causa pérdida silenciosa de configuración tras reiniciar el servidor.


🔗 Páginas Relacionadas

Official documentation & web portal for Dasik Igaijinn mods.