ExperienceCommand.java

net.minecraft.server.commands.ExperienceCommand

信息

  • 全限定名:net.minecraft.server.commands.ExperienceCommand
  • 类型:public class
  • 包:net.minecraft.server.commands
  • 源码路径:src/main/java/net/minecraft/server/commands/ExperienceCommand.java
  • 起始行号:L20
  • 职责:

    TODO

字段/常量

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

      TODO

内部类/嵌套类型

  • net.minecraft.server.commands.ExperienceCommand.Type
    • 类型: enum
    • 修饰符: private static
    • 源码定位: L173
    • 说明:

      TODO

构造器

方法

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

public static void register(CommandDispatcher<CommandSourceStack> dispatcher) @ L25

  • 方法名:register
  • 源码定位:L25
  • 返回类型:void
  • 修饰符:public static

参数:

  • dispatcher: CommandDispatcher

说明:

TODO

private static int queryExperience(CommandSourceStack source, ServerPlayer target, ExperienceCommand.Type type) @ L125

  • 方法名:queryExperience
  • 源码定位:L125
  • 返回类型:int
  • 修饰符:private static

参数:

  • source: CommandSourceStack
  • target: ServerPlayer
  • type: ExperienceCommand.Type

说明:

TODO

private static int addExperience(CommandSourceStack source, Collection<?extends ServerPlayer> players, int amount, ExperienceCommand.Type type) @ L131

  • 方法名:addExperience
  • 源码定位:L131
  • 返回类型:int
  • 修饰符:private static

参数:

  • source: CommandSourceStack
  • players: Collection<?extends ServerPlayer>
  • amount: int
  • type: ExperienceCommand.Type

说明:

TODO

private static int setExperience(CommandSourceStack source, Collection<?extends ServerPlayer> players, int amount, ExperienceCommand.Type type) @ L148

  • 方法名:setExperience
  • 源码定位:L148
  • 返回类型:int
  • 修饰符:private static

参数:

  • source: CommandSourceStack
  • players: Collection<?extends ServerPlayer>
  • amount: int
  • type: ExperienceCommand.Type

说明:

TODO

代码

public class ExperienceCommand {
    private static final SimpleCommandExceptionType ERROR_SET_POINTS_INVALID = new SimpleCommandExceptionType(
        Component.translatable("commands.experience.set.points.invalid")
    );
 
