User Tools

Site Tools


tutorial:blockentity_sync_itemstack

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tutorial:blockentity_sync_itemstack [2024/08/26 02:49] – removed [Changing ItemStack's BlockEntity data] because showing tooltips should not change data; improved [Helpful Reference] solidblocktutorial:blockentity_sync_itemstack [2024/08/27 02:37] (current) – [Block drops with data] solidblock
Line 5: Line 5:
 When you create a block with block entity, you might want to place the block with predefined NBT data from an ''ItemStack'' (of your ''BlockItem''), or save the ''BlockEntity'' data in the ''ItemStack'' after breaking the block. When you create a block with block entity, you might want to place the block with predefined NBT data from an ''ItemStack'' (of your ''BlockItem''), or save the ''BlockEntity'' data in the ''ItemStack'' after breaking the block.
  
-In this tutorial, we assume you have created a [[block]] (and block item) and the [[blockentity|block entity]], and [[blockentity_modifying_data|stored data for it]].+In this tutorial, we assume you have created a [[blocks|block]] (and block item) and the [[blockentity|block entity]], and [[blockentity_modify_data|stored data for it]].
  
-===== Block Drops with data =====+===== Block drops with data =====
  
-For a block to drop an ''ItemStack'' with the **Nbt** from the ''BlockEntity'' of the broken block, we only need to change the //loot table//.+For a block to drop an ''ItemStack'' with the NBT or data components from the ''BlockEntity'' of the broken block, we only need to change the //loot table//.
  
 ==== For versions since 1.20.5 ==== ==== For versions since 1.20.5 ====
Line 128: Line 128:
 } }
 </code> </code>
 +
 +Similarly, you can also modify the ''getName'' method so the data can be displayed directly in the name. In this case, you have to modify how your block item is registered to create ''DemoBlockItem'' instead of ''BlockItem''.
 +<code java DemoBlockItem.class>
 +public class DemoBlockItem extends BlockItem {
 +  public DemoBlockItem(Block block, Settings settings) {
 +    super(block, settings);
 +  }
 +
 +  @Override
 +  public Text getName(ItemStack stack) {
 +    final MutableText name = Text.translatable(stack.getTranslationKey());
 +    if (stack.contains(TutorialDataComponentTypes.NUMBER)) {
 +      name.append(" - number=" + stack.get(TutorialDataComponentTypes.NUMBER));
 +    }
 +    return name;
 +  }
 +}
 +</code>
 +
 +===== Pick item with data =====
 +In Creative Mode, when you pick item (by pressing the mouse wheel) while holding ''Ctrl'', you can get an item stack with all block entity data. However, if you don't press ''Ctrl'', you can only get one without data, unless you modify ''getPickStack'' method in the ''DemoBlock'' class:
 +<code java>
 +  @Override
 +  public ItemStack getPickStack(WorldView world, BlockPos pos, BlockState state) {
 +    final ItemStack pickStack = super.getPickStack(world, pos, state);
 +    final BlockEntity blockEntity = world.getBlockEntity(pos);
 +    if (blockEntity instanceof DemoBlockEntity demoBlockEntity) {
 +      pickStack.applyComponentsFrom(demoBlockEntity.createComponentMap());
 +    }
 +    return pickStack;
 +  }
 +</code>
 +
 +> **Note:** When ''Ctrl'' is not pressed down, pick-stack happend only on client side. Therefore, you should modify ''toUpdatePacket'' and ''toInitialChunkDataNbt'', and call ''updateListeners'' when modifying data (see [[blockentity modify data#sync data from server to client]]).
  
 ===== Helpful Reference ===== ===== Helpful Reference =====
tutorial/blockentity_sync_itemstack.1724640542.txt.gz · Last modified: 2024/08/26 02:49 by solidblock