ResourceOrTagKeyArgument.java

net.minecraft.commands.arguments.ResourceOrTagKeyArgument

信息

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

    TODO

字段/常量

  • EXAMPLES

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

      TODO

  • registryKey

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

      TODO

内部类/嵌套类型

  • net.minecraft.commands.arguments.ResourceOrTagKeyArgument.Info

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

      TODO

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

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

      TODO

  • net.minecraft.commands.arguments.ResourceOrTagKeyArgument.ResourceResult

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

      TODO

  • net.minecraft.commands.arguments.ResourceOrTagKeyArgument.Result

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

      TODO

  • net.minecraft.commands.arguments.ResourceOrTagKeyArgument.TagResult

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

      TODO

构造器

public ResourceOrTagKeyArgument(ResourceKey<?extends Registry<T>> registryKey) @ L33

  • 构造器名:ResourceOrTagKeyArgument
  • 源码定位:L33
  • 修饰符:public

参数:

  • registryKey: ResourceKey<?extends Registry>

说明:

TODO

方法

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

public static <T> ResourceOrTagKeyArgument<T> resourceOrTagKey(ResourceKey<?extends Registry<T>> key) @ L37

  • 方法名:resourceOrTagKey
  • 源码定位:L37
  • 返回类型: ResourceOrTagKeyArgument
  • 修饰符:public static

参数:

  • key: ResourceKey<?extends Registry>

说明:

TODO

public static <T> ResourceOrTagKeyArgument.Result<T> getResourceOrTagKey(CommandContext<CommandSourceStack> context, String name, ResourceKey<Registry<T>> registryKey, DynamicCommandExceptionType exceptionType) @ L41

  • 方法名:getResourceOrTagKey
  • 源码定位:L41
  • 返回类型: ResourceOrTagKeyArgument.Result
  • 修饰符:public static

参数:

  • context: CommandContext
  • name: String
  • registryKey: ResourceKey<Registry>
  • exceptionType: DynamicCommandExceptionType

说明:

TODO

public ResourceOrTagKeyArgument.Result<T> parse(StringReader reader) @ L49

  • 方法名:parse
  • 源码定位:L49
  • 返回类型:ResourceOrTagKeyArgument.Result
  • 修饰符:public

参数:

  • reader: StringReader

说明:

TODO

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

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

参数:

  • context: CommandContext
  • builder: SuggestionsBuilder

说明:

TODO

public Collection<String> getExamples() @ L72

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

参数:

说明:

TODO

代码

public class ResourceOrTagKeyArgument<T> implements ArgumentType<ResourceOrTagKeyArgument.Result<T>> {
    private static final Collection<String> EXAMPLES = Arrays.asList("foo", "foo:bar", "012", "#skeletons", "#minecraft:skeletons");
    private final ResourceKey<? extends Registry<T>> registryKey;
 
    public ResourceOrTagKeyArgument(ResourceKey<? extends Registry<T>> registryKey) {
        this.registryKey = registryKey;
    }
 
    public static <T> ResourceOrTagKeyArgument<T> resourceOrTagKey(ResourceKey<? extends Registry<T>> key) {
        return new ResourceOrTagKeyArgument<>(key);
    }
 
    public static <T> ResourceOrTagKeyArgument.Result<T> getResourceOrTagKey(
        CommandContext<CommandSourceStack> context, String name, ResourceKey<Registry<T>> registryKey, DynamicCommandExceptionType exceptionType
    ) throws CommandSyntaxException {
        ResourceOrTagKeyArgument.Result<?> argument = context.getArgument(name, ResourceOrTagKeyArgument.Result.class);
        Optional<ResourceOrTagKeyArgument.Result<T>> value = argument.cast(registryKey);
        return value.orElseThrow(() -> exceptionType.create(argument));
    }
 
    public ResourceOrTagKeyArgument.Result<T> parse(StringReader reader) throws CommandSyntaxException {
        if (reader.canRead() && reader.peek() == '#') {
            int cursor = reader.getCursor();
 
            try {
                reader.skip();
                Identifier tagId = Identifier.read(reader);
                return new ResourceOrTagKeyArgument.TagResult<>(TagKey.create(this.registryKey, tagId));
            } catch (CommandSyntaxException var4) {
                reader.setCursor(cursor);
                throw var4;
            }
        } else {
            Identifier resourceId = Identifier.read(reader);
            return new ResourceOrTagKeyArgument.ResourceResult<>(ResourceKey.create(this.registryKey, resourceId));
        }
    }
 
    @Override
    public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
        return SharedSuggestionProvider.listSuggestions(context, builder, this.registryKey, SharedSuggestionProvider.ElementSuggestionType.ALL);
    }
 
    @Override
    public Collection<String> getExamples() {
        return EXAMPLES;
    }
 
    public static class Info<T> implements ArgumentTypeInfo<ResourceOrTagKeyArgument<T>, ResourceOrTagKeyArgument.Info<T>.Template> {
        public void serializeToNetwork(ResourceOrTagKeyArgument.Info<T>.Template template, FriendlyByteBuf out) {
            out.writeResourceKey(template.registryKey);
        }
 
        public ResourceOrTagKeyArgument.Info<T>.Template deserializeFromNetwork(FriendlyByteBuf in) {
            return new ResourceOrTagKeyArgument.Info.Template(in.readRegistryKey());
        }
 
        public void serializeToJson(ResourceOrTagKeyArgument.Info<T>.Template template, JsonObject out) {
            out.addProperty("registry", template.registryKey.identifier().toString());
        }
 
        public ResourceOrTagKeyArgument.Info<T>.Template unpack(ResourceOrTagKeyArgument<T> argument) {
            return new ResourceOrTagKeyArgument.Info.Template(argument.registryKey);
        }
 
        public final class Template implements ArgumentTypeInfo.Template<ResourceOrTagKeyArgument<T>> {
            private final ResourceKey<? extends Registry<T>> registryKey;
 
            private Template(ResourceKey<? extends Registry<T>> registryKey) {
                Objects.requireNonNull(Info.this);
                super();
                this.registryKey = registryKey;
            }
 
            public ResourceOrTagKeyArgument<T> instantiate(CommandBuildContext context) {
                return new ResourceOrTagKeyArgument<>(this.registryKey);
            }
 
            @Override
            public ArgumentTypeInfo<ResourceOrTagKeyArgument<T>, ?> type() {
                return Info.this;
            }
        }
    }
 
    private record ResourceResult<T>(ResourceKey<T> key) implements ResourceOrTagKeyArgument.Result<T> {
        @Override
        public Either<ResourceKey<T>, TagKey<T>> unwrap() {
            return Either.left(this.key);
        }
 
        @Override
        public <E> Optional<ResourceOrTagKeyArgument.Result<E>> cast(ResourceKey<? extends Registry<E>> registryKey) {
            return this.key.cast(registryKey).map(ResourceOrTagKeyArgument.ResourceResult::new);
        }
 
        public boolean test(Holder<T> holder) {
            return holder.is(this.key);
        }
 
        @Override
        public String asPrintable() {
            return this.key.identifier().toString();
        }
    }
 
    public interface Result<T> extends Predicate<Holder<T>> {
        Either<ResourceKey<T>, TagKey<T>> unwrap();
 
        <E> Optional<ResourceOrTagKeyArgument.Result<E>> cast(final ResourceKey<? extends Registry<E>> registryKey);
 
        String asPrintable();
    }
 
    private record TagResult<T>(TagKey<T> key) implements ResourceOrTagKeyArgument.Result<T> {
        @Override
        public Either<ResourceKey<T>, TagKey<T>> unwrap() {
            return Either.right(this.key);
        }
 
        @Override
        public <E> Optional<ResourceOrTagKeyArgument.Result<E>> cast(ResourceKey<? extends Registry<E>> registryKey) {
            return this.key.cast(registryKey).map(ResourceOrTagKeyArgument.TagResult::new);
        }
 
        public boolean test(Holder<T> holder) {
            return holder.is(this.key);
        }
 
        @Override
        public String asPrintable() {
            return "#" + this.key.location();
        }
    }
}

引用的其他类

  • CommandSourceStack

    • 引用位置: 参数
  • SharedSuggestionProvider

    • 引用位置: 方法调用
    • 关联成员: SharedSuggestionProvider.listSuggestions()
  • Registry

    • 引用位置: 参数/字段
  • Identifier

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

    • 引用位置: 参数/字段/方法调用
    • 关联成员: ResourceKey.create()
  • TagKey

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