ItemPredicateArgument.java

net.minecraft.commands.arguments.item.ItemPredicateArgument

信息

  • 全限定名:net.minecraft.commands.arguments.item.ItemPredicateArgument
  • 类型:public class
  • 包:net.minecraft.commands.arguments.item
  • 源码路径:src/main/java/net/minecraft/commands/arguments/item/ItemPredicateArgument.java
  • 起始行号:L40
  • 继承:ParserBasedArgument<ItemPredicateArgument.Result>
  • 职责:

    TODO

字段/常量

  • EXAMPLES

    • 类型: Collection<String>
    • 修饰符: private static final
    • 源码定位: L41
    • 说明:

      TODO

  • ERROR_UNKNOWN_ITEM

    • 类型: DynamicCommandExceptionType
    • 修饰符: private static final
    • 源码定位: L42
    • 说明:

      TODO

  • ERROR_UNKNOWN_TAG

    • 类型: DynamicCommandExceptionType
    • 修饰符: private static final
    • 源码定位: L45
    • 说明:

      TODO

  • ERROR_UNKNOWN_COMPONENT

    • 类型: DynamicCommandExceptionType
    • 修饰符: private static final
    • 源码定位: L48
    • 说明:

      TODO

  • ERROR_MALFORMED_COMPONENT

    • 类型: Dynamic2CommandExceptionType
    • 修饰符: private static final
    • 源码定位: L51
    • 说明:

      TODO

  • ERROR_UNKNOWN_PREDICATE

    • 类型: DynamicCommandExceptionType
    • 修饰符: private static final
    • 源码定位: L54
    • 说明:

      TODO

  • ERROR_MALFORMED_PREDICATE

    • 类型: Dynamic2CommandExceptionType
    • 修饰符: private static final
    • 源码定位: L57
    • 说明:

      TODO

  • COUNT_ID

    • 类型: Identifier
    • 修饰符: private static final
    • 源码定位: L60
    • 说明:

      TODO

  • PSEUDO_COMPONENTS

    • 类型: Map<Identifier,ItemPredicateArgument.ComponentWrapper>
    • 修饰符: private static final
    • 源码定位: L61
    • 说明:

      TODO

  • PSEUDO_PREDICATES

    • 类型: Map<Identifier,ItemPredicateArgument.PredicateWrapper>
    • 修饰符: private static final
    • 源码定位: L67
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.commands.arguments.item.ItemPredicateArgument.ComponentWrapper

    • 类型: record
    • 修饰符: private
    • 源码定位: L94
    • 说明:

      TODO

  • net.minecraft.commands.arguments.item.ItemPredicateArgument.Context

    • 类型: class
    • 修饰符: private static
    • 源码定位: L115
    • 说明:

      TODO

  • net.minecraft.commands.arguments.item.ItemPredicateArgument.PredicateWrapper

    • 类型: record
    • 修饰符: private
    • 源码定位: L215
    • 说明:

      TODO

  • net.minecraft.commands.arguments.item.ItemPredicateArgument.Result

    • 类型: interface
    • 修饰符: public
    • 源码定位: L228
    • 说明:

      TODO

构造器

public ItemPredicateArgument(CommandBuildContext registries) @ L77

  • 构造器名:ItemPredicateArgument
  • 源码定位:L77
  • 修饰符:public

参数:

  • registries: CommandBuildContext

说明:

TODO

方法

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

private static ItemPredicateArgument.PredicateWrapper createComponentExistencePredicate(Holder.Reference<DataComponentType<?>> componentId) @ L72

  • 方法名:createComponentExistencePredicate
  • 源码定位:L72
  • 返回类型:ItemPredicateArgument.PredicateWrapper
  • 修饰符:private static

参数:

  • componentId: Holder.Reference<DataComponentType<?>>

说明:

TODO

public static ItemPredicateArgument itemPredicate(CommandBuildContext context) @ L81

  • 方法名:itemPredicate
  • 源码定位:L81
  • 返回类型:ItemPredicateArgument
  • 修饰符:public static

参数:

  • context: CommandBuildContext

说明:

TODO

