tutorial:containers
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
tutorial:containers [2020/02/27 16:19] – [Orgnizing] typo mkpoli | tutorial:containers [2020/04/02 11:04] – [Block and BlockItem] Replace BlockWithEntity with BlockEntityProvider and other cleanup earthcomputer | ||
---|---|---|---|
Line 3: | Line 3: | ||
==== Block and BlockItem ==== | ==== Block and BlockItem ==== | ||
- | First we need to create Block and register it as well as its BlockItem. | + | First we need to create |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
- | public class BiggerChestBlock extends | + | public class BiggerChestBlock extends |
public BiggerChestBlock(Settings settings) { | public BiggerChestBlock(Settings settings) { | ||
super(settings); | super(settings); | ||
- | } | ||
- | |||
- | // We need to explicitly return a MODEL render type because BlockWithEntity has a side-effect of not showing the model. | ||
- | // You can also implement BlockEntityProvider Type to avoid this side-effect. | ||
- | public BlockRenderType getRenderType(BlockState state) { | ||
- | return BlockRenderType.MODEL; | ||
} | } | ||
// We will create the BlockEntity later. | // We will create the BlockEntity later. | ||
+ | @Override | ||
public BlockEntity createBlockEntity(BlockView view) { | public BlockEntity createBlockEntity(BlockView view) { | ||
return new BiggerChestBlockEntity(); | return new BiggerChestBlockEntity(); | ||
} | } | ||
+ | @Override | ||
public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { | public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { | ||
if (itemStack.hasCustomName()) { | if (itemStack.hasCustomName()) { | ||
Line 31: | Line 27: | ||
} | } | ||
+ | @Override | ||
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { | public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { | ||
if (!world.isClient) { | if (!world.isClient) { | ||
Line 42: | Line 39: | ||
// Scatter the items in the chest when it is removed. | // Scatter the items in the chest when it is removed. | ||
+ | @Override | ||
public void onBlockRemoved(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { | public void onBlockRemoved(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { | ||
if (state.getBlock() != newState.getBlock()) { | if (state.getBlock() != newState.getBlock()) { | ||
Line 47: | Line 45: | ||
if (blockEntity instanceof BiggerChestBlockEntity) { | if (blockEntity instanceof BiggerChestBlockEntity) { | ||
ItemScatterer.spawn(world, | ItemScatterer.spawn(world, | ||
+ | // update comparators | ||
world.updateHorizontalAdjacent(pos, | world.updateHorizontalAdjacent(pos, | ||
} | } | ||
Line 53: | Line 52: | ||
} | } | ||
+ | @Override | ||
public boolean hasComparatorOutput(BlockState state) { | public boolean hasComparatorOutput(BlockState state) { | ||
return true; | return true; | ||
} | } | ||
+ | @Override | ||
public int getComparatorOutput(BlockState state, World world, BlockPos pos) { | public int getComparatorOutput(BlockState state, World world, BlockPos pos) { | ||
return Container.calculateComparatorOutput(world.getBlockEntity(pos)); | return Container.calculateComparatorOutput(world.getBlockEntity(pos)); | ||
Line 84: | Line 85: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | You may refer to other tutorials to modify the appearance and other properties of the Block by adding models or adjusting rendering later. | ||
==== BlockEntity ==== | ==== BlockEntity ==== | ||
- | BlockEntities are used for managing container inventories. Actually, it implements Inventory interface. | + | BlockEntity is used for managing container inventories. Actually, it implements Inventory interface. It is required to save and load the inventory. |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
Line 252: | Line 255: | ||
[...] | [...] | ||
ContainerProviderRegistry.INSTANCE.registerFactory(BIGGER_CHEST, | ContainerProviderRegistry.INSTANCE.registerFactory(BIGGER_CHEST, | ||
- | final BlockEntity blockEntity | + | final World world = player.world; |
- | return((BiggerChestBlockEntity) blockEntity).createContainer(syncId, player.inventory); | + | final BlockPos pos = buf.readBlockPos(); |
+ | return | ||
}); | }); | ||
} | } |
tutorial/containers.txt · Last modified: 2022/05/27 15:57 by solidblock