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 13:46] – typo mkpoli | tutorial:containers [2020/04/02 11:05] – Add more @Override annotations 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 188: | Line 191: | ||
// Shift + Player Inv Slot | // Shift + Player Inv Slot | ||
+ | @Override | ||
public ItemStack transferSlot(PlayerEntity player, int invSlot) { | public ItemStack transferSlot(PlayerEntity player, int invSlot) { | ||
ItemStack newStack = ItemStack.EMPTY; | ItemStack newStack = ItemStack.EMPTY; | ||
Line 249: | Line 253: | ||
public static final String BIGGER_CHEST_TRANSLATION_KEY = Util.createTranslationKey(" | public static final String BIGGER_CHEST_TRANSLATION_KEY = Util.createTranslationKey(" | ||
+ | @Override | ||
public void onInitialize() { | public void onInitialize() { | ||
[...] | [...] | ||
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 | ||
}); | }); | ||
} | } | ||
Line 259: | Line 265: | ||
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
+ | @Override | ||
public void onInitializeClient() { | public void onInitializeClient() { | ||
[...] | [...] | ||
Line 265: | Line 272: | ||
</ | </ | ||
- | ==== Orgnizing | + | ==== Organizing |
After all the steps, you should have your ExampleMod Class and ExampleClientMod Class as such: | After all the steps, you should have your ExampleMod Class and ExampleClientMod Class as such: | ||
tutorial/containers.txt · Last modified: 2022/05/27 15:57 by solidblock