From ce694a032e8c47703b13b76087fafcae46d3975d Mon Sep 17 00:00:00 2001 From: QiuShui1012 Date: Sun, 12 Jul 2026 23:47:24 +0800 Subject: [PATCH 1/2] feat(codec): add zomListMap method for creating zero/one/many element List MapCodec --- .../anvilcraft/lib/v2/codec/CodecUtil.java | 55 +++++++++++++------ 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/module.codec/src/main/java/dev/anvilcraft/lib/v2/codec/CodecUtil.java b/module.codec/src/main/java/dev/anvilcraft/lib/v2/codec/CodecUtil.java index df9357f2..3d814111 100644 --- a/module.codec/src/main/java/dev/anvilcraft/lib/v2/codec/CodecUtil.java +++ b/module.codec/src/main/java/dev/anvilcraft/lib/v2/codec/CodecUtil.java @@ -25,6 +25,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import net.minecraft.advancements.criterion.DamageSourcePredicate; import net.minecraft.core.NonNullList; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.codec.StreamCodec; @@ -42,6 +43,7 @@ import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; import net.minecraft.world.level.storage.loot.providers.number.NumberProviders; +import java.util.Collections; import java.util.Deque; import java.util.LinkedList; import java.util.List; @@ -310,13 +312,11 @@ public static MapCodec> createIngredientListCodec(String ); } - /** - * 构建方块状态属性编解码器,将每个属性作为可选字段暴露。 - * - * @param state 提供属性定义和默认值的原型状态 - * @param 属性值类型 - * @return 该状态对应的属性 MapCodec - */ + /// 构建方块状态属性编解码器,将每个属性作为可选字段暴露。 + /// + /// @param state 提供属性定义和默认值的原型状态 + /// @param 属性值类型 + /// @return 该状态对应的属性 MapCodec public static > MapCodec blockStatePropertiesCodec(BlockState state) { AtomicReference> mapcodec = new AtomicReference<>(MapCodec.of(Encoder.empty(), Decoder.unit(state))); state.getValues().forEach((value) -> { @@ -333,17 +333,15 @@ public static > MapCodec blockStatePropertie return mapcodec.get(); } - /** - * 向现有方块状态 MapCodec 追加一个属性字段编解码器。 - * - * @param propertyCodec 现有 MapCodec 累加器 - * @param holderSupplier 用于回退默认值的状态提供器 - * @param value 序列化字段名 - * @param property 目标属性 - * @param defValue 默认属性值 - * @param 属性可比较类型 - * @return 追加该属性后的 MapCodec - */ + /// 向现有方块状态 MapCodec 追加一个属性字段编解码器。 + /// + /// @param propertyCodec 现有 MapCodec 累加器 + /// @param holderSupplier 用于回退默认值的状态提供器 + /// @param value 序列化字段名 + /// @param property 目标属性 + /// @param defValue 默认属性值 + /// @param 属性可比较类型 + /// @return 追加该属性后的 MapCodec public static > MapCodec appendBlockStatePropertyCodec( MapCodec propertyCodec, Supplier holderSupplier, @@ -359,6 +357,27 @@ public static > MapCodec appendBlockStatePro ).xmap(pair -> pair.getFirst().setValue(property, pair.getSecond().value()), state -> Pair.of(state, property.value(state))); } + /// 构建一个 `ZOM列表`(零/一/多元素列表)MapCodec + /// + /// @param codec 元素编解码器 + /// @param name 名称 + /// @return `ZOM列表`(零/一/多元素列表)MapCodec + public static MapCodec> zomListMap(Codec codec, String name) { + return Codec.mapEither(codec.optionalFieldOf(name), codec.listOf().fieldOf(name)).xmap( + either -> either.map( + op -> op + .map(Collections::singletonList) + .orElse(List.of()), + Function.identity() + ), + list -> list.size() <= 1 + ? list.isEmpty() + ? Either.left(Optional.empty()) + : Either.left(Optional.of(list.getFirst())) + : Either.right(list) + ); + } + /// 创建 {@link Codec} 的便携方法,对 {@link RecordCodecBuilder#create(Function)} 的代理 /// ///

参考了 {@link net.minecraft.network.codec.StreamCodec#composite(StreamCodec, Function, Function)} 的设计

From e5030520593502ba993a3a8a3e03bd33bd143718 Mon Sep 17 00:00:00 2001 From: QiuShui1012 Date: Sun, 12 Jul 2026 23:51:32 +0800 Subject: [PATCH 2/2] chore(codec): remove unused inport and revert irrelevant codec style change --- .../anvilcraft/lib/v2/codec/CodecUtil.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/module.codec/src/main/java/dev/anvilcraft/lib/v2/codec/CodecUtil.java b/module.codec/src/main/java/dev/anvilcraft/lib/v2/codec/CodecUtil.java index 3d814111..811016e6 100644 --- a/module.codec/src/main/java/dev/anvilcraft/lib/v2/codec/CodecUtil.java +++ b/module.codec/src/main/java/dev/anvilcraft/lib/v2/codec/CodecUtil.java @@ -25,7 +25,6 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AccessLevel; import lombok.NoArgsConstructor; -import net.minecraft.advancements.criterion.DamageSourcePredicate; import net.minecraft.core.NonNullList; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.codec.StreamCodec; @@ -312,11 +311,13 @@ public static MapCodec> createIngredientListCodec(String ); } - /// 构建方块状态属性编解码器,将每个属性作为可选字段暴露。 - /// - /// @param state 提供属性定义和默认值的原型状态 - /// @param 属性值类型 - /// @return 该状态对应的属性 MapCodec + /** + * 构建方块状态属性编解码器,将每个属性作为可选字段暴露。 + * + * @param state 提供属性定义和默认值的原型状态 + * @param 属性值类型 + * @return 该状态对应的属性 MapCodec + */ public static > MapCodec blockStatePropertiesCodec(BlockState state) { AtomicReference> mapcodec = new AtomicReference<>(MapCodec.of(Encoder.empty(), Decoder.unit(state))); state.getValues().forEach((value) -> { @@ -333,15 +334,17 @@ public static > MapCodec blockStatePropertie return mapcodec.get(); } - /// 向现有方块状态 MapCodec 追加一个属性字段编解码器。 - /// - /// @param propertyCodec 现有 MapCodec 累加器 - /// @param holderSupplier 用于回退默认值的状态提供器 - /// @param value 序列化字段名 - /// @param property 目标属性 - /// @param defValue 默认属性值 - /// @param 属性可比较类型 - /// @return 追加该属性后的 MapCodec + /** + * 向现有方块状态 MapCodec 追加一个属性字段编解码器。 + * + * @param propertyCodec 现有 MapCodec 累加器 + * @param holderSupplier 用于回退默认值的状态提供器 + * @param value 序列化字段名 + * @param property 目标属性 + * @param defValue 默认属性值 + * @param 属性可比较类型 + * @return 追加该属性后的 MapCodec + */ public static > MapCodec appendBlockStatePropertyCodec( MapCodec propertyCodec, Supplier holderSupplier,