ScoreHolderArgument.java

net.minecraft.commands.arguments.ScoreHolderArgument

信息

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

    TODO

字段/常量

  • SUGGEST_SCORE_HOLDERS

    • 类型: SuggestionProvider<CommandSourceStack>
    • 修饰符: public static final
    • 源码定位: L34
    • 说明:

      TODO

  • EXAMPLES

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

      TODO

  • ERROR_NO_RESULTS

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

      TODO

  • multiple

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

      TODO

内部类/嵌套类型

  • net.minecraft.commands.arguments.ScoreHolderArgument.Info

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

      TODO

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

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

      TODO

  • net.minecraft.commands.arguments.ScoreHolderArgument.Result

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

      TODO

  • net.minecraft.commands.arguments.ScoreHolderArgument.SelectorResult

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

      TODO

构造器

public ScoreHolderArgument(boolean multiple) @ L50

  • 构造器名:ScoreHolderArgument
  • 源码定位:L50
  • 修饰符:public

参数:

  • multiple: boolean

说明:

TODO

方法

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

public static ScoreHolder getName(CommandContext<CommandSourceStack> context, String name) @ L54

  • 方法名:getName
  • 源码定位:L54
  • 返回类型:ScoreHolder
  • 修饰符:public static

参数:

  • context: CommandContext
  • name: String

说明:

TODO

public static Collection<ScoreHolder> getNames(CommandContext<CommandSourceStack> context, String name) @ L58

  • 方法名:getNames
  • 源码定位:L58
  • 返回类型:Collection
  • 修饰符:public static

参数:

  • context: CommandContext
  • name: String

说明:

TODO

public static Collection<ScoreHolder> getNamesWithDefaultWildcard(CommandContext<CommandSourceStack> context, String name) @ L62

  • 方法名:getNamesWithDefaultWildcard
  • 源码定位:L62
  • 返回类型:Collection
  • 修饰符:public static

参数:

  • context: CommandContext
  • name: String

说明:

TODO

public static Collection<ScoreHolder> getNames(CommandContext<CommandSourceStack> context, String name, Supplier<Collection<ScoreHolder>> wildcard) @ L66

  • 方法名:getNames
  • 源码定位:L66
  • 返回类型:Collection
  • 修饰符:public static

参数:

  • context: CommandContext
  • name: String
  • wildcard: Supplier<Collection>

说明:

TODO

public static ScoreHolderArgument scoreHolder() @ L75

  • 方法名:scoreHolder
  • 源码定位:L75
  • 返回类型:ScoreHolderArgument
  • 修饰符:public static

参数:

说明:

TODO

public static ScoreHolderArgument scoreHolders() @ L79

  • 方法名:scoreHolders
  • 源码定位:L79
  • 返回类型:ScoreHolderArgument
  • 修饰符:public static

参数:

说明:

TODO

public ScoreHolderArgument.Result parse(StringReader reader) @ L83

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

参数:

  • reader: StringReader

说明:

TODO

public <S> ScoreHolderArgument.Result parse(StringReader reader, S source) @ L87

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

参数:

  • reader: StringReader
  • source: S

说明:

TODO

private ScoreHolderArgument.Result parse(StringReader reader, boolean allowSelectors) @ L91

  • 方法名:parse
  • 源码定位:L91
  • 返回类型:ScoreHolderArgument.Result
  • 修饰符:private

参数:

  • reader: StringReader
  • allowSelectors: boolean

说明:

TODO

public Collection<String> getExamples() @ L163

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

参数:

说明:

TODO

代码

