User Tools

Site Tools


tutorial:containers

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
Last revisionBoth sides next revision
tutorial:containers [2020/02/27 16:34] – adjusment mkpolitutorial:containers [2020/08/14 07:49] – evil cast my smol brain no understand leocth2
Line 10: Line 10:
         super(settings);         super(settings);
     }     }
- +     
-    // We need to explicitly return a MODEL render type because BlockWithEntity has a side-effect of not showing the model. +    // side effect of extending BlockWithEntity is it changes the render type to INVISIBLE, so we have to revert this 
-    // You can also implement BlockEntityProvider Type to avoid this side-effect.+    @Override
     public BlockRenderType getRenderType(BlockState state) {     public BlockRenderType getRenderType(BlockState state) {
         return BlockRenderType.MODEL;         return BlockRenderType.MODEL;
Line 18: Line 18:
  
     // 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 33:
     }     }
  
 +    @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 45:
  
     // 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()) {
             BlockEntity blockEntity = world.getBlockEntity(pos);             BlockEntity blockEntity = world.getBlockEntity(pos);
             if (blockEntity instanceof BiggerChestBlockEntity) {             if (blockEntity instanceof BiggerChestBlockEntity) {
-                ItemScatterer.spawn(world, (BlockPos)pos, (Inventory)((BiggerChestBlockEntity)blockEntity));+                ItemScatterer.spawn(world, pos, (BiggerChestBlockEntity)blockEntity); 
 +                // update comparators
                 world.updateHorizontalAdjacent(pos, this);                 world.updateHorizontalAdjacent(pos, this);
             }             }
Line 53: Line 58:
     }     }
  
 +    @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 74: Line 81:
     public static final Identifier BIGGER_CHEST = new Identifier(MOD_ID, "bigger_chest_block");     public static final Identifier BIGGER_CHEST = new Identifier(MOD_ID, "bigger_chest_block");
  
-    public static final Block BIGGER_CHEST_BLOCK = new BiggerChestBlock(FabricBlockSettings.of(Material.METAL).build());+    public static final Block BIGGER_CHEST_BLOCK = new BiggerChestBlock(FabricBlockSettings.of(Material.METAL));
        
     @Override     @Override
Line 80: Line 87:
     {     {
         Registry.register(Registry.BLOCK, BIGGER_CHEST, BIGGER_CHEST_BLOCK);         Registry.register(Registry.BLOCK, BIGGER_CHEST, BIGGER_CHEST_BLOCK);
-        Registry.register(Registry.BLOCK, BIGGER_CHEST, new BlockItem(BIGGER_CHEST_BLOCK, new Item.Settings().group(ItemGroup.REDSTONE)));+        Registry.register(Registry.ITEM, BIGGER_CHEST, new BlockItem(BIGGER_CHEST_BLOCK, new Item.Settings().group(ItemGroup.REDSTONE)));
     }     }
 } }
Line 106: Line 113:
  
     @Override     @Override
-    protected Container createContainer(int syncId, PlayerInventory playerInventory) { +    protected ScreenHandler createScreenHandler(int syncId, PlayerInventory playerInventory) { 
-        return new BiggerChestContainer(syncId, playerInventory, (Inventory) this);+        return new BiggerChestScreenHandler(syncId, playerInventory, (Inventory) this);
     }     }
  
Line 121: Line 128:
  
     @Override     @Override
-    public int getInvSize() {+    public int size() {
         return INVENTORY_SIZE;         return INVENTORY_SIZE;
     }     }
