package com.minelittlepony.unicopia.container; import net.minecraft.container.Container; import net.minecraft.container.Slot; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; import net.minecraft.util.Hand; import net.minecraft.util.Identifier; import net.minecraft.util.PacketByteBuf; public class BagOfHoldingContainer extends Container { private final BagOfHoldingInventory inventory; private ItemStack sourceStack; public BagOfHoldingContainer(int sync, Identifier id, PlayerEntity player, PacketByteBuf buf) { super(null, sync); sourceStack = player.getStackInHand(Hand.MAIN_HAND); inventory = BagOfHoldingInventory.getInventoryFromStack(sourceStack); inventory.onInvOpen(player); close(player); final int LEFT_MARGIN = 8; final int TOP_MARGIN = 18; final int containerRows = (int)Math.ceil(inventory.getInvSize() / 9); final int inventoryRows = (int)Math.ceil((player.inventory.getInvSize() - 9) / 9); for (int i = 0; i < inventory.getInvSize(); i++) { int slotX = (i % 9) * 18; int slotY = (int)Math.floor(i / 9) * 18; addSlot(new SlotOfHolding(inventory, i, LEFT_MARGIN + slotX, TOP_MARGIN + slotY)); } int inventoryY = (containerRows * 18) + 8; int hotbarY = inventoryY + TOP_MARGIN + (inventoryRows * 18) + 4; for (int i = 9; i < player.inventory.getInvSize() - 5; i++) { int slotX = (i % 9) * 18; int slotY = (int)Math.floor(i / 9) * 18; addSlot(new Slot(player.inventory, i, LEFT_MARGIN + slotX, inventoryY + slotY)); } for (int i = 0; i < 9; i++) { addSlot(new Slot(player.inventory, i, LEFT_MARGIN + i * 18, hotbarY)); } } @Override public void close(PlayerEntity player) { inventory.writeTostack(sourceStack); inventory.onInvClose(player); super.close(player); } @Override public boolean canUse(PlayerEntity playerIn) { return true; } @Override public ItemStack transferSlot(PlayerEntity playerIn, int index) { ItemStack resultingStack = ItemStack.EMPTY; Slot slot = slots.get(index); if (slot != null && slot.hasStack()) { ItemStack originalStack = slot.getStack(); resultingStack = originalStack.copy(); if (index < inventory.getInvSize()) { if (!insertItem(originalStack, inventory.getInvSize(), slots.size(), true)) { return ItemStack.EMPTY; } } else if (!insertItem(originalStack, 0, inventory.getInvSize(), false)) { return ItemStack.EMPTY; } if (originalStack.isEmpty()) { slot.setStack(ItemStack.EMPTY); } else { slot.markDirty(); } } return resultingStack; } class SlotOfHolding extends Slot { public SlotOfHolding(Inventory inventoryIn, int index, int xPosition, int yPosition) { super(inventoryIn, index, xPosition, yPosition); } } }