public class ScoreHolderArgument implements ArgumentType<ScoreHolderArgument.Result> {
    public static final SuggestionProvider<CommandSourceStack> SUGGEST_SCORE_HOLDERS = (context, builder) -> {
        StringReader reader = new StringReader(builder.getInput());
        reader.setCursor(builder.getStart());
        EntitySelectorParser parser = new EntitySelectorParser(reader, context.getSource().permissions().hasPermission(Permissions.COMMANDS_ENTITY_SELECTORS));
 
        try {
            parser.parse();
        } catch (CommandSyntaxException var5) {
        }
 
        return parser.fillSuggestions(builder, suggestions -> SharedSuggestionProvider.suggest(context.getSource().getOnlinePlayerNames(), suggestions));
    };
    private static final Collection<String> EXAMPLES = Arrays.asList("Player", "0123", "*", "@e");
    private static final SimpleCommandExceptionType ERROR_NO_RESULTS = new SimpleCommandExceptionType(Component.translatable("argument.scoreHolder.empty"));
    private final boolean multiple;
 
    public ScoreHolderArgument(boolean multiple) {
        this.multiple = multiple;
    }
 
    public static ScoreHolder getName(CommandContext<CommandSourceStack> context, String name) throws CommandSyntaxException {
        return getNames(context, name).iterator().next();
    }
 
    public static Collection<ScoreHolder> getNames(CommandContext<CommandSourceStack> context, String name) throws CommandSyntaxException {
        return getNames(context, name, Collections::emptyList);
    }
 
    public static Collection<ScoreHolder> getNamesWithDefaultWildcard(CommandContext<CommandSourceStack> context, String name) throws CommandSyntaxException {
        return getNames(context, name, context.getSource().getServer().getScoreboard()::getTrackedPlayers);
    }
 
    public static Collection<ScoreHolder> getNames(CommandContext<CommandSourceStack> context, String name, Supplier<Collection<ScoreHolder>> wildcard) throws CommandSyntaxException {
        Collection<ScoreHolder> result = context.getArgument(name, ScoreHolderArgument.Result.class).getNames(context.getSource(), wildcard);
        if (result.isEmpty()) {
            throw EntityArgument.NO_ENTITIES_FOUND.create();
        } else {
            return result;
        }
    }
 
    public static ScoreHolderArgument scoreHolder() {
        return new ScoreHolderArgument(false);
    }
 
    public static ScoreHolderArgument scoreHolders() {
        return new ScoreHolderArgument(true);
    }
 
    public ScoreHolderArgument.Result parse(StringReader reader) throws CommandSyntaxException {
        return this.parse(reader, true);
    }
 
    public <S> ScoreHolderArgument.Result parse(StringReader reader, S source) throws CommandSyntaxException {
        return this.parse(reader, EntitySelectorParser.allowSelectors(source));
    }
 
    private ScoreHolderArgument.Result parse(StringReader reader, boolean allowSelectors) throws CommandSyntaxException {
        if (reader.canRead() && reader.peek() == '@') {
            EntitySelectorParser parser = new EntitySelectorParser(reader, allowSelectors);
            EntitySelector selector = parser.parse();
            if (!this.multiple && selector.getMaxResults() > 1) {
                throw EntityArgument.ERROR_NOT_SINGLE_ENTITY.createWithContext(reader);
            } else {
                return new ScoreHolderArgument.SelectorResult(selector);
            }
        } else {
            int start = reader.getCursor();
 
            while (reader.canRead() && reader.peek() != ' ') {
                reader.skip();
            }
 
            String text = reader.getString().substring(start, reader.getCursor());
            if (text.equals("*")) {
                return (sender, wildcard) -> {
                    Collection<ScoreHolder> results = wildcard.get();
                    if (results.isEmpty()) {
                        throw ERROR_NO_RESULTS.create();
                    } else {
                        return results;
                    }
                };
            } else {
                List<ScoreHolder> nameOnlyHolder = List.of(ScoreHolder.forNameOnly(text));
                if (text.startsWith("#")) {
                    return (sender, wildcard) -> nameOnlyHolder;
                } else {
                    try {
                        UUID uuid = UUID.fromString(text);
                        return (sender, wildcard) -> {
                            MinecraftServer server = sender.getServer();
                            ScoreHolder firstResult = null;
                            List<ScoreHolder> moreResults = null;
 
                            for (ServerLevel level : server.getAllLevels()) {
                                Entity entity = level.getEntity(uuid);
                                if (entity != null) {
                                    if (firstResult == null) {
                                        firstResult = entity;
                                    } else {
                                        if (moreResults == null) {
                                            moreResults = new ArrayList<>();
                                            moreResults.add(firstResult);
                                        }
 
                                        moreResults.add(entity);
                                    }
                                }
                            }
 
                            if (moreResults != null) {
                                return moreResults;
                            } else {
                                return firstResult != null ? List.of(firstResult) : nameOnlyHolder;
                            }
                        };
                    } catch (IllegalArgumentException var7) {
                        return (sender, wildcard) -> {
                            MinecraftServer server = sender.getServer();
                            ServerPlayer player = server.getPlayerList().getPlayerByName(text);
                            return player != null ? List.of(player) : nameOnlyHolder;
                        };
                    }
                }
            }
        }
    }
 
