Implement Integration Table logic
This commit is contained in:
parent
edf8f17a6f
commit
173aabf91d
3 changed files with 195 additions and 7 deletions
|
@ -24,11 +24,15 @@ public interface IIntegrationRecipeManager {
|
||||||
|
|
||||||
double getEnergyCost();
|
double getEnergyCost();
|
||||||
|
|
||||||
boolean isValidInput(ItemStack stack);
|
boolean isValidInputA(ItemStack inputA);
|
||||||
|
|
||||||
ItemStack getOutputForInput(ItemStack stack);
|
boolean isValidInputB(ItemStack inputB);
|
||||||
|
|
||||||
ItemStack[] getExampleInputs();
|
ItemStack getOutputForInputs(ItemStack inputA, ItemStack inputB);
|
||||||
|
|
||||||
|
ItemStack[] getExampleInputsA();
|
||||||
|
|
||||||
|
ItemStack[] getExampleInputsB();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -154,7 +154,7 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isUseableByPlayer(EntityPlayer entityplayer) {
|
public boolean isUseableByPlayer(EntityPlayer entityplayer) {
|
||||||
return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) == this;
|
return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) == this && !isInvalid();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -8,19 +8,203 @@
|
||||||
*/
|
*/
|
||||||
package buildcraft.silicon;
|
package buildcraft.silicon;
|
||||||
|
|
||||||
|
import buildcraft.api.recipes.BuildcraftRecipes;
|
||||||
|
import buildcraft.api.recipes.IIntegrationRecipeManager.IIntegrationRecipe;
|
||||||
|
import buildcraft.core.inventory.ITransactor;
|
||||||
|
import buildcraft.core.inventory.InventoryMapper;
|
||||||
|
import buildcraft.core.inventory.SimpleInventory;
|
||||||
|
import buildcraft.core.inventory.StackHelper;
|
||||||
|
import buildcraft.core.inventory.Transactor;
|
||||||
|
import buildcraft.core.utils.Utils;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.inventory.ISidedInventory;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author CovertJaguar <http://www.railcraft.info/>
|
* @author CovertJaguar <http://www.railcraft.info/>
|
||||||
*/
|
*/
|
||||||
public class TileIntegrationTable extends TileLaserTableBase {
|
public class TileIntegrationTable extends TileLaserTableBase implements ISidedInventory {
|
||||||
|
|
||||||
|
private static final int CYCLE_LENGTH = 32;
|
||||||
|
private static final int SLOT_INPUT_A = 0;
|
||||||
|
private static final int SLOT_INPUT_B = 1;
|
||||||
|
private static final int SLOT_OUTPUT = 2;
|
||||||
|
private static final int[] SLOTS = Utils.createSlotArray(0, 3);
|
||||||
|
private int tick = 0;
|
||||||
|
private SimpleInventory inv = new SimpleInventory(3, "integration", 64);
|
||||||
|
private InventoryMapper invOutput = new InventoryMapper(inv, SLOT_OUTPUT, 1, false);
|
||||||
|
private IIntegrationRecipe currentRecipe;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateEntity() {
|
||||||
|
super.updateEntity();
|
||||||
|
|
||||||
|
if (worldObj.isRemote)
|
||||||
|
return;
|
||||||
|
|
||||||
|
tick++;
|
||||||
|
if (tick % CYCLE_LENGTH != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
currentRecipe = findMatchingRecipe();
|
||||||
|
|
||||||
|
if (currentRecipe == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (getEnergy() >= currentRecipe.getEnergyCost())
|
||||||
|
tryCraftItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
private IIntegrationRecipe findMatchingRecipe() {
|
||||||
|
ItemStack inputA = inv.getStackInSlot(SLOT_INPUT_A);
|
||||||
|
ItemStack inputB = inv.getStackInSlot(SLOT_INPUT_B);
|
||||||
|
|
||||||
|
for (IIntegrationRecipe recipe : BuildcraftRecipes.integrationTable.getRecipes()) {
|
||||||
|
if (recipe.isValidInputA(inputA) && recipe.isValidInputB(inputB))
|
||||||
|
return recipe;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tryCraftItem() {
|
||||||
|
ItemStack inputA = inv.getStackInSlot(SLOT_INPUT_A);
|
||||||
|
ItemStack inputB = inv.getStackInSlot(SLOT_INPUT_B);
|
||||||
|
ItemStack output = currentRecipe.getOutputForInputs(inputA, inputB);
|
||||||
|
|
||||||
|
if (isRoomForOutput(output)) {
|
||||||
|
setEnergy(0);
|
||||||
|
inv.decrStackSize(SLOT_INPUT_A, 1);
|
||||||
|
inv.decrStackSize(SLOT_INPUT_B, 1);
|
||||||
|
ITransactor trans = Transactor.getTransactorFor(invOutput);
|
||||||
|
trans.add(output, ForgeDirection.UP, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isRoomForOutput(ItemStack output) {
|
||||||
|
ItemStack existingOutput = inv.getStackInSlot(SLOT_OUTPUT);
|
||||||
|
if (existingOutput == null)
|
||||||
|
return true;
|
||||||
|
if (StackHelper.instance().canStacksMerge(output, existingOutput) && output.stackSize + existingOutput.stackSize <= output.getMaxStackSize())
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getRequiredEnergy() {
|
public double getRequiredEnergy() {
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
if (currentRecipe != null) {
|
||||||
|
return currentRecipe.getEnergyCost();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canCraft() {
|
public boolean canCraft() {
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
return currentRecipe != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToNBT(NBTTagCompound nbt) {
|
||||||
|
super.writeToNBT(nbt);
|
||||||
|
inv.writeToNBT(nbt);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readFromNBT(NBTTagCompound nbt) {
|
||||||
|
super.readFromNBT(nbt);
|
||||||
|
inv.readFromNBT(nbt);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isItemValidForSlot(int slot, ItemStack stack) {
|
||||||
|
switch (slot) {
|
||||||
|
case SLOT_INPUT_A:
|
||||||
|
return isValidInputA(stack);
|
||||||
|
case SLOT_INPUT_B:
|
||||||
|
return isValidInputB(stack);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValidInputA(ItemStack stack) {
|
||||||
|
for (IIntegrationRecipe recipe : BuildcraftRecipes.integrationTable.getRecipes()) {
|
||||||
|
if (recipe.isValidInputA(stack))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValidInputB(ItemStack stack) {
|
||||||
|
for (IIntegrationRecipe recipe : BuildcraftRecipes.integrationTable.getRecipes()) {
|
||||||
|
if (recipe.isValidInputB(stack))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int[] getAccessibleSlotsFromSide(int side) {
|
||||||
|
return SLOTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canInsertItem(int slot, ItemStack stack, int side) {
|
||||||
|
return isItemValidForSlot(slot, stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canExtractItem(int slot, ItemStack stack, int side) {
|
||||||
|
return slot == SLOT_OUTPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSizeInventory() {
|
||||||
|
return inv.getSizeInventory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack getStackInSlot(int slot) {
|
||||||
|
return inv.getStackInSlot(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack decrStackSize(int slot, int amount) {
|
||||||
|
return inv.decrStackSize(slot, amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack getStackInSlotOnClosing(int slot) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setInventorySlotContents(int slot, ItemStack stack) {
|
||||||
|
inv.setInventorySlotContents(slot, stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getInvName() {
|
||||||
|
return "Integration Table";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getInventoryStackLimit() {
|
||||||
|
return inv.getInventoryStackLimit();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isUseableByPlayer(EntityPlayer player) {
|
||||||
|
return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) == this && !isInvalid();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void openChest() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void closeChest() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue