package net.minecraft.server.commands; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import com.mojang.brigadier.tree.LiteralCommandNode; import java.util.Collection; import java.util.function.BiConsumer; import java.util.function.BiPredicate; import java.util.function.ToIntFunction; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; 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 p_137307_) { LiteralCommandNode literalcommandnode = p_137307_.register( Commands.literal("experience") .requires(p_137324_ -> p_137324_.hasPermission(2)) .then( Commands.literal("add") .then( Commands.argument("target", EntityArgument.players()) .then( Commands.argument("amount", IntegerArgumentType.integer()) .executes( p_137341_ -> addExperience( p_137341_.getSource(), EntityArgument.getPlayers(p_137341_, "target"), IntegerArgumentType.getInteger(p_137341_, "amount"), ExperienceCommand.Type.POINTS ) ) .then( Commands.literal("points") .executes( p_137339_ -> addExperience( p_137339_.getSource(), EntityArgument.getPlayers(p_137339_, "target"), IntegerArgumentType.getInteger(p_137339_, "amount"), ExperienceCommand.Type.POINTS ) ) ) .then( Commands.literal("levels") .executes( p_137337_ -> addExperience( p_137337_.getSource(), EntityArgument.getPlayers(p_137337_, "target"), IntegerArgumentType.getInteger(p_137337_, "amount"), ExperienceCommand.Type.LEVELS ) ) ) ) ) ) .then( Commands.literal("set") .then( Commands.argument("target", EntityArgument.players()) .then( Commands.argument("amount", IntegerArgumentType.integer(0)) .executes( p_137335_ -> setExperience( p_137335_.getSource(), EntityArgument.getPlayers(p_137335_, "target"), IntegerArgumentType.getInteger(p_137335_, "amount"), ExperienceCommand.Type.POINTS ) ) .then( Commands.literal("points") .executes( p_137333_ -> setExperience( p_137333_.getSource(), EntityArgument.getPlayers(p_137333_, "target"), IntegerArgumentType.getInteger(p_137333_, "amount"), ExperienceCommand.Type.POINTS ) ) ) .then( Commands.literal("levels") .executes( p_137331_ -> setExperience( p_137331_.getSource(), EntityArgument.getPlayers(p_137331_, "target"), IntegerArgumentType.getInteger(p_137331_, "amount"), ExperienceCommand.Type.LEVELS ) ) ) ) ) ) .then( Commands.literal("query") .then( Commands.argument("target", EntityArgument.player()) .then( Commands.literal("points") .executes( p_137322_ -> queryExperience( p_137322_.getSource(), EntityArgument.getPlayer(p_137322_, "target"), ExperienceCommand.Type.POINTS ) ) ) .then( Commands.literal("levels") .executes( p_137309_ -> queryExperience( p_137309_.getSource(), EntityArgument.getPlayer(p_137309_, "target"), ExperienceCommand.Type.LEVELS ) ) ) ) ) ); p_137307_.register(Commands.literal("xp").requires(p_137311_ -> p_137311_.hasPermission(2)).redirect(literalcommandnode)); } private static int queryExperience(CommandSourceStack p_137313_, ServerPlayer p_137314_, ExperienceCommand.Type p_137315_) { int i = p_137315_.query.applyAsInt(p_137314_); p_137313_.sendSuccess(() -> Component.translatable("commands.experience.query." + p_137315_.name, p_137314_.getDisplayName(), i), false); return i; } private static int addExperience(CommandSourceStack p_137317_, Collection p_137318_, int p_137319_, ExperienceCommand.Type p_137320_) { for (ServerPlayer serverplayer : p_137318_) { p_137320_.add.accept(serverplayer, p_137319_); } if (p_137318_.size() == 1) { p_137317_.sendSuccess( () -> Component.translatable( "commands.experience.add." + p_137320_.name + ".success.single", p_137319_, p_137318_.iterator().next().getDisplayName() ), true ); } else { p_137317_.sendSuccess( () -> Component.translatable("commands.experience.add." + p_137320_.name + ".success.multiple", p_137319_, p_137318_.size()), true ); } return p_137318_.size(); } private static int setExperience(CommandSourceStack p_137326_, Collection p_137327_, int p_137328_, ExperienceCommand.Type p_137329_) throws CommandSyntaxException { int i = 0; for (ServerPlayer serverplayer : p_137327_) { if (p_137329_.set.test(serverplayer, p_137328_)) { i++; } } if (i == 0) { throw ERROR_SET_POINTS_INVALID.create(); } else { if (p_137327_.size() == 1) { p_137326_.sendSuccess( () -> Component.translatable( "commands.experience.set." + p_137329_.name + ".success.single", p_137328_, p_137327_.iterator().next().getDisplayName() ), true ); } else { p_137326_.sendSuccess( () -> Component.translatable("commands.experience.set." + p_137329_.name + ".success.multiple", p_137328_, p_137327_.size()), true ); } return p_137327_.size(); } } static enum Type { POINTS("points", Player::giveExperiencePoints, (p_358589_, p_358590_) -> { if (p_358590_ >= p_358589_.getXpNeededForNextLevel()) { return false; } else { p_358589_.setExperiencePoints(p_358590_); return true; } }, p_358591_ -> Mth.floor(p_358591_.experienceProgress * (float)p_358591_.getXpNeededForNextLevel())), LEVELS("levels", ServerPlayer::giveExperienceLevels, (p_137360_, p_137361_) -> { p_137360_.setExperienceLevels(p_137361_); return true; }, p_287335_ -> p_287335_.experienceLevel); public final BiConsumer add; public final BiPredicate set; public final String name; final ToIntFunction query; private Type( final String p_137353_, final BiConsumer p_137354_, final BiPredicate p_137355_, final ToIntFunction p_137356_ ) { this.add = p_137354_; this.name = p_137353_; this.set = p_137355_; this.query = p_137356_; } } }