package net.minecraft.server.commands; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import java.util.Collection; import java.util.Collections; import java.util.function.Predicate; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.commands.arguments.item.ItemPredicateArgument; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; public class ClearInventoryCommands { private static final DynamicCommandExceptionType ERROR_SINGLE = new DynamicCommandExceptionType( object -> Component.translatableEscape("clear.failed.single", object) ); private static final DynamicCommandExceptionType ERROR_MULTIPLE = new DynamicCommandExceptionType( object -> Component.translatableEscape("clear.failed.multiple", object) ); public static void register(CommandDispatcher dispatcher, CommandBuildContext context) { dispatcher.register( Commands.literal("clear") .requires(commandSourceStack -> commandSourceStack.hasPermission(2)) .executes( commandContext -> clearUnlimited(commandContext.getSource(), Collections.singleton(commandContext.getSource().getPlayerOrException()), itemStack -> true) ) .then( Commands.argument("targets", EntityArgument.players()) .executes(commandContext -> clearUnlimited(commandContext.getSource(), EntityArgument.getPlayers(commandContext, "targets"), itemStack -> true)) .then( Commands.argument("item", ItemPredicateArgument.itemPredicate(context)) .executes( commandContext -> clearUnlimited( commandContext.getSource(), EntityArgument.getPlayers(commandContext, "targets"), ItemPredicateArgument.getItemPredicate(commandContext, "item") ) ) .then( Commands.argument("maxCount", IntegerArgumentType.integer(0)) .executes( commandContext -> clearInventory( commandContext.getSource(), EntityArgument.getPlayers(commandContext, "targets"), ItemPredicateArgument.getItemPredicate(commandContext, "item"), IntegerArgumentType.getInteger(commandContext, "maxCount") ) ) ) ) ) ); } private static int clearUnlimited(CommandSourceStack source, Collection targets, Predicate filter) throws CommandSyntaxException { return clearInventory(source, targets, filter, -1); } private static int clearInventory(CommandSourceStack source, Collection targetPlayers, Predicate itemPredicate, int maxCount) throws CommandSyntaxException { int i = 0; for (ServerPlayer serverPlayer : targetPlayers) { i += serverPlayer.getInventory().clearOrCountMatchingItems(itemPredicate, maxCount, serverPlayer.inventoryMenu.getCraftSlots()); serverPlayer.containerMenu.broadcastChanges(); serverPlayer.inventoryMenu.slotsChanged(serverPlayer.getInventory()); } if (i == 0) { if (targetPlayers.size() == 1) { throw ERROR_SINGLE.create(((ServerPlayer)targetPlayers.iterator().next()).getName()); } else { throw ERROR_MULTIPLE.create(targetPlayers.size()); } } else { int j = i; if (maxCount == 0) { if (targetPlayers.size() == 1) { source.sendSuccess(() -> Component.translatable("commands.clear.test.single", j, ((ServerPlayer)targetPlayers.iterator().next()).getDisplayName()), true); } else { source.sendSuccess(() -> Component.translatable("commands.clear.test.multiple", j, targetPlayers.size()), true); } } else if (targetPlayers.size() == 1) { source.sendSuccess(() -> Component.translatable("commands.clear.success.single", j, ((ServerPlayer)targetPlayers.iterator().next()).getDisplayName()), true); } else { source.sendSuccess(() -> Component.translatable("commands.clear.success.multiple", j, targetPlayers.size()), true); } return i; } } }