diff --git a/src/main/java/mod/chiselsandbits/helpers/ContinousBits.java b/src/main/java/mod/chiselsandbits/helpers/ContinousBits.java index 0ac722e0..7014ba07 100644 --- a/src/main/java/mod/chiselsandbits/helpers/ContinousBits.java +++ b/src/main/java/mod/chiselsandbits/helpers/ContinousBits.java @@ -5,19 +5,20 @@ import mod.chiselsandbits.bitbag.BagInventory; import mod.chiselsandbits.core.ChiselsAndBits; -import mod.chiselsandbits.helpers.ModUtil.ItemStackSlot; -import mod.chiselsandbits.items.ItemBitBag; import mod.chiselsandbits.items.ItemChiseledBit; import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; public class ContinousBits implements IContinuousInventory { final int stateID; private final ActingPlayer who; - private final List options = new ArrayList(); + private final List options = new ArrayList(); private final List bags = new ArrayList(); private final boolean canEdit; @@ -38,25 +39,46 @@ public ContinousBits( for ( int zz = 0; zz < inv.getSizeInventory(); zz++ ) { final ItemStack which = inv.getStackInSlot( zz ); - if ( which != null && which.getItem() instanceof ItemChiseledBit ) + if ( which != null && which.getItem() != null ) { - if ( ItemChiseledBit.getStackState( which ) == stateID ) + Item i = which.getItem(); + if ( i instanceof ItemChiseledBit ) { - if ( zz == src.getCurrentItem() ) + if ( ItemChiseledBit.getStackState( which ) == stateID ) { - handSlot = new ItemStackSlot( inv, zz, which, src, canEdit ); + if ( zz == src.getCurrentItem() ) + { + handSlot = new ItemStackSlot( inv, zz, which, src, canEdit ); + } + else + { + options.add( new ItemStackSlot( inv, zz, which, src, canEdit ) ); + } } - else + } + + else if ( i instanceof ItemBitBag ) + { + bags.add( new BagInventory( which ) ); + } + + else if ( which.hasCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null ) ) + { + IItemHandler internal = which.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null ); + for ( int x = 0; x < internal.getSlots(); x++ ) { - options.add( new ItemStackSlot( inv, zz, which, src, canEdit ) ); + ItemStack is = internal.getStackInSlot( x ); + + if ( is.getItem() instanceof ItemChiseledBit ) + { + if ( ItemChiseledBit.getStackState( is ) == stateID ) + { + options.add( new IItemHandlerSlot( internal, x, is, src, canEdit ) ); + } + } } } } - - if ( which != null && which.getItem() instanceof ItemBitBag ) - { - bags.add( new BagInventory( which ) ); - } } if ( handSlot != null ) @@ -66,39 +88,44 @@ public ContinousBits( } @Override - public ItemStackSlot getItem( + public IItemInInventory getItem( final int BlockID ) { return options.get( 0 ); } @Override - public void useItem( + public boolean useItem( final int blk ) { - final ItemStackSlot slot = options.get( 0 ); + final IItemInInventory slot = options.get( 0 ); - if ( ModUtil.getStackSize( slot.getStack() ) <= 1 ) + if ( slot instanceof ItemStackSlot && ModUtil.getStackSize( slot.getStack() ) <= 1 ) { for ( final BagInventory bag : bags ) { - slot.replaceStack( bag.restockItem( slot.getStack(), slot.getStackType() ) ); + ( (ItemStackSlot) slot ).replaceStack( bag.restockItem( slot.getStack(), slot.getStackType() ) ); } } - slot.consume(); + boolean worked = slot.consume(); if ( slot.isValid() ) { - for ( final BagInventory bag : bags ) + if ( slot instanceof ItemStackSlot ) { - slot.replaceStack( bag.restockItem( slot.getStack(), slot.getStackType() ) ); + for ( final BagInventory bag : bags ) + { + ( (ItemStackSlot) slot ).replaceStack( bag.restockItem( slot.getStack(), slot.getStackType() ) ); + } } } else { options.remove( 0 ); } + + return worked; } @Override diff --git a/src/main/java/mod/chiselsandbits/helpers/ContinousChisels.java b/src/main/java/mod/chiselsandbits/helpers/ContinousChisels.java index ad6a7006..05039138 100644 --- a/src/main/java/mod/chiselsandbits/helpers/ContinousChisels.java +++ b/src/main/java/mod/chiselsandbits/helpers/ContinousChisels.java @@ -10,7 +10,6 @@ import com.google.common.collect.Lists; import mod.chiselsandbits.core.ChiselsAndBits; -import mod.chiselsandbits.helpers.ModUtil.ItemStackSlot; import mod.chiselsandbits.items.ItemChisel; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item.ToolMaterial; @@ -79,7 +78,7 @@ public ContinousChisels( } @Override - public ItemStackSlot getItem( + public IItemInInventory getItem( final int BlockID ) { if ( !actionCache.containsKey( BlockID ) ) @@ -94,7 +93,7 @@ public ItemStackSlot getItem( return new ItemStackSlot( who.getInventory(), -1, ModUtil.getEmptyStack(), who, canEdit ); } - final ItemStackSlot slot = choices.get( choices.size() - 1 ); + final IItemInInventory slot = choices.get( choices.size() - 1 ); if ( slot.isValid() ) { @@ -127,10 +126,11 @@ public boolean isValid() } @Override - public void useItem( + public boolean useItem( final int blk ) { getItem( blk ).damage( who ); + return true; } } diff --git a/src/main/java/mod/chiselsandbits/helpers/IContinuousInventory.java b/src/main/java/mod/chiselsandbits/helpers/IContinuousInventory.java index 8cd2a51b..b457dcec 100644 --- a/src/main/java/mod/chiselsandbits/helpers/IContinuousInventory.java +++ b/src/main/java/mod/chiselsandbits/helpers/IContinuousInventory.java @@ -1,11 +1,9 @@ package mod.chiselsandbits.helpers; -import mod.chiselsandbits.helpers.ModUtil.ItemStackSlot; - public interface IContinuousInventory { - void useItem( + boolean useItem( int blockId ); void fail( @@ -13,7 +11,7 @@ void fail( boolean isValid(); - ItemStackSlot getItem( + IItemInInventory getItem( int blockId ); } diff --git a/src/main/java/mod/chiselsandbits/helpers/IItemHandlerSlot.java b/src/main/java/mod/chiselsandbits/helpers/IItemHandlerSlot.java new file mode 100644 index 00000000..1755d2f1 --- /dev/null +++ b/src/main/java/mod/chiselsandbits/helpers/IItemHandlerSlot.java @@ -0,0 +1,78 @@ +package mod.chiselsandbits.helpers; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandler; + +public class IItemHandlerSlot implements IItemInInventory +{ + + private IItemHandler internal; + private int zz; + private @Nonnull ItemStack stack; // copy of itemstack + private final @Nonnull ItemStack originalStack; + private ActingPlayer src; + private boolean isEditable; + + public IItemHandlerSlot( + IItemHandler internal, + int zz, + ItemStack which, + ActingPlayer src, + boolean canEdit ) + { + this.internal = internal; + this.zz = zz; + this.stack = ModUtil.copy( which ); + this.originalStack = ModUtil.copy( which ); + this.src = src; + this.isEditable = canEdit; + } + + @Override + public boolean isValid() + { + return isEditable && ( src.isCreative() || !ModUtil.isEmpty( stack ) && ModUtil.getStackSize( stack ) > 0 ); + } + + @Override + public void damage( + ActingPlayer who ) + { + throw new RuntimeException( "Cannot damage an item in an inventory?" ); + } + + @Override + public boolean consume() + { + ItemStack is = internal.extractItem( zz, 1, true ); + if ( is != null && ItemStack.areItemStackTagsEqual( is, stack ) && ItemStack.areItemStackTagsEqual( is, stack ) ) + { + internal.extractItem( zz, 1, false ); + ModUtil.adjustStackSize( stack, -1 ); + return true; + } + + return false; + } + + @Override + public ItemStack getStack() + { + return stack; + } + + @Override + public void swapWithWeapon() + { + throw new RuntimeException( "Cannot swap an item in an inventory?" ); + } + + @Override + public ItemStack getStackType() + { + return originalStack; + } + +} diff --git a/src/main/java/mod/chiselsandbits/helpers/IItemInInventory.java b/src/main/java/mod/chiselsandbits/helpers/IItemInInventory.java new file mode 100644 index 00000000..84466f4c --- /dev/null +++ b/src/main/java/mod/chiselsandbits/helpers/IItemInInventory.java @@ -0,0 +1,21 @@ +package mod.chiselsandbits.helpers; + +import net.minecraft.item.ItemStack; + +public interface IItemInInventory +{ + + boolean isValid(); + + void damage( + ActingPlayer who ); + + boolean consume(); + + ItemStack getStack(); + + void swapWithWeapon(); + + ItemStack getStackType(); + +} \ No newline at end of file diff --git a/src/main/java/mod/chiselsandbits/helpers/ItemStackSlot.java b/src/main/java/mod/chiselsandbits/helpers/ItemStackSlot.java new file mode 100644 index 00000000..ffabb0f8 --- /dev/null +++ b/src/main/java/mod/chiselsandbits/helpers/ItemStackSlot.java @@ -0,0 +1,105 @@ +package mod.chiselsandbits.helpers; + +import javax.annotation.Nonnull; + +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class ItemStackSlot implements IItemInInventory +{ + private final IInventory inv; + private final int slot; + private @Nonnull ItemStack stack; + private final @Nonnull ItemStack originalStack; + private final boolean isCreative; + private final boolean isEditable; + private final int toolSlot; + + ItemStackSlot( + final IInventory i, + final int s, + final @Nonnull ItemStack st, + final ActingPlayer player, + final boolean canEdit ) + { + inv = i; + slot = s; + stack = st; + originalStack = ModUtil.copy( st ); + toolSlot = player.getCurrentItem(); + isCreative = player.isCreative(); + isEditable = canEdit; + } + + @Override + public boolean isValid() + { + return isEditable && ( isCreative || !ModUtil.isEmpty( stack ) && ModUtil.getStackSize( stack ) > 0 ); + } + + @Override + public void damage( + final ActingPlayer who ) + { + if ( isCreative ) + { + return; + } + + who.damageItem( stack, 1 ); + if ( ModUtil.getStackSize( stack ) <= 0 ) + { + who.playerDestroyItem( stack, who.getHand() ); + inv.setInventorySlotContents( slot, ModUtil.getEmptyStack() ); + } + } + + @Override + public boolean consume() + { + if ( isCreative ) + { + return true; + } + + if ( ModUtil.getStackSize( stack ) > 0 ) + { + ModUtil.adjustStackSize( stack, -1 ); + if ( ModUtil.getStackSize( stack ) <= 0 ) + { + inv.setInventorySlotContents( slot, ModUtil.getEmptyStack() ); + } + + return true; + } + + return false; + } + + @Override + public ItemStack getStack() + { + return stack; + } + + @Override + public void swapWithWeapon() + { + final ItemStack it = inv.getStackInSlot( toolSlot ); + inv.setInventorySlotContents( toolSlot, inv.getStackInSlot( slot ) ); + inv.setInventorySlotContents( slot, it ); + } + + @Override + public ItemStack getStackType() + { + return originalStack; + } + + public void replaceStack( + final @Nonnull ItemStack restockItem ) + { + stack = restockItem; + inv.setInventorySlotContents( slot, restockItem ); + } +} \ No newline at end of file diff --git a/src/main/java/mod/chiselsandbits/helpers/ModUtil.java b/src/main/java/mod/chiselsandbits/helpers/ModUtil.java index c55ea5e1..301698fb 100644 --- a/src/main/java/mod/chiselsandbits/helpers/ModUtil.java +++ b/src/main/java/mod/chiselsandbits/helpers/ModUtil.java @@ -96,93 +96,7 @@ static public Pair getPlayerRay( return Pair.of( from, to ); } - static public class ItemStackSlot - { - private final IInventory inv; - private final int slot; - private @Nonnull ItemStack stack; - private final @Nonnull ItemStack originalStack; - private final boolean isCreative; - private final boolean isEditable; - private final int toolSlot; - - ItemStackSlot( - final IInventory i, - final int s, - final @Nonnull ItemStack st, - final ActingPlayer player, - final boolean canEdit ) - { - inv = i; - slot = s; - stack = st; - originalStack = ModUtil.copy( st ); - toolSlot = player.getCurrentItem(); - isCreative = player.isCreative(); - isEditable = canEdit; - } - - public boolean isValid() - { - return isEditable && ( isCreative || !ModUtil.isEmpty( stack ) && getStackSize( stack ) > 0 ); - } - - public void damage( - final ActingPlayer who ) - { - if ( isCreative ) - { - return; - } - - who.damageItem( stack, 1 ); - if ( getStackSize( stack ) <= 0 ) - { - who.playerDestroyItem( stack, who.getHand() ); - inv.setInventorySlotContents( slot, ModUtil.getEmptyStack() ); - } - } - - public void consume() - { - if ( isCreative ) - { - return; - } - - adjustStackSize( stack, -1 ); - if ( getStackSize( stack ) <= 0 ) - { - inv.setInventorySlotContents( slot, ModUtil.getEmptyStack() ); - } - } - - public ItemStack getStack() - { - return stack; - } - - public void swapWithWeapon() - { - final ItemStack it = inv.getStackInSlot( toolSlot ); - inv.setInventorySlotContents( toolSlot, inv.getStackInSlot( slot ) ); - inv.setInventorySlotContents( slot, it ); - } - - public ItemStack getStackType() - { - return originalStack; - } - - public void replaceStack( - final @Nonnull ItemStack restockItem ) - { - stack = restockItem; - inv.setInventorySlotContents( slot, restockItem ); - } - }; - - static public ItemStackSlot findBit( + static public IItemInInventory findBit( final ActingPlayer who, final BlockPos pos, final int StateID ) diff --git a/src/main/java/mod/chiselsandbits/items/ItemChisel.java b/src/main/java/mod/chiselsandbits/items/ItemChisel.java index cf2671ba..93045fbc 100644 --- a/src/main/java/mod/chiselsandbits/items/ItemChisel.java +++ b/src/main/java/mod/chiselsandbits/items/ItemChisel.java @@ -23,9 +23,9 @@ import mod.chiselsandbits.helpers.ChiselModeManager; import mod.chiselsandbits.helpers.ChiselToolType; import mod.chiselsandbits.helpers.IContinuousInventory; +import mod.chiselsandbits.helpers.IItemInInventory; import mod.chiselsandbits.helpers.LocalStrings; import mod.chiselsandbits.helpers.ModUtil; -import mod.chiselsandbits.helpers.ModUtil.ItemStackSlot; import mod.chiselsandbits.integration.mcmultipart.MCMultipartProxy; import mod.chiselsandbits.interfaces.IChiselModeItem; import mod.chiselsandbits.interfaces.IItemScrollWheel; @@ -323,7 +323,10 @@ static public ItemStack chiselBlock( return output; } - selected.useItem( blk ); + if ( !selected.useItem( blk ) ) + { + return output; + } final boolean spawnBit = ChiselsAndBits.getItems().itemBlockBit != null; if ( !world.isRemote && !isCreative ) @@ -371,7 +374,7 @@ public static boolean canMine( final @Nonnull BlockPos pos ) { final int targetState = ModUtil.getStateId( state ); - ItemStackSlot chiselSlot = chiselInv.getItem( targetState ); + IItemInInventory chiselSlot = chiselInv.getItem( targetState ); ItemStack chisel = chiselSlot.getStack(); if ( player.capabilities.isCreativeMode ) diff --git a/src/main/java/mod/chiselsandbits/items/ItemChiseledBit.java b/src/main/java/mod/chiselsandbits/items/ItemChiseledBit.java index 2c47f551..8a6afb0f 100644 --- a/src/main/java/mod/chiselsandbits/items/ItemChiseledBit.java +++ b/src/main/java/mod/chiselsandbits/items/ItemChiseledBit.java @@ -23,9 +23,9 @@ import mod.chiselsandbits.helpers.ChiselToolType; import mod.chiselsandbits.helpers.DeprecationHelper; import mod.chiselsandbits.helpers.IContinuousInventory; +import mod.chiselsandbits.helpers.IItemInInventory; import mod.chiselsandbits.helpers.LocalStrings; import mod.chiselsandbits.helpers.ModUtil; -import mod.chiselsandbits.helpers.ModUtil.ItemStackSlot; import mod.chiselsandbits.interfaces.ICacheClearable; import mod.chiselsandbits.interfaces.IChiselModeItem; import mod.chiselsandbits.interfaces.IItemScrollWheel; @@ -439,17 +439,18 @@ public static boolean placeBit( { if ( vb.get( x, y, z ) == 0 ) { - final ItemStackSlot slot = bits.getItem( 0 ); + final IItemInInventory slot = bits.getItem( 0 ); final int stateID = ItemChiseledBit.getStackState( slot.getStack() ); if ( slot.isValid() ) { - vb.set( x, y, z, stateID ); - if ( !player.isCreative() ) { - bits.useItem( stateID ); + if ( bits.useItem( stateID ) ) + vb.set( x, y, z, stateID ); } + else + vb.set( x, y, z, stateID ); } return true; diff --git a/src/main/java/mod/chiselsandbits/items/ItemPositivePrint.java b/src/main/java/mod/chiselsandbits/items/ItemPositivePrint.java index 77631101..99d13814 100644 --- a/src/main/java/mod/chiselsandbits/items/ItemPositivePrint.java +++ b/src/main/java/mod/chiselsandbits/items/ItemPositivePrint.java @@ -16,9 +16,9 @@ import mod.chiselsandbits.helpers.ActingPlayer; import mod.chiselsandbits.helpers.ContinousChisels; import mod.chiselsandbits.helpers.IContinuousInventory; +import mod.chiselsandbits.helpers.IItemInInventory; import mod.chiselsandbits.helpers.LocalStrings; import mod.chiselsandbits.helpers.ModUtil; -import mod.chiselsandbits.helpers.ModUtil.ItemStackSlot; import mod.chiselsandbits.integration.mcmultipart.MCMultipartProxy; import mod.chiselsandbits.interfaces.IChiselModeItem; import mod.chiselsandbits.modes.PositivePatternMode; @@ -208,15 +208,17 @@ private boolean consumeEntirePattern( continue; } - ItemStackSlot bit = ModUtil.findBit( player, pos, inPattern ); + IItemInInventory bit = ModUtil.findBit( player, pos, inPattern ); int stillNeeded = type.getValue() - ModUtil.consumeBagBit( bags, inPattern, type.getValue() ); if ( stillNeeded != 0 ) { for ( int x = stillNeeded; x > 0 && bit.isValid(); --x ) { - bit.consume(); - stillNeeded--; - bit = ModUtil.findBit( player, pos, inPattern ); + if ( bit.consume() ) + { + stillNeeded--; + bit = ModUtil.findBit( player, pos, inPattern ); + } } if ( stillNeeded != 0 ) @@ -280,19 +282,20 @@ protected void applyPrint( if ( inPlace == 0 && inPattern != 0 && filled.get( x, y, z ) == 0 ) { - final ItemStackSlot bit = ModUtil.findBit( player, pos, inPattern ); + final IItemInInventory bit = ModUtil.findBit( player, pos, inPattern ); if ( ModUtil.consumeBagBit( bags, inPattern, 1 ) == 1 ) { vb.set( x, y, z, inPattern ); } else if ( bit.isValid() ) { - vb.set( x, y, z, inPattern ); - if ( !player.isCreative() ) { - bit.consume(); + if ( bit.consume() ) + vb.set( x, y, z, inPattern ); } + else + vb.set( x, y, z, inPattern ); } } } diff --git a/src/main/java/mod/chiselsandbits/network/packets/PacketUndo.java b/src/main/java/mod/chiselsandbits/network/packets/PacketUndo.java index fb4c7b6e..b54f1568 100644 --- a/src/main/java/mod/chiselsandbits/network/packets/PacketUndo.java +++ b/src/main/java/mod/chiselsandbits/network/packets/PacketUndo.java @@ -14,9 +14,9 @@ import mod.chiselsandbits.helpers.ActingPlayer; import mod.chiselsandbits.helpers.ContinousChisels; import mod.chiselsandbits.helpers.IContinuousInventory; +import mod.chiselsandbits.helpers.IItemInInventory; import mod.chiselsandbits.helpers.InventoryBackup; import mod.chiselsandbits.helpers.ModUtil; -import mod.chiselsandbits.helpers.ModUtil.ItemStackSlot; import mod.chiselsandbits.items.ItemBitBag; import mod.chiselsandbits.items.ItemChisel; import mod.chiselsandbits.network.ModPacket; @@ -169,18 +169,23 @@ else if ( inAfter != 0 ) } } - final ItemStackSlot bit = ModUtil.findBit( player, pos, inAfter ); + final IItemInInventory bit = ModUtil.findBit( player, pos, inAfter ); if ( ModUtil.consumeBagBit( bags, inAfter, 1 ) == 1 ) { bi.setNext( target, inAfter ); } else if ( bit.isValid() ) { - bi.setNext( target, inAfter ); if ( !player.isCreative() ) { - bit.consume(); + if ( !bit.consume() ) + { + successful = false; + break; + } } + + bi.setNext( target, inAfter ); } else {