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:
@@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
|
||||
|
||||
@@ -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() );
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user