1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-11-13 03:43:08 +00:00

Replace most inventory handling code with IItemHandlers

- Make InventoryUtil deal with item handlers instead. This
   significantly simplifies the implementation, the interface now
   does most of the hard work.
 - Add InvWrapper item handlers to printers, disk drives and turtles
 - Add IItemHandlerModifiable accessor to ITurtleAccess
 - Migrate all other inventory code (mostly turtle commands) to use
   item handlers instead.
This commit is contained in:
SquidDev
2017-05-09 00:41:20 +01:00
parent 25128dfb66
commit b07f28c30c
16 changed files with 230 additions and 243 deletions

View File

@@ -22,16 +22,27 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.*;
import net.minecraft.util.math.*;
import net.minecraft.util.text.*;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ITickable;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.wrapper.InvWrapper;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import static net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABILITY;
public class TileDiskDrive extends TilePeripheralBase
implements IInventory, ITickable
{
@@ -50,6 +61,7 @@ public class TileDiskDrive extends TilePeripheralBase
private final Map<IComputerAccess, MountInfo> m_computers;
private ItemStack m_diskStack;
private final IItemHandlerModifiable m_itemHandler = new InvWrapper( this );
private IMount m_diskMount;
private boolean m_recordQueued;
@@ -681,4 +693,21 @@ public class TileDiskDrive extends TilePeripheralBase
{
ComputerCraft.playRecord( null, null, worldObj, getPos() );
}
@Override
public boolean hasCapability( @Nonnull Capability<?> capability, @Nullable EnumFacing facing )
{
return capability == ITEM_HANDLER_CAPABILITY || super.hasCapability( capability, facing );
}
@Nonnull
@Override
public <T> T getCapability( @Nonnull Capability<T> capability, @Nullable EnumFacing facing )
{
if( capability == ITEM_HANDLER_CAPABILITY )
{
return ITEM_HANDLER_CAPABILITY.cast( m_itemHandler );
}
return super.getCapability( capability, facing );
}
}

View File

@@ -23,13 +23,22 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.*;
import net.minecraft.util.math.*;
import net.minecraft.util.text.*;
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.util.text.TextComponentTranslation;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.wrapper.InvWrapper;
import net.minecraftforge.items.wrapper.SidedInvWrapper;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import static net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABILITY;
public class TilePrinter extends TilePeripheralBase
implements IInventory, ISidedInventory
@@ -43,6 +52,9 @@ public class TilePrinter extends TilePeripheralBase
// Members
private final ItemStack[] m_inventory;
private final IItemHandlerModifiable m_itemHandlerAll = new InvWrapper( this );
private IItemHandlerModifiable[] m_itemHandlerSides;
private final Terminal m_page;
private String m_pageTitle;
private boolean m_printing;
@@ -532,7 +544,7 @@ public class TilePrinter extends TilePeripheralBase
ItemStack stack = ItemPrintout.createSingleFromTitleAndText( m_pageTitle, lines, colours );
synchronized( m_inventory )
{
ItemStack remainder = InventoryUtil.storeItems( stack, this, 7, 6, 7 );
ItemStack remainder = InventoryUtil.storeItems( stack, m_itemHandlerAll, 7, 6, 7 );
if( remainder == null )
{
m_printing = false;
@@ -596,4 +608,35 @@ public class TilePrinter extends TilePeripheralBase
setAnim( anim );
}
}
@Override
public boolean hasCapability( @Nonnull Capability<?> capability, @Nullable EnumFacing facing )
{
return capability == ITEM_HANDLER_CAPABILITY || super.hasCapability( capability, facing );
}
@Nonnull
@Override
public <T> T getCapability( @Nonnull Capability<T> capability, @Nullable EnumFacing facing )
{
if( capability == ITEM_HANDLER_CAPABILITY )
{
if( facing == null )
{
return ITEM_HANDLER_CAPABILITY.cast( m_itemHandlerAll );
}
else
{
IItemHandlerModifiable[] handlers = m_itemHandlerSides;
if( handlers == null ) handlers = m_itemHandlerSides = new IItemHandlerModifiable[ 6 ];
int i = facing.ordinal();
IItemHandlerModifiable handler = handlers[ i ];
if( handler == null ) handler = handlers[ i ] = new SidedInvWrapper( this, facing );
return ITEM_HANDLER_CAPABILITY.cast( handler );
}
}
return super.getCapability( capability, facing );
}
}