    @Override
    public Collection<String> getExamples() {
        return EXAMPLES;
    }
 
    public static class Info implements ArgumentTypeInfo<ScoreHolderArgument, ScoreHolderArgument.Info.Template> {
        private static final byte FLAG_MULTIPLE = 1;
 
        public void serializeToNetwork(ScoreHolderArgument.Info.Template template, FriendlyByteBuf out) {
            int flags = 0;
            if (template.multiple) {
                flags |= 1;
            }
 
            out.writeByte(flags);
        }
 
        public ScoreHolderArgument.Info.Template deserializeFromNetwork(FriendlyByteBuf in) {
            byte flags = in.readByte();
            boolean multiple = (flags & 1) != 0;
            return new ScoreHolderArgument.Info.Template(multiple);
        }
 
        public void serializeToJson(ScoreHolderArgument.Info.Template template, JsonObject out) {
            out.addProperty("amount", template.multiple ? "multiple" : "single");
        }
 
        public ScoreHolderArgument.Info.Template unpack(ScoreHolderArgument argument) {
            return new ScoreHolderArgument.Info.Template(argument.multiple);
        }
 
        public final class Template implements ArgumentTypeInfo.Template<ScoreHolderArgument> {
            private final boolean multiple;
 
            private Template(boolean multiple) {
                Objects.requireNonNull(Info.this);
                super();
                this.multiple = multiple;
            }
 
            public ScoreHolderArgument instantiate(CommandBuildContext context) {
                return new ScoreHolderArgument(this.multiple);
            }
 
            @Override
            public ArgumentTypeInfo<ScoreHolderArgument, ?> type() {
                return Info.this;
            }
        }
    }
 
    @FunctionalInterface
    public interface Result {
        Collection<ScoreHolder> getNames(final CommandSourceStack sender, Supplier<Collection<ScoreHolder>> wildcard) throws CommandSyntaxException;
    }
 
    public static class SelectorResult implements ScoreHolderArgument.Result {
        private final EntitySelector selector;
 
        public SelectorResult(EntitySelector selector) {
            this.selector = selector;
        }
 
        @Override
        public Collection<ScoreHolder> getNames(CommandSourceStack sender, Supplier<Collection<ScoreHolder>> wildcard) throws CommandSyntaxException {
            List<? extends Entity> entities = this.selector.findEntities(sender);
            if (entities.isEmpty()) {
                throw EntityArgument.NO_ENTITIES_FOUND.create();
            } else {
                return List.copyOf(entities);
            }
        }
    }
}

引用的其他类

  • CommandSourceStack

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

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

    • 引用位置: 方法调用/构造调用
    • 关联成员: EntitySelectorParser(), EntitySelectorParser.allowSelectors()
  • Component

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

    • 引用位置: 参数/方法调用/返回值
    • 关联成员: ScoreHolder.forNameOnly()