public static ItemPredicateArgument.Result getItemPredicate(CommandContext<CommandSourceStack> context, String name) @ L85

  • 方法名:getItemPredicate
  • 源码定位:L85
  • 返回类型:ItemPredicateArgument.Result
  • 修饰符:public static

参数:

  • context: CommandContext
  • name: String

说明:

TODO

public Collection<String> getExamples() @ L89

  • 方法名:getExamples
  • 源码定位:L89
  • 返回类型:Collection
  • 修饰符:public

参数:

说明:

TODO

代码

public class ItemPredicateArgument extends ParserBasedArgument<ItemPredicateArgument.Result> {
    private static final Collection<String> EXAMPLES = Arrays.asList("stick", "minecraft:stick", "#stick", "#stick{foo:'bar'}");
    private static final DynamicCommandExceptionType ERROR_UNKNOWN_ITEM = new DynamicCommandExceptionType(
        id -> Component.translatableEscape("argument.item.id.invalid", id)
    );
    private static final DynamicCommandExceptionType ERROR_UNKNOWN_TAG = new DynamicCommandExceptionType(
        tag -> Component.translatableEscape("arguments.item.tag.unknown", tag)
    );
    private static final DynamicCommandExceptionType ERROR_UNKNOWN_COMPONENT = new DynamicCommandExceptionType(
        id -> Component.translatableEscape("arguments.item.component.unknown", id)
    );
    private static final Dynamic2CommandExceptionType ERROR_MALFORMED_COMPONENT = new Dynamic2CommandExceptionType(
        (type, message) -> Component.translatableEscape("arguments.item.component.malformed", type, message)
    );
    private static final DynamicCommandExceptionType ERROR_UNKNOWN_PREDICATE = new DynamicCommandExceptionType(
        id -> Component.translatableEscape("arguments.item.predicate.unknown", id)
    );
    private static final Dynamic2CommandExceptionType ERROR_MALFORMED_PREDICATE = new Dynamic2CommandExceptionType(
        (type, message) -> Component.translatableEscape("arguments.item.predicate.malformed", type, message)
    );
    private static final Identifier COUNT_ID = Identifier.withDefaultNamespace("count");
    private static final Map<Identifier, ItemPredicateArgument.ComponentWrapper> PSEUDO_COMPONENTS = Stream.of(
            new ItemPredicateArgument.ComponentWrapper(
                COUNT_ID, itemStack -> true, MinMaxBounds.Ints.CODEC.map(range -> itemStack -> range.matches(itemStack.getCount()))
            )
        )
        .collect(Collectors.toUnmodifiableMap(ItemPredicateArgument.ComponentWrapper::id, e -> (ItemPredicateArgument.ComponentWrapper)e));
    private static final Map<Identifier, ItemPredicateArgument.PredicateWrapper> PSEUDO_PREDICATES = Stream.of(
            new ItemPredicateArgument.PredicateWrapper(COUNT_ID, MinMaxBounds.Ints.CODEC.map(range -> itemStack -> range.matches(itemStack.getCount())))
        )
        .collect(Collectors.toUnmodifiableMap(ItemPredicateArgument.PredicateWrapper::id, e -> (ItemPredicateArgument.PredicateWrapper)e));
 
    private static ItemPredicateArgument.PredicateWrapper createComponentExistencePredicate(Holder.Reference<DataComponentType<?>> componentId) {
        Predicate<ItemStack> componentExists = itemStack -> itemStack.has(componentId.value());
        return new ItemPredicateArgument.PredicateWrapper(componentId.key().identifier(), Unit.CODEC.map(unit -> componentExists));
    }
 
    public ItemPredicateArgument(CommandBuildContext registries) {
        super(ComponentPredicateParser.createGrammar(new ItemPredicateArgument.Context(registries)).mapResult(predicates -> Util.allOf(predicates)::test));
    }
 
    public static ItemPredicateArgument itemPredicate(CommandBuildContext context) {
        return new ItemPredicateArgument(context);
    }
 
    public static ItemPredicateArgument.Result getItemPredicate(CommandContext<CommandSourceStack> context, String name) {
        return context.getArgument(name, ItemPredicateArgument.Result.class);
    }
 
    @Override
    public Collection<String> getExamples() {
        return EXAMPLES;
    }
 
