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> {
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ComponentPredicateParser.createGrammar()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Component.translatableEscape()
- 引用位置:
-
- 引用位置:
字段/方法调用 - 关联成员:
Identifier.withDefaultNamespace()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
RegistryOps.injectRegistryContext()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ResourceKey.create()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
TagKey.create()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Util.allOf(), Util.anyOf()
- 引用位置:
-
- 引用位置:
继承
- 引用位置: