Minecraft – How to remove specific NBT items from player inventory without data packs

minecraft-commandsminecraft-java-edition

I created a level-based minigame, and every level, it checks your inventory, and makes sure you don't have any forbidden items. I make items forbidden my adding a tag to them: discard:1b. Any items that should get removed from the inventory at the end of each level get this tag, so they are discarded.

I then started working on the clear command, and I found that you cannot remove items based upon NBT, but rather only by item, although you can add an NBT specification to items afterwards.

I then saw this answer, and got excited, but then I realized it used datapacks, and that would not be an option for me.
I looked around a bit more, and discovered this, who had a very similar problem to me, but its only answer was something I already knew how to do, and it wasn't enough.

Best Answer

You can do this using /replaceitem and a technique similar to the one described in Fabian Röling's answer to this related question:

/execute if entity @s[nbt={Inventory:[{Slot:0b,tag:{discard:1b}}]}] run replaceitem entity @s hotbar.0 air
…
/execute if entity @s[nbt={Inventory:[{Slot:8b,tag:{discard:1b}}]}] run replaceitem entity @s hotbar.8 air
/execute if entity @s[nbt={Inventory:[{Slot:9b,tag:{discard:1b}}]}] run replaceitem entity @s inventory.0 air
…
/execute if entity @s[nbt={Inventory:[{Slot:35b,tag:{discard:1b}}]}] run replaceitem entity @s inventory.26 air
/execute if entity @s[nbt={Inventory:[{Slot:-106b,tag:{discard:1b}}]}] run replaceitem entity @s weapon.offhand air