SelectItemModelProperty.java

net.minecraft.client.renderer.item.properties.select.SelectItemModelProperty

信息

  • 全限定名:net.minecraft.client.renderer.item.properties.select.SelectItemModelProperty
  • 类型:public interface
  • 包:net.minecraft.client.renderer.item.properties.select
  • 源码路径:src/main/java/net/minecraft/client/renderer/item/properties/select/SelectItemModelProperty.java
  • 起始行号:L21
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

  • net.minecraft.client.renderer.item.properties.select.SelectItemModelProperty.Type
    • 类型: record
    • 修饰符: public
    • 源码定位: L29
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

T get(ItemStack itemStack, ClientLevel level, LivingEntity owner, int seed, ItemDisplayContext displayContext) @ L22

  • 方法名:get
  • 源码定位:L22
  • 返回类型:T
  • 修饰符:package-private

参数:

  • itemStack: ItemStack
  • level: ClientLevel
  • owner: LivingEntity
  • seed: int
  • displayContext: ItemDisplayContext

说明:

TODO

Codec<T> valueCodec() @ L24

  • 方法名:valueCodec
  • 源码定位:L24
  • 返回类型:Codec
  • 修饰符:package-private

参数:

说明:

TODO

SelectItemModelProperty.Type<?extends SelectItemModelProperty<T>,T> type() @ L26

  • 方法名:type
  • 源码定位:L26
  • 返回类型:SelectItemModelProperty.Type<?extends SelectItemModelProperty,T>
  • 修饰符:package-private

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public interface SelectItemModelProperty<T> {
    @Nullable T get(ItemStack itemStack, @Nullable ClientLevel level, @Nullable LivingEntity owner, int seed, ItemDisplayContext displayContext);
 
    Codec<T> valueCodec();
 
    SelectItemModelProperty.Type<? extends SelectItemModelProperty<T>, T> type();
 
    @OnlyIn(Dist.CLIENT)
    public record Type<P extends SelectItemModelProperty<T>, T>(MapCodec<SelectItemModel.UnbakedSwitch<P, T>> switchCodec) {
        public static <P extends SelectItemModelProperty<T>, T> SelectItemModelProperty.Type<P, T> create(MapCodec<P> propertyMapCodec, Codec<T> valueCodec) {
            MapCodec<SelectItemModel.UnbakedSwitch<P, T>> switchCodec = RecordCodecBuilder.mapCodec(
                i -> i.group(
                        propertyMapCodec.forGetter(SelectItemModel.UnbakedSwitch::property),
                        createCasesFieldCodec(valueCodec).forGetter(SelectItemModel.UnbakedSwitch::cases)
                    )
                    .apply(i, SelectItemModel.UnbakedSwitch::new)
            );
            return new SelectItemModelProperty.Type<>(switchCodec);
        }
 
        public static <T> MapCodec<List<SelectItemModel.SwitchCase<T>>> createCasesFieldCodec(Codec<T> valueCodec) {
            return SelectItemModel.SwitchCase.codec(valueCodec).listOf().validate(SelectItemModelProperty.Type::validateCases).fieldOf("cases");
        }
 
        private static <T> DataResult<List<SelectItemModel.SwitchCase<T>>> validateCases(List<SelectItemModel.SwitchCase<T>> cases) {
            if (cases.isEmpty()) {
                return DataResult.error(() -> "Empty case list");
            } else {
                Multiset<T> counts = HashMultiset.create();
 
                for (SelectItemModel.SwitchCase<T> c : cases) {
                    counts.addAll(c.values());
                }
 
                return counts.size() != counts.entrySet().size()
                    ? DataResult.error(
                        () -> "Duplicate case conditions: "
                            + counts.entrySet().stream().filter(e -> e.getCount() > 1).map(e -> e.getElement().toString()).collect(Collectors.joining(", "))
                    )
                    : DataResult.success(cases);
            }
        }
    }
}

引用的其他类