Made the give and take command use manipulator methods
This commit is contained in:
parent
3fa2c5e83f
commit
465a3093fe
4 changed files with 444 additions and 396 deletions
|
@ -1,24 +1,26 @@
|
||||||
package assemblyline.common.armbot.command;
|
package assemblyline.common.armbot.command;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import net.minecraft.inventory.ISidedInventory;
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
import dark.library.machine.crafting.AutoCraftingManager;
|
import universalelectricity.core.vector.Vector3;
|
||||||
|
import assemblyline.common.machine.InvExtractionHelper;
|
||||||
|
|
||||||
public class CommandGive extends Command
|
public class CommandGive extends Command
|
||||||
{
|
{
|
||||||
private ItemStack stack;
|
private ItemStack stack;
|
||||||
|
private int ammount = -1;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTaskStart()
|
public void onTaskStart()
|
||||||
{
|
{
|
||||||
int id = 0;
|
int id = 0;
|
||||||
int meta = 32767;
|
int meta = 32767;
|
||||||
int count = 1;
|
|
||||||
|
|
||||||
if (this.getArgs().length > 0)
|
if (this.getArgs().length > 0)
|
||||||
{
|
{
|
||||||
|
@ -36,7 +38,7 @@ public class CommandGive extends Command
|
||||||
}
|
}
|
||||||
if (this.getArgs().length > 1)
|
if (this.getArgs().length > 1)
|
||||||
{
|
{
|
||||||
count = this.getIntArg(1);
|
ammount = this.getIntArg(1);
|
||||||
}
|
}
|
||||||
if (id == 0)
|
if (id == 0)
|
||||||
{
|
{
|
||||||
|
@ -44,7 +46,7 @@ public class CommandGive extends Command
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
stack = new ItemStack(id, count, meta);
|
stack = new ItemStack(id, ammount == -1 ? 1 : ammount, meta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,57 +54,32 @@ public class CommandGive extends Command
|
||||||
protected boolean doTask()
|
protected boolean doTask()
|
||||||
{
|
{
|
||||||
TileEntity targetTile = this.tileEntity.getHandPosition().getTileEntity(this.world);
|
TileEntity targetTile = this.tileEntity.getHandPosition().getTileEntity(this.world);
|
||||||
ForgeDirection direction = this.tileEntity.getFacingDirectionFromAngle();
|
|
||||||
if (targetTile != null && this.tileEntity.getGrabbedItems().size() > 0)
|
if (targetTile != null && this.tileEntity.getGrabbedItems().size() > 0)
|
||||||
{
|
{
|
||||||
if (targetTile instanceof ISidedInventory)
|
ForgeDirection direction = this.tileEntity.getFacingDirectionFromAngle();
|
||||||
|
List<ItemStack> stacks = new ArrayList<ItemStack>();
|
||||||
|
if (this.stack != null)
|
||||||
{
|
{
|
||||||
ISidedInventory inventory = (ISidedInventory) targetTile;
|
stacks.add(stack);
|
||||||
int[] slots = inventory.getAccessibleSlotsFromSide(direction.getOpposite().ordinal());
|
}
|
||||||
Iterator<ItemStack> targetIt = this.tileEntity.getGrabbedItems().iterator();
|
InvExtractionHelper invEx = new InvExtractionHelper(this.tileEntity.worldObj, new Vector3(this.tileEntity), stacks, false);
|
||||||
while (targetIt.hasNext())
|
|
||||||
|
Iterator<ItemStack> targetIt = this.tileEntity.getGrabbedItems().iterator();
|
||||||
|
boolean flag = true;
|
||||||
|
while (targetIt.hasNext())
|
||||||
|
{
|
||||||
|
ItemStack insertStack = targetIt.next();
|
||||||
|
ItemStack original = insertStack.copy();
|
||||||
|
insertStack = invEx.tryPlaceInPosition(insertStack, new Vector3(targetTile), direction.getOpposite());
|
||||||
|
flag = insertStack != null && insertStack.stackSize == original.stackSize;
|
||||||
|
if (insertStack == null || insertStack.stackSize <= 0)
|
||||||
{
|
{
|
||||||
ItemStack itemstack = targetIt.next();
|
targetIt.remove();
|
||||||
for (int i = 0; i < slots.length; i++)
|
break;
|
||||||
{
|
|
||||||
if (this.stack == null || AutoCraftingManager.areStacksEqual(this.stack, itemstack))
|
|
||||||
{
|
|
||||||
if (inventory.canInsertItem(slots[i], itemstack, direction.getOpposite().ordinal()))
|
|
||||||
{
|
|
||||||
ItemStack slotStack = inventory.getStackInSlot(slots[i]);
|
|
||||||
if (slotStack == null)
|
|
||||||
{
|
|
||||||
ItemStack insertstack = itemstack.copy();
|
|
||||||
insertstack.stackSize = Math.min(itemstack.stackSize, inventory.getInventoryStackLimit());
|
|
||||||
inventory.setInventorySlotContents(slots[i], insertstack);
|
|
||||||
itemstack = AutoCraftingManager.decrStackSize(itemstack, insertstack.stackSize);
|
|
||||||
}
|
|
||||||
else if (AutoCraftingManager.areStacksEqual(slotStack, itemstack))
|
|
||||||
{
|
|
||||||
int room = slotStack.getMaxStackSize() - slotStack.stackSize;
|
|
||||||
if (room > 0)
|
|
||||||
{
|
|
||||||
ItemStack insertstack = itemstack.copy();
|
|
||||||
insertstack.stackSize = Math.min(Math.min(itemstack.stackSize, inventory.getInventoryStackLimit()), room);
|
|
||||||
itemstack = AutoCraftingManager.decrStackSize(itemstack, insertstack.stackSize);
|
|
||||||
insertstack.stackSize += slotStack.stackSize;
|
|
||||||
inventory.setInventorySlotContents(slots[i], insertstack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (itemstack == null || itemstack.stackSize <= 0)
|
|
||||||
{
|
|
||||||
targetIt.remove();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return false;
|
}
|
||||||
}// TODO add a way to steal items from players
|
return flag;
|
||||||
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
package assemblyline.common.armbot.command;
|
package assemblyline.common.armbot.command;
|
||||||
|
|
||||||
import net.minecraft.inventory.ISidedInventory;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
import dark.library.machine.crafting.AutoCraftingManager;
|
import universalelectricity.core.vector.Vector3;
|
||||||
|
import assemblyline.common.machine.InvExtractionHelper;
|
||||||
|
|
||||||
public class CommandTake extends Command
|
public class CommandTake extends Command
|
||||||
{
|
{
|
||||||
|
@ -50,29 +53,18 @@ public class CommandTake extends Command
|
||||||
protected boolean doTask()
|
protected boolean doTask()
|
||||||
{
|
{
|
||||||
TileEntity targetTile = this.tileEntity.getHandPosition().getTileEntity(this.world);
|
TileEntity targetTile = this.tileEntity.getHandPosition().getTileEntity(this.world);
|
||||||
ForgeDirection direction = this.tileEntity.getFacingDirectionFromAngle();
|
|
||||||
if (targetTile != null && this.tileEntity.getGrabbedItems().size() <= 0)
|
if (targetTile != null && this.tileEntity.getGrabbedItems().size() <= 0)
|
||||||
{
|
{
|
||||||
if (targetTile instanceof ISidedInventory)
|
ForgeDirection direction = this.tileEntity.getFacingDirectionFromAngle();
|
||||||
|
List<ItemStack> stacks = new ArrayList<ItemStack>();
|
||||||
|
if (this.stack != null)
|
||||||
{
|
{
|
||||||
ISidedInventory inventory = (ISidedInventory) targetTile;
|
stacks.add(stack);
|
||||||
int[] slots = inventory.getAccessibleSlotsFromSide(direction.getOpposite().ordinal());
|
}
|
||||||
for (int i = 0; i < slots.length; i++)
|
InvExtractionHelper invEx = new InvExtractionHelper(this.tileEntity.worldObj, new Vector3(this.tileEntity), stacks, false);
|
||||||
{
|
this.tileEntity.grabItem(invEx.tryGrabFromPosition(new Vector3(targetTile), direction, this.stack != null ? stack.stackSize : 1));
|
||||||
ItemStack slotStack = inventory.getStackInSlot(slots[i]);
|
return !(this.tileEntity.getGrabbedItems().size() > 0);
|
||||||
if (this.stack != null)
|
|
||||||
{
|
|
||||||
if (AutoCraftingManager.areStacksEqual(this.stack, slotStack) && inventory.canExtractItem(slots[i], this.stack, direction.getOpposite().ordinal()))
|
|
||||||
{
|
|
||||||
ItemStack insertStack = this.stack.copy();
|
|
||||||
insertStack.stackSize = Math.min(this.stack.stackSize, slotStack.stackSize);
|
|
||||||
this.tileEntity.grabItem(insertStack);
|
|
||||||
inventory.setInventorySlotContents(slots[i], AutoCraftingManager.decrStackSize(slotStack, insertStack.stackSize));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}// TODO add a way to steal items from players
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -0,0 +1,378 @@
|
||||||
|
package assemblyline.common.machine;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.entity.item.EntityItem;
|
||||||
|
import net.minecraft.inventory.IInventory;
|
||||||
|
import net.minecraft.inventory.ISidedInventory;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.tileentity.TileEntityChest;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
|
import universalelectricity.core.vector.Vector3;
|
||||||
|
import universalelectricity.prefab.multiblock.TileEntityMulti;
|
||||||
|
import assemblyline.common.block.BlockCrate;
|
||||||
|
import assemblyline.common.block.TileEntityCrate;
|
||||||
|
import assemblyline.common.imprinter.ItemImprinter;
|
||||||
|
|
||||||
|
public class InvExtractionHelper
|
||||||
|
{
|
||||||
|
World world;
|
||||||
|
Vector3 location;
|
||||||
|
List<ItemStack> filterItems;
|
||||||
|
boolean inverted;
|
||||||
|
|
||||||
|
public InvExtractionHelper(World world, Vector3 location, List<ItemStack> filters, boolean inverted)
|
||||||
|
{
|
||||||
|
this.world = world;
|
||||||
|
this.location = location;
|
||||||
|
this.filterItems = filters;
|
||||||
|
if (filterItems == null)
|
||||||
|
{
|
||||||
|
filterItems = new ArrayList<ItemStack>();
|
||||||
|
}
|
||||||
|
this.inverted = inverted;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws the items from the manipulator into the world.
|
||||||
|
*
|
||||||
|
* @param outputPosition
|
||||||
|
* @param items
|
||||||
|
*/
|
||||||
|
public void throwItem(Vector3 outputPosition, ItemStack items)
|
||||||
|
{
|
||||||
|
if (!world.isRemote)
|
||||||
|
{
|
||||||
|
EntityItem entityItem = new EntityItem(world, outputPosition.x + 0.5, outputPosition.y + 0.8, outputPosition.z + 0.5, items);
|
||||||
|
entityItem.motionX = 0;
|
||||||
|
entityItem.motionZ = 0;
|
||||||
|
entityItem.motionY /= 5;
|
||||||
|
entityItem.delayBeforeCanPickup = 20;
|
||||||
|
world.spawnEntityInWorld(entityItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to place an itemStack in a specific position if it is an inventory.
|
||||||
|
*
|
||||||
|
* @return The ItemStack remained after place attempt
|
||||||
|
*/
|
||||||
|
public ItemStack tryPlaceInPosition(ItemStack itemStack, Vector3 position, ForgeDirection direction)
|
||||||
|
{
|
||||||
|
TileEntity tileEntity = position.getTileEntity(world);
|
||||||
|
|
||||||
|
if (tileEntity != null && itemStack != null)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Try to put items into a chest.
|
||||||
|
*/
|
||||||
|
if (tileEntity instanceof TileEntityMulti)
|
||||||
|
{
|
||||||
|
Vector3 mainBlockPosition = ((TileEntityMulti) tileEntity).mainBlockPosition;
|
||||||
|
|
||||||
|
if (mainBlockPosition != null)
|
||||||
|
{
|
||||||
|
if (!(mainBlockPosition.getTileEntity(world) instanceof TileEntityMulti))
|
||||||
|
{
|
||||||
|
return tryPlaceInPosition(itemStack, mainBlockPosition, direction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tileEntity instanceof TileEntityChest)
|
||||||
|
{
|
||||||
|
TileEntityChest[] chests = { (TileEntityChest) tileEntity, null };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to find a double chest.
|
||||||
|
*/
|
||||||
|
for (int i = 2; i < 6; i++)
|
||||||
|
{
|
||||||
|
ForgeDirection searchDirection = ForgeDirection.getOrientation(i);
|
||||||
|
Vector3 searchPosition = position.clone();
|
||||||
|
searchPosition.modifyPositionFromSide(searchDirection);
|
||||||
|
|
||||||
|
if (searchPosition.getTileEntity(world) != null)
|
||||||
|
{
|
||||||
|
if (searchPosition.getTileEntity(world).getClass() == chests[0].getClass())
|
||||||
|
{
|
||||||
|
chests[1] = (TileEntityChest) searchPosition.getTileEntity(world);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (TileEntityChest chest : chests)
|
||||||
|
{
|
||||||
|
if (chest != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < chest.getSizeInventory(); i++)
|
||||||
|
{
|
||||||
|
itemStack = this.addStackToInventory(i, chest, itemStack);
|
||||||
|
if (itemStack == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tileEntity instanceof TileEntityCrate)
|
||||||
|
{
|
||||||
|
return BlockCrate.addStackToCrate((TileEntityCrate) tileEntity, itemStack);
|
||||||
|
}
|
||||||
|
else if (tileEntity instanceof ISidedInventory)
|
||||||
|
{
|
||||||
|
ISidedInventory inventory = (ISidedInventory) tileEntity;
|
||||||
|
int[] slots = inventory.getAccessibleSlotsFromSide(direction.getOpposite().ordinal());
|
||||||
|
for (int i = 0; i < slots.length; i++)
|
||||||
|
{
|
||||||
|
if (inventory.canInsertItem(slots[i], itemStack, direction.getOpposite().ordinal()))
|
||||||
|
{
|
||||||
|
itemStack = this.addStackToInventory(slots[i], inventory, itemStack);
|
||||||
|
}
|
||||||
|
if (itemStack == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (tileEntity instanceof net.minecraftforge.common.ISidedInventory)
|
||||||
|
{
|
||||||
|
net.minecraftforge.common.ISidedInventory inventory = (net.minecraftforge.common.ISidedInventory) tileEntity;
|
||||||
|
|
||||||
|
int startIndex = inventory.getStartInventorySide(direction.getOpposite());
|
||||||
|
|
||||||
|
for (int i = startIndex; i < startIndex + inventory.getSizeInventorySide(direction); i++)
|
||||||
|
{
|
||||||
|
itemStack = this.addStackToInventory(i, inventory, itemStack);
|
||||||
|
if (itemStack == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tileEntity instanceof IInventory)
|
||||||
|
{
|
||||||
|
IInventory inventory = (IInventory) tileEntity;
|
||||||
|
|
||||||
|
for (int i = 0; i < inventory.getSizeInventory(); i++)
|
||||||
|
{
|
||||||
|
itemStack = this.addStackToInventory(i, inventory, itemStack);
|
||||||
|
if (itemStack == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemStack.stackSize <= 0)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return itemStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStack addStackToInventory(int slotIndex, IInventory inventory, ItemStack itemStack)
|
||||||
|
{
|
||||||
|
if (inventory.getSizeInventory() > slotIndex)
|
||||||
|
{
|
||||||
|
ItemStack stackInInventory = inventory.getStackInSlot(slotIndex);
|
||||||
|
|
||||||
|
if (stackInInventory == null)
|
||||||
|
{
|
||||||
|
inventory.setInventorySlotContents(slotIndex, itemStack);
|
||||||
|
if (inventory.getStackInSlot(slotIndex) == null)
|
||||||
|
{
|
||||||
|
return itemStack;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else if (stackInInventory.isItemEqual(itemStack) && stackInInventory.isStackable())
|
||||||
|
{
|
||||||
|
stackInInventory = stackInInventory.copy();
|
||||||
|
int stackLim = Math.min(inventory.getInventoryStackLimit(), itemStack.getMaxStackSize());
|
||||||
|
int rejectedAmount = Math.max((stackInInventory.stackSize + itemStack.stackSize) - stackLim, 0);
|
||||||
|
stackInInventory.stackSize = Math.min(Math.max((stackInInventory.stackSize + itemStack.stackSize - rejectedAmount), 0), inventory.getInventoryStackLimit());
|
||||||
|
itemStack.stackSize = rejectedAmount;
|
||||||
|
inventory.setInventorySlotContents(slotIndex, stackInInventory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemStack.stackSize <= 0)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return itemStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to take a item from a inventory at a specific position.
|
||||||
|
*
|
||||||
|
* @param position
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public ItemStack tryGrabFromPosition(Vector3 position, ForgeDirection direction, int ammount)
|
||||||
|
{
|
||||||
|
ItemStack returnStack = null;
|
||||||
|
TileEntity tileEntity = position.getTileEntity(world);
|
||||||
|
|
||||||
|
if (tileEntity != null)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Try to put items into a chest.
|
||||||
|
*/
|
||||||
|
if (tileEntity instanceof TileEntityMulti)
|
||||||
|
{
|
||||||
|
Vector3 mainBlockPosition = ((TileEntityMulti) tileEntity).mainBlockPosition;
|
||||||
|
|
||||||
|
if (mainBlockPosition != null)
|
||||||
|
{
|
||||||
|
if (!(mainBlockPosition.getTileEntity(world) instanceof TileEntityMulti))
|
||||||
|
{
|
||||||
|
return tryGrabFromPosition(mainBlockPosition, direction, ammount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tileEntity instanceof TileEntityChest)
|
||||||
|
{
|
||||||
|
TileEntityChest[] chests = { (TileEntityChest) tileEntity, null };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to find a double chest.
|
||||||
|
*/
|
||||||
|
for (int i = 2; i < 6; i++)
|
||||||
|
{
|
||||||
|
ForgeDirection searchDirection = ForgeDirection.getOrientation(i);
|
||||||
|
Vector3 searchPosition = position.clone();
|
||||||
|
searchPosition.modifyPositionFromSide(searchDirection);
|
||||||
|
|
||||||
|
if (searchPosition.getTileEntity(world) != null)
|
||||||
|
{
|
||||||
|
if (searchPosition.getTileEntity(world).getClass() == chests[0].getClass())
|
||||||
|
{
|
||||||
|
chests[1] = (TileEntityChest) searchPosition.getTileEntity(world);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
chestSearch:
|
||||||
|
for (TileEntityChest chest : chests)
|
||||||
|
{
|
||||||
|
if (chest != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < chest.getSizeInventory(); i++)
|
||||||
|
{
|
||||||
|
ItemStack itemStack = this.removeStackFromInventory(i, chest,ammount);
|
||||||
|
|
||||||
|
if (itemStack != null)
|
||||||
|
{
|
||||||
|
returnStack = itemStack;
|
||||||
|
break chestSearch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tileEntity instanceof ISidedInventory)
|
||||||
|
{
|
||||||
|
ISidedInventory inventory = (ISidedInventory) tileEntity;
|
||||||
|
|
||||||
|
int[] slots = inventory.getAccessibleSlotsFromSide(direction.ordinal());
|
||||||
|
|
||||||
|
for (int i = 0; i < slots.length; i++)
|
||||||
|
{
|
||||||
|
int slot = slots[i];
|
||||||
|
ItemStack itemStack = this.removeStackFromInventory(i, inventory,ammount);
|
||||||
|
if (itemStack != null && inventory.canExtractItem(slot, itemStack, direction.ordinal()))
|
||||||
|
{
|
||||||
|
returnStack = itemStack;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tileEntity instanceof net.minecraftforge.common.ISidedInventory)
|
||||||
|
{
|
||||||
|
net.minecraftforge.common.ISidedInventory inventory = (net.minecraftforge.common.ISidedInventory) tileEntity;
|
||||||
|
|
||||||
|
int startIndex = inventory.getStartInventorySide(direction);
|
||||||
|
|
||||||
|
for (int i = startIndex; i < startIndex + inventory.getSizeInventorySide(direction); i++)
|
||||||
|
{
|
||||||
|
ItemStack itemStack = this.removeStackFromInventory(i, inventory,ammount);
|
||||||
|
|
||||||
|
if (itemStack != null)
|
||||||
|
{
|
||||||
|
returnStack = itemStack;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tileEntity instanceof IInventory)
|
||||||
|
{
|
||||||
|
IInventory inventory = (IInventory) tileEntity;
|
||||||
|
|
||||||
|
for (int i = 0; i < inventory.getSizeInventory(); i++)
|
||||||
|
{
|
||||||
|
ItemStack itemStack = this.removeStackFromInventory(i, inventory,ammount);
|
||||||
|
if (itemStack != null)
|
||||||
|
{
|
||||||
|
returnStack = itemStack;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnStack;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Takes an item from the given inventory
|
||||||
|
*/
|
||||||
|
public ItemStack removeStackFromInventory(int slotIndex, IInventory inventory, int ammount)
|
||||||
|
{
|
||||||
|
if (inventory.getStackInSlot(slotIndex) != null)
|
||||||
|
{
|
||||||
|
ItemStack itemStack = inventory.getStackInSlot(slotIndex).copy();
|
||||||
|
|
||||||
|
if (this.filterItems.size() == 0 || this.isFiltering(itemStack))
|
||||||
|
{
|
||||||
|
itemStack.stackSize = ammount;
|
||||||
|
inventory.decrStackSize(slotIndex, 1);
|
||||||
|
return itemStack;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* is the item being restricted to a filter set
|
||||||
|
*/
|
||||||
|
public boolean isFiltering(ItemStack itemStack)
|
||||||
|
{
|
||||||
|
if (this.filterItems != null && itemStack != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < filterItems.size(); i++)
|
||||||
|
{
|
||||||
|
if (filterItems.get(i) != null)
|
||||||
|
{
|
||||||
|
if (filterItems.get(i).isItemEqual(itemStack))
|
||||||
|
{
|
||||||
|
return !inverted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return inverted;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -19,20 +19,32 @@ import universalelectricity.prefab.network.PacketManager;
|
||||||
import assemblyline.api.IManipulator;
|
import assemblyline.api.IManipulator;
|
||||||
import assemblyline.common.block.BlockCrate;
|
import assemblyline.common.block.BlockCrate;
|
||||||
import assemblyline.common.block.TileEntityCrate;
|
import assemblyline.common.block.TileEntityCrate;
|
||||||
|
import assemblyline.common.imprinter.ItemImprinter;
|
||||||
import assemblyline.common.imprinter.prefab.TileEntityFilterable;
|
import assemblyline.common.imprinter.prefab.TileEntityFilterable;
|
||||||
import cpw.mods.fml.common.network.PacketDispatcher;
|
import cpw.mods.fml.common.network.PacketDispatcher;
|
||||||
|
|
||||||
public class TileEntityManipulator extends TileEntityFilterable implements IRotatable, IRedstoneReceptor, IManipulator
|
public class TileEntityManipulator extends TileEntityFilterable implements IRotatable, IRedstoneReceptor, IManipulator
|
||||||
{
|
{
|
||||||
public boolean selfPulse = false;
|
public boolean selfPulse = false;
|
||||||
|
/* SET TO OUTPUT MODE */
|
||||||
/**
|
|
||||||
* Is the manipulator wrenched to turn into output mode?
|
|
||||||
*/
|
|
||||||
private boolean isOutput = false;
|
private boolean isOutput = false;
|
||||||
|
|
||||||
private boolean isRedstonePowered = false;
|
private boolean isRedstonePowered = false;
|
||||||
|
|
||||||
|
private InvExtractionHelper invExtractionHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the class that managed extracting and placing items into inventories
|
||||||
|
*/
|
||||||
|
public InvExtractionHelper invHelper()
|
||||||
|
{
|
||||||
|
if (invExtractionHelper == null)
|
||||||
|
{
|
||||||
|
this.invExtractionHelper = new InvExtractionHelper(this.worldObj, new Vector3(this), this.getFilter() != null ? ItemImprinter.getFilters(getFilter()) : null, this.isInverted());
|
||||||
|
}
|
||||||
|
return invExtractionHelper;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isOutput()
|
public boolean isOutput()
|
||||||
{
|
{
|
||||||
return this.isOutput;
|
return this.isOutput;
|
||||||
|
@ -133,21 +145,21 @@ public class TileEntityManipulator extends TileEntityFilterable implements IRota
|
||||||
|
|
||||||
if (this.getFilter() == null || this.isFiltering(remainingStack))
|
if (this.getFilter() == null || this.isFiltering(remainingStack))
|
||||||
{
|
{
|
||||||
remainingStack = this.tryPlaceInPosition(remainingStack, outputUp, ForgeDirection.DOWN);
|
remainingStack = invHelper().tryPlaceInPosition(remainingStack, outputUp, ForgeDirection.DOWN);
|
||||||
|
|
||||||
if (remainingStack != null)
|
if (remainingStack != null)
|
||||||
{
|
{
|
||||||
remainingStack = this.tryPlaceInPosition(remainingStack, outputDown, ForgeDirection.UP);
|
remainingStack = invHelper().tryPlaceInPosition(remainingStack, outputDown, ForgeDirection.UP);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (remainingStack != null)
|
if (remainingStack != null)
|
||||||
{
|
{
|
||||||
remainingStack = this.tryPlaceInPosition(remainingStack, outputPosition, this.getDirection().getOpposite());
|
remainingStack = invHelper().tryPlaceInPosition(remainingStack, outputPosition, this.getDirection().getOpposite());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (remainingStack != null && remainingStack.stackSize > 0)
|
if (remainingStack != null && remainingStack.stackSize > 0)
|
||||||
{
|
{
|
||||||
this.throwItem(outputPosition, remainingStack);
|
invHelper().throwItem(outputPosition, remainingStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
entity.setDead();
|
entity.setDead();
|
||||||
|
@ -175,338 +187,27 @@ public class TileEntityManipulator extends TileEntityFilterable implements IRota
|
||||||
Vector3 outputPosition = new Vector3(this);
|
Vector3 outputPosition = new Vector3(this);
|
||||||
outputPosition.modifyPositionFromSide(this.getDirection());
|
outputPosition.modifyPositionFromSide(this.getDirection());
|
||||||
|
|
||||||
ItemStack itemStack = this.tryGrabFromPosition(inputUp, ForgeDirection.DOWN);
|
ItemStack itemStack = invHelper().tryGrabFromPosition(inputUp, ForgeDirection.DOWN,1);
|
||||||
|
|
||||||
if (itemStack == null)
|
if (itemStack == null)
|
||||||
{
|
{
|
||||||
itemStack = this.tryGrabFromPosition(inputDown, ForgeDirection.UP);
|
itemStack = invHelper().tryGrabFromPosition(inputDown, ForgeDirection.UP,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itemStack == null)
|
if (itemStack == null)
|
||||||
{
|
{
|
||||||
itemStack = this.tryGrabFromPosition(inputPosition, this.getDirection().getOpposite());
|
itemStack = invHelper().tryGrabFromPosition(inputPosition, this.getDirection().getOpposite(),1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itemStack != null)
|
if (itemStack != null)
|
||||||
{
|
{
|
||||||
if (itemStack.stackSize > 0)
|
if (itemStack.stackSize > 0)
|
||||||
{
|
{
|
||||||
this.throwItem(outputPosition, itemStack);
|
invHelper().throwItem(outputPosition, itemStack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Throws the items from the manipulator into the world.
|
|
||||||
*
|
|
||||||
* @param outputPosition
|
|
||||||
* @param items
|
|
||||||
*/
|
|
||||||
public void throwItem(Vector3 outputPosition, ItemStack items)
|
|
||||||
{
|
|
||||||
if (!this.worldObj.isRemote)
|
|
||||||
{
|
|
||||||
EntityItem entityItem = new EntityItem(this.worldObj, outputPosition.x + 0.5, outputPosition.y + 0.8, outputPosition.z + 0.5, items);
|
|
||||||
entityItem.motionX = 0;
|
|
||||||
entityItem.motionZ = 0;
|
|
||||||
entityItem.motionY /= 5;
|
|
||||||
entityItem.delayBeforeCanPickup = 20;
|
|
||||||
this.worldObj.spawnEntityInWorld(entityItem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tries to place an itemStack in a specific position if it is an inventory.
|
|
||||||
*
|
|
||||||
* @return The ItemStack remained after place attempt
|
|
||||||
*/
|
|
||||||
private ItemStack tryPlaceInPosition(ItemStack itemStack, Vector3 position, ForgeDirection direction)
|
|
||||||
{
|
|
||||||
TileEntity tileEntity = position.getTileEntity(this.worldObj);
|
|
||||||
|
|
||||||
if (tileEntity != null && itemStack != null)
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Try to put items into a chest.
|
|
||||||
*/
|
|
||||||
if (tileEntity instanceof TileEntityMulti)
|
|
||||||
{
|
|
||||||
Vector3 mainBlockPosition = ((TileEntityMulti) tileEntity).mainBlockPosition;
|
|
||||||
|
|
||||||
if (mainBlockPosition != null)
|
|
||||||
{
|
|
||||||
if (!(mainBlockPosition.getTileEntity(this.worldObj) instanceof TileEntityMulti))
|
|
||||||
return tryPlaceInPosition(itemStack, mainBlockPosition, direction);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (tileEntity instanceof TileEntityChest)
|
|
||||||
{
|
|
||||||
TileEntityChest[] chests = { (TileEntityChest) tileEntity, null };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Try to find a double chest.
|
|
||||||
*/
|
|
||||||
for (int i = 2; i < 6; i++)
|
|
||||||
{
|
|
||||||
ForgeDirection searchDirection = ForgeDirection.getOrientation(i);
|
|
||||||
Vector3 searchPosition = position.clone();
|
|
||||||
searchPosition.modifyPositionFromSide(searchDirection);
|
|
||||||
|
|
||||||
if (searchPosition.getTileEntity(this.worldObj) != null)
|
|
||||||
{
|
|
||||||
if (searchPosition.getTileEntity(this.worldObj).getClass() == chests[0].getClass())
|
|
||||||
{
|
|
||||||
chests[1] = (TileEntityChest) searchPosition.getTileEntity(this.worldObj);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (TileEntityChest chest : chests)
|
|
||||||
{
|
|
||||||
if (chest != null)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < chest.getSizeInventory(); i++)
|
|
||||||
{
|
|
||||||
itemStack = this.addStackToInventory(i, chest, itemStack);
|
|
||||||
if (itemStack == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (tileEntity instanceof TileEntityCrate)
|
|
||||||
{
|
|
||||||
return BlockCrate.addStackToCrate((TileEntityCrate) tileEntity, itemStack);
|
|
||||||
}
|
|
||||||
else if (tileEntity instanceof ISidedInventory)
|
|
||||||
{
|
|
||||||
ISidedInventory inventory = (ISidedInventory) tileEntity;
|
|
||||||
int[] slots = inventory.getAccessibleSlotsFromSide(direction.getOpposite().ordinal());
|
|
||||||
for (int i = 0; i < slots.length; i++)
|
|
||||||
{
|
|
||||||
if (inventory.canInsertItem(slots[i], itemStack, direction.getOpposite().ordinal()))
|
|
||||||
{
|
|
||||||
itemStack = this.addStackToInventory(slots[i], inventory, itemStack);
|
|
||||||
}
|
|
||||||
if (itemStack == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (tileEntity instanceof net.minecraftforge.common.ISidedInventory)
|
|
||||||
{
|
|
||||||
net.minecraftforge.common.ISidedInventory inventory = (net.minecraftforge.common.ISidedInventory) tileEntity;
|
|
||||||
|
|
||||||
int startIndex = inventory.getStartInventorySide(direction.getOpposite());
|
|
||||||
|
|
||||||
for (int i = startIndex; i < startIndex + inventory.getSizeInventorySide(direction); i++)
|
|
||||||
{
|
|
||||||
itemStack = this.addStackToInventory(i, inventory, itemStack);
|
|
||||||
if (itemStack == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (tileEntity instanceof IInventory)
|
|
||||||
{
|
|
||||||
IInventory inventory = (IInventory) tileEntity;
|
|
||||||
|
|
||||||
for (int i = 0; i < inventory.getSizeInventory(); i++)
|
|
||||||
{
|
|
||||||
itemStack = this.addStackToInventory(i, inventory, itemStack);
|
|
||||||
if (itemStack == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (itemStack.stackSize <= 0)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return itemStack;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ItemStack addStackToInventory(int slotIndex, IInventory inventory, ItemStack itemStack)
|
|
||||||
{
|
|
||||||
if (inventory.getSizeInventory() > slotIndex)
|
|
||||||
{
|
|
||||||
ItemStack stackInInventory = inventory.getStackInSlot(slotIndex);
|
|
||||||
|
|
||||||
if (stackInInventory == null)
|
|
||||||
{
|
|
||||||
inventory.setInventorySlotContents(slotIndex, itemStack);
|
|
||||||
if (inventory.getStackInSlot(slotIndex) == null)
|
|
||||||
{
|
|
||||||
return itemStack;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
else if (stackInInventory.isItemEqual(itemStack) && stackInInventory.isStackable())
|
|
||||||
{
|
|
||||||
stackInInventory = stackInInventory.copy();
|
|
||||||
int stackLim = Math.min(inventory.getInventoryStackLimit(), itemStack.getMaxStackSize());
|
|
||||||
int rejectedAmount = Math.max((stackInInventory.stackSize + itemStack.stackSize) - stackLim, 0);
|
|
||||||
stackInInventory.stackSize = Math.min(Math.max((stackInInventory.stackSize + itemStack.stackSize - rejectedAmount), 0), inventory.getInventoryStackLimit());
|
|
||||||
itemStack.stackSize = rejectedAmount;
|
|
||||||
inventory.setInventorySlotContents(slotIndex, stackInInventory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (itemStack.stackSize <= 0)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return itemStack;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tries to take a item from a inventory at a specific position.
|
|
||||||
*
|
|
||||||
* @param position
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private ItemStack tryGrabFromPosition(Vector3 position, ForgeDirection direction)
|
|
||||||
{
|
|
||||||
ItemStack returnStack = null;
|
|
||||||
TileEntity tileEntity = position.getTileEntity(this.worldObj);
|
|
||||||
|
|
||||||
if (tileEntity != null)
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Try to put items into a chest.
|
|
||||||
*/
|
|
||||||
if (tileEntity instanceof TileEntityMulti)
|
|
||||||
{
|
|
||||||
Vector3 mainBlockPosition = ((TileEntityMulti) tileEntity).mainBlockPosition;
|
|
||||||
|
|
||||||
if (mainBlockPosition != null)
|
|
||||||
{
|
|
||||||
if (!(mainBlockPosition.getTileEntity(this.worldObj) instanceof TileEntityMulti))
|
|
||||||
return tryGrabFromPosition(mainBlockPosition, direction);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (tileEntity instanceof TileEntityChest)
|
|
||||||
{
|
|
||||||
TileEntityChest[] chests = { (TileEntityChest) tileEntity, null };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Try to find a double chest.
|
|
||||||
*/
|
|
||||||
for (int i = 2; i < 6; i++)
|
|
||||||
{
|
|
||||||
ForgeDirection searchDirection = ForgeDirection.getOrientation(i);
|
|
||||||
Vector3 searchPosition = position.clone();
|
|
||||||
searchPosition.modifyPositionFromSide(searchDirection);
|
|
||||||
|
|
||||||
if (searchPosition.getTileEntity(this.worldObj) != null)
|
|
||||||
{
|
|
||||||
if (searchPosition.getTileEntity(this.worldObj).getClass() == chests[0].getClass())
|
|
||||||
{
|
|
||||||
chests[1] = (TileEntityChest) searchPosition.getTileEntity(this.worldObj);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chestSearch:
|
|
||||||
for (TileEntityChest chest : chests)
|
|
||||||
{
|
|
||||||
if (chest != null)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < chest.getSizeInventory(); i++)
|
|
||||||
{
|
|
||||||
ItemStack itemStack = this.removeStackFromInventory(i, chest);
|
|
||||||
|
|
||||||
if (itemStack != null)
|
|
||||||
{
|
|
||||||
returnStack = itemStack;
|
|
||||||
break chestSearch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (tileEntity instanceof ISidedInventory)
|
|
||||||
{
|
|
||||||
ISidedInventory inventory = (ISidedInventory) tileEntity;
|
|
||||||
|
|
||||||
int[] slots = inventory.getAccessibleSlotsFromSide(direction.ordinal());
|
|
||||||
|
|
||||||
for (int i = 0; i < slots.length; i++)
|
|
||||||
{
|
|
||||||
int slot = slots[i];
|
|
||||||
ItemStack itemStack = this.removeStackFromInventory(i, inventory);
|
|
||||||
if (itemStack != null && inventory.canExtractItem(slot, itemStack, direction.ordinal()))
|
|
||||||
{
|
|
||||||
returnStack = itemStack;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (tileEntity instanceof net.minecraftforge.common.ISidedInventory)
|
|
||||||
{
|
|
||||||
net.minecraftforge.common.ISidedInventory inventory = (net.minecraftforge.common.ISidedInventory) tileEntity;
|
|
||||||
|
|
||||||
int startIndex = inventory.getStartInventorySide(direction);
|
|
||||||
|
|
||||||
for (int i = startIndex; i < startIndex + inventory.getSizeInventorySide(direction); i++)
|
|
||||||
{
|
|
||||||
ItemStack itemStack = this.removeStackFromInventory(i, inventory);
|
|
||||||
|
|
||||||
if (itemStack != null)
|
|
||||||
{
|
|
||||||
returnStack = itemStack;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (tileEntity instanceof IInventory)
|
|
||||||
{
|
|
||||||
IInventory inventory = (IInventory) tileEntity;
|
|
||||||
|
|
||||||
for (int i = 0; i < inventory.getSizeInventory(); i++)
|
|
||||||
{
|
|
||||||
ItemStack itemStack = this.removeStackFromInventory(i, inventory);
|
|
||||||
if (itemStack != null)
|
|
||||||
{
|
|
||||||
returnStack = itemStack;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnStack;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ItemStack removeStackFromInventory(int slotIndex, IInventory inventory)
|
|
||||||
{
|
|
||||||
if (inventory.getStackInSlot(slotIndex) != null)
|
|
||||||
{
|
|
||||||
ItemStack itemStack = inventory.getStackInSlot(slotIndex).copy();
|
|
||||||
|
|
||||||
if (this.getFilter() == null || this.isFiltering(itemStack))
|
|
||||||
{
|
|
||||||
itemStack.stackSize = 1;
|
|
||||||
inventory.decrStackSize(slotIndex, 1);
|
|
||||||
return itemStack;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readFromNBT(NBTTagCompound nbt)
|
public void readFromNBT(NBTTagCompound nbt)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue