Ниже - рабочие способы, когда нужно очистить инвентарь полностью или убрать конкретные предметы. Сразу выберу подход под ваш запрос: через команду, через плагины (Spigot/Paper) или через логику предмета.
Вариант 1. Полная очистка командой в игре
Команда /clear умеет убирать предметы из инвентарь игрока.
Очистить инвентарь игрока целиком
- Очистка инвентаря выполняющего игрока:
clear
или
clear @s
- Очистка инвентаря конкретного игрока:
clear Alice
Удалить только определенный предмет
Если нужно убрать не все вещи, а конкретный предмет:
clear Alice minecraft:wool
Можно указать максимальное количество, которое будет удалено:
clear @a minecraft:wool 1
Важно: формат идентификаторов отличается по версиям. В современных версиях используется
minecraft:идентификатор, а не старые числовыеdata/ID.
Источник по синтаксису и аргументам: Minecraft Wiki - команда /clear.
Вариант 2. Очистка инвентаря через Java-плагин (Spigot/Paper)
Если вы разрабатываете плагин и хотите управлять предметами через код, самый надежный путь - работать с коллекцией дропов в событиях или напрямую править инвентарь.
Убрать предмет из дропов при смерти (пример)
Когда нужно удалить конкретный предмет, который иначе выпал бы после смерти:
@EventHandler
public void onDeath(PlayerDeathEvent e) {
e.getEntity().getInventory().remove(Material.BARRIER);
}
В обсуждениях также встречается подход через event.getDrops(), если вы хотите убрать именно выпадающие предметы:
@EventHandler
public void onDeath(PlayerDeathEvent e) {
e.getDrops().removeIf(item -> item.getType() == Material.BARRIER);
}
Как удалять конкретные варианты предметов (метаданные/NBT)
Чтобы удаление срабатывало только для нужного варианта, сравнивайте больше параметров, чем просто Material.
В примерных решениях используют проверку getItemDamage() и сравнение тегов:
- сопоставление meta/damage
- проверка совпадения NBT через ItemStack.areItemStackTagsEqual(...)
Вариант 3. Нажатием ПКМ: удалить N предметов у игрока
Если вы делаете кастомный item и по ПКМ хотите удалить 10 штук из инвентарь, логика обычно такая:
1) находим, сколько нужного типа предметов есть в player.inventory.mainInventory
2) если в сумме 10 и больше - удаляем ровно 10
В примерах для этого использовался подход через consumeInventoryItem, который “съедает” предметы из инвентаря (по сути уменьшает количество до нужного остатка).
Пример логики на ПКМ: удалить 10 предметов одного типа
Ниже упрощенный вариант идеи из практических решений:
@Override
public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player) {
Item findItem = Items.stick;
int total = 0;
for (ItemStack stack : player.inventory.mainInventory) {
if (stack != null && stack.getItem() == findItem) {
total += stack.stackSize;
}
if (total >= 10) break;
}
if (total >= 10) {
for (int j = 0; j < 10; j++) {
player.inventory.consumeInventoryItem(findItem);
}
}
return super.onItemRightClick(is, world, player);
}
Если предмет должен удаляться с учетом конкретного варианта (meta, зачарования, NBT), то вместо сравнения только по getItem() нужно сравнивать метадату и теги, как в примерах с getItemDamage() и areItemStackTagsEqual(...).
Частые ошибки
| Проблема | Почему так выходит | Как исправить |
|---|---|---|
Команда /clear не удаляет то, что ожидаете |
Неправильный формат предмета или неверный id для вашей версии | Используйте minecraft:... и точный идентификатор предмета |
| Удаляете “не тот” вариант предмета | Сравниваете только Material/тип, но игнорируете метаданные или NBT |
Делайте сравнение через meta/теги или удаляйте по точному NBT |
| В цикле удаление “ломается” | Ошибка счетчика или попытка удалить больше/меньше чем нужно | Сначала посчитайте, затем удаляйте фиксированное число (например, 10) |
| В коде ничего не меняется | Вы удаляете предмет из коллекции, где его нет (например, из дропов, а нужно править инвентарь) | Удаляйте из правильного объекта: inventory или event.getDrops() |
Полезные ссылки
- Minecraft Wiki: команда
/clear- https://minecraft.fandom.com/ru/wiki/%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%8B%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D0%B8/clear - Пример удаления N предметов через ПКМ (обсуждение с
consumeInventoryItem) - https://forum.mcmodding.ru/threads/kak-zabirat-iz-inventarja-igroka-srazu-neskolko-predmetov-odnogo-tipa.8737/ - Удаление предметов с data/метадатой (обсуждение для вариантов предметов) - https://rubukkit.org/threads/kak-udalit-s-inventarja-igroka-predmet-s-data.172305/
- Удаление предмета при смерти через событие (пример для Spigot/Paper) - https://spigotmc.ru/threads/kak-udalit-predmet-iz-inventarja-igroka-pri-ego-smerti.7729/