From 7ca72320c57e968b359c787a80dbf27521896aad Mon Sep 17 00:00:00 2001 From: WayofTime Date: Wed, 13 Apr 2016 17:58:06 -0400 Subject: [PATCH] Initial work on Capabilities usage for inventories. --- .../bloodmagic/ritual/RitualCrushing.java | 42 +++---- .../bloodmagic/tile/TileInventory.java | 70 ++++++++++- .../java/WayofTime/bloodmagic/util/Utils.java | 110 +++++++++++++++++- .../bloodmagic/textures/gui/crucible.png | Bin 0 -> 1235 bytes 4 files changed, 194 insertions(+), 28 deletions(-) create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/crucible.png diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java index c9647c66..7b4b0ed1 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java @@ -1,23 +1,26 @@ package WayofTime.bloodmagic.ritual; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.network.SoulNetwork; -import WayofTime.bloodmagic.api.ritual.*; -import WayofTime.bloodmagic.api.util.helper.NetworkHelper; -import WayofTime.bloodmagic.registry.ModBlocks; -import WayofTime.bloodmagic.util.Utils; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityItem; -import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.List; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.network.SoulNetwork; +import WayofTime.bloodmagic.api.ritual.AreaDescriptor; +import WayofTime.bloodmagic.api.ritual.EnumRuneType; +import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.api.ritual.Ritual; +import WayofTime.bloodmagic.api.ritual.RitualComponent; +import WayofTime.bloodmagic.api.util.helper.NetworkHelper; +import WayofTime.bloodmagic.registry.ModBlocks; +import WayofTime.bloodmagic.util.Utils; public class RitualCrushing extends Ritual { @@ -49,19 +52,6 @@ public class RitualCrushing extends Ritual TileEntity tile = world.getTileEntity(masterRitualStone.getBlockPos().up()); - if (!(tile instanceof IInventory)) - { - return; - } - - IInventory tileEntity; - tileEntity = (IInventory) tile; - - if (tileEntity.getSizeInventory() <= 0) - { - return; - } - boolean isSilkTouch = false; int fortune = 0; @@ -88,7 +78,7 @@ public class RitualCrushing extends Ritual ItemStack item = new ItemStack(block, 1, meta); ItemStack copyStack = ItemStack.copyItemStack(item); - Utils.insertStackIntoInventory(copyStack, tileEntity, EnumFacing.DOWN); + Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); if (copyStack.stackSize > 0) { @@ -104,8 +94,8 @@ public class RitualCrushing extends Ritual { ItemStack copyStack = ItemStack.copyItemStack(item); - Utils.insertStackIntoInventory(copyStack, tileEntity, EnumFacing.DOWN); - if (copyStack.stackSize > 0) + copyStack = Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); + if (copyStack != null && copyStack.stackSize > 0) { world.spawnEntityInWorld(new EntityItem(world, pos.getX() + 0.5, pos.getY() + 2, pos.getZ() + 0.5, copyStack)); } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java index c7121cb0..bbf09a4d 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java @@ -1,9 +1,9 @@ package WayofTime.bloodmagic.tile; -import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -12,10 +12,17 @@ import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.wrapper.InvWrapper; +import net.minecraftforge.items.wrapper.SidedInvWrapper; +import WayofTime.bloodmagic.util.helper.TextHelper; public class TileInventory extends TileEntity implements IInventory { @@ -29,6 +36,7 @@ public class TileInventory extends TileEntity implements IInventory this.inventory = new ItemStack[size]; this.size = size; this.name = name; + initializeItemHandlers(); } private boolean isSyncedSlot(int slot) @@ -248,4 +256,64 @@ public class TileInventory extends TileEntity implements IInventory { return new TextComponentString(getName()); } + + protected void initializeItemHandlers() + { + if (this instanceof ISidedInventory) + { + handlerDown = new SidedInvWrapper((ISidedInventory) this, EnumFacing.DOWN); + handlerUp = new SidedInvWrapper((ISidedInventory) this, EnumFacing.UP); + handlerNorth = new SidedInvWrapper((ISidedInventory) this, EnumFacing.NORTH); + handlerSouth = new SidedInvWrapper((ISidedInventory) this, EnumFacing.SOUTH); + handlerWest = new SidedInvWrapper((ISidedInventory) this, EnumFacing.WEST); + handlerEast = new SidedInvWrapper((ISidedInventory) this, EnumFacing.EAST); + } else + { + handlerDown = new InvWrapper(this); + handlerUp = handlerDown; + handlerNorth = handlerDown; + handlerSouth = handlerDown; + handlerWest = handlerDown; + handlerEast = handlerDown; + } + } + + IItemHandler handlerDown; + IItemHandler handlerUp; + IItemHandler handlerNorth; + IItemHandler handlerSouth; + IItemHandler handlerWest; + IItemHandler handlerEast; + + @SuppressWarnings("unchecked") + @Override + public T getCapability(Capability capability, EnumFacing facing) + { + if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + { + switch (facing) + { + case DOWN: + return (T) handlerDown; + case EAST: + return (T) handlerEast; + case NORTH: + return (T) handlerNorth; + case SOUTH: + return (T) handlerSouth; + case UP: + return (T) handlerUp; + case WEST: + return (T) handlerWest; + } + } + + return super.getCapability(capability, facing); + } + + @Override + public boolean hasCapability(Capability capability, EnumFacing facing) + { + return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing); + } } diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 0e6e6091..8db3eed0 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -33,6 +33,8 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidBlock; import net.minecraftforge.fluids.IFluidHandler; import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; import WayofTime.bloodmagic.api.BlockStack; import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; @@ -366,6 +368,102 @@ public class Utils return returned; } + public static ItemStack insertStackIntoTile(ItemStack stack, TileEntity tile, EnumFacing dir) + { + if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir)) + { + IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir); + int numberOfSlots = handler.getSlots(); + + ItemStack copyStack = stack.copy(); + + for (int slot = 0; slot < numberOfSlots; slot++) + { + copyStack = handler.insertItem(slot, copyStack, false); + if (copyStack == null) + { + return null; + } + } + + return copyStack; + } else if (tile instanceof IInventory) + { + return insertStackIntoInventory(stack, (IInventory) tile, dir); + } + + return stack; + } + + /** + * Inserts the desired stack into the tile up to a limit for the tile. + * Respects capabilities. + * + * @param stack + * @param tile + * @param dir + * @param limit + * @return + */ + public static ItemStack insertStackIntoTile(ItemStack stack, TileEntity tile, EnumFacing dir, int limit) + { + if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir)) + { + IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir); + int numberOfSlots = handler.getSlots(); + + ItemStack copyStack = stack.copy(); + + int numberMatching = 0; + + for (int slot = 0; slot < numberOfSlots; slot++) + { + ItemStack invStack = handler.getStackInSlot(slot); + + if (invStack != null && canCombine(stack, invStack)) + { + numberMatching += invStack.stackSize; + } + } + + if (numberMatching >= limit) + { + return stack; + } + + int newLimit = limit - numberMatching; + + for (int slot = 0; slot < numberOfSlots; slot++) + { + ItemStack newCopyStack = copyStack.copy(); + newCopyStack.stackSize = Math.min(copyStack.stackSize, newLimit); + + newCopyStack = handler.insertItem(slot, newCopyStack, false); + + if (newCopyStack == null) + { + return null; + } + + newLimit -= (copyStack.stackSize - newCopyStack.stackSize); + + if (newLimit <= 0) + { + return null; //TODO + } + + copyStack.stackSize -= (copyStack.stackSize - newCopyStack.stackSize); + } + + return copyStack; + } else if (tile instanceof IInventory) + { + return insertStackIntoInventory(stack, (IInventory) tile, dir, limit); + } + + return stack; + } + public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir) { if (stack == null) @@ -495,6 +593,16 @@ public class Utils return false; } + /** + * Inserts the desired stack into the inventory up to a limit for the + * inventory. + * + * @param stack + * @param inventory + * @param dir + * @param limit + * @return + */ public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, EnumFacing dir, int limit) { if (stack == null) @@ -554,7 +662,7 @@ public class Utils ItemStack[] combinedStacks = combineStacks(stack, inventory.getStackInSlot(i), newLimit); stack = combinedStacks[0]; - inventory.setInventorySlotContents(i, combinedStacks[1]); + inventory.setInventorySlotContents(i, combinedStacks[1]); //TODO newLimit -= (prevStackSize - stack.stackSize); diff --git a/src/main/resources/assets/bloodmagic/textures/gui/crucible.png b/src/main/resources/assets/bloodmagic/textures/gui/crucible.png new file mode 100644 index 0000000000000000000000000000000000000000..c321fcefdd70ee5d192c8828a0a24836a419a5c7 GIT binary patch literal 1235 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5n0T@z;_6Q8AUa`8i0cAC7!;n>0-)z&-}Z! z43902*_>Y|G{=zPutCH#M#8%G+4TEU3YP8c>V{oDK{P!ka{{ z%z5^_V9wp83(S~iUOqJEc(22>rhPB?5~>-!Zd4@uy_At|v|%R3B*7CPlYq+4WY+cd zI>eW-Z`jMAnzP4nc?pm^j}cF(H!$pAQD8X0d6Of>?{l%mxp!^~854UQprLM)`dx9s z+5^wF7(6f3Hqhq+1?Yya*XCTZl=HJ@BF0#*9FVbnYY&th4@+y~BDgN`z+u_^O)$QxQe=pC!8cJLWsR_S>~!w-Wy;^t*!nZV+CKq2U$?)+&iRuI;qd{Y9GUu$Hll)Iy4iU-2{!g z|582gZg4z-q|XDvW%5k7fFZ|SEVrHM^CE^EeFx6y{Ii;KA3xlpjL%Sx25(@b%$Wd; zG86mu$2Yiq%5zxDAgR%>{I|dC^bTOKuX+9I(V@uq4C}71UhQaZ159BA0pADVS|!c9 To{uiefz*1s`njxgN@xNAYtffw literal 0 HcmV?d00001