Minecraft – How to give a player an item with custom properties

minecraft-bedrock-editionminecraft-commands

I'm used to creating Java Edition Minecraft maps, where NBT can be used to set many different block, item, and entity properties, like an item's CanPlaceOn/CanDestroy list, a chest's items, and more!

To open my maps up to more players, I've started creating maps on Minecraft Bedrock Edition as well. But NBT is inaccessible from commands in BE, which I knew before, but didn't know how much of a problem I would have creating these complicated command chains.

One of the things that I've always been doing is giving players items with custom item names, lores, enchantments, and other properties.

But there is a problem. All this would have been done in NBT in Java Edition. In Bedrock, NBT is inaccessible from commands, meaning the commands I used in JE don't work. Are my dreams crushed?


Browse more workarounds for getting/setting NBT in Bedrock Edition

Best Answer

Instead of storing the item in a chest, you store it in a structure by saving a 1×1 structure that consists of just air and the item entities. So the step by step guide is:

  1. Throw item(s) on top of a structure block, save the structure with entities (probably as a 1×1×1 sized structure).
  2. Change the structure block to load mode.
  3. When activated, load the structure at the player's position.

Now that you know the plan, let's begin!

Step 1: Customize your item

So to do this, you're going to need to prepare your item in your inventory. Please observe the following things that you can do to prepare your item:

Properties that can be set/changed without using this method

You can set the following item properties in a direct command without having to use this method:

  • Default potion effects: Potions can be given as one of the default potions available in the Creative Inventory using data values.
  • CanPlaceOn and CanDestroy: If you want to give an item with these properties alone, you can simply use /give with the JSON components.

Properties you can set/change with this method

The following properties can be changed within the game using this method:

  • Custom name: Take your item to an anvil. Use the anvil’s rename form to change the item name. Instead of using raw JSON text, use formatting codes to stylize the item name.
  • Some enchantments: Get an enchanted book and combine it with your item in an anvil. You may also use /enchant while holding the item in your main hand. You may not exceed the maximum enchantment level, and you may not enchant items that don't make sense with that enchantment (so no enchanting a fish with Knockback X), but you can use an NBT editor—see below.
  • Filled maps: To give a filled map with custom scale/regions/ to a player, get an empty map yourself, bring it to the region, and activate it. Then place the filled map in the chest. This method is also required to give an empty locator map, because the locator/non-locator data is stored in NBT.

Properties that require an NBT editor to be set/changed

The following properties can be changed through one-time use of an NBT editor. Follow these instructions to modify any of the below listed properties, and place the item in the chest. The below commands will then work to give an exact copy of the item, even with some properties changed, without requiring use of an NBT editor ever again.

  • Lore
  • Unbreakable (won't display on tooltip but still takes effect)
  • Enchantments that an anvil is unable to apply to an item

Properties you cannot set/change

These are item tags that exist in Java Edition, but the matching NBT tag in Bedrock Edition has not been discovered, or is nonexistent. Feel free to tinker with the NBT tags in an editor, and if you can find any new NBT tags, please comment so I can add to this post!

  • Custom potion effects

Step 2: Create the setup

Next we need to create the setup of structures. This is how:

  1. Ensure you have positional coordinates shown. If not, run this command in your chat:

    gamerule showcoordinates true
    
  2. Pick a block on the ground. Any block will do, as long as it is a full block (not bottom slab, not chest, not soul sand, etc.). Stand on it, and note the coordinates that are currently in your position.

  3. You need a structure void for this. Type the following command in your chat:

    give @s structure_void
    
  4. Place the structure void on the block of ground you picked in step 1.

  5. Throw the item that you have customized onto the ground there too. Ensure it is in the same block as the structure void, not next to it.
    From this point, you have 5 minutes to complete the next step. Take too long and your items will disappear!

  6. Run the following command to save the structure:

    structure save <name: string> <from: x y z> <to: x y z> true disk false
    

    But replace the following items in the above command:

    • Replace <name: string> with a memorable name for your structure. Do not forget it or else you will have to create another one without deleting the old one, taking up memory slowly. How wasteful!
    • Replace <from: x y z> with the X, Y, and Z coordinates that I told you to write down in step 1.
    • Replace <to: x y z> with the X, Y, and Z coordinates that I told you to write down in step 1. This means that you should have specified the same coordinates twice.

Step 3: Setup the commands

Setting up the commands is the last thing we need to do before our setup is complete! Place down a single impulse command block that will activate to give our player the item.

That's right, only one command is needed for this:

execute @p[name=target_player] ~ ~ ~ structure load <name: string> ~ ~ ~

Replace <name: string> with the name you saved your structure as. Don't remember it? Now you have to go back to step 2 and create a new structure without deleting the old one because you don't remember its name. How wasteful!

Once you've set up this command block, run it, and you should see that the item entities are summoned right on top of you so you don't need to run and fetch them. Hooray!