    public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
        LiteralCommandNode<CommandSourceStack> command = dispatcher.register(
            Commands.literal("experience")
                .requires(Commands.hasPermission(Commands.LEVEL_GAMEMASTERS))
                .then(
                    Commands.literal("add")
                        .then(
                            Commands.argument("target", EntityArgument.players())
                                .then(
                                    Commands.argument("amount", IntegerArgumentType.integer())
                                        .executes(
                                            c -> addExperience(
                                                c.getSource(),
                                                EntityArgument.getPlayers(c, "target"),
                                                IntegerArgumentType.getInteger(c, "amount"),
                                                ExperienceCommand.Type.POINTS
                                            )
                                        )
                                        .then(
                                            Commands.literal("points")
                                                .executes(
                                                    c -> addExperience(
                                                        c.getSource(),
                                                        EntityArgument.getPlayers(c, "target"),
                                                        IntegerArgumentType.getInteger(c, "amount"),
                                                        ExperienceCommand.Type.POINTS
                                                    )
                                                )
                                        )
                                        .then(
                                            Commands.literal("levels")
                                                .executes(
                                                    c -> addExperience(
                                                        c.getSource(),
                                                        EntityArgument.getPlayers(c, "target"),
                                                        IntegerArgumentType.getInteger(c, "amount"),
                                                        ExperienceCommand.Type.LEVELS
                                                    )
                                                )
                                        )
                                )
                        )
                )
                .then(
                    Commands.literal("set")
                        .then(
                            Commands.argument("target", EntityArgument.players())
                                .then(
                                    Commands.argument("amount", IntegerArgumentType.integer(0))
                                        .executes(
                                            c -> setExperience(
                                                c.getSource(),
                                                EntityArgument.getPlayers(c, "target"),
                                                IntegerArgumentType.getInteger(c, "amount"),
                                                ExperienceCommand.Type.POINTS
                                            )
                                        )
                                        .then(
                                            Commands.literal("points")
                                                .executes(
                                                    c -> setExperience(
                                                        c.getSource(),
                                                        EntityArgument.getPlayers(c, "target"),
                                                        IntegerArgumentType.getInteger(c, "amount"),
                                                        ExperienceCommand.Type.POINTS
                                                    )
                                                )
                                        )
                                        .then(
                                            Commands.literal("levels")
                                                .executes(
                                                    c -> setExperience(
                                                        c.getSource(),
                                                        EntityArgument.getPlayers(c, "target"),
                                                        IntegerArgumentType.getInteger(c, "amount"),
                                                        ExperienceCommand.Type.LEVELS
                                                    )
                                                )
                                        )
                                )
                        )
                )
                .then(
                    Commands.literal("query")
                        .then(
                            Commands.argument("target", EntityArgument.player())
                                .then(
                                    Commands.literal("points")
                                        .executes(c -> queryExperience(c.getSource(), EntityArgument.getPlayer(c, "target"), ExperienceCommand.Type.POINTS))
                                )
                                .then(
                                    Commands.literal("levels")
                                        .executes(c -> queryExperience(c.getSource(), EntityArgument.getPlayer(c, "target"), ExperienceCommand.Type.LEVELS))
                                )
                        )
                )
        );
        dispatcher.register(Commands.literal("xp").requires(Commands.hasPermission(Commands.LEVEL_GAMEMASTERS)).redirect(command));
    }
 
    private static int queryExperience(CommandSourceStack source, ServerPlayer target, ExperienceCommand.Type type) {
        int result = type.query.applyAsInt(target);
        source.sendSuccess(() -> Component.translatable("commands.experience.query." + type.name, target.getDisplayName(), result), false);
        return result;
    }
 
    private static int addExperience(CommandSourceStack source, Collection<? extends ServerPlayer> players, int amount, ExperienceCommand.Type type) {
        for (ServerPlayer player : players) {
            type.add.accept(player, amount);
        }
 
        if (players.size() == 1) {
            source.sendSuccess(
                () -> Component.translatable("commands.experience.add." + type.name + ".success.single", amount, players.iterator().next().getDisplayName()),
                true
            );
        } else {
            source.sendSuccess(() -> Component.translatable("commands.experience.add." + type.name + ".success.multiple", amount, players.size()), true);
        }
 
        return players.size();
    }
 
    private static int setExperience(CommandSourceStack source, Collection<? extends ServerPlayer> players, int amount, ExperienceCommand.Type type) throws CommandSyntaxException {
        int success = 0;
 
        for (ServerPlayer player : players) {
            if (type.set.test(player, amount)) {
                success++;
            }
        }
 
        if (success == 0) {
            throw ERROR_SET_POINTS_INVALID.create();
        } else {
            if (players.size() == 1) {
                source.sendSuccess(
                    () -> Component.translatable("commands.experience.set." + type.name + ".success.single", amount, players.iterator().next().getDisplayName()),
                    true
                );
            } else {
                source.sendSuccess(() -> Component.translatable("commands.experience.set." + type.name + ".success.multiple", amount, players.size()), true);
            }
 
            return players.size();
        }
    }
 
    private static enum Type {
        POINTS("points", Player::giveExperiencePoints, (p, a) -> {
            if (a >= p.getXpNeededForNextLevel()) {
                return false;
            } else {
                p.setExperiencePoints(a);
                return true;
            }
        }, p -> Mth.floor(p.experienceProgress * p.getXpNeededForNextLevel())),
        LEVELS("levels", ServerPlayer::giveExperienceLevels, (p, a) -> {
            p.setExperienceLevels(a);
            return true;
        }, p -> p.experienceLevel);
 
        public final BiConsumer<ServerPlayer, Integer> add;
        public final BiPredicate<ServerPlayer, Integer> set;
        public final String name;
        private final ToIntFunction<ServerPlayer> query;
 
        private Type(String name, BiConsumer<ServerPlayer, Integer> add, BiPredicate<ServerPlayer, Integer> set, ToIntFunction<ServerPlayer> query) {
            this.add = add;
            this.name = name;
            this.set = set;
            this.query = query;
        }
    }
}

引用的其他类

  • CommandSourceStack

    • 引用位置: 参数
  • Commands

    • 引用位置: 方法调用
    • 关联成员: Commands.argument(), Commands.hasPermission(), Commands.literal()
  • EntityArgument

    • 引用位置: 方法调用
    • 关联成员: EntityArgument.getPlayer(), EntityArgument.getPlayers(), EntityArgument.player(), EntityArgument.players()
  • Component

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

    • 引用位置: 参数
  • Mth

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