Skip to content

CodecUtil

CodecUtil 是抽象工具类,提供静态 Codec / MapCodec 常量及辅助方法,用于将游戏对象序列化为 JSON、NBT 或配置文件。

内置编解码器

字段类型说明
ITEMCodec<Item>通过注册表 ID 字符串序列化物品,空气或无效 ID 返回 error
BLOCKCodec<Block>通过注册表 ID 字符串序列化方块
ENTITYCodec<EntityType<?>>实体类型编解码,带注册表存在性校验
CHARCodec<Character>单字符编解码器
NUMBER_PROVIDERCodec<NumberProvider>支持标准 NumberProvider 结构与纯整数(自动展开为 ConstantValue)
BLOCK_STATE_MAP_CODECMapCodec<BlockState>通过 "block" 字段确定方块,"state" 字段携带属性值

方块状态编解码

java
// 为特定 BlockState 构建属性编解码器
MapCodec<BlockState> codec = CodecUtil.blockStatePropertiesCodec(state);

// 向已有 MapCodec 追加一个属性字段
MapCodec<BlockState> extended = CodecUtil.appendBlockStatePropertyCodec(
    base, supplier, name, property, defValue
);

枚举编解码

方法说明
enumCodecInInt(Class<T>)按 ordinal 整数编解码
enumCodecInLowerName(Class<T>)按小写名称字符串编解码
java
Codec<MyEnum> intCodec = CodecUtil.enumCodecInInt(MyEnum.class);
Codec<MyEnum> nameCodec = CodecUtil.enumCodecInLowerName(MyEnum.class);

Optional 编解码

java
// 带显式 isPresent 布尔字段的 Optional 编解码器
Codec<Optional<T>> codec = CodecUtil.createOptionalCodec(innerCodec);

集合编解码

java
// LinkedList 编解码
Codec<LinkedList<T>> listCodec = CodecUtil.linkedListOf(innerCodec);

// 双端队列编解码
Codec<Deque<T>> dequeCodec = CodecUtil.dequeOf(innerCodec, factoryFunction);

配方相关

java
// 创建限制最大长度的 NonNullList<Ingredient> 编解码器
Codec<NonNullList<Ingredient>> ingredients = CodecUtil.createIngredientListCodec(
    "ingredients", 9, recipeType
);

单条目 Map 转换

java
// 将 Codec<Map<K,V>> 转为 Codec<T>,适用于 {"key": value} 格式
Codec<T> byMap = CodecUtil.byMap(mapCodec, keyGetter, valueGetter, factory);

使用示例

java
// 方块状态的完整编解码
MapCodec<BlockState> blockStateMapCodec = CodecUtil.BLOCK_STATE_MAP_CODEC;

// 枚举按名称编解码
Codec<MyEnum> enumCodec = CodecUtil.enumCodecInLowerName(MyEnum.class);

// NumberProvider 同时支持数值和标准结构
Codec<NumberProvider> npCodec = CodecUtil.NUMBER_PROVIDER;

Released under the CC-BY-NC-SA 4.0 License.