ResourceSelectorArgument.java

net.minecraft.commands.arguments.ResourceSelectorArgument

信息

  • 全限定名:net.minecraft.commands.arguments.ResourceSelectorArgument
  • 类型:public class
  • 包:net.minecraft.commands.arguments
  • 源码路径:src/main/java/net/minecraft/commands/arguments/ResourceSelectorArgument.java
  • 起始行号:L28
  • 实现:ArgumentType<Collection<Holder.Reference>>
  • 职责:

    TODO

字段/常量

  • EXAMPLES

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

      TODO

  • ERROR_NO_MATCHES

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

      TODO

  • registryKey

    • 类型: ResourceKey<?extends Registry<T>>
    • 修饰符: private final
    • 源码定位: L33
    • 说明:

      TODO

  • registryLookup

    • 类型: HolderLookup<T>
    • 修饰符: private final
    • 源码定位: L34
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.commands.arguments.ResourceSelectorArgument.Info

    • 类型: class
    • 修饰符: public static
    • 源码定位: L96
    • 说明:

      TODO

  • net.minecraft.commands.arguments.ResourceSelectorArgument.Info.Template

    • 类型: class
    • 修饰符: public final
    • 源码定位: L113
    • 说明:

      TODO

构造器

private ResourceSelectorArgument(CommandBuildContext context, ResourceKey<?extends Registry<T>> registryKey) @ L36

  • 构造器名:ResourceSelectorArgument
  • 源码定位:L36
  • 修饰符:private

参数:

  • context: CommandBuildContext
  • registryKey: ResourceKey<?extends Registry>

说明:

TODO

方法

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

public Collection<Holder.Reference<T>> parse(StringReader reader) @ L41

  • 方法名:parse
  • 源码定位:L41
  • 返回类型:Collection<Holder.Reference>
  • 修饰符:public

参数:

  • reader: StringReader

说明:

TODO

public static <T> Collection<Holder.Reference<T>> parse(StringReader reader, HolderLookup<T> registry) @ L51

  • 方法名:parse
  • 源码定位:L51
  • 返回类型: Collection<Holder.Reference>
  • 修饰符:public static

参数:

  • reader: StringReader
  • registry: HolderLookup

说明:

TODO

private static String readPattern(StringReader reader) @ L56

  • 方法名:readPattern
  • 源码定位:L56
  • 返回类型:String
  • 修饰符:private static

参数:

  • reader: StringReader

说明:

TODO

private static boolean isAllowedPatternCharacter(char character) @ L66

  • 方法名:isAllowedPatternCharacter
  • 源码定位:L66
  • 返回类型:boolean
  • 修饰符:private static

参数:

  • character: char

说明:

TODO

private static String ensureNamespaced(String input) @ L70

  • 方法名:ensureNamespaced
  • 源码定位:L70
  • 返回类型:String
  • 修饰符:private static

参数:

  • input: String

说明:

TODO

private static boolean matches(String pattern, Identifier key) @ L74

  • 方法名:matches
  • 源码定位:L74
  • 返回类型:boolean
  • 修饰符:private static

参数:

  • pattern: String
  • key: Identifier

说明:

TODO

public static <T> ResourceSelectorArgument<T> resourceSelector(CommandBuildContext context, ResourceKey<?extends Registry<T>> registry) @ L78

  • 方法名:resourceSelector
  • 源码定位:L78
  • 返回类型: ResourceSelectorArgument
  • 修饰符:public static

参数:

  • context: CommandBuildContext
  • registry: ResourceKey<?extends Registry>

说明:

TODO

public static <T> Collection<Holder.Reference<T>> getSelectedResources(CommandContext<CommandSourceStack> context, String name) @ L82

  • 方法名:getSelectedResources
  • 源码定位:L82
  • 返回类型: Collection<Holder.Reference>
  • 修饰符:public static

参数:

  • context: CommandContext
  • name: String

说明:

TODO

public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) @ L86

  • 方法名:listSuggestions
  • 源码定位:L86
  • 返回类型: CompletableFuture
  • 修饰符:public

参数:

  • context: CommandContext
  • builder: SuggestionsBuilder

说明:

TODO

public Collection<String> getExamples() @ L91

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

参数:

说明:

TODO

代码

