aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities
diff options
context:
space:
mode:
authorJordan Byrne <draknyte1@hotmail.com>2018-03-03 00:55:17 +1000
committerJordan Byrne <draknyte1@hotmail.com>2018-03-03 00:55:17 +1000
commit7d0e25469b1a9169df3b81a33c686349aac56717 (patch)
treec33bbc47ad4a9f0897578de324dd1f2db3083975 /src/Java/gtPlusPlus/xmod/gregtech/common/tileentities
parent5d674370577d6fb4210007055cd67f881b026dad (diff)
downloadGT5-Unofficial-7d0e25469b1a9169df3b81a33c686349aac56717.tar.gz
GT5-Unofficial-7d0e25469b1a9169df3b81a33c686349aac56717.tar.bz2
GT5-Unofficial-7d0e25469b1a9169df3b81a33c686349aac56717.zip
$ Replicator Module work.
Diffstat (limited to 'src/Java/gtPlusPlus/xmod/gregtech/common/tileentities')
-rw-r--r--src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/GregtechMetaTileEntity_IndustrialMultiMachine.java157
1 files changed, 150 insertions, 7 deletions
diff --git a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/GregtechMetaTileEntity_IndustrialMultiMachine.java b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/GregtechMetaTileEntity_IndustrialMultiMachine.java
index b46b41a9ac..892b91a365 100644
--- a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/GregtechMetaTileEntity_IndustrialMultiMachine.java
+++ b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/GregtechMetaTileEntity_IndustrialMultiMachine.java
@@ -9,22 +9,27 @@ import org.apache.commons.lang3.ArrayUtils;
import net.minecraft.block.Block;
import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
-import gregtech.api.enums.TAE;
-import gregtech.api.enums.Textures;
+import gregtech.api.enums.*;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_OutputBus;
import gregtech.api.objects.GT_RenderedTexture;
+import gregtech.api.util.GT_OreDictUnificator;
import gregtech.api.util.GT_Recipe;
import gregtech.api.util.GT_Utility;
+import gregtech.common.items.behaviors.Behaviour_DataOrb;
import gtPlusPlus.api.objects.Logger;
import gtPlusPlus.core.block.ModBlocks;
import gtPlusPlus.core.lib.CORE;
import gtPlusPlus.core.recipe.common.CI;
import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
import gtPlusPlus.xmod.gregtech.api.gui.GUI_MultiMachine;
import gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GregtechMeta_MultiBlockBase;
import net.minecraftforge.common.util.ForgeDirection;
@@ -34,7 +39,7 @@ public class GregtechMetaTileEntity_IndustrialMultiMachine
extends GregtechMeta_MultiBlockBase {
protected int mInternalMode = 0;
- protected GT_Recipe[][] mLastRecipeExtended = new GT_Recipe[3][3];
+ protected GT_Recipe[] mLastRecipeExtended = new GT_Recipe[9];
private static final int MODE_COMPRESSOR = 0;
private static final int MODE_LATHE = 1;
private static final int MODE_MAGNETIC = 2;
@@ -165,7 +170,7 @@ extends GregtechMeta_MultiBlockBase {
}
return null;
}
-
+
private final int getCircuitID(ItemStack circuit) {
int H = circuit.getItemDamage();
int T = (H == 20 ? 0 : (H == 21 ? 1 : (H == 22 ? 2 : -1)));
@@ -176,7 +181,7 @@ extends GregtechMeta_MultiBlockBase {
public GT_Recipe.GT_Recipe_Map getRecipeMap() {
return null;
}
-
+
private final GT_Recipe.GT_Recipe_Map getRecipeMap(ItemStack circuit) {
return getRecipeMap(getCircuitID(circuit));
}
@@ -230,14 +235,22 @@ extends GregtechMeta_MultiBlockBase {
long tVoltage = getMaxInputVoltage();
byte tTier = (byte) Math.max(1, GT_Utility.getTier(tVoltage));
+ //Get Circuit info for this recipe.
ItemStack tCircuit = getCircuit(aItemInputs);
+ int tCircuitID = getCircuitID(tCircuit);
+
+ if (tCircuitID == MODE_REPLICATOR) {
+ return checkReplicatorRecipe(aItemInputs, aFluidInputs);
+ }
+
GT_Recipe tRecipe = this.getRecipeMap(tCircuit).findRecipe(
- getBaseMetaTileEntity(), mLastRecipe, false,
+ getBaseMetaTileEntity(), this.mLastRecipeExtended[tCircuitID], false,
gregtech.api.enums.GT_Values.V[tTier], aFluidInputs, aItemInputs);
// Remember last recipe - an optimization for findRecipe()
//this.mLastRecipe = tRecipe; //Let's not do this, it's bad.
- this.mLastRecipeExtended[this.mInternalMode]
+ //Instead, how about I use a array for types?
+ this.mLastRecipeExtended[tCircuitID] = tRecipe;
if (tRecipe == null) {
Logger.WARNING("BAD RETURN - 1");
@@ -371,4 +384,134 @@ extends GregtechMeta_MultiBlockBase {
Logger.WARNING("GOOD RETURN - 1");
return true;
}
+
+ private FluidStack mReplicatorFluidOutput;
+ //Replicator handling
+ public boolean checkReplicatorRecipe(ItemStack[] aItemInputs, FluidStack[] aFluidInputs) {
+
+ //Must Have An Item and Fluid (Data Orb and UUM)
+ if (aItemInputs.length <= 0 || aFluidInputs.length <= 0) {
+ return false;
+ }
+
+ byte tTier = (byte) Math.max(1, GT_Utility.getTier(getMaxInputVoltage()));
+ ItemStack tDataOrb = null;
+ ItemStack tCellStack = null;
+ ItemStack tReplicatedItem;
+ FluidStack tOutputFluid;
+
+ //Find First Data Orb with Scan Data
+ for (ItemStack I : aItemInputs) {
+ if (ItemList.Tool_DataOrb.isStackEqual((Object) I, false, true) && Behaviour_DataOrb.getDataTitle(I).equals("Elemental-Scan")) {
+ tDataOrb = I.copy();
+ break;
+ }
+ }
+
+ //Find First empty cell stack
+ for (ItemStack I : aItemInputs) {
+ if (ItemList.Cell_Empty.isStackEqual((Object) I)) {
+ tCellStack = I.copy();
+ break;
+ }
+ }
+
+ if (tDataOrb == null) {
+ return false;
+ }
+
+ for (FluidStack F : aFluidInputs) {
+ if (F != null && F.isFluidEqual(Materials.UUMatter.getFluid(1L))) {
+ final FluidStack tFluid = F;
+ final Materials tMaterial = Element.get(Behaviour_DataOrb.getDataName(tDataOrb)).mLinkedMaterials
+ .get(0);
+ final long tMass = tMaterial.getMass();
+ if (tFluid.amount >= tMass && tMass > 0L) {
+ this.mEUt = (int) GT_Values.V[(int) this.getInputTier()];
+ this.mMaxProgresstime = (int) (tMass * 512L / (1 << tTier - 1));
+ if ((tReplicatedItem = GT_OreDictUnificator.get(OrePrefixes.dust, (Object) tMaterial, 1L)) == null) {
+ if ((tReplicatedItem = GT_OreDictUnificator.get(OrePrefixes.cell, (Object) tMaterial, 1L)) != null) {
+ if ((tOutputFluid = GT_Utility.getFluidForFilledItem(tReplicatedItem, true)) == null) {
+
+ if (ItemList.Cell_Empty.isStackEqual((Object) tCellStack)
+ && this.canBufferOutput(new ItemStack[]{tReplicatedItem})) {
+ final ItemStack input = tCellStack;
+ --input.stackSize;
+ final FluidStack UUM = tFluid;
+ UUM.amount -= (int) tMass;
+ return true;
+ }
+
+ } else {
+ tReplicatedItem = null;
+ if (this.getDrainableStack() == null
+ || (this.getDrainableStack().isFluidEqual(tOutputFluid)
+ && this.getDrainableStack().amount < 16000)) {
+ final FluidStack UUM = tFluid;
+ UUM.amount -= (int) tMass;
+ return true;
+ }
+ }
+ }
+ } else if (this.canBufferOutput(new ItemStack[]{tReplicatedItem})) {
+ final FluidStack UUM = tFluid;
+ UUM.amount -= (int) tMass;
+ return true;
+ }
+ }
+ }
+ }
+
+
+ return false;
+ }
+
+ private boolean canBufferOutput(ItemStack[] aInputs) {
+ // Count slots available in output buses
+ ArrayList<ItemStack> tBusStacks = new ArrayList<>();
+
+ int tEmptySlots = 0;
+ for (final GT_MetaTileEntity_Hatch_OutputBus tBus : this.mOutputBusses) {
+ if (!isValidMetaTileEntity(tBus)) {
+ continue;
+ }
+ final IInventory tBusInv = tBus.getBaseMetaTileEntity();
+ for (int i = 0; i < tBusInv.getSizeInventory(); i++) {
+ if (tBus.getStackInSlot(i) == null) {
+ tEmptySlots++;
+ }
+ else {
+ tBusStacks.add(tBus.getStackInSlot(i));
+ }
+ }
+ }
+
+ int slotsNeeded = aInputs.length;
+ for (final ItemStack tRecipeOutput: aInputs) {
+ if (tRecipeOutput == null) continue;
+ int amount = tRecipeOutput.stackSize;
+ for (final ItemStack tBusStack : tBusStacks) {
+ if (GT_Utility.areStacksEqual(tBusStack, tRecipeOutput)) {
+ if (tBusStack.stackSize + amount <= tBusStack.getMaxStackSize()) {
+ slotsNeeded--;
+ break;
+ }
+ }
+ }
+ }
+ // Enough open slots?
+ if (tEmptySlots < slotsNeeded) return false;
+ return true;
+
+ }
+
+ public FluidStack getDrainableStack() {
+ return this.mReplicatorFluidOutput;
+ }
+
+ public FluidStack setDrainableStack(final FluidStack aFluid) {
+ return this.mReplicatorFluidOutput = aFluid;
+ }
+
+
} \ No newline at end of file