Engineering table now can auto-craft
This commit is contained in:
parent
beb453df1e
commit
49e790e667
2 changed files with 53 additions and 97 deletions
|
@ -156,6 +156,9 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DO NOT USE THIS INTERNALLY. FOR EXTERNAL USE ONLY!
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public ItemStack getStackInSlot(int slot)
|
public ItemStack getStackInSlot(int slot)
|
||||||
{
|
{
|
||||||
|
@ -165,7 +168,7 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive
|
||||||
}
|
}
|
||||||
else if (slot < CRAFTING_OUTPUT_END)
|
else if (slot < CRAFTING_OUTPUT_END)
|
||||||
{
|
{
|
||||||
return this.inventory[slot - CRAFTING_MATRIX_END];
|
return inventory[slot - CRAFTING_MATRIX_END];
|
||||||
}
|
}
|
||||||
else if (slot < PLAYER_OUTPUT_END && invPlayer != null)
|
else if (slot < PLAYER_OUTPUT_END && invPlayer != null)
|
||||||
{
|
{
|
||||||
|
@ -204,6 +207,12 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive
|
||||||
}
|
}
|
||||||
else if (slot < CRAFTING_OUTPUT_END)
|
else if (slot < CRAFTING_OUTPUT_END)
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* An external inventory is attempting to craft the item from the engineering table.
|
||||||
|
*/
|
||||||
|
if (itemStack == null)
|
||||||
|
onPickUpFromSlot(null, slot, this.inventory[slot - CRAFTING_MATRIX_END]);
|
||||||
|
|
||||||
this.inventory[slot - CRAFTING_MATRIX_END] = itemStack;
|
this.inventory[slot - CRAFTING_MATRIX_END] = itemStack;
|
||||||
}
|
}
|
||||||
else if (slot < PLAYER_OUTPUT_END && this.invPlayer != null)
|
else if (slot < PLAYER_OUTPUT_END && this.invPlayer != null)
|
||||||
|
@ -356,7 +365,7 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPickUpFromSlot(EntityPlayer entityPlayer, int s, ItemStack itemStack)
|
public void onPickUpFromSlot(EntityPlayer entityPlayer, int slotID, ItemStack itemStack)
|
||||||
{
|
{
|
||||||
if (!worldObj.isRemote)
|
if (!worldObj.isRemote)
|
||||||
{
|
{
|
||||||
|
@ -458,19 +467,58 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive
|
||||||
@Override
|
@Override
|
||||||
public int[] getAccessibleSlotsFromSide(int side)
|
public int[] getAccessibleSlotsFromSide(int side)
|
||||||
{
|
{
|
||||||
return this.getCraftingInv();
|
return new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto-crafting methods.
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean canInsertItem(int slot, ItemStack itemstack, int side)
|
public boolean canInsertItem(int slot, ItemStack itemstack, int side)
|
||||||
{
|
{
|
||||||
return this.isItemValidForSlot(slot, itemstack);
|
if (getStackInSlot(4) != null && getStackInSlot(4).getItem() instanceof ItemImprint)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
int minSize = 64;
|
||||||
|
int optimalSlot = -1;
|
||||||
|
|
||||||
|
for (int i = 0; i < craftingMatrix.length; i++)
|
||||||
|
{
|
||||||
|
ItemStack checkStack = getStackInSlot(i);
|
||||||
|
|
||||||
|
if (checkStack != null && checkStack.isItemEqual(itemstack))
|
||||||
|
{
|
||||||
|
if (checkStack.stackSize < minSize || optimalSlot < 0)
|
||||||
|
{
|
||||||
|
optimalSlot = i;
|
||||||
|
minSize = checkStack.stackSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return slot == optimalSlot;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canExtractItem(int slot, ItemStack itemstack, int side)
|
public boolean canExtractItem(int slot, ItemStack itemstack, int side)
|
||||||
{
|
{
|
||||||
return this.isItemValidForSlot(slot, itemstack);
|
ItemStack outputStack = getStackInSlot(CRAFTING_MATRIX_END);
|
||||||
|
|
||||||
|
if (outputStack != null)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Only allow take out crafting result when it can be crafted twice!
|
||||||
|
*/
|
||||||
|
Pair<ItemStack, ItemStack[]> idealRecipeItem = this.getCraftingManager().getIdealRecipe(outputStack);
|
||||||
|
ItemStack[] doubleResults = ArrayUtils.addAll(idealRecipeItem.right(), idealRecipeItem.right());
|
||||||
|
|
||||||
|
if (!getCraftingManager().consumeItems(false, doubleResults))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return slot == CRAFTING_MATRIX_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -22,12 +22,6 @@ import calclavia.lib.utility.FluidUtility;
|
||||||
*/
|
*/
|
||||||
public class PipeNetwork extends FluidNetwork
|
public class PipeNetwork extends FluidNetwork
|
||||||
{
|
{
|
||||||
public HashMap<IFluidHandler, EnumSet<ForgeDirection>> sideMap = new HashMap<IFluidHandler, EnumSet<ForgeDirection>>();
|
|
||||||
public HashMap<IFluidHandler, IFluidConnector> connectionMap = new HashMap<IFluidHandler, IFluidConnector>();
|
|
||||||
public int maxFlowRate = 0;
|
|
||||||
public int currentPressure = 0;
|
|
||||||
public int currentFlowRate = 0;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update()
|
public void update()
|
||||||
{
|
{
|
||||||
|
@ -41,62 +35,6 @@ public class PipeNetwork extends FluidNetwork
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Old pipe distribution code.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public void oldDistribution()
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Slight delay to allow visual effect to take place before draining the pipe's internal
|
|
||||||
* tank
|
|
||||||
*/
|
|
||||||
FluidStack stack = this.getTank().getFluid().copy();
|
|
||||||
int count = this.sideMap.size();
|
|
||||||
|
|
||||||
Iterator<Entry<IFluidHandler, EnumSet<ForgeDirection>>> it = new HashMap<IFluidHandler, EnumSet<ForgeDirection>>(sideMap).entrySet().iterator();
|
|
||||||
|
|
||||||
while (it.hasNext())
|
|
||||||
{
|
|
||||||
Entry<IFluidHandler, EnumSet<ForgeDirection>> entry = it.next();
|
|
||||||
int sideCount = entry.getValue().size();
|
|
||||||
|
|
||||||
for (ForgeDirection dir : entry.getValue())
|
|
||||||
{
|
|
||||||
int volPer = (stack.amount / count);
|
|
||||||
int volPerSide = (volPer / sideCount);
|
|
||||||
IFluidHandler handler = entry.getKey();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Don't input to tanks from the sides where the pipe is extraction mode. This
|
|
||||||
* prevents feed-back loops.
|
|
||||||
*/
|
|
||||||
if (connectionMap.get(handler).canFlow())
|
|
||||||
{
|
|
||||||
stack.amount -= handler.fill(dir, FluidUtility.getStack(stack, Math.min(volPerSide, this.maxFlowRate)), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sideCount > 1)
|
|
||||||
--sideCount;
|
|
||||||
if (volPer <= 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count > 1)
|
|
||||||
count--;
|
|
||||||
|
|
||||||
if (stack == null || stack.amount <= 0)
|
|
||||||
{
|
|
||||||
stack = null;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getTank().setFluid(stack);
|
|
||||||
// TODO check for change before rebuilding
|
|
||||||
reconstructTankInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate pressure in this pipe.
|
* Calculate pressure in this pipe.
|
||||||
*/
|
*/
|
||||||
|
@ -243,36 +181,6 @@ public class PipeNetwork extends FluidNetwork
|
||||||
return canUpdate();
|
return canUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reconstruct()
|
|
||||||
{
|
|
||||||
this.sideMap.clear();
|
|
||||||
this.maxFlowRate = Integer.MAX_VALUE;
|
|
||||||
super.reconstruct();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reconstructConnector(IFluidConnector connector)
|
|
||||||
{
|
|
||||||
super.reconstructConnector(connector);
|
|
||||||
|
|
||||||
for (int i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
if (connector.getConnections()[i] instanceof IFluidHandler && !(connector.getConnections()[i] instanceof IFluidPipe))
|
|
||||||
{
|
|
||||||
EnumSet<ForgeDirection> set = this.sideMap.get(connector.getConnections()[i]);
|
|
||||||
if (set == null)
|
|
||||||
{
|
|
||||||
set = EnumSet.noneOf(ForgeDirection.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
set.add(ForgeDirection.getOrientation(i).getOpposite());
|
|
||||||
sideMap.put((IFluidHandler) connector.getConnections()[i], set);
|
|
||||||
connectionMap.put((IFluidHandler) connector.getConnections()[i], connector);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FluidStack drain(IFluidConnector source, ForgeDirection from, FluidStack resource, boolean doDrain)
|
public FluidStack drain(IFluidConnector source, ForgeDirection from, FluidStack resource, boolean doDrain)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue