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 acdba987..740a1474 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 @@ -27,6 +27,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; @@ -336,6 +337,29 @@ 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#encodeStart(DynamicOps, Object)}。 * @@ -349,4 +373,4 @@ public static > MapCodec appendBlockStatePro public static DataResult encodeStart(MapCodec codec, DynamicOps ops, T input) { return codec.encode(input, ops, codec.compressedBuilder(ops)).build(ops.emptyMap()); } -} \ No newline at end of file +}