Line 128: Line 135:
     public void fromTag(CompoundTag tag) {     public void fromTag(CompoundTag tag) {
         super.fromTag(tag);         super.fromTag(tag);
-        this.inventory = DefaultedList.ofSize(this.getInvSize(), ItemStack.EMPTY);+        this.inventory = DefaultedList.ofSize(this.size(), ItemStack.EMPTY);
         if (!this.deserializeLootTable(tag)) {         if (!this.deserializeLootTable(tag)) {
             Inventories.fromTag(tag, this.inventory);             Inventories.fromTag(tag, this.inventory);
Line 146: Line 153:
  
 ==== Container GUI and Screen ==== ==== Container GUI and Screen ====
-We need a Container Class and a ContainerScreen Class to display and sync the GUI. Container Classes are used to synchronize GUI state between the server and the client. ContainerScreen Classes are fully client-sided and are responsible for drawing GUI elements.+We need a ScreenHandler Class and a HandledScreen Class to display and sync the GUI. ScreenHandler classes are used to synchronize GUI state between the server and the client. HandledScreen classes are fully client-sided and are responsible for drawing GUI elements.
  
-<code java [enable_line_numbers="true"BiggerChestContainer.java> +<code java [enable_line_numbers="true"BiggerChestScreenHandler.java> 
-public class BiggerChestContainer extends Container {+public class BiggerChestScreenHandler extends ScreenHandler {
     private final Inventory inventory; // Chest inventory     private final Inventory inventory; // Chest inventory
     private static final int INVENTORY_SIZE = 54; // 6 rows * 9 cols     private static final int INVENTORY_SIZE = 54; // 6 rows * 9 cols
  
-    protected BiggerChestContainer(int syncId, PlayerInventory playerInventory, Inventory inventory) { +    protected BiggerChestScreenHandler(int syncId, PlayerInventory playerInventory, Inventory inventory) { 
-        super(null, syncId); // Since we didn't create a ContainerType, we will place null here.+        super(null, syncId); // Since we didn't create a ScreenHandlerType, we will place null here.
         this.inventory = inventory;         this.inventory = inventory;
-        checkContainerSize(inventory, INVENTORY_SIZE); +        checkSize(inventory, INVENTORY_SIZE); 
-        inventory.onInvOpen(playerInventory.player);+        inventory.onOpen(playerInventory.player);
  
-        // Creating Slots for GUI. A Slot is essentially a correspoding from inventory itemstacks to the GUI position.+        // Creating Slots for GUI. A Slot is essentially a corresponding from inventory ItemStacks to the GUI position.
         int i;         int i;
         int j;         int j;
Line 186: Line 193:
     @Override     @Override
     public boolean canUse(PlayerEntity player) {     public boolean canUse(PlayerEntity player) {
-        return this.inventory.canPlayerUseInv(player);+        return this.inventory.canPlayerUse(player);
     }     }
  
     // 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 217: Line 225:
  
 <code java [enable_line_numbers="true"] BiggerChestScreen.java> <code java [enable_line_numbers="true"] BiggerChestScreen.java>
-public class BiggerChestScreen extends ContainerScreen<BiggerChestContainer> {+public class BiggerChestScreen extends HandledScreen<BiggerChestScreenHandler> {
  
     // a path to gui texture, you may replace it with new Identifier(YourMod.MOD_ID, "textures/gui/container/your_container.png");     // a path to gui texture, you may replace it with new Identifier(YourMod.MOD_ID, "textures/gui/container/your_container.png");
     private static final Identifier TEXTURE = new Identifier("textures/gui/container/generic_54.png");     private static final Identifier TEXTURE = new Identifier("textures/gui/container/generic_54.png");
  
-    public BiggerChestScreen(BiggerChestContainer container, PlayerInventory playerInventory, Text title) { +    public BiggerChestScreen(BiggerChestScreenHandler handler, PlayerInventory playerInventory, Text title) { 
-        super(container, playerInventory, title); +        super(handler, playerInventory, title); 
-        this.containerHeight = 114 + 6 * 18;+        this.backgroundHeight = 114 + 6 * 18;
     }     }
  
     @Override     @Override
-    protected void drawForeground(int mouseX, int mouseY) { +    protected void drawForeground(MatrixStack matrices, int mouseX, int mouseY) { 
-        this.font.draw(this.title.asFormattedString(), 8.0F, 6.0F, 4210752); +        this.textRenderer.draw(matrices, this.title.asString(), 8.0F, 6.0F, 4210752); 
-        this.font.draw(this.playerInventory.getDisplayName().asFormattedString(), 8.0F, (float)(this.containerHeight - 96 + 2), 4210752);+        this.textRenderer.draw(matrices, this.playerInventory.getDisplayName().asString(), 8.0F, (float)(this.backgroundHeight - 96 + 2), 4210752);
     }     }
  
Line 236: Line 244:
     protected void drawBackground(float delta, int mouseX, int mouseY) {     protected void drawBackground(float delta, int mouseX, int mouseY) {
         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-        this.minecraft.getTextureManager().bindTexture(TEXTURE); +        this.client.getTextureManager().bindTexture(TEXTURE); 
-        int i = (this.width - this.containerWidth) / 2; +        int i = (this.width - this.backgroundWidth) / 2; 
-        int j = (this.height - this.containerHeight) / 2; +        int j = (this.height - this.backgroundHeight) / 2; 
-        this.blit(i, j, 0, 0, this.containerWidth, 6 * 18 + 17); +        this.blit(i, j, 0, 0, this.backgroundWidth, 6 * 18 + 17); 
-        this.blit(i, j + 6 * 18 + 17, 0, 126, this.containerWidth, 96);+        this.blit(i, j + 6 * 18 + 17, 0, 126, this.backgroundWidth, 96);
     }     }
 } }
Line 251: Line 259:
     public static final String BIGGER_CHEST_TRANSLATION_KEY = Util.createTranslationKey("container", BIGGER_CHEST);     public static final String BIGGER_CHEST_TRANSLATION_KEY = Util.createTranslationKey("container", BIGGER_CHEST);
  
 +    @Override
     public void onInitialize() {     public void onInitialize() {
         [...]         [...]
Line 262: Line 271:
  
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
 +    @Override
     public void onInitializeClient() {     public void onInitializeClient() {
         [...]         [...]
tutorial/containers.txt · Last modified: 2022/05/27 15:57 by solidblock