public class ResourceSelectorArgument<T> implements ArgumentType<Collection<Holder.Reference<T>>> {
    private static final Collection<String> EXAMPLES = List.of("minecraft:*", "*:asset", "*");
    public static final Dynamic2CommandExceptionType ERROR_NO_MATCHES = new Dynamic2CommandExceptionType(
        (selector, registry) -> Component.translatableEscape("argument.resource_selector.not_found", selector, registry)
    );
    private final ResourceKey<? extends Registry<T>> registryKey;
    private final HolderLookup<T> registryLookup;
 
    private ResourceSelectorArgument(CommandBuildContext context, ResourceKey<? extends Registry<T>> registryKey) {
        this.registryKey = registryKey;
        this.registryLookup = context.lookupOrThrow(registryKey);
    }
 
    public Collection<Holder.Reference<T>> parse(StringReader reader) throws CommandSyntaxException {
        String pattern = ensureNamespaced(readPattern(reader));
        List<Holder.Reference<T>> results = this.registryLookup.listElements().filter(element -> matches(pattern, element.key().identifier())).toList();
        if (results.isEmpty()) {
            throw ERROR_NO_MATCHES.createWithContext(reader, pattern, this.registryKey.identifier());
        } else {
            return results;
        }
    }
 
    public static <T> Collection<Holder.Reference<T>> parse(StringReader reader, HolderLookup<T> registry) {
        String pattern = ensureNamespaced(readPattern(reader));
        return registry.listElements().filter(element -> matches(pattern, element.key().identifier())).toList();
    }
 
    private static String readPattern(StringReader reader) {
        int start = reader.getCursor();
 
        while (reader.canRead() && isAllowedPatternCharacter(reader.peek())) {
            reader.skip();
        }
 
        return reader.getString().substring(start, reader.getCursor());
    }
 
    private static boolean isAllowedPatternCharacter(char character) {
        return Identifier.isAllowedInIdentifier(character) || character == '*' || character == '?';
    }
 
    private static String ensureNamespaced(String input) {
        return !input.contains(":") ? "minecraft:" + input : input;
    }
 
    private static boolean matches(String pattern, Identifier key) {
        return FilenameUtils.wildcardMatch(key.toString(), pattern);
    }
 
    public static <T> ResourceSelectorArgument<T> resourceSelector(CommandBuildContext context, ResourceKey<? extends Registry<T>> registry) {
        return new ResourceSelectorArgument<>(context, registry);
    }
 
    public static <T> Collection<Holder.Reference<T>> getSelectedResources(CommandContext<CommandSourceStack> context, String name) {
        return context.getArgument(name, Collection.class);
    }
 
    @Override
    public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
        return SharedSuggestionProvider.listSuggestions(context, builder, this.registryKey, SharedSuggestionProvider.ElementSuggestionType.ELEMENTS);
    }
 
    @Override
    public Collection<String> getExamples() {
        return EXAMPLES;
    }
 
    public static class Info<T> implements ArgumentTypeInfo<ResourceSelectorArgument<T>, ResourceSelectorArgument.Info<T>.Template> {
        public void serializeToNetwork(ResourceSelectorArgument.Info<T>.Template template, FriendlyByteBuf out) {
            out.writeResourceKey(template.registryKey);
        }
 
        public ResourceSelectorArgument.Info<T>.Template deserializeFromNetwork(FriendlyByteBuf in) {
            return new ResourceSelectorArgument.Info.Template(in.readRegistryKey());
        }
 
        public void serializeToJson(ResourceSelectorArgument.Info<T>.Template template, JsonObject out) {
            out.addProperty("registry", template.registryKey.identifier().toString());
        }
 
        public ResourceSelectorArgument.Info<T>.Template unpack(ResourceSelectorArgument<T> argument) {
            return new ResourceSelectorArgument.Info.Template(argument.registryKey);
        }
 
        public final class Template implements ArgumentTypeInfo.Template<ResourceSelectorArgument<T>> {
            private final ResourceKey<? extends Registry<T>> registryKey;
 
            private Template(ResourceKey<? extends Registry<T>> registryKey) {
                Objects.requireNonNull(Info.this);
                super();
                this.registryKey = registryKey;
            }
 
            public ResourceSelectorArgument<T> instantiate(CommandBuildContext context) {
                return new ResourceSelectorArgument<>(context, this.registryKey);
            }
 
            @Override
            public ArgumentTypeInfo<ResourceSelectorArgument<T>, ?> type() {
                return Info.this;
            }
        }
    }
}

引用的其他类