    private record ComponentWrapper(Identifier id, Predicate<ItemStack> presenceChecker, Decoder<? extends Predicate<ItemStack>> valueChecker) {
        public static <T> ItemPredicateArgument.ComponentWrapper create(ImmutableStringReader reader, Identifier id, DataComponentType<T> type) throws CommandSyntaxException {
            Codec<T> codec = type.codec();
            if (codec == null) {
                throw ItemPredicateArgument.ERROR_UNKNOWN_COMPONENT.createWithContext(reader, id);
            } else {
                return new ItemPredicateArgument.ComponentWrapper(id, itemStack -> itemStack.has(type), codec.map(expected -> itemStack -> {
                    T actual = itemStack.get(type);
                    return Objects.equals(expected, actual);
                }));
            }
        }
 
        public Predicate<ItemStack> decode(ImmutableStringReader reader, Dynamic<?> value) throws CommandSyntaxException {
            DataResult<? extends Predicate<ItemStack>> result = this.valueChecker.parse(value);
            return (Predicate<ItemStack>)result.getOrThrow(
                message -> ItemPredicateArgument.ERROR_MALFORMED_COMPONENT.createWithContext(reader, this.id.toString(), message)
            );
        }
    }
 
    private static class Context
        implements ComponentPredicateParser.Context<Predicate<ItemStack>, ItemPredicateArgument.ComponentWrapper, ItemPredicateArgument.PredicateWrapper> {
        private final HolderLookup.Provider registries;
        private final HolderLookup.RegistryLookup<Item> items;
        private final HolderLookup.RegistryLookup<DataComponentType<?>> components;
        private final HolderLookup.RegistryLookup<DataComponentPredicate.Type<?>> predicates;
 
        private Context(HolderLookup.Provider registries) {
            this.registries = registries;
            this.items = registries.lookupOrThrow(Registries.ITEM);
            this.components = registries.lookupOrThrow(Registries.DATA_COMPONENT_TYPE);
            this.predicates = registries.lookupOrThrow(Registries.DATA_COMPONENT_PREDICATE_TYPE);
        }
 
        public Predicate<ItemStack> forElementType(ImmutableStringReader reader, Identifier id) throws CommandSyntaxException {
            Holder.Reference<Item> item = this.items
                .get(ResourceKey.create(Registries.ITEM, id))
                .orElseThrow(() -> ItemPredicateArgument.ERROR_UNKNOWN_ITEM.createWithContext(reader, id));
            return itemStack -> itemStack.is(item);
        }
 
        public Predicate<ItemStack> forTagType(ImmutableStringReader reader, Identifier id) throws CommandSyntaxException {
            HolderSet<Item> tag = this.items
                .get(TagKey.create(Registries.ITEM, id))
                .orElseThrow(() -> ItemPredicateArgument.ERROR_UNKNOWN_TAG.createWithContext(reader, id));
            return itemStack -> itemStack.is(tag);
        }
 
        public ItemPredicateArgument.ComponentWrapper lookupComponentType(ImmutableStringReader reader, Identifier componentId) throws CommandSyntaxException {
            ItemPredicateArgument.ComponentWrapper wrapper = ItemPredicateArgument.PSEUDO_COMPONENTS.get(componentId);
            if (wrapper != null) {
                return wrapper;
            } else {
                DataComponentType<?> componentType = this.components
                    .get(ResourceKey.create(Registries.DATA_COMPONENT_TYPE, componentId))
                    .map(Holder::value)
                    .orElseThrow(() -> ItemPredicateArgument.ERROR_UNKNOWN_COMPONENT.createWithContext(reader, componentId));
                return ItemPredicateArgument.ComponentWrapper.create(reader, componentId, componentType);
            }
        }
 
        public Predicate<ItemStack> createComponentTest(ImmutableStringReader reader, ItemPredicateArgument.ComponentWrapper componentType, Dynamic<?> value) throws CommandSyntaxException {
            return componentType.decode(reader, RegistryOps.injectRegistryContext(value, this.registries));
        }
 
        public Predicate<ItemStack> createComponentTest(ImmutableStringReader reader, ItemPredicateArgument.ComponentWrapper componentType) {
            return componentType.presenceChecker;
        }
 
        public ItemPredicateArgument.PredicateWrapper lookupPredicateType(ImmutableStringReader reader, Identifier componentId) throws CommandSyntaxException {
            ItemPredicateArgument.PredicateWrapper wrapper = ItemPredicateArgument.PSEUDO_PREDICATES.get(componentId);
            return wrapper != null
                ? wrapper
                : this.predicates
                    .get(ResourceKey.create(Registries.DATA_COMPONENT_PREDICATE_TYPE, componentId))
                    .map(ItemPredicateArgument.PredicateWrapper::new)
                    .or(
                        () -> this.components
                            .get(ResourceKey.create(Registries.DATA_COMPONENT_TYPE, componentId))
                            .map(ItemPredicateArgument::createComponentExistencePredicate)
                    )
                    .orElseThrow(() -> ItemPredicateArgument.ERROR_UNKNOWN_PREDICATE.createWithContext(reader, componentId));
        }
 
        public Predicate<ItemStack> createPredicateTest(ImmutableStringReader reader, ItemPredicateArgument.PredicateWrapper predicateType, Dynamic<?> value) throws CommandSyntaxException {
            return predicateType.decode(reader, RegistryOps.injectRegistryContext(value, this.registries));
        }
 
        @Override
        public Stream<Identifier> listElementTypes() {
            return this.items.listElementIds().map(ResourceKey::identifier);
        }
 
        @Override
        public Stream<Identifier> listTagTypes() {
            return this.items.listTagIds().map(TagKey::location);
        }
 
        @Override
        public Stream<Identifier> listComponentTypes() {
            return Stream.concat(
                ItemPredicateArgument.PSEUDO_COMPONENTS.keySet().stream(),
                this.components.listElements().filter(e -> !e.value().isTransient()).map(e -> e.key().identifier())
            );
        }
 
        @Override
        public Stream<Identifier> listPredicateTypes() {
            return Stream.concat(ItemPredicateArgument.PSEUDO_PREDICATES.keySet().stream(), this.predicates.listElementIds().map(ResourceKey::identifier));
        }
 
        public Predicate<ItemStack> negate(Predicate<ItemStack> value) {
            return value.negate();
        }
 
        public Predicate<ItemStack> anyOf(List<Predicate<ItemStack>> alternatives) {
            return Util.anyOf(alternatives);
        }
    }
 
