diff --git a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagCapabilityProvider.java b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagCapabilityProvider.java new file mode 100644 index 0000000..2529825 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagCapabilityProvider.java @@ -0,0 +1,41 @@ +package nl.requios.effortlessbuilding.inventory; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilitySerializable; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class RandomizerBagCapabilityProvider implements ICapabilitySerializable { + IItemHandler itemHandler = new ItemStackHandler(5); + + @Override + public boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + return true; + return false; + } + + @Nullable + @Override + public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + return (T) itemHandler; + return null; + } + + @Override + public NBTTagCompound serializeNBT() { + return ((ItemStackHandler)itemHandler).serializeNBT(); + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) { + ((ItemStackHandler)itemHandler).deserializeNBT(nbt); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagContainer.java b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagContainer.java index 4195f31..ba24af2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagContainer.java +++ b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagContainer.java @@ -8,17 +8,19 @@ import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.SlotItemHandler; public class RandomizerBagContainer extends Container { - private final IInventory bagInventory; + private final IItemHandler bagInventory; private final int sizeInventory; - public RandomizerBagContainer(InventoryPlayer parInventoryPlayer, IInventory parIInventory) { + public RandomizerBagContainer(InventoryPlayer parInventoryPlayer, IItemHandler parIInventory) { bagInventory = parIInventory; - sizeInventory = bagInventory.getSizeInventory(); - for (int i = 0; i < RandomizerBagInventory.INV_SIZE; ++i) { - this.addSlotToContainer(new Slot(bagInventory, i, 80 + (18 * (i / 4)), 8 + (18 * (i % 4)))); + sizeInventory = bagInventory.getSlots(); + for (int i = 0; i < sizeInventory; ++i) { + this.addSlotToContainer(new SlotItemHandler(bagInventory, i, 80 + (18 * (i / 4)), 8 + (18 * (i % 4)))); } // add player inventory slots @@ -37,7 +39,7 @@ public class RandomizerBagContainer extends Container { @Override public boolean canInteractWith(EntityPlayer playerIn) { - return bagInventory.isUsableByPlayer(playerIn); + return true; } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagGuiContainer.java b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagGuiContainer.java index 4d2df0c..62f48d9 100644 --- a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagGuiContainer.java +++ b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagGuiContainer.java @@ -3,32 +3,32 @@ package nl.requios.effortlessbuilding.inventory; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.items.IItemHandler; import nl.requios.effortlessbuilding.EffortlessBuilding; @SideOnly(Side.CLIENT) public class RandomizerBagGuiContainer extends GuiContainer { private static final ResourceLocation grinderGuiTextures = new ResourceLocation(EffortlessBuilding.MODID - + ":textures/gui/container/bagrandomizer.png"); + + ":textures/gui/container/randomizerbag.png"); private final InventoryPlayer inventoryPlayer; - private final IInventory tileGrinder; + private final IItemHandler inventoryBag; public RandomizerBagGuiContainer(InventoryPlayer parInventoryPlayer, - IInventory parInventoryGrinder) { + IItemHandler parInventoryBag) { super(new RandomizerBagContainer(parInventoryPlayer, - parInventoryGrinder)); + parInventoryBag)); inventoryPlayer = parInventoryPlayer; - tileGrinder = parInventoryGrinder; + inventoryBag = parInventoryBag; } @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - String s = tileGrinder.getDisplayName().getUnformattedText(); + String s = "Randomizer bag"; fontRenderer.drawString(s, xSize / 2 - fontRenderer.getStringWidth(s) / 2, 6, 4210752); fontRenderer.drawString(inventoryPlayer.getDisplayName().getUnformattedText(), 8, ySize - 96 + 2, 4210752); } @@ -44,17 +44,5 @@ public class RandomizerBagGuiContainer extends GuiContainer { int marginHorizontal = (width - xSize) / 2; int marginVertical = (height - ySize) / 2; drawTexturedModalRect(marginHorizontal, marginVertical, 0, 0, xSize, ySize); - - // Draw progress indicator - int progressLevel = getProgressLevel(24); - drawTexturedModalRect(marginHorizontal + 79, marginVertical + 34, 176, 14, progressLevel + 1, 16); - } - - private int getProgressLevel(int progressIndicatorPixelWidth) { - int ticksGrindingItemSoFar = tileGrinder.getField(2); - int ticksPerItem = tileGrinder.getField(3); - return ticksPerItem != 0 && ticksGrindingItemSoFar != 0 ? - ticksGrindingItemSoFar * progressIndicatorPixelWidth / ticksPerItem - : 0; } } diff --git a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagInventory.java b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagInventory.java deleted file mode 100644 index 93baa79..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerBagInventory.java +++ /dev/null @@ -1,215 +0,0 @@ -package nl.requios.effortlessbuilding.inventory; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentString; -import net.minecraftforge.items.IItemHandler; - -import javax.annotation.Nonnull; - -public class RandomizerBagInventory implements IInventory { - - //Reference to NBT data - private final ItemStack invItem; - - public static final int INV_SIZE = 5; - - private ItemStack[] inventory = new ItemStack[INV_SIZE]; - - public RandomizerBagInventory(ItemStack invItem) { - this.invItem = invItem; - - if (!invItem.hasTagCompound()) { - invItem.setTagCompound(new NBTTagCompound()); - } - - readFromNBT(invItem.getTagCompound()); - } - - @Override - public int getSizeInventory() { - return INV_SIZE; - } - - @Override - public boolean isEmpty() { - return false; - } - - @Nonnull - @Override - public ItemStack getStackInSlot(int slot) { - return inventory[slot]; - } - - @Nonnull - @Override - public ItemStack decrStackSize(int slot, int amount) { - if (inventory[slot] != null) - { - ItemStack itemstack; - - if (inventory[slot].getCount() <= amount) - { - itemstack = inventory[slot]; - inventory[slot] = null; - return itemstack; - } - else - { - itemstack = inventory[slot].splitStack(amount); - - if (inventory[slot].getCount() == 0) - { - inventory[slot] = null; - } - - return itemstack; - } - } - else - { - return null; - } - } - - @Override - public ItemStack removeStackFromSlot(int index) { - return null; - } - - public void onInventoryChanged() { - for (int i = 0; i < getFieldCount(); ++i) { - if (getStackInSlot(i) != null && getStackInSlot(i).getCount() == 0) { - inventory[i] = null; - } - } - - writeToNBT(invItem.getTagCompound()); - } - - public void setInventorySlotContents(int slot, ItemStack stack) { - inventory[slot] = stack; - - if (stack != null && stack.getCount() > getInventoryStackLimit()) - { - stack.setCount(getInventoryStackLimit()); - } - - markDirty(); - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public void markDirty() { - - } - - @Override - public boolean isUsableByPlayer(EntityPlayer player) { - return true; - } - - @Override - public void openInventory(EntityPlayer player) { - - } - - @Override - public void closeInventory(EntityPlayer player) { - - } - - @Override - public boolean isItemValidForSlot(int index, ItemStack stack) { - return true; - } - - @Override - public int getField(int id) { - //variables - return 0; - } - - @Override - public void setField(int id, int value) { - - } - - @Override - public int getFieldCount() { - return 0; - } - - @Override - public void clear() { - for (int i = 0; i < inventory.length; ++i) - { - inventory[i] = null; - } - } - - public void readFromNBT(NBTTagCompound compound) { - // Gets the custom taglist we wrote to this compound, if any - // 1.7.2+ change to compound.getTagList("ItemInventory", Constants.NBT.TAG_COMPOUND); - NBTTagList items = compound.getTagList("ItemInventory", 0); - - for (int i = 0; i < items.tagCount(); ++i) { - // 1.7.2+ change to items.getCompoundTagAt(i) - NBTTagCompound item = items.getCompoundTagAt(i); - int slot = item.getInteger("Slot"); - - // Just double-checking that the saved slot index is within our inventory array bounds - if (slot >= 0 && slot < getFieldCount()) { - inventory[slot] = new ItemStack(item); - } - } - } - - /** - * A custom method to write our inventory to an ItemStack's NBT compound - */ - public void writeToNBT(NBTTagCompound tagcompound) { - // Create a new NBT Tag List to store itemstacks as NBT Tags - NBTTagList items = new NBTTagList(); - - for (int i = 0; i < getSizeInventory(); ++i) { - // Only write stacks that contain items - if (getStackInSlot(i) != null) { - // Make a new NBT Tag Compound to write the itemstack and slot index to - NBTTagCompound item = new NBTTagCompound(); - item.setInteger("Slot", i); - // Writes the itemstack in slot(i) to the Tag Compound we just made - getStackInSlot(i).writeToNBT(item); - - // add the tag compound to our tag list - items.appendTag(item); - } - } - // Add the TagList to the ItemStack's Tag Compound with the name "ItemInventory" - tagcompound.setTag("ItemInventory", items); - } - - @Override - public String getName() { - return "Testname"; - } - - @Override - public boolean hasCustomName() { - return false; - } - - @Override - public ITextComponent getDisplayName() { - return new TextComponentString("Testname"); - } -} diff --git a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerGuiHandler.java b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerGuiHandler.java index e1aa391..0caea6a 100644 --- a/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerGuiHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/inventory/RandomizerGuiHandler.java @@ -4,6 +4,9 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.EnumHand; import net.minecraft.world.World; import net.minecraftforge.fml.common.network.IGuiHandler; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.inventory.RandomizerBagContainer; @@ -15,7 +18,7 @@ public class RandomizerGuiHandler implements IGuiHandler { public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { if (ID == EffortlessBuilding.RANDOMIZER_BAG_GUI) { // Use the player's held item to create the inventory - return new RandomizerBagContainer(player.inventory, new RandomizerBagInventory(player.getHeldItem(EnumHand.MAIN_HAND))); + return new RandomizerBagContainer(player.inventory, player.getHeldItem(EnumHand.MAIN_HAND).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)); } return null; } @@ -26,7 +29,7 @@ public class RandomizerGuiHandler implements IGuiHandler { if (ID == EffortlessBuilding.RANDOMIZER_BAG_GUI) { // We have to cast the new container as our custom class // and pass in currently held item for the inventory - return new RandomizerBagGuiContainer(player.inventory, new RandomizerBagInventory(player.getHeldItem(EnumHand.MAIN_HAND))); + return new RandomizerBagGuiContainer(player.inventory, player.getHeldItem(EnumHand.MAIN_HAND).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)); } return null; } diff --git a/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java b/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java index c8e180d..ba254cd 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/ItemRandomizerBag.java @@ -4,13 +4,18 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.ICapabilityProvider; import nl.requios.effortlessbuilding.EffortlessBuilding; +import nl.requios.effortlessbuilding.inventory.RandomizerBagCapabilityProvider; + +import javax.annotation.Nullable; public class ItemRandomizerBag extends Item { @@ -53,4 +58,10 @@ public class ItemRandomizerBag extends Item { public int getMaxItemUseDuration(ItemStack stack) { return 1; } + + @Nullable + @Override + public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable NBTTagCompound nbt) { + return new RandomizerBagCapabilityProvider(); + } } diff --git a/src/main/resources/assets/effortlessbuilding/textures/gui/container/randomizerbag.png b/src/main/resources/assets/effortlessbuilding/textures/gui/container/randomizerbag.png index ff34cf8..1cf27c5 100644 Binary files a/src/main/resources/assets/effortlessbuilding/textures/gui/container/randomizerbag.png and b/src/main/resources/assets/effortlessbuilding/textures/gui/container/randomizerbag.png differ