1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-11-04 15:43:00 +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

@@ -40,11 +40,17 @@ import net.minecraft.util.math.Vec3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.wrapper.InvWrapper;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.List;
import static net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABILITY;
public class TileTurtle extends TileComputerBase
implements ITurtleTile, IInventory, ITickable
{
@@ -65,6 +71,7 @@ public class TileTurtle extends TileComputerBase
private ItemStack[] m_inventory;
private ItemStack[] m_previousInventory;
private final IItemHandlerModifiable m_itemHandler = new InvWrapper( this );
private boolean m_inventoryChanged;
private TurtleBrain m_brain;
private MoveState m_moveState;
@@ -714,4 +721,26 @@ public class TileTurtle extends TileComputerBase
m_brain.setOwner( this );
copy.m_moveState = MoveState.MOVED;
}
public IItemHandlerModifiable getItemHandler()
{
return m_itemHandler;
}
@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

@@ -34,6 +34,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.items.IItemHandlerModifiable;
import javax.annotation.Nonnull;
import java.lang.ref.WeakReference;
@@ -649,6 +650,13 @@ public class TurtleBrain implements ITurtleAccess
return m_owner;
}
@Nonnull
@Override
public IItemHandlerModifiable getItemHandler()
{
return m_owner.getItemHandler();
}
@Override
public boolean isFuelNeeded()
{

View File

@@ -40,7 +40,7 @@ public class TurtleCraftCommand implements ITurtleCommand
// Store the results
for( ItemStack stack : results )
{
ItemStack remainder = InventoryUtil.storeItems( stack, turtle.getInventory(), 0, turtle.getInventory().getSizeInventory(), turtle.getSelectedSlot() );
ItemStack remainder = InventoryUtil.storeItems( stack, turtle.getItemHandler(), turtle.getSelectedSlot() );
if( remainder != null )
{
// Drop the remainder

View File

@@ -17,6 +17,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
import net.minecraftforge.items.IItemHandler;
import javax.annotation.Nonnull;
@@ -46,7 +47,7 @@ public class TurtleDropCommand implements ITurtleCommand
EnumFacing direction = m_direction.toWorldDir( turtle );
// Get things to drop
ItemStack stack = InventoryUtil.takeItems( m_quantity, turtle.getInventory(), turtle.getSelectedSlot(), 1, turtle.getSelectedSlot() );
ItemStack stack = InventoryUtil.takeItems( m_quantity, turtle.getItemHandler(), turtle.getSelectedSlot(), 1, turtle.getSelectedSlot() );
if( stack == null )
{
return TurtleCommandResult.failure( "No items to drop" );
@@ -58,15 +59,15 @@ public class TurtleDropCommand implements ITurtleCommand
BlockPos newPosition = oldPosition.offset( direction );
EnumFacing side = direction.getOpposite();
IInventory inventory = InventoryUtil.getInventory( world, newPosition, side );
IItemHandler inventory = InventoryUtil.getInventory( world, newPosition, side );
if( inventory != null )
{
// Drop the item into the inventory
ItemStack remainder = InventoryUtil.storeItems( stack, inventory, side );
ItemStack remainder = InventoryUtil.storeItems( stack, inventory );
if( remainder != null )
{
// Put the remainder back in the turtle
InventoryUtil.storeItems( remainder, turtle.getInventory(), 0, turtle.getInventory().getSizeInventory(), turtle.getSelectedSlot() );
InventoryUtil.storeItems( remainder, turtle.getItemHandler(), turtle.getSelectedSlot() );
}
// Return true if we stored anything

View File

@@ -14,6 +14,7 @@ import dan200.computercraft.shared.util.WorldUtil;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.items.IItemHandler;
import javax.annotation.Nonnull;
@@ -33,7 +34,7 @@ public class TurtleEquipCommand implements ITurtleCommand
// Determine the upgrade to equipLeft
ITurtleUpgrade newUpgrade;
ItemStack newUpgradeStack;
IInventory inventory = turtle.getInventory();
IItemHandler inventory = turtle.getItemHandler();
ItemStack selectedStack = inventory.getStackInSlot( turtle.getSelectedSlot() );
if( selectedStack != null )
{
@@ -68,19 +69,17 @@ public class TurtleEquipCommand implements ITurtleCommand
{
// Consume new upgrades item
InventoryUtil.takeItems( 1, inventory, turtle.getSelectedSlot(), 1, turtle.getSelectedSlot() );
inventory.markDirty();
}
if( oldUpgradeStack != null )
{
// Store old upgrades item
ItemStack remainder = InventoryUtil.storeItems( oldUpgradeStack, inventory, 0, inventory.getSizeInventory(), turtle.getSelectedSlot() );
ItemStack remainder = InventoryUtil.storeItems( oldUpgradeStack, inventory, turtle.getSelectedSlot() );
if( remainder != null )
{
// If there's no room for the items, drop them
BlockPos position = turtle.getPosition();
WorldUtil.dropItemStack( remainder, turtle.getWorld(), position, turtle.getDirection() );
}
inventory.markDirty();
}
turtle.setUpgrade( m_side, newUpgrade );

View File

@@ -227,7 +227,7 @@ public class TurtlePlaceCommand implements ITurtleCommand
@Override
public void consumeDrop( Entity entity, ItemStack drop )
{
ItemStack remainder = InventoryUtil.storeItems( drop, turtle.getInventory(), 0, turtle.getInventory().getSizeInventory(), turtle.getSelectedSlot() );
ItemStack remainder = InventoryUtil.storeItems( drop, turtle.getItemHandler(), turtle.getSelectedSlot() );
if( remainder != null )
{
WorldUtil.dropItemStack( remainder, world, position, turtle.getDirection().getOpposite() );

View File

@@ -54,7 +54,7 @@ public class TurtlePlayer extends FakePlayer
ItemStack stack = inventory.getStackInSlot( i );
if( stack != null )
{
ItemStack remainder = InventoryUtil.storeItems( stack, turtle.getInventory(), 0, turtle.getInventory().getSizeInventory(), turtle.getSelectedSlot() );
ItemStack remainder = InventoryUtil.storeItems( stack, turtle.getItemHandler(), turtle.getSelectedSlot() );
if( remainder != null )
{
WorldUtil.dropItemStack( remainder, turtle.getWorld(), dropPosition, dropDirection );

View File

@@ -42,14 +42,14 @@ public class TurtleRefuelCommand implements ITurtleCommand
{
// Otherwise, refuel for real
// Remove items from inventory
ItemStack stack = InventoryUtil.takeItems( m_limit, turtle.getInventory(), turtle.getSelectedSlot(), 1, turtle.getSelectedSlot() );
ItemStack stack = InventoryUtil.takeItems( m_limit, turtle.getItemHandler(), turtle.getSelectedSlot(), 1, turtle.getSelectedSlot() );
if( stack != null )
{
TurtleCommandResult result = refuel( turtle, stack, false );
if( !result.isSuccess() )
{
// If the items weren't burnt, put them back
InventoryUtil.storeItems( stack, turtle.getInventory(), 0, turtle.getInventory().getSizeInventory(), turtle.getSelectedSlot() );
InventoryUtil.storeItems( stack, turtle.getItemHandler(), turtle.getSelectedSlot() );
}
return result;
}
@@ -83,7 +83,7 @@ public class TurtleRefuelCommand implements ITurtleCommand
// Store the replacement item in the inventory
if( replacementStack != null )
{
InventoryUtil.storeItems( replacementStack, turtle.getInventory(), 0, turtle.getInventory().getSizeInventory(), turtle.getSelectedSlot() );
InventoryUtil.storeItems( replacementStack, turtle.getItemHandler(), turtle.getSelectedSlot() );
}
// Animate

View File

@@ -20,6 +20,7 @@ import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
import net.minecraftforge.items.IItemHandler;
import javax.annotation.Nonnull;
import java.util.List;
@@ -55,19 +56,19 @@ public class TurtleSuckCommand implements ITurtleCommand
BlockPos newPosition = WorldUtil.moveCoords( oldPosition, direction );
EnumFacing side = direction.getOpposite();
IInventory inventory = InventoryUtil.getInventory( world, newPosition, side );
IItemHandler inventory = InventoryUtil.getInventory( world, newPosition, side );
if( inventory != null )
{
// Take from inventory of thing in front
ItemStack stack = InventoryUtil.takeItems( m_quantity, inventory, side );
ItemStack stack = InventoryUtil.takeItems( m_quantity, inventory );
if( stack != null )
{
// Try to place into the turtle
ItemStack remainder = InventoryUtil.storeItems( stack, turtle.getInventory(), 0, turtle.getInventory().getSizeInventory(), turtle.getSelectedSlot() );
ItemStack remainder = InventoryUtil.storeItems( stack, turtle.getItemHandler(), turtle.getSelectedSlot() );
if( remainder != null )
{
// Put the remainder back in the inventory
InventoryUtil.storeItems( remainder, inventory, side );
InventoryUtil.storeItems( remainder, inventory );
}
// Return true if we consumed anything
@@ -115,7 +116,7 @@ public class TurtleSuckCommand implements ITurtleCommand
storeStack = stack;
leaveStack = null;
}
ItemStack remainder = InventoryUtil.storeItems( storeStack, turtle.getInventory(), 0, turtle.getInventory().getSizeInventory(), turtle.getSelectedSlot() );
ItemStack remainder = InventoryUtil.storeItems( storeStack, turtle.getItemHandler(), turtle.getSelectedSlot() );
if( remainder != storeStack )
{
storedItems = true;

View File

@@ -31,7 +31,7 @@ public class TurtleTransferToCommand implements ITurtleCommand
public TurtleCommandResult execute( @Nonnull ITurtleAccess turtle )
{
// Take stack
ItemStack stack = InventoryUtil.takeItems( m_quantity, turtle.getInventory(), turtle.getSelectedSlot(), 1, turtle.getSelectedSlot() );
ItemStack stack = InventoryUtil.takeItems( m_quantity, turtle.getItemHandler(), turtle.getSelectedSlot(), 1, turtle.getSelectedSlot() );
if( stack == null )
{
turtle.playAnimation( TurtleAnimation.Wait );
@@ -39,11 +39,11 @@ public class TurtleTransferToCommand implements ITurtleCommand
}
// Store stack
ItemStack remainder = InventoryUtil.storeItems( stack, turtle.getInventory(), m_slot, 1, m_slot );
ItemStack remainder = InventoryUtil.storeItems( stack, turtle.getItemHandler(), m_slot, 1, m_slot );
if( remainder != null )
{
// Put the remainder back
InventoryUtil.storeItems( remainder, turtle.getInventory(), turtle.getSelectedSlot(), 1, turtle.getSelectedSlot() );
InventoryUtil.storeItems( remainder, turtle.getItemHandler(), turtle.getSelectedSlot(), 1, turtle.getSelectedSlot() );
}
// Return true if we moved anything

View File

@@ -36,6 +36,7 @@ import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nonnull;
import javax.vecmath.Matrix4f;
import java.util.List;
public class TurtleTool implements ITurtleUpgrade
{
@@ -180,7 +181,7 @@ public class TurtleTool implements ITurtleUpgrade
@Override
public void consumeDrop( Entity entity, ItemStack drop )
{
ItemStack remainder = InventoryUtil.storeItems( drop, turtle.getInventory(), 0, turtle.getInventory().getSizeInventory(), turtle.getSelectedSlot() );
ItemStack remainder = InventoryUtil.storeItems( drop, turtle.getItemHandler(), turtle.getSelectedSlot() );
if( remainder != null )
{
WorldUtil.dropItemStack( remainder, world, position, turtle.getDirection().getOpposite() );
@@ -261,12 +262,12 @@ public class TurtleTool implements ITurtleUpgrade
// Consume the items the block drops
if( canHarvestBlock( world, newPosition ) )
{
java.util.List<ItemStack> items = getBlockDropped( world, newPosition );
List<ItemStack> items = getBlockDropped( world, newPosition );
if( items != null && items.size() > 0 )
{
for( ItemStack stack : items )
{
ItemStack remainder = InventoryUtil.storeItems( stack, turtle.getInventory(), 0, turtle.getInventory().getSizeInventory(), turtle.getSelectedSlot() );
ItemStack remainder = InventoryUtil.storeItems( stack, turtle.getItemHandler(), turtle.getSelectedSlot() );
if( remainder != null )
{
// If there's no room for the items, drop them