    private record PredicateWrapper(Identifier id, Decoder<? extends Predicate<ItemStack>> type) {
        public PredicateWrapper(Holder.Reference<DataComponentPredicate.Type<?>> holder) {
            this(holder.key().identifier(), holder.value().codec().map(v -> v::matches));
        }
 
        public Predicate<ItemStack> decode(ImmutableStringReader reader, Dynamic<?> value) throws CommandSyntaxException {
            DataResult<? extends Predicate<ItemStack>> result = this.type.parse(value);
            return (Predicate<ItemStack>)result.getOrThrow(
                message -> ItemPredicateArgument.ERROR_MALFORMED_PREDICATE.createWithContext(reader, this.id.toString(), message)
            );
        }
    }
 
    public interface Result extends Predicate<ItemStack> {
    }
}

引用的其他类

  • CommandBuildContext

    • 引用位置: 参数
  • CommandSourceStack

    • 引用位置: 参数
  • ComponentPredicateParser

    • 引用位置: 方法调用
    • 关联成员: ComponentPredicateParser.createGrammar()
  • Holder

    • 引用位置: 参数
  • DataComponentType

    • 引用位置: 参数
  • Component

    • 引用位置: 方法调用
    • 关联成员: Component.translatableEscape()
  • Identifier

    • 引用位置: 字段/方法调用
    • 关联成员: Identifier.withDefaultNamespace()
  • RegistryOps

    • 引用位置: 方法调用
    • 关联成员: RegistryOps.injectRegistryContext()
  • ResourceKey

    • 引用位置: 方法调用
    • 关联成员: ResourceKey.create()
  • TagKey

    • 引用位置: 方法调用
    • 关联成员: TagKey.create()
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.allOf(), Util.anyOf()
  • ParserBasedArgument

    • 引用位置: 继承