aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDream-Master <dream-master@gmx.net>2017-10-08 13:42:36 +0200
committerDream-Master <dream-master@gmx.net>2017-10-08 13:42:36 +0200
commitb7dde4464242b8cd1e391704287a4c9d84fcae32 (patch)
tree7ab4737927feb5d0af79e643588c101dcd41ffc2
parent3c427a6b64c1a4dc4794d8d137e8fc2e582af46c (diff)
downloadGT5-Unofficial-b7dde4464242b8cd1e391704287a4c9d84fcae32.tar.gz
GT5-Unofficial-b7dde4464242b8cd1e391704287a4c9d84fcae32.tar.bz2
GT5-Unofficial-b7dde4464242b8cd1e391704287a4c9d84fcae32.zip
update file from 2.0.0.0 to 2.1.0.0
-rw-r--r--patch.diff3087
1 files changed, 3087 insertions, 0 deletions
diff --git a/patch.diff b/patch.diff
new file mode 100644
index 0000000000..db06287d97
--- /dev/null
+++ b/patch.diff
@@ -0,0 +1,3087 @@
+From 9c09b6ebe1bfbef3d694b98b5e8c00f4fb37142e Mon Sep 17 00:00:00 2001
+From: Dream-Master <dream-master@gmx.net>
+Date: Sat, 7 Oct 2017 22:49:34 +0200
+Subject: [PATCH] cherry pick Commit: f5abfcefe8d77e2c3c6284bff72de25c0a0ef774
+ [f5abfce]
+
+The right method to find out whether the machine should break the block.
+---
+ .../common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java | 2 +-
+ .../machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java | 3 +--
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java
+index cec1c5a..3bc1045 100644
+--- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java
++++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Pump.java
+@@ -201,7 +201,7 @@ public class GT_MetaTileEntity_Pump extends GT_MetaTileEntity_Hatch {
+ if (yHead <= 0) {
+ return false;
+ }
+- if ((!consumeFluid(getBaseMetaTileEntity().getXCoord(), yHead - 1, getBaseMetaTileEntity().getZCoord())) && (!getBaseMetaTileEntity().getAir(getBaseMetaTileEntity().getXCoord(), yHead - 1, getBaseMetaTileEntity().getZCoord()))) {
++ if ((!consumeFluid(getBaseMetaTileEntity().getXCoord(), yHead - 1, getBaseMetaTileEntity().getZCoord())) && (!getBaseMetaTileEntity().getBlock(getBaseMetaTileEntity().getXCoord(), yHead - 1, getBaseMetaTileEntity().getZCoord()).isAir(getBaseMetaTileEntity().getWorld(), getBaseMetaTileEntity().getXCoord(), yHead - 1, getBaseMetaTileEntity().getZCoord()))) {
+
+ return false;
+ }
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java
+index 3fa1a98..3f44900 100644
+--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java
+@@ -92,8 +92,7 @@ public abstract class GT_MetaTileEntity_ConcreteBackfillerBase extends GT_MetaTi
+
+ private boolean isRefillableBlock(int aX, int aY, int aZ){
+ IGregTechTileEntity aBaseTile = getBaseMetaTileEntity();
+- if (aBaseTile.getTileEntity(aX, aY, aZ) != null) return false;
+- if (!aBaseTile.getAir(aX, aY, aZ) && aBaseTile.getBlock(aX, aY, aZ).getMaterial().isSolid()) return false;
++ if (!aBaseTile.getBlock(aX, aY, aZ).isAir(aBaseTile.getWorld(), aX, aY, aZ) || aBaseTile.getBlock(aX, aY, aZ).getMaterial().isSolid()) return false;
+ if (!GT_Utility.setBlockByFakePlayer(getFakePlayer(aBaseTile), aX, aY, aZ, GregTech_API.sBlockConcretes, 8, true)) return false;
+ return true;
+ }
+--
+1.9.5.msysgit.0
+
+From 74199106670216396a0d2a9c9892969b13930e3e Mon Sep 17 00:00:00 2001
+From: Dream-Master <dream-master@gmx.net>
+Date: Tue, 12 Sep 2017 23:18:27 +0200
+Subject: [PATCH] cherry pick bd305c45b038819de2a0e61166da7344dbc770c7
+ 69d557908f447be138102676309e48e5f95b32b9
+
+Fix localization of Item Distributor #1211
+https://github.com/Blood-Asp/GT5-Unofficial/pull/1211
+---
+ src/main/java/gregtech/api/util/GT_LanguageManager.java | 1 +
+ .../tileentities/automation/GT_MetaTileEntity_ItemDistributor.java | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/main/java/gregtech/api/util/GT_LanguageManager.java b/src/main/java/gregtech/api/util/GT_LanguageManager.java
+index 58e6d91..b2d977e 100644
+--- a/src/main/java/gregtech/api/util/GT_LanguageManager.java
++++ b/src/main/java/gregtech/api/util/GT_LanguageManager.java
+@@ -316,6 +316,7 @@ public class GT_LanguageManager {
+ // addStringLocalization("Interaction_DESCRIPTION_Index_208", "Grab");
+ // addStringLocalization("Interaction_DESCRIPTION_Index_209", "Grab");
+ // addStringLocalization("Interaction_DESCRIPTION_Index_210", "Grab");
++ addStringLocalization("Interaction_DESCRIPTION_Index_211", "Items per side: ");
+
+ }
+
+diff --git a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ItemDistributor.java b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ItemDistributor.java
+index 8239dc1..5fa3bc8 100644
+--- a/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ItemDistributor.java
++++ b/src/main/java/gregtech/common/tileentities/automation/GT_MetaTileEntity_ItemDistributor.java
+@@ -153,7 +153,7 @@ public class GT_MetaTileEntity_ItemDistributor extends GT_MetaTileEntity_Buffer
+ //Adjust items per side by 1 or -1, constrained to the cyclic interval [0, 127]
+ itemsPerSide[aSide] += aPlayer.isSneaking() ? -1 : 1;
+ itemsPerSide[aSide] = (byte) ((itemsPerSide[aSide] + 128) % 128);
+- GT_Utility.sendChatToPlayer(aPlayer, trans("110", "Items per side: " + itemsPerSide[aSide]));
++ GT_Utility.sendChatToPlayer(aPlayer, trans("211", "Items per side: ") + itemsPerSide[aSide]);
+ }
+
+ @Override
+--
+1.9.5.msysgit.0
+
+From 9956fee4454bc9ec54f5a0ed04e37d6589cbaf19 Mon Sep 17 00:00:00 2001
+From: Dream-Master <dream-master@gmx.net>
+Date: Tue, 12 Sep 2017 23:16:04 +0200
+Subject: [PATCH] cherry pick
+
+dae15665ccb54a0a8d6a76ffcc7d48eae0abec15
+
+Odp speed improving #1209
+https://github.com/Blood-Asp/GT5-Unofficial/pull/1209
+---
+ .../multi/GT_MetaTileEntity_OreDrillingPlant1.java | 8 +-
+ .../multi/GT_MetaTileEntity_OreDrillingPlant2.java | 7 +-
+ .../multi/GT_MetaTileEntity_OreDrillingPlant3.java | 7 +-
+ .../multi/GT_MetaTileEntity_OreDrillingPlant4.java | 8 +-
+ .../GT_MetaTileEntity_OreDrillingPlantBase.java | 287 ++++++++++++++++++---
+ 5 files changed, 274 insertions(+), 43 deletions(-)
+
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant1.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant1.java
+index 8d1f683..bd1c079 100644
+--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant1.java
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant1.java
+@@ -1,4 +1,3 @@
+-
+ package gregtech.common.tileentities.machines.multi;
+
+ import gregtech.api.enums.ItemList;
+@@ -49,4 +48,9 @@ public class GT_MetaTileEntity_OreDrillingPlant1 extends GT_MetaTileEntity_OreDr
+ protected int getMinTier() {
+ return 2;
+ }
+-}
++
++ @Override
++ protected int getBaseProgressTime() {
++ return 960;
++ }
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant2.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant2.java
+index 2b161fe..272ea64 100644
+--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant2.java
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant2.java
+@@ -48,4 +48,9 @@ public class GT_MetaTileEntity_OreDrillingPlant2 extends GT_MetaTileEntity_OreDr
+ protected int getMinTier() {
+ return 3;
+ }
+-}
++
++ @Override
++ protected int getBaseProgressTime() {
++ return 800;
++ }
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant3.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant3.java
+index 1be6391..f89c578 100644
+--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant3.java
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant3.java
+@@ -48,4 +48,9 @@ public class GT_MetaTileEntity_OreDrillingPlant3 extends GT_MetaTileEntity_OreDr
+ protected int getMinTier() {
+ return 4;
+ }
+-}
++
++ @Override
++ protected int getBaseProgressTime() {
++ return 640;
++ }
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant4.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant4.java
+index 2488bc1..4059735 100644
+--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant4.java
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlant4.java
+@@ -1,4 +1,3 @@
+-
+ package gregtech.common.tileentities.machines.multi;
+
+ import gregtech.api.enums.ItemList;
+@@ -49,4 +48,9 @@ public class GT_MetaTileEntity_OreDrillingPlant4 extends GT_MetaTileEntity_OreDr
+ protected int getMinTier() {
+ return 5;
+ }
+-}
++
++ @Override
++ protected int getBaseProgressTime() {
++ return 480;
++ }
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java
+index c34d8b0..a227ab7 100644
+--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java
+@@ -1,16 +1,18 @@
+ package gregtech.common.tileentities.machines.multi;
+
+-import static gregtech.api.enums.GT_Values.V;
+-import static gregtech.api.enums.GT_Values.VN;
+-
+-import java.util.ArrayList;
+-
++import gregtech.api.GregTech_API;
+ import gregtech.api.enums.ItemList;
+ import gregtech.api.enums.Materials;
+ import gregtech.api.enums.OrePrefixes;
++import gregtech.api.enums.Textures;
+ import gregtech.api.gui.GT_GUIContainer_MultiMachine;
++import gregtech.api.interfaces.ITexture;
+ import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
++import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
++import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
++import gregtech.api.objects.GT_RenderedTexture;
+ import gregtech.api.objects.ItemData;
++import gregtech.api.util.GT_ModHandler;
+ import gregtech.api.util.GT_OreDictUnificator;
+ import gregtech.api.util.GT_Recipe;
+ import gregtech.api.util.GT_Utility;
+@@ -20,40 +22,106 @@ import net.minecraft.block.Block;
+ import net.minecraft.entity.player.InventoryPlayer;
+ import net.minecraft.init.Blocks;
+ import net.minecraft.item.ItemStack;
++import net.minecraft.nbt.NBTTagCompound;
+ import net.minecraft.tileentity.TileEntity;
+ import net.minecraft.world.ChunkPosition;
++import net.minecraftforge.common.util.ForgeDirection;
+ import net.minecraftforge.fluids.FluidStack;
+
+-public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTileEntity_DrillerBase {
++import java.util.ArrayList;
++
++import static gregtech.api.enums.GT_Values.*;
++
++public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTileEntity_MultiBlockBase {
++ private static final ItemStack miningPipe = GT_ModHandler.getIC2Item("miningPipe", 0);
++ private static final ItemStack miningPipeTip = GT_ModHandler.getIC2Item("miningPipeTip", 0);
++ private static final Block miningPipeBlock = GT_Utility.getBlockFromStack(miningPipe);
++ private static final Block miningPipeTipBlock = GT_Utility.getBlockFromStack(miningPipeTip);
+
+ private final ArrayList<ChunkPosition> oreBlockPositions = new ArrayList<>();
+
++ private Block casingBlock;
++ private int casingMeta;
++ private int frameMeta;
++ private int casingTextureIndex;
++
++ private ForgeDirection back;
++ private int xDrill, yDrill, zDrill, xCenter, zCenter, yHead;
++
++ private boolean isPickingPipes;
++
+ public GT_MetaTileEntity_OreDrillingPlantBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
++ initFields();
+ }
+
+ public GT_MetaTileEntity_OreDrillingPlantBase(String aName) {
+ super(aName);
++ initFields();
++ }
++
++ private void initFields() {
++ casingBlock = getCasingBlockItem().getBlock();
++ casingMeta = getCasingBlockItem().get(0).getItemDamage();
++ int frameId = 4096 + getFrameMaterial().mMetaItemSubID;
++ frameMeta = GregTech_API.METATILEENTITIES[frameId] != null ? GregTech_API.METATILEENTITIES[frameId].getTileEntityBaseType() : W;
++ casingTextureIndex = getCasingTextureIndex();
++ isPickingPipes = false;
++ }
++
++ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, byte aSide, byte aFacing, byte aColorIndex, boolean aActive, boolean aRedstone) {
++ if (aSide == aFacing)
++ return new ITexture[]{Textures.BlockIcons.CASING_BLOCKS[casingTextureIndex],new GT_RenderedTexture(aActive ? Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL_ACTIVE : Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL)};
++ return new ITexture[]{Textures.BlockIcons.CASING_BLOCKS[casingTextureIndex]};
+ }
+
+- @Override
+ public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
+ return new GT_GUIContainer_MultiMachine(aPlayerInventory, aBaseMetaTileEntity, getLocalName(), "OreDrillingPlant.png");
+ }
+
+ @Override
+- protected boolean workingDownward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, int yHead, int oldYHead){
++ public void saveNBTData(NBTTagCompound aNBT) {
++ super.saveNBTData(aNBT);
++ aNBT.setBoolean("isPickingPipes", isPickingPipes);
++ }
++
++ @Override
++ public void loadNBTData(NBTTagCompound aNBT) {
++ super.loadNBTData(aNBT);
++ isPickingPipes = aNBT.getBoolean("isPickingPipes");
++ }
++
++ @Override
++ public boolean checkRecipe(ItemStack aStack) {
++ setElectricityStats();
++ int oldYHead = yHead;
++ if (!checkPipesAndSetYHead() || !isEnergyEnough()) {
++ stopMachine();
++ return false;
++ }
+ if (yHead != oldYHead) oreBlockPositions.clear();
++ if (isPickingPipes) {
++ if (tryPickPipe()) {
++ mOutputItems = new ItemStack[] {GT_Utility.copyAmount(1, miningPipe)};
++ return true;
++ } else {
++ isPickingPipes = false;
++ stopMachine();
++ return false;
++ }
++ }
+
+- fillMineListIfEmpty(xDrill, yDrill, zDrill, xPipe, zPipe, yHead);
++ putMiningPipesFromInputsInController();
++ if (!tryConsumeDrillingFluid()) return false;
++
++ fillMineListIfEmpty();
+ if (oreBlockPositions.isEmpty()) {
+ if (!tryLowerPipe()) {
+- if (waitForPipes()) return false;
+ isPickingPipes = true;
+ return true;
+ }
+ //new layer - fill again
+- fillMineListIfEmpty(xDrill, yDrill, zDrill, xPipe, zPipe, yHead);
++ fillMineListIfEmpty();
+ }
+
+ ChunkPosition oreBlockPos = null;
+@@ -64,7 +132,6 @@ public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTile
+ oreBlock = getBaseMetaTileEntity().getBlock(oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ);
+ }
+
+- if (!tryConsumeDrillingFluid()) return false;
+ if (oreBlock != null && oreBlock != Blocks.air) {
+ ArrayList<ItemStack> oreBlockDrops = getBlockDrops(oreBlock, oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ);
+ getBaseMetaTileEntity().getWorld().setBlockToAir(oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ);
+@@ -74,29 +141,29 @@ public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTile
+ return true;
+ }
+
+- @Override
+- protected boolean checkHatches(){
+- return !mMaintenanceHatches.isEmpty() && !mInputHatches.isEmpty() && !mOutputBusses.isEmpty() && !mEnergyHatches.isEmpty();
++ private boolean isEnergyEnough() {
++ long requiredEnergy = 512 + getMaxInputVoltage() * 4;
++ for (GT_MetaTileEntity_Hatch_Energy energyHatch : mEnergyHatches) {
++ requiredEnergy -= energyHatch.getEUVar();
++ if (requiredEnergy <= 0) return true;
++ }
++ return false;
+ }
+
+- @Override
+- protected void setElectricityStats() {
++ private boolean tryPickPipe() {
++ if (yHead == yDrill) return false;
++ if (checkBlockAndMeta(xCenter, yHead + 1, zCenter, miningPipeBlock, W))
++ getBaseMetaTileEntity().getWorld().setBlock(xCenter, yHead + 1, zCenter, miningPipeTipBlock);
++ getBaseMetaTileEntity().getWorld().setBlockToAir(xCenter, yHead, zCenter);
++ return true;
++ }
++
++ private void setElectricityStats() {
+ this.mEfficiency = getCurrentEfficiency(null);
+ this.mEfficiencyIncrease = 10000;
+- //T1 = 12; T2 = 48; T3 = 192; T4 = 768
+- this.mEUt = 3 * (1 << (getMinTier() << 1));
+- //T1 = 960; T2 = 480; T3 = 240; T4 = 120
+- this.mMaxProgresstime = (isPickingPipes ? 80 : 1920) / (1 << getMinTier());
+-
+- long voltage = getMaxInputVoltage();
+- long overclockEu = V[Math.max(1, GT_Utility.getTier(voltage)) - 1];
+- while (this.mEUt <= overclockEu) {
+- this.mEUt *= 4;
+- this.mMaxProgresstime /= 2;
+- }
+-
+- this.mEUt = -this.mEUt;
+- this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime);
++ int overclock = 1 << GT_Utility.getTier(getMaxInputVoltage()) - 1;
++ this.mEUt = -12 * overclock * overclock;
++ this.mMaxProgresstime = (isPickingPipes ? 80 : getBaseProgressTime()) / overclock;
+ }
+
+ private ItemStack[] getOutputByDrops(ArrayList<ItemStack> oreBlockDrops) {
+@@ -149,17 +216,37 @@ public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTile
+ }
+
+ private boolean tryConsumeDrillingFluid() {
+- if (!depleteInput(new FluidStack(ItemList.sDrillingFluid, 2000))) {
+- mMaxProgresstime = 0;
+- return false;
++ return depleteInput(new FluidStack(ItemList.sDrillingFluid, 2000));
++ }
++
++ private void putMiningPipesFromInputsInController() {
++ int maxPipes = miningPipe.getMaxStackSize();
++ if (isHasMiningPipes(maxPipes)) return;
++
++ ItemStack pipes = getStackInSlot(1);
++ for (ItemStack storedItem : getStoredInputs()) {
++ if (!storedItem.isItemEqual(miningPipe)) continue;
++
++ if (pipes == null) {
++ setInventorySlotContents(1, GT_Utility.copy(miningPipe));
++ pipes = getStackInSlot(1);
++ }
++
++ if (pipes.stackSize == maxPipes) break;
++
++ int needPipes = maxPipes - pipes.stackSize;
++ int transferPipes = storedItem.stackSize < needPipes ? storedItem.stackSize : needPipes;
++
++ pipes.stackSize += transferPipes;
++ storedItem.stackSize -= transferPipes;
+ }
+- return true;
++ updateSlots();
+ }
+
+- private void fillMineListIfEmpty(int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, int yHead) {
++ private void fillMineListIfEmpty() {
+ if (!oreBlockPositions.isEmpty()) return;
+
+- tryAddOreBlockToMineList(xPipe, yHead - 1, zPipe);
++ tryAddOreBlockToMineList(xCenter, yHead - 1, zCenter);
+ if (yHead == yDrill) return; //skip controller block layer
+
+ int radius = getRadiusInChunks() << 4;
+@@ -184,8 +271,134 @@ public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTile
+ }
+ }
+
++ private boolean tryLowerPipe() {
++ if (!isHasMiningPipes()) return false;
++
++ if (yHead <= 0) return false;
++ if (checkBlockAndMeta(xCenter, yHead - 1, zCenter, Blocks.bedrock, W)) return false;
++
++ getBaseMetaTileEntity().getWorld().setBlock(xCenter, yHead - 1, zCenter, miningPipeTipBlock);
++ if (yHead != yDrill) getBaseMetaTileEntity().getWorld().setBlock(xCenter, yHead, zCenter, miningPipeBlock);
++
++ getBaseMetaTileEntity().decrStackSize(1, 1);
++ return true;
++ }
++
++ private boolean isHasMiningPipes() {
++ return isHasMiningPipes(1);
++ }
++
++ private boolean isHasMiningPipes(int minCount) {
++ ItemStack pipe = getStackInSlot(1);
++ return pipe != null && pipe.stackSize > minCount - 1 && pipe.isItemEqual(miningPipe);
++ }
++
++ @Override
++ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
++ updateCoordinates();
++ //check base layer
++ for (int xOff = -1 + back.offsetX; xOff <= 1 + back.offsetX; xOff++) {
++ for (int zOff = -1 + back.offsetZ; zOff <= 1 + back.offsetZ; zOff++) {
++ if (xOff == 0 && zOff == 0) continue;
++
++ IGregTechTileEntity tTileEntity = aBaseMetaTileEntity.getIGregTechTileEntityOffset(xOff, 0, zOff);
++ if (!checkCasingBlock(xOff, 0, zOff)
++ && !addMaintenanceToMachineList(tTileEntity, casingTextureIndex)
++ && !addInputToMachineList(tTileEntity, casingTextureIndex)
++ && !addOutputToMachineList(tTileEntity, casingTextureIndex)
++ && !addEnergyInputToMachineList(tTileEntity, casingTextureIndex))
++ return false;
++ }
++ }
++ if (mMaintenanceHatches.isEmpty() || mInputHatches.isEmpty() || mOutputBusses.isEmpty() || mEnergyHatches.isEmpty()) return false;
++ if (GT_Utility.getTier(getMaxInputVoltage()) < getMinTier()) return false;
++ //check tower
++ for (int yOff = 1; yOff < 4; yOff++) {
++ if (!checkCasingBlock(back.offsetX, yOff, back.offsetZ)
++ || !checkFrameBlock(back.offsetX + 1, yOff, back.offsetZ)
++ || !checkFrameBlock(back.offsetX - 1, yOff, back.offsetZ)
++ || !checkFrameBlock(back.offsetX, yOff, back.offsetZ + 1)
++ || !checkFrameBlock(back.offsetX, yOff, back.offsetZ - 1)
++ || !checkFrameBlock(back.offsetX, yOff + 3, back.offsetZ))
++ return false;
++ }
++ return true;
++ }
++
++ private void updateCoordinates() {
++ xDrill = getBaseMetaTileEntity().getXCoord();
++ yDrill = getBaseMetaTileEntity().getYCoord();
++ zDrill = getBaseMetaTileEntity().getZCoord();
++ back = ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing());
++ xCenter = xDrill + back.offsetX;
++ zCenter = zDrill + back.offsetZ;
++ }
++
++ private boolean checkPipesAndSetYHead() {
++ yHead = yDrill - 1;
++ while (checkBlockAndMeta(xCenter, yHead, zCenter, miningPipeBlock, W)) yHead--; //skip pipes
++ //is pipe tip OR is controller layer
++ if (checkBlockAndMeta(xCenter, yHead, zCenter, miningPipeTipBlock, W) || ++yHead == yDrill) return true;
++ //pipe column is broken - try fix
++ getBaseMetaTileEntity().getWorld().setBlock(xCenter, yHead, zCenter, miningPipeTipBlock);
++ return true;
++ }
++
++ private boolean checkCasingBlock(int xOff, int yOff, int zOff) {
++ return checkBlockAndMetaOffset(xOff, yOff, zOff, casingBlock, casingMeta);
++ }
++ //meta of frame is getTileEntityBaseType; frame should be checked using its drops (possible a high weight operation)
++ private boolean checkFrameBlock(int xOff, int yOff, int zOff) {
++ return checkBlockAndMetaOffset(xOff, yOff, zOff, GregTech_API.sBlockMachines, frameMeta);
++ }
++
++ private boolean checkBlockAndMetaOffset(int xOff, int yOff, int zOff, Block block, int meta) {
++ return checkBlockAndMeta(xDrill + xOff, yDrill + yOff, zDrill + zOff, block, meta);
++ }
++
++ private boolean checkBlockAndMeta(int x, int y, int z, Block block, int meta) {
++ return (meta == W || getBaseMetaTileEntity().getMetaID(x, y, z) == meta)
++ && getBaseMetaTileEntity().getBlock(x, y, z) == block;
++ }
++
++ @Override
++ public boolean isCorrectMachinePart(ItemStack aStack) {
++ return true;
++ }
++
++ @Override
++ public int getMaxEfficiency(ItemStack aStack) {
++ return 10000;
++ }
++
++ @Override
++ public int getPollutionPerTick(ItemStack aStack) {
++ return 0;
++ }
++
++ @Override
++ public int getDamageToComponent(ItemStack aStack) {
++ return 0;
++ }
++
++ @Override
++ public boolean explodesOnComponentBreak(ItemStack aStack) {
++ return false;
++ }
++
++ protected abstract ItemList getCasingBlockItem();
++
++ protected abstract Materials getFrameMaterial();
++
++ protected abstract int getCasingTextureIndex();
++
+ protected abstract int getRadiusInChunks();
+
++ protected abstract int getMinTier();
++
++ //returns theoretical progress time for LV energy hatch
++ protected abstract int getBaseProgressTime();
++
+ protected String[] getDescriptionInternal(String tierSuffix) {
+ String casings = getCasingBlockItem().get(0).getDisplayName();
+ return new String[]{
+--
+1.9.5.msysgit.0
+
+From a166a5bbd3a8d9809c2c3c3444451c2870a98cc7 Mon Sep 17 00:00:00 2001
+From: Dream-Master <dream-master@gmx.net>
+Date: Tue, 12 Sep 2017 23:11:20 +0200
+Subject: [PATCH] cherry pick ded594c86c701a0ff1f2282b4d6bff9cc7b1b9f6
+ c6d39f12fdf85edbeadc725e0b398fa70eb15bd0
+
+Patched ME energy tunnel, now they can emit GT energy. #1200
+https://github.com/Blood-Asp/GT5-Unofficial/pull/1200
+---
+ src/main/java/gregtech/GT_Mod.java | 1 +
+ .../loaders/postload/GT_AE2EnergyTunnelLoader.java | 27 +++++++
+ .../gregtech/loaders/postload/PartP2PGTPower.java | 84 ++++++++++++++++++++++
+ 3 files changed, 112 insertions(+)
+ create mode 100644 src/main/java/gregtech/loaders/postload/GT_AE2EnergyTunnelLoader.java
+ create mode 100644 src/main/java/gregtech/loaders/postload/PartP2PGTPower.java
+
+diff --git a/src/main/java/gregtech/GT_Mod.java b/src/main/java/gregtech/GT_Mod.java
+index 939d03a..e1f9842 100644
+--- a/src/main/java/gregtech/GT_Mod.java
++++ b/src/main/java/gregtech/GT_Mod.java
+@@ -625,6 +625,7 @@ public class GT_Mod implements IGT_Mod {
+ new GT_CropLoader().run();
+ new GT_Worldgenloader().run();
+ new GT_CoverLoader().run();
++ new GT_AE2EnergyTunnelLoader().run();
+ LoadArmorComponents.init();
+
+ GT_RecipeRegistrator.registerUsagesForMaterials(new ItemStack(Blocks.planks, 1), null, false);
+diff --git a/src/main/java/gregtech/loaders/postload/GT_AE2EnergyTunnelLoader.java b/src/main/java/gregtech/loaders/postload/GT_AE2EnergyTunnelLoader.java
+new file mode 100644
+index 0000000..a558696
+--- /dev/null
++++ b/src/main/java/gregtech/loaders/postload/GT_AE2EnergyTunnelLoader.java
+@@ -0,0 +1,27 @@
++package gregtech.loaders.postload;
++
++import appeng.items.parts.PartType;
++import gregtech.GT_Mod;
++import gregtech.api.util.GT_Log;
++
++import java.lang.reflect.Field;
++
++public class GT_AE2EnergyTunnelLoader implements Runnable {
++ @Override
++ public void run() {
++ if (GT_Mod.gregtechproxy.mAE2Integration) {
++ try {
++ load();
++ } catch (Throwable e) {
++ GT_Log.out.println("Failed to load P2P tunnel for GT electricity");
++ e.printStackTrace(GT_Log.out);
++ }
++ }
++ }
++
++ public void load() throws Throwable {
++ Field f = PartType.class.getDeclaredField("myPart");
++ f.setAccessible(true);
++ f.set(PartType.P2PTunnelEU, PartP2PGTPower.class);
++ }
++}
+diff --git a/src/main/java/gregtech/loaders/postload/PartP2PGTPower.java b/src/main/java/gregtech/loaders/postload/PartP2PGTPower.java
+new file mode 100644
+index 0000000..30a3377
+--- /dev/null
++++ b/src/main/java/gregtech/loaders/postload/PartP2PGTPower.java
+@@ -0,0 +1,84 @@
++package gregtech.loaders.postload;
++
++import appeng.api.networking.IGridNode;
++import appeng.api.networking.ticking.IGridTickable;
++import appeng.api.networking.ticking.TickRateModulation;
++import appeng.api.networking.ticking.TickingRequest;
++import appeng.parts.p2p.PartP2PIC2Power;
++import gregtech.api.interfaces.tileentity.IEnergyConnected;
++import gregtech.api.util.GT_Utility;
++import net.minecraft.item.ItemStack;
++import net.minecraft.tileentity.TileEntity;
++import net.minecraft.world.World;
++import net.minecraftforge.common.util.ForgeDirection;
++
++public class PartP2PGTPower extends PartP2PIC2Power implements IGridTickable {
++ public PartP2PGTPower(ItemStack is) {
++ super(is);
++ }
++
++ public final World getWorld() {
++ return tile.getWorldObj();
++ }
++
++ public final int getXCoord() {
++ return tile.xCoord;
++ }
++
++ public final short getYCoord() {
++ return (short) tile.yCoord;
++ }
++
++ public final int getZCoord() {
++ return tile.zCoord;
++ }
++
++ public final int getOffsetX(byte aSide, int aMultiplier) {
++ return getXCoord() + ForgeDirection.getOrientation(aSide).offsetX * aMultiplier;
++ }
++
++ public final short getOffsetY(byte aSide, int aMultiplier) {
++ return (short) (getYCoord() + ForgeDirection.getOrientation(aSide).offsetY * aMultiplier);
++ }
++
++ public final int getOffsetZ(byte aSide, int aMultiplier) {
++ return getZCoord() + ForgeDirection.getOrientation(aSide).offsetZ * aMultiplier;
++ }
++
++ public final TileEntity getTileEntity(int aX, int aY, int aZ) {
++ return getWorld().getTileEntity(aX, aY, aZ);
++ }
++
++ public final TileEntity getTileEntityAtSide(byte aSide) {
++ int tX = getOffsetX(aSide, 1), tY = getOffsetY(aSide, 1), tZ = getOffsetZ(aSide, 1);
++ return getWorld().getTileEntity(tX, tY, tZ);
++ }
++
++ public boolean outputEnergy() {
++ if (getOfferedEnergy() == 0) {
++ return false;
++ }
++ TileEntity t = getTileEntityAtSide((byte) side.ordinal());
++ if (t instanceof IEnergyConnected) {
++ long voltage = 8 << (getSourceTier() * 2);
++ if (voltage > getOfferedEnergy()) {
++ voltage = (long) getOfferedEnergy();
++ }
++ if (((IEnergyConnected) t).injectEnergyUnits(GT_Utility.getOppositeSide(side.ordinal()), voltage, 1) > 0) {
++ drawEnergy(voltage);
++ return true;
++ }
++ }
++ return false;
++ }
++
++ @Override
++ public TickingRequest getTickingRequest(IGridNode iGridNode) {
++ return new TickingRequest(1, 20, false, false);
++ }
++
++ @Override
++ public TickRateModulation tickingRequest(IGridNode iGridNode, int i) {
++ return outputEnergy() ? TickRateModulation.FASTER : TickRateModulation.SLOWER;
++ }
++}
+\ No newline at end of file
+--
+1.9.5.msysgit.0
+
+From a4a0a7c2cc3c299969c62e509cc3c366a90214f3 Mon Sep 17 00:00:00 2001
+From: Dream-Master <dream-master@gmx.net>
+Date: Tue, 12 Sep 2017 23:06:55 +0200
+Subject: [PATCH] cherry pick 11213d18d7345ee29f2efce6c5d421a855bed056
+ fb163d1be0aa291508bb6513e34cacba3ca06b36
+ fb508132d91543d5e837dfa4fac09cf5e4b9e7a8
+ d682ca0d36e3824b1bf73cc800f58c4126bcf104
+ 0f2db4f76a88c26ca08b2da444b264444ce01316
+ 50229e4506687d184c93ed702cdeeecea65e326a
+
+f5195f822d9951015c4ef6599e5b4f6544ec0714
+fbdb6ceecf60183ab382f043b78b61941157eccf
+55af1972b86a82bf6038342aa1a3bf9013d0f164
+
+c0d9d5a268da4b58385ee95e27408e06829c74b8
+416890142c0fa62617fc6e4537826689635e9eb3
+d532cb67f7bc68243e3d2dc2a12a466ed9c9e2d9
+d1671eaf33b3b4223da174e115f35b9bc1f19c5a
+4d90afad87375e3f1013a493f4b3b5d4e92bf521
+3c397d61697c13f0467e0cb67fb127fff8401f71
+64957ccd0f51ef283cc561d52a5439c3752c4e71
+
+b7e0863207253ee758742a22c607c3ccc37af6d3
+
+ae5a1e117d47876de9d2d2e8ea581e15686c5e1a
+a0eb30d03f8fc311598f628ad45b5365c7391917
+505a9c263e88e5519bade6a3167f829e41e13e64
+
+9cbb9c66a2f63e7e0cb4aceebfc9c93776b82be2
+
+Drillers upgrade #1163
+https://github.com/Blood-Asp/GT5-Unofficial/pull/1163
+---
+ src/main/java/gregtech/api/enums/ItemList.java | 2 +-
+ .../api/gui/GT_GUIContainer_MultiMachine.java | 25 +-
+ .../GT_MetaTileEntity_Hatch_DataAccess.java | 4 +
+ .../multi/GT_MetaTileEntity_AssemblyLine.java | 2 +-
+ .../GT_MetaTileEntity_ConcreteBackfiller1.java | 51 +++
+ .../GT_MetaTileEntity_ConcreteBackfiller2.java | 66 ++++
+ .../GT_MetaTileEntity_ConcreteBackfillerBase.java | 125 ++++++++
+ .../multi/GT_MetaTileEntity_DrillerBase.java | 357 +++++++++++++++++++++
+ .../machines/multi/GT_MetaTileEntity_OilDrill.java | 270 ----------------
+ .../multi/GT_MetaTileEntity_OilDrill1.java | 51 +++
+ .../multi/GT_MetaTileEntity_OilDrill2.java | 51 +++
+ .../multi/GT_MetaTileEntity_OilDrill3.java | 51 +++
+ .../multi/GT_MetaTileEntity_OilDrillBase.java | 152 +++++++++
+ .../GT_MetaTileEntity_OreDrillingPlantBase.java | 269 ++--------------
+ .../preload/GT_Loader_MetaTileEntities.java | 13 +-
+ 15 files changed, 959 insertions(+), 530 deletions(-)
+ create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller1.java
+ create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller2.java
+ create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java
+ create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java
+ delete mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill.java
+ create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill1.java
+ create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill2.java
+ create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill3.java
+ create mode 100644 src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillBase.java
+
+diff --git a/src/main/java/gregtech/api/enums/ItemList.java b/src/main/java/gregtech/api/enums/ItemList.java
+index b1c993a..1e0f667 100644
+--- a/src/main/java/gregtech/api/enums/ItemList.java
++++ b/src/main/java/gregtech/api/enums/ItemList.java
+@@ -661,7 +661,7 @@ public enum ItemList implements IItemContainer {
+ Casing_Tank_1, Casing_Tank_2, Casing_Tank_3, Casing_Tank_4, Casing_Tank_5, Casing_Tank_6, Casing_Tank_7, Casing_Tank_8, Casing_Tank_9, Casing_Tank_10, Casing_Tank_11, Casing_Tank_12, Casing_Tank_13, Casing_Tank_14, Casing_Tank_15, Casing_Tank_0,
+ MobRep_LV, MobRep_MV, MobRep_HV, MobRep_EV, MobRep_IV, MobRep_LuV, MobRep_ZPM, MobRep_UV, Cover_PlayerDetector, Machine_Multi_HeatExchanger,
+ Block_BronzePlate, Block_IridiumTungstensteel, Block_Plascrete, Block_TungstenSteelReinforced,
+- Honeycomb, Charcoal_Pile, Block_BrittleCharcoal, Seismic_Prospector, Seismic_Prospector_Adv, OilDrill, OreDrill1, OreDrill2, OreDrill3, OreDrill4, PyrolyseOven, OilCracker, Crop_Drop_UUMBerry, Crop_Drop_UUABerry, Empty_Board_Basic, Empty_Board_Elite,
++ Honeycomb, Charcoal_Pile, Block_BrittleCharcoal, Seismic_Prospector, Seismic_Prospector_Adv, OilDrill1, OilDrill2, OilDrill3, ConcreteBackfiller1, ConcreteBackfiller2, OreDrill1, OreDrill2, OreDrill3, OreDrill4, PyrolyseOven, OilCracker, Crop_Drop_UUMBerry, Crop_Drop_UUABerry, Empty_Board_Basic, Empty_Board_Elite,
+ Battery_Charger_4by4_ULV, Battery_Charger_4by4_LV, Battery_Charger_4by4_MV, Battery_Charger_4by4_HV, Battery_Charger_4by4_EV, Battery_Charger_4by4_IV, Battery_Charger_4by4_LuV, Battery_Charger_4by4_ZPM, Battery_Charger_4by4_UV, Battery_Charger_4by4_MAX,
+ MicroTransmitter_HV, MicroTransmitter_EV, MicroTransmitter_IV, MicroTransmitter_LUV, MicroTransmitter_ZPM,
+ Crop_Drop_Bauxite, Crop_Drop_Ilmenite, Crop_Drop_Pitchblende, Crop_Drop_Uraninite, Crop_Drop_Thorium, Crop_Drop_Nickel, Crop_Drop_Zinc, Crop_Drop_Manganese, Crop_Drop_Scheelite, Crop_Drop_Platinum, Crop_Drop_Iridium, Crop_Drop_Osmium, Crop_Drop_Naquadah, Uraniumcell_1, Uraniumcell_2, Uraniumcell_4, Moxcell_1, Moxcell_2, Moxcell_4,
+diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer_MultiMachine.java b/src/main/java/gregtech/api/gui/GT_GUIContainer_MultiMachine.java
+index 5a7c487..62e6f8c 100644
+--- a/src/main/java/gregtech/api/gui/GT_GUIContainer_MultiMachine.java
++++ b/src/main/java/gregtech/api/gui/GT_GUIContainer_MultiMachine.java
+@@ -1,14 +1,18 @@
+ package gregtech.api.gui;
+
+-import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+-import gregtech.api.util.GT_LanguageManager;
+-import gregtech.api.util.GT_ModHandler;
+-import gregtech.api.util.GT_Utility;
+-import gregtech.common.items.GT_MetaGenerated_Tool_01;
+-import net.minecraft.entity.player.InventoryPlayer;
+-import net.minecraft.item.ItemStack;
++ import static gregtech.api.enums.GT_Values.RES_PATH_GUI;
++
++ import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
++ import gregtech.api.util.GT_LanguageManager;
++ import gregtech.api.util.GT_ModHandler;
++ import gregtech.api.util.GT_Utility;
++ import gregtech.common.items.GT_MetaGenerated_Tool_01;
++ import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_DrillerBase;
++ import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine;
++ import net.minecraft.entity.player.InventoryPlayer;
++ import net.minecraft.item.ItemStack;
++
+
+-import static gregtech.api.enums.GT_Values.RES_PATH_GUI;
+
+ /**
+ * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
+@@ -54,13 +58,12 @@ public class GT_GUIContainer_MultiMachine extends GT_GUIContainerMetaTile_Machin
+ } else {
+ fontRendererObj.drawString(trans("142","Running perfectly."), 10, 16, 16448255);
+ }
+- int id = mContainer.mTileEntity.getMetaTileID();
+- if (id == 1157 || id == 1158 || id == 1177 || id == 1178 || id == 1179) {
++ if (mContainer.mTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_DrillerBase) {
+ ItemStack tItem = mContainer.mTileEntity.getMetaTileEntity().getStackInSlot(1);
+ if (tItem == null || !GT_Utility.areStacksEqual(tItem, GT_ModHandler.getIC2Item("miningPipe", 1L))) {
+ fontRendererObj.drawString(trans("143", "Missing Mining Pipe"), 10, ((GT_Container_MultiMachine) mContainer).mActive == 0 ? 40 : 24, 16448255);
+ }
+- } else if (id == 1131 || id == 1151 || id == 1152 || id == 1153) {
++ } else if (mContainer.mTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_LargeTurbine) {
+ ItemStack tItem = mContainer.mTileEntity.getMetaTileEntity().getStackInSlot(1);
+ if (tItem == null || !(tItem.getItem() == GT_MetaGenerated_Tool_01.INSTANCE && tItem.getItemDamage() >= 170 && tItem.getItemDamage() <= 177)) {
+ fontRendererObj.drawString(trans("144", "Missing Turbine Rotor"), 10, ((GT_Container_MultiMachine) mContainer).mActive == 0 ? 40 : 24, 16448255);
+diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java
+index e28f5e6..bbdf0ec 100644
+--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java
++++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java
+@@ -98,4 +98,8 @@ public class GT_MetaTileEntity_Hatch_DataAccess extends GT_MetaTileEntity_Hatch
+ public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, byte aSide, ItemStack aStack) {
+ return false;
+ }
++ @Override
++ public int getInventoryStackLimit() {
++ return 1;
++ }
+ }
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java
+index 85fa737..2934fc5 100644
+--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_AssemblyLine.java
+@@ -322,7 +322,7 @@ public class GT_MetaTileEntity_AssemblyLine
+ * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb
+ */
+ private boolean isCorrectDataItem(ItemStack aStack, int state){
+- if ((state & 1) != 0 && ItemList.Circuit_Integrated.isStackEqual(aStack, false, true)) return true;
++ if ((state & 1) != 0 && ItemList.Circuit_Integrated.isStackEqual(aStack, true, true)) return true;
+ if ((state & 2) != 0 && ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) return true;
+ if ((state & 4) != 0 && ItemList.Tool_DataOrb.isStackEqual(aStack, false, true)) return true;
+ return false;
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller1.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller1.java
+new file mode 100644
+index 0000000..84bba3b
+--- /dev/null
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller1.java
+@@ -0,0 +1,51 @@
++package gregtech.common.tileentities.machines.multi;
++
++import gregtech.api.enums.ItemList;
++import gregtech.api.enums.Materials;
++import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
++import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
++
++public class GT_MetaTileEntity_ConcreteBackfiller1 extends GT_MetaTileEntity_ConcreteBackfillerBase {
++ public GT_MetaTileEntity_ConcreteBackfiller1(int aID, String aName, String aNameRegional) {
++ super(aID, aName, aNameRegional);
++ }
++
++ public GT_MetaTileEntity_ConcreteBackfiller1(String aName) {
++ super(aName);
++ }
++
++ @Override
++ public String[] getDescription() {
++ return getDescriptionInternal("");
++ }
++
++ @Override
++ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
++ return new GT_MetaTileEntity_ConcreteBackfiller1(mName);
++ }
++
++ @Override
++ protected ItemList getCasingBlockItem() {
++ return ItemList.Casing_SolidSteel;
++ }
++
++ @Override
++ protected Materials getFrameMaterial() {
++ return Materials.Steel;
++ }
++
++ @Override
++ protected int getCasingTextureIndex() {
++ return 16;
++ }
++
++ @Override
++ protected int getRadius() {
++ return 16;
++ }
++
++ @Override
++ protected int getMinTier() {
++ return 2;
++ }
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller2.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller2.java
+new file mode 100644
+index 0000000..6357783
+--- /dev/null
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfiller2.java
+@@ -0,0 +1,66 @@
++package gregtech.common.tileentities.machines.multi;
++
++import static gregtech.api.enums.GT_Values.VN;
++
++import gregtech.api.enums.ItemList;
++import gregtech.api.enums.Materials;
++import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
++import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
++
++public class GT_MetaTileEntity_ConcreteBackfiller2 extends GT_MetaTileEntity_ConcreteBackfillerBase {
++ public GT_MetaTileEntity_ConcreteBackfiller2(int aID, String aName, String aNameRegional) {
++ super(aID, aName, aNameRegional);
++ }
++
++ public GT_MetaTileEntity_ConcreteBackfiller2(String aName) {
++ super(aName);
++ }
++
++ @Override
++ public String[] getDescription() {
++ String casings = getCasingBlockItem().get(0).getDisplayName();
++ return new String[]{
++ "Controller Block for the Advanced Concrete Backfiller",
++ "Size(WxHxD): 3x7x3", "Controller (Front middle at bottom)",
++ "3x1x3 Base of " + casings,
++ "1x3x1 " + casings + " pillar (Center of base)",
++ "1x3x1 " + getFrameMaterial().mName + " Frame Boxes (Each pillar side and on top)",
++ "1x Input Hatch (One of base casings)",
++ "1x Maintenance Hatch (One of base casings)",
++ "1x " + VN[getMinTier()] + "+ Energy Hatch (Any bottom layer casing)",
++ "Put Programmed Circuits into Data Access to config radius",
++ "Radius = (total config value)x2 blocks",
++ "Default 64, Maximum 128",};
++ }
++
++ @Override
++ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
++ return new GT_MetaTileEntity_ConcreteBackfiller2(mName);
++ }
++
++ @Override
++ protected ItemList getCasingBlockItem() {
++ return ItemList.Casing_StableTitanium;
++ }
++
++ @Override
++ protected Materials getFrameMaterial() {
++ return Materials.Titanium;
++ }
++
++ @Override
++ protected int getCasingTextureIndex() {
++ return 50;
++ }
++
++ @Override
++ protected int getRadius() {
++ int tConfig = getTotalConfigValue() * 2;
++ return tConfig >= 128 ? 128 : tConfig <= 0 ? 64 : tConfig;
++ }
++
++ @Override
++ protected int getMinTier() {
++ return 4;
++ }
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java
+new file mode 100644
+index 0000000..169bb26
+--- /dev/null
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_ConcreteBackfillerBase.java
+@@ -0,0 +1,125 @@
++package gregtech.common.tileentities.machines.multi;
++
++import static gregtech.api.enums.GT_Values.V;
++import static gregtech.api.enums.GT_Values.VN;
++
++import gregtech.api.GregTech_API;
++import gregtech.api.enums.Materials;
++import gregtech.api.gui.GT_GUIContainer_MultiMachine;
++import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
++import gregtech.api.util.GT_Utility;
++import net.minecraft.entity.player.InventoryPlayer;
++import net.minecraft.item.ItemStack;
++
++public abstract class GT_MetaTileEntity_ConcreteBackfillerBase extends GT_MetaTileEntity_DrillerBase {
++
++ private int mLastXOff = 0, mLastZOff = 0;
++
++ public GT_MetaTileEntity_ConcreteBackfillerBase(int aID, String aName, String aNameRegional) {
++ super(aID, aName, aNameRegional);
++ }
++
++ public GT_MetaTileEntity_ConcreteBackfillerBase(String aName) {
++ super(aName);
++ }
++
++ protected String[] getDescriptionInternal(String tierSuffix) {
++ String casings = getCasingBlockItem().get(0).getDisplayName();
++ return new String[]{
++ "Controller Block for the Concrete Backfiller " + (tierSuffix != null ? tierSuffix : ""),
++ "Size(WxHxD): 3x7x3", "Controller (Front middle at bottom)",
++ "3x1x3 Base of " + casings,
++ "1x3x1 " + casings + " pillar (Center of base)",
++ "1x3x1 " + getFrameMaterial().mName + " Frame Boxes (Each pillar side and on top)",
++ "1x Input Hatch (One of base casings)",
++ "1x Maintenance Hatch (One of base casings)",
++ "1x " + VN[getMinTier()] + "+ Energy Hatch (Any bottom layer casing)",
++ "Radius is " + getRadius() + " blocks"};
++ }
++
++ @Override
++ public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
++ return new GT_GUIContainer_MultiMachine(aPlayerInventory, aBaseMetaTileEntity, getLocalName(), "DrillingRig.png");
++ }
++
++ protected abstract int getRadius();
++
++ @Override
++ protected boolean checkHatches() {
++ return !mMaintenanceHatches.isEmpty() && !mInputHatches.isEmpty() && !mEnergyHatches.isEmpty();
++ }
++
++ @Override
++ protected void setElectricityStats() {
++ this.mEfficiency = getCurrentEfficiency(null);
++ this.mEfficiencyIncrease = 10000;
++ //T1 = 48; T2 = 192; T3 = 768; T4 = 3072
++ this.mEUt = 12 * (1 << (getMinTier() << 1));
++ this.mMaxProgresstime = (isPickingPipes ? 240: 80) / (1 << getMinTier());
++
++ long voltage = getMaxInputVoltage();
++ long overclockEu = V[Math.max(1, GT_Utility.getTier(voltage)) - 1];
++ while (this.mEUt <= overclockEu) {
++ this.mEUt *= 4;
++ this.mMaxProgresstime /= 2;
++ }
++
++ this.mEUt = -this.mEUt;
++ this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime);
++ }
++
++ @Override
++ protected boolean workingUpward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, int yHead, int oldYHead) {
++ if (isRefillableBlock(xPipe, yHead - 1, zPipe))
++ return tryRefillBlock(xPipe, yHead - 1, zPipe);
++ int radius = getRadius();
++ if (mLastXOff == 0 && mLastZOff == 0) {
++ mLastXOff = - radius;
++ mLastZOff = - radius;
++ }
++ if (yHead != yDrill) {
++ for (int i = mLastXOff; i <= radius; i++) {
++ for (int j = (i == mLastXOff ? mLastZOff : - radius); j <= radius; j++) {
++ if (isRefillableBlock(xPipe + i, yHead, zPipe + j)){
++ mLastXOff = i;
++ mLastZOff = j;
++ return tryRefillBlock(xPipe + i, yHead, zPipe + j);
++ }
++ }
++ }
++ }
++
++ if (tryPickPipe()) {
++ mLastXOff = 0;
++ mLastZOff = 0;
++ return true;
++ } else {
++ isPickingPipes = false;
++ stopMachine();
++ return false;
++ }
++ }
++
++ private boolean isRefillableBlock(int aX, int aY, int aZ){
++ if (getBaseMetaTileEntity().getTileEntity(aX, aY, aZ) != null) return false;
++ if (getBaseMetaTileEntity().getAir(aX, aY, aZ) || !getBaseMetaTileEntity().getBlock(aX, aY, aZ).getMaterial().isSolid())
++ return true;
++ return false;
++ }
++
++ private boolean tryRefillBlock(int aX, int aY, int aZ) {
++ if (!tryConsumeFluid())
++ return false;
++ getBaseMetaTileEntity().getWorld().setBlock(aX, aY, aZ, GregTech_API.sBlockConcretes, 8, 3);
++ return true;
++ }
++
++ private boolean tryConsumeFluid() {
++ if (!depleteInput(Materials.Concrete.getMolten(144L))){
++ mMaxProgresstime = 0;
++ return false;
++ }
++ return true;
++ }
++
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java
+new file mode 100644
+index 0000000..2e7616b
+--- /dev/null
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_DrillerBase.java
+@@ -0,0 +1,357 @@
++package gregtech.common.tileentities.machines.multi;
++
++import static gregtech.api.enums.GT_Values.W;
++
++import java.util.ArrayList;
++
++import gregtech.api.GregTech_API;
++import gregtech.api.enums.ItemList;
++import gregtech.api.enums.Materials;
++import gregtech.api.enums.Textures;
++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;
++import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_DataAccess;
++import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
++import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
++import gregtech.api.objects.GT_RenderedTexture;
++import gregtech.api.util.GT_ModHandler;
++import gregtech.api.util.GT_Utility;
++import net.minecraft.block.Block;
++import net.minecraft.entity.player.InventoryPlayer;
++import net.minecraft.init.Blocks;
++import net.minecraft.item.ItemStack;
++import net.minecraft.nbt.NBTTagCompound;
++import net.minecraftforge.common.util.ForgeDirection;
++
++public abstract class GT_MetaTileEntity_DrillerBase extends GT_MetaTileEntity_MultiBlockBase {
++ private static final ItemStack miningPipe = GT_ModHandler.getIC2Item("miningPipe", 0);
++ private static final ItemStack miningPipeTip = GT_ModHandler.getIC2Item("miningPipeTip", 0);
++ private static final Block miningPipeBlock = GT_Utility.getBlockFromStack(miningPipe);
++ private static final Block miningPipeTipBlock = GT_Utility.getBlockFromStack(miningPipeTip);
++
++ private Block casingBlock;
++ private int casingMeta;
++ private int frameMeta;
++ private int casingTextureIndex;
++
++ private ForgeDirection back;
++
++ private int xDrill, yDrill, zDrill, xPipe, zPipe, yHead;
++ protected boolean isPickingPipes;
++
++ public GT_MetaTileEntity_DrillerBase(int aID, String aName, String aNameRegional) {
++ super(aID, aName, aNameRegional);
++ initFields();
++ }
++
++ public GT_MetaTileEntity_DrillerBase(String aName) {
++ super(aName);
++ initFields();
++ }
++
++ private void initFields() {
++ casingBlock = getCasingBlockItem().getBlock();
++ casingMeta = getCasingBlockItem().get(0).getItemDamage();
++ int frameId = 4096 + getFrameMaterial().mMetaItemSubID;
++ frameMeta = GregTech_API.METATILEENTITIES[frameId] != null ? GregTech_API.METATILEENTITIES[frameId].getTileEntityBaseType() : W;
++ casingTextureIndex = getCasingTextureIndex();
++ isPickingPipes = false;
++ }
++
++ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, byte aSide, byte aFacing, byte aColorIndex, boolean aActive, boolean aRedstone) {
++ if (aSide == aFacing)
++ return new ITexture[]{Textures.BlockIcons.CASING_BLOCKS[casingTextureIndex],new GT_RenderedTexture(aActive ? Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL_ACTIVE : Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL)};
++ return new ITexture[]{Textures.BlockIcons.CASING_BLOCKS[casingTextureIndex]};
++ }
++
++ @Override
++ public void saveNBTData(NBTTagCompound aNBT) {
++ super.saveNBTData(aNBT);
++ aNBT.setBoolean("isPickingPipe", isPickingPipes);
++ }
++
++ @Override
++ public void loadNBTData(NBTTagCompound aNBT) {
++ super.loadNBTData(aNBT);
++ isPickingPipes = aNBT.getBoolean("isPickingPipes");
++ }
++
++ protected boolean tryPickPipe() {
++ if (yHead == yDrill) return false;
++ if (tryOutputPipe()){
++ if (checkBlockAndMeta(xPipe, yHead + 1, zPipe, miningPipeBlock, W))
++ getBaseMetaTileEntity().getWorld().setBlock(xPipe, yHead + 1, zPipe, miningPipeTipBlock);
++ getBaseMetaTileEntity().getWorld().setBlockToAir(xPipe, yHead, zPipe);
++ return true;
++ }
++ return false;
++ }
++
++ protected boolean tryLowerPipe() {
++ if (!isHasMiningPipes()) return false;
++
++ if (yHead <= 0) return false;
++ if (!canLowerPipe()) return false;
++
++ getBaseMetaTileEntity().getWorld().setBlock(xPipe, yHead - 1, zPipe, miningPipeTipBlock);
++ if (yHead != yDrill) getBaseMetaTileEntity().getWorld().setBlock(xPipe, yHead, zPipe, miningPipeBlock);
++
++ getBaseMetaTileEntity().decrStackSize(1, 1);
++ return true;
++ }
++
++ private void putMiningPipesFromInputsInController() {
++ int maxPipes = miningPipe.getMaxStackSize();
++ if (isHasMiningPipes(maxPipes)) return;
++
++ ItemStack pipes = getStackInSlot(1);
++ for (ItemStack storedItem : getStoredInputs()) {
++ if (!storedItem.isItemEqual(miningPipe)) continue;
++
++ if (pipes == null) {
++ setInventorySlotContents(1, GT_Utility.copy(miningPipe));
++ pipes = getStackInSlot(1);
++ }
++
++ if (pipes.stackSize == maxPipes) break;
++
++ int needPipes = maxPipes - pipes.stackSize;
++ int transferPipes = storedItem.stackSize < needPipes ? storedItem.stackSize : needPipes;
++
++ pipes.stackSize += transferPipes;
++ storedItem.stackSize -= transferPipes;
++ }
++ updateSlots();
++ }
++
++ private boolean tryOutputPipe(){
++ if (!getBaseMetaTileEntity().addStackToSlot(1, GT_Utility.copyAmount(1, miningPipe)))
++ mOutputItems = new ItemStack[] {GT_Utility.copyAmount(1, miningPipe)};
++ return true;
++ }
++
++ protected boolean canLowerPipe(){
++ return yHead > 0 && !checkBlockAndMeta(xPipe, yHead - 1, zPipe, Blocks.bedrock, W);
++ }
++
++ private boolean isHasMiningPipes() {
++ return isHasMiningPipes(1);
++ }
++
++ private boolean isHasMiningPipes(int minCount) {
++ ItemStack pipe = getStackInSlot(1);
++ return pipe != null && pipe.stackSize > minCount - 1 && pipe.isItemEqual(miningPipe);
++ }
++
++ private boolean isEnergyEnough() {
++ long requiredEnergy = 512 + getMaxInputVoltage() * 4;
++ for (GT_MetaTileEntity_Hatch_Energy energyHatch : mEnergyHatches) {
++ requiredEnergy -= energyHatch.getEUVar();
++ if (requiredEnergy <= 0) return true;
++ }
++ return false;
++ }
++
++ protected boolean workingDownward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, int yHead, int oldYHead){
++ if(!tryLowerPipe())
++ if(waitForPipes()) return false;
++ isPickingPipes = true;
++ return true;
++ }
++
++ protected boolean workingUpward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, int yHead, int oldYHead) {
++ if (tryPickPipe()) {
++ return true;
++ } else {
++ isPickingPipes = false;
++ stopMachine();
++ return false;
++ }
++ }
++
++ @Override
++ public boolean checkRecipe(ItemStack aStack) {
++ //Public pipe actions
++ setElectricityStats();
++ int oldYHead = yHead;
++ if (!checkPipesAndSetYHead() || !isEnergyEnough()) {
++ stopMachine();
++ return false;
++ }
++ putMiningPipesFromInputsInController();
++ if (!isPickingPipes)
++ return workingDownward(aStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead);
++ else
++ return workingUpward(aStack, xDrill, yDrill, zDrill, xPipe, zPipe, yHead, oldYHead);
++ }
++
++ @Override
++ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
++ updateCoordinates();
++ //check base layer
++ for (int xOff = -1 + back.offsetX; xOff <= 1 + back.offsetX; xOff++) {
++ for (int zOff = -1 + back.offsetZ; zOff <= 1 + back.offsetZ; zOff++) {
++ if (xOff == 0 && zOff == 0) continue;
++
++ IGregTechTileEntity tTileEntity = aBaseMetaTileEntity.getIGregTechTileEntityOffset(xOff, 0, zOff);
++ if (!checkCasingBlock(xOff, 0, zOff)
++ && !addMaintenanceToMachineList(tTileEntity, casingTextureIndex)
++ && !addInputToMachineList(tTileEntity, casingTextureIndex)
++ && !addOutputToMachineList(tTileEntity, casingTextureIndex)
++ && !addEnergyInputToMachineList(tTileEntity, casingTextureIndex)
++ && !addDataAccessToMachineList(tTileEntity, casingTextureIndex))
++ return false;
++ }
++ }
++ if(!checkHatches()) return false;
++ if (GT_Utility.getTier(getMaxInputVoltage()) < getMinTier()) return false;
++ //check tower
++ for (int yOff = 1; yOff < 4; yOff++) {
++ if (!checkCasingBlock(back.offsetX, yOff, back.offsetZ)
++ || !checkFrameBlock(back.offsetX + 1, yOff, back.offsetZ)
++ || !checkFrameBlock(back.offsetX - 1, yOff, back.offsetZ)
++ || !checkFrameBlock(back.offsetX, yOff, back.offsetZ + 1)
++ || !checkFrameBlock(back.offsetX, yOff, back.offsetZ - 1)
++ || !checkFrameBlock(back.offsetX, yOff + 3, back.offsetZ))
++ return false;
++ }
++ return true;
++ }
++
++ private void updateCoordinates() {
++ xDrill = getBaseMetaTileEntity().getXCoord();
++ yDrill = getBaseMetaTileEntity().getYCoord();
++ zDrill = getBaseMetaTileEntity().getZCoord();
++ back = ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing());
++ xPipe = xDrill + back.offsetX;
++ zPipe = zDrill + back.offsetZ;
++ }
++
++ private boolean checkPipesAndSetYHead() {
++ yHead = yDrill - 1;
++ while (checkBlockAndMeta(xPipe, yHead, zPipe, miningPipeBlock, W)) yHead--; //skip pipes
++ //is pipe tip OR is controller layer
++ if (checkBlockAndMeta(xPipe, yHead, zPipe, miningPipeTipBlock, W) || ++yHead == yDrill) return true;
++ //pipe column is broken - try fix
++ getBaseMetaTileEntity().getWorld().setBlock(xPipe, yHead, zPipe, miningPipeTipBlock);
++ return true;
++ }
++
++ protected boolean checkCasingBlock(int xOff, int yOff, int zOff) {
++ return checkBlockAndMetaOffset(xOff, yOff, zOff, casingBlock, casingMeta);
++ }
++ //meta of frame is getTileEntityBaseType; frame should be checked using its drops (possible a high weight operation)
++ protected boolean checkFrameBlock(int xOff, int yOff, int zOff) {
++ return checkBlockAndMetaOffset(xOff, yOff, zOff, GregTech_API.sBlockMachines, frameMeta);
++ }
++
++ protected boolean checkBlockAndMetaOffset(int xOff, int yOff, int zOff, Block block, int meta) {
++ return checkBlockAndMeta(xDrill + xOff, yDrill + yOff, zDrill + zOff, block, meta);
++ }
++
++ private boolean checkBlockAndMeta(int x, int y, int z, Block block, int meta) {
++ return (meta == W || getBaseMetaTileEntity().getMetaID(x, y, z) == meta)
++ && getBaseMetaTileEntity().getBlock(x, y, z) == block;
++ }
++
++ protected boolean waitForPipes(){
++ if (canLowerPipe()) {
++ mMaxProgresstime = 0;
++ return true;
++ }
++ return false;
++ }
++
++ @Override
++ public boolean isCorrectMachinePart(ItemStack aStack) {
++ return true;
++ }
++
++ @Override
++ public int getMaxEfficiency(ItemStack aStack) {
++ return 10000;
++ }
++
++ @Override
++ public int getPollutionPerTick(ItemStack aStack) {
++ return 0;
++ }
++
++ @Override
++ public int getDamageToComponent(ItemStack aStack) {
++ return 0;
++ }
++
++ @Override
++ public boolean explodesOnComponentBreak(ItemStack aStack) {
++ return false;
++ }
++
++ public abstract Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity);
++
++ protected abstract ItemList getCasingBlockItem();
++
++ protected abstract Materials getFrameMaterial();
++
++ protected abstract int getCasingTextureIndex();
++
++ protected abstract int getMinTier();
++
++ protected abstract boolean checkHatches();
++
++ protected abstract void setElectricityStats();
++
++ public int getTotalConfigValue(){
++ int config = 0;
++ ArrayList<ItemStack> tCircuitList = getDataItems(1);
++ for (ItemStack tCircuit : tCircuitList)
++ config += tCircuit.getItemDamage();
++ return config;
++ }
++
++ public ArrayList<GT_MetaTileEntity_Hatch_DataAccess> mDataAccessHatches = new ArrayList<GT_MetaTileEntity_Hatch_DataAccess>();
++
++ /**
++ * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb
++ */
++ private boolean isCorrectDataItem(ItemStack aStack, int state){
++ if ((state & 1) != 0 && ItemList.Circuit_Integrated.isStackEqual(aStack, true, true)) return true;
++ if ((state & 2) != 0 && ItemList.Tool_DataStick.isStackEqual(aStack, false, true)) return true;
++ if ((state & 4) != 0 && ItemList.Tool_DataOrb.isStackEqual(aStack, false, true)) return true;
++ return false;
++ }
++
++ /**
++ * @param state using bitmask, 1 for IntegratedCircuit, 2 for DataStick, 4 for DataOrb
++ */
++ public ArrayList<ItemStack> getDataItems(int state) {
++ ArrayList<ItemStack> rList = new ArrayList<ItemStack>();
++ if (GT_Utility.isStackValid(mInventory[1]) && isCorrectDataItem(mInventory[1], state)) {
++ rList.add(mInventory[1]);
++ }
++ for (GT_MetaTileEntity_Hatch_DataAccess tHatch : mDataAccessHatches) {
++ if (isValidMetaTileEntity(tHatch)) {
++ for (int i = 0; i < tHatch.getBaseMetaTileEntity().getSizeInventory(); i++) {
++ if (tHatch.getBaseMetaTileEntity().getStackInSlot(i) != null
++ && isCorrectDataItem(tHatch.getBaseMetaTileEntity().getStackInSlot(i), state))
++ rList.add(tHatch.getBaseMetaTileEntity().getStackInSlot(i));
++ }
++ }
++ }
++ return rList;
++ }
++
++ public boolean addDataAccessToMachineList(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) {
++ if (aTileEntity == null) return false;
++ IMetaTileEntity aMetaTileEntity = aTileEntity.getMetaTileEntity();
++ if (aMetaTileEntity == null) return false;
++ if (aMetaTileEntity instanceof GT_MetaTileEntity_Hatch_DataAccess) {
++ ((GT_MetaTileEntity_Hatch) aMetaTileEntity).mMachineBlock = (byte) aBaseCasingIndex;
++ return mDataAccessHatches.add((GT_MetaTileEntity_Hatch_DataAccess) aMetaTileEntity);
++ }
++ return false;
++ }
++
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill.java
+deleted file mode 100644
+index e3e0c85..0000000
+--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill.java
++++ /dev/null
+@@ -1,270 +0,0 @@
+-package gregtech.common.tileentities.machines.multi;
+-
+-import gregtech.api.GregTech_API;
+-import gregtech.api.enums.Textures;
+-import gregtech.api.gui.GT_GUIContainer_MultiMachine;
+-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_Energy;
+-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Muffler;
+-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+-import gregtech.api.objects.GT_RenderedTexture;
+-import gregtech.api.util.GT_ModHandler;
+-import gregtech.api.util.GT_Utility;
+-import net.minecraft.entity.player.InventoryPlayer;
+-import net.minecraft.init.Blocks;
+-import net.minecraft.item.ItemStack;
+-import net.minecraft.util.EnumChatFormatting;
+-import net.minecraftforge.common.util.ForgeDirection;
+-import net.minecraftforge.fluids.FluidStack;
+-
+-import java.util.ArrayList;
+-
+-import static gregtech.common.GT_UndergroundOil.undergroundOil;
+-
+-public class GT_MetaTileEntity_OilDrill extends GT_MetaTileEntity_MultiBlockBase {
+-
+- private boolean completedCycle = false;
+- private int extractionSpeed=0;
+-
+- public GT_MetaTileEntity_OilDrill(int aID, String aName, String aNameRegional) {
+- super(aID, aName, aNameRegional);
+- }
+-
+- public GT_MetaTileEntity_OilDrill(String aName) {
+- super(aName);
+- }
+-
+- public String[] getDescription() {
+- return new String[]{
+- "Controller Block for the Oil Drilling Rig",
+- "Size(WxHxD): 3x7x3", "Controller (Front middle at bottom)",
+- "3x1x3 Base of Solid Steel Machine Casings",
+- "1x3x1 Solid Steel Machine Casing pillar (Center of base)",
+- "1x3x1 Steel Frame Boxes (Each Steel pillar side and on top)",
+- "1x Output Hatch (One of base casings)",
+- "1x Maintenance Hatch (One of base casings)",
+- "1x Energy Hatch (One of base casings)",
+- "Also check the seismic prospector..."};
+- }
+-
+- public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, byte aSide, byte aFacing, byte aColorIndex, boolean aActive, boolean aRedstone) {
+- if (aSide == aFacing) {
+- return new ITexture[]{Textures.BlockIcons.CASING_BLOCKS[16], new GT_RenderedTexture(aActive ? Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL_ACTIVE : Textures.BlockIcons.OVERLAY_FRONT_OIL_DRILL)};
+- }
+- return new ITexture[]{Textures.BlockIcons.CASING_BLOCKS[16]};
+- }
+-
+- public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
+- return new GT_GUIContainer_MultiMachine(aPlayerInventory, aBaseMetaTileEntity, getLocalName(), "DrillingRig.png");
+- }
+-
+- @Override
+- public boolean checkRecipe(ItemStack aStack) {
+- if (mInventory[1] == null || (mInventory[1].isItemEqual(GT_ModHandler.getIC2Item("miningPipe", 1L)) && mInventory[1].stackSize < mInventory[1].getMaxStackSize())) {
+- ArrayList<ItemStack> tItems = getStoredInputs();
+- for (ItemStack tStack : tItems) {
+- if (tStack.isItemEqual(GT_ModHandler.getIC2Item("miningPipe", 1L))) {
+- if (tStack.stackSize < 2) {
+- tStack = null;
+- } else {
+- tStack.stackSize--;
+- }
+-
+- }
+- if (mInventory[1] == null) {
+- mInventory[1] = GT_ModHandler.getIC2Item("miningPipe", 1L);
+- } else {
+- mInventory[1].stackSize++;
+- }
+- }
+- }
+- //Output fluid
+- FluidStack tFluid = undergroundOil(getBaseMetaTileEntity(),.5F+(getInputTier()*.25F));//consumes here...
+- if (tFluid == null){
+- extractionSpeed=0;
+- stopMachine();
+- return false;//impossible
+- }
+- if (getBaseMetaTileEntity().getBlockOffset(ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing()).offsetX, getYOfPumpHead() - 1 - getBaseMetaTileEntity().getYCoord(), ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing()).offsetZ) != Blocks.bedrock) {
+- //Not at bedrock layer - i prefer to keep it like it is...
+- if (completedCycle) {
+- moveOneDown();
+- }
+- tFluid = null;
+- if (mEnergyHatches.size() > 0 && mEnergyHatches.get(0).getEUVar() > (512 + getMaxInputVoltage() * 4))
+- completedCycle = true;
+- } else if (tFluid.amount == 0) {//no fluid remaining, for SANity
+- extractionSpeed=0;
+- stopMachine();
+- return false;//stops processing??
+- } else {
+- extractionSpeed=tFluid.amount;
+- }
+- this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
+- this.mEfficiencyIncrease = 10000;
+- calculateOverclockedNessMulti(24, 160, 1, getMaxInputVoltage());
+- //In case recipe is too OP for that machine
+- if (mMaxProgresstime == Integer.MAX_VALUE - 1 && mEUt == Integer.MAX_VALUE - 1)
+- return false;
+- if (this.mEUt > 0) {
+- this.mEUt = (-this.mEUt);
+- }
+- this.mOutputFluids = new FluidStack[]{tFluid};
+- return true;
+- }
+-
+- private boolean moveOneDown() {
+- if ((this.mInventory[1] == null) || (this.mInventory[1].stackSize < 1)
+- || (!GT_Utility.areStacksEqual(this.mInventory[1], GT_ModHandler.getIC2Item("miningPipe", 1L)))) {
+- return false;
+- }
+- int xDir = ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing()).offsetX;
+- int zDir = ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing()).offsetZ;
+- int yHead = getYOfPumpHead();
+- if (yHead < 1) {
+- return false;
+- }
+- if (getBaseMetaTileEntity().getBlock(getBaseMetaTileEntity().getXCoord() + xDir, yHead - 1, getBaseMetaTileEntity().getZCoord() + zDir) == Blocks.bedrock) {
+- return false;
+- }
+- if (!(getBaseMetaTileEntity().getWorld().setBlock(getBaseMetaTileEntity().getXCoord() + xDir, yHead - 1, getBaseMetaTileEntity().getZCoord() + zDir, GT_Utility.getBlockFromStack(GT_ModHandler.getIC2Item("miningPipeTip", 1L))))) {
+- return false;
+- }
+- if (yHead != getBaseMetaTileEntity().getYCoord()) {
+- getBaseMetaTileEntity().getWorld().setBlock(getBaseMetaTileEntity().getXCoord() + xDir, yHead, getBaseMetaTileEntity().getZCoord() + zDir, GT_Utility.getBlockFromStack(GT_ModHandler.getIC2Item("miningPipe", 1L)));
+- }
+- getBaseMetaTileEntity().decrStackSize(1, 1);
+- return true;
+- }
+-
+- private int getYOfPumpHead() {
+- int xDir = ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing()).offsetX;
+- int zDir = ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing()).offsetZ;
+- int y = getBaseMetaTileEntity().getYCoord() - 1;
+- while (getBaseMetaTileEntity().getBlock(getBaseMetaTileEntity().getXCoord() + xDir, y, getBaseMetaTileEntity().getZCoord() + zDir) == GT_Utility.getBlockFromStack(GT_ModHandler.getIC2Item("miningPipe", 1L))) {
+- y--;
+- }
+- if (y == getBaseMetaTileEntity().getYCoord() - 1) {
+- if (getBaseMetaTileEntity().getBlock(getBaseMetaTileEntity().getXCoord() + xDir, y, getBaseMetaTileEntity().getZCoord() + zDir) != GT_Utility.getBlockFromStack(GT_ModHandler.getIC2Item("miningPipeTip", 1L))) {
+- return y + 1;
+- }
+- } else if (getBaseMetaTileEntity().getBlock(getBaseMetaTileEntity().getXCoord() + xDir, y, getBaseMetaTileEntity().getZCoord() + zDir) != GT_Utility
+- .getBlockFromStack(GT_ModHandler.getIC2Item("miningPipeTip", 1L)) && this.mInventory[1] != null && this.mInventory[1].stackSize > 0 && GT_Utility.areStacksEqual(this.mInventory[1], GT_ModHandler.getIC2Item("miningPipe", 1L))) {
+- getBaseMetaTileEntity().getWorld().setBlock(getBaseMetaTileEntity().getXCoord() + xDir, y, getBaseMetaTileEntity().getZCoord() + zDir,
+- GT_Utility.getBlockFromStack(GT_ModHandler.getIC2Item("miningPipeTip", 1L)));
+- getBaseMetaTileEntity().decrStackSize(0, 1);
+- }
+- return y;
+- }
+-
+- @Override
+- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+- int xDir = ForgeDirection.getOrientation(aBaseMetaTileEntity.getBackFacing()).offsetX;
+- int zDir = ForgeDirection.getOrientation(aBaseMetaTileEntity.getBackFacing()).offsetZ;
+- for (int i = -1; i < 2; i++) {
+- for (int j = -1; j < 2; j++) {
+- if ((xDir + i != 0) || (zDir + j != 0)) {
+- IGregTechTileEntity tTileEntity = aBaseMetaTileEntity.getIGregTechTileEntityOffset(xDir + i, 0, zDir + j);
+- if ((!addMaintenanceToMachineList(tTileEntity, 16)) && (!addInputToMachineList(tTileEntity, 16)) && (!addOutputToMachineList(tTileEntity, 16)) && (!addEnergyInputToMachineList(tTileEntity, 16))) {
+- if (aBaseMetaTileEntity.getBlockOffset(xDir + i, 0, zDir + j) != GregTech_API.sBlockCasings2) {
+- return false;
+- }
+- if (aBaseMetaTileEntity.getMetaIDOffset(xDir + i, 0, zDir + j) != 0) {
+- return false;
+- }
+- }
+- }
+- }
+- }
+- for (int y = 1; y < 4; y++) {
+- if (aBaseMetaTileEntity.getBlockOffset(xDir, y, zDir) != GregTech_API.sBlockCasings2) {
+- return false;
+- }
+- if (aBaseMetaTileEntity.getBlockOffset(xDir + 1, y, zDir) != GregTech_API.sBlockMachines) {
+- return false;
+- }
+- if (aBaseMetaTileEntity.getBlockOffset(xDir - 1, y, zDir) != GregTech_API.sBlockMachines) {
+- return false;
+- }
+- if (aBaseMetaTileEntity.getBlockOffset(xDir, y, zDir + 1) != GregTech_API.sBlockMachines) {
+- return false;
+- }
+- if (aBaseMetaTileEntity.getBlockOffset(xDir, y, zDir - 1) != GregTech_API.sBlockMachines) {
+- return false;
+- }
+- if (aBaseMetaTileEntity.getBlockOffset(xDir, y + 3, zDir) != GregTech_API.sBlockMachines) {
+- return false;
+- }
+- }
+- return true;
+- }
+-
+- @Override
+- public boolean isCorrectMachinePart(ItemStack aStack) {
+- return true;
+- }
+-
+- @Override
+- public int getMaxEfficiency(ItemStack aStack) {
+- return 10000;
+- }
+-
+- @Override
+- public int getPollutionPerTick(ItemStack aStack) {
+- return 0;
+- }
+-
+- @Override
+- public int getDamageToComponent(ItemStack aStack) {
+- return 0;
+- }
+-
+- @Override
+- public boolean explodesOnComponentBreak(ItemStack aStack) {
+- return false;
+- }
+-
+- public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+- return new GT_MetaTileEntity_OilDrill(this.mName);
+- }
+-
+- @Override
+- public String[] getInfoData() {
+- int mPollutionReduction=0;
+- for (GT_MetaTileEntity_Hatch_Muffler tHatch : mMufflerHatches) {
+- if (isValidMetaTileEntity(tHatch)) {
+- mPollutionReduction=Math.max(tHatch.calculatePollutionReduction(100),mPollutionReduction);
+- }
+- }
+-
+- long storedEnergy=0;
+- long maxEnergy=0;
+- for(GT_MetaTileEntity_Hatch_Energy tHatch : mEnergyHatches) {
+- if (isValidMetaTileEntity(tHatch)) {
+- storedEnergy+=tHatch.getBaseMetaTileEntity().getStoredEU();
+- maxEnergy+=tHatch.getBaseMetaTileEntity().getEUCapacity();
+- }
+- }
+-
+- return new String[]{
+- "Progress:",
+- EnumChatFormatting.GREEN + Integer.toString(mProgresstime/20) + EnumChatFormatting.RESET +" s / "+
+- EnumChatFormatting.YELLOW + Integer.toString(mMaxProgresstime/20) + EnumChatFormatting.RESET +" s",
+- "Stored Energy:",
+- EnumChatFormatting.GREEN + Long.toString(storedEnergy) + EnumChatFormatting.RESET +" EU / "+
+- EnumChatFormatting.YELLOW + Long.toString(maxEnergy) + EnumChatFormatting.RESET +" EU",
+- "Probably uses: "+
+- EnumChatFormatting.RED + Integer.toString(-mEUt) + EnumChatFormatting.RESET + " EU/t",
+- "Maximum total power (to all Energy Hatches, not single ones): ",
+- EnumChatFormatting.YELLOW+Long.toString(getMaxInputVoltage())+EnumChatFormatting.RESET+ " EU/t * 2A",
+- "Problems: "+
+- EnumChatFormatting.RED+ (getIdealStatus() - getRepairStatus())+EnumChatFormatting.RESET+
+- " Efficiency: "+
+- EnumChatFormatting.YELLOW+Float.toString(mEfficiency / 100.0F)+EnumChatFormatting.RESET + " %",
+- "Pollution reduced to: "+ EnumChatFormatting.GREEN + mPollutionReduction+ EnumChatFormatting.RESET+" %",
+- "Extraction this cycle: "+ EnumChatFormatting.GOLD + extractionSpeed + EnumChatFormatting.RESET+" L"
+- };
+- }
+-}
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill1.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill1.java
+new file mode 100644
+index 0000000..750978a
+--- /dev/null
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill1.java
+@@ -0,0 +1,51 @@
++package gregtech.common.tileentities.machines.multi;
++
++import gregtech.api.enums.ItemList;
++import gregtech.api.enums.Materials;
++import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
++import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
++
++public class GT_MetaTileEntity_OilDrill1 extends GT_MetaTileEntity_OilDrillBase {
++ public GT_MetaTileEntity_OilDrill1(int aID, String aName, String aNameRegional) {
++ super(aID, aName, aNameRegional);
++ }
++
++ public GT_MetaTileEntity_OilDrill1(String aName) {
++ super(aName);
++ }
++
++ @Override
++ public String[] getDescription() {
++ return getDescriptionInternal("I");
++ }
++
++ @Override
++ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
++ return new GT_MetaTileEntity_OilDrill1(mName);
++ }
++
++ @Override
++ protected ItemList getCasingBlockItem() {
++ return ItemList.Casing_SolidSteel;
++ }
++
++ @Override
++ protected Materials getFrameMaterial() {
++ return Materials.Steel;
++ }
++
++ @Override
++ protected int getCasingTextureIndex() {
++ return 16;
++ }
++
++ @Override
++ protected int getRangeInChunks() {
++ return 1;
++ }
++
++ @Override
++ protected int getMinTier() {
++ return 2;
++ }
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill2.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill2.java
+new file mode 100644
+index 0000000..00b6f19
+--- /dev/null
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill2.java
+@@ -0,0 +1,51 @@
++package gregtech.common.tileentities.machines.multi;
++
++import gregtech.api.enums.ItemList;
++import gregtech.api.enums.Materials;
++import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
++import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
++
++public class GT_MetaTileEntity_OilDrill2 extends GT_MetaTileEntity_OilDrillBase {
++ public GT_MetaTileEntity_OilDrill2(int aID, String aName, String aNameRegional) {
++ super(aID, aName, aNameRegional);
++ }
++
++ public GT_MetaTileEntity_OilDrill2(String aName) {
++ super(aName);
++ }
++
++ @Override
++ public String[] getDescription() {
++ return getDescriptionInternal("II");
++ }
++
++ @Override
++ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
++ return new GT_MetaTileEntity_OilDrill2(mName);
++ }
++
++ @Override
++ protected ItemList getCasingBlockItem() {
++ return ItemList.Casing_StableTitanium;
++ }
++
++ @Override
++ protected Materials getFrameMaterial() {
++ return Materials.Titanium;
++ }
++
++ @Override
++ protected int getCasingTextureIndex() {
++ return 50;
++ }
++
++ @Override
++ protected int getRangeInChunks() {
++ return 3;
++ }
++
++ @Override
++ protected int getMinTier() {
++ return 3;
++ }
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill3.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill3.java
+new file mode 100644
+index 0000000..164ece9
+--- /dev/null
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrill3.java
+@@ -0,0 +1,51 @@
++package gregtech.common.tileentities.machines.multi;
++
++import gregtech.api.enums.ItemList;
++import gregtech.api.enums.Materials;
++import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
++import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
++
++public class GT_MetaTileEntity_OilDrill3 extends GT_MetaTileEntity_OilDrillBase {
++ public GT_MetaTileEntity_OilDrill3(int aID, String aName, String aNameRegional) {
++ super(aID, aName, aNameRegional);
++ }
++
++ public GT_MetaTileEntity_OilDrill3(String aName) {
++ super(aName);
++ }
++
++ @Override
++ public String[] getDescription() {
++ return getDescriptionInternal("III");
++ }
++
++ @Override
++ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
++ return new GT_MetaTileEntity_OilDrill3(mName);
++ }
++
++ @Override
++ protected ItemList getCasingBlockItem() {
++ return ItemList.Casing_RobustTungstenSteel;
++ }
++
++ @Override
++ protected Materials getFrameMaterial() {
++ return Materials.TungstenSteel;
++ }
++
++ @Override
++ protected int getCasingTextureIndex() {
++ return 48;
++ }
++
++ @Override
++ protected int getRangeInChunks() {
++ return 6;
++ }
++
++ @Override
++ protected int getMinTier() {
++ return 4;
++ }
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillBase.java
+new file mode 100644
+index 0000000..23fafc3
+--- /dev/null
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OilDrillBase.java
+@@ -0,0 +1,152 @@
++package gregtech.common.tileentities.machines.multi;
++
++import static gregtech.api.enums.GT_Values.V;
++import static gregtech.api.enums.GT_Values.VN;
++import static gregtech.common.GT_UndergroundOil.undergroundOil;
++
++import java.util.ArrayList;
++
++import gregtech.api.gui.GT_GUIContainer_MultiMachine;
++import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
++import gregtech.api.util.GT_Utility;
++import net.minecraft.entity.player.InventoryPlayer;
++import net.minecraft.item.ItemStack;
++import net.minecraft.nbt.NBTTagCompound;
++import net.minecraft.world.chunk.Chunk;
++import net.minecraftforge.fluids.FluidRegistry;
++import net.minecraftforge.fluids.FluidStack;
++
++public abstract class GT_MetaTileEntity_OilDrillBase extends GT_MetaTileEntity_DrillerBase {
++
++ private boolean completedCycle = false;
++
++ private ArrayList<Chunk> mOilFieldChunks = new ArrayList<Chunk>();
++ private int mOilId = 0;
++
++ public GT_MetaTileEntity_OilDrillBase(int aID, String aName, String aNameRegional) {
++ super(aID, aName, aNameRegional);
++ }
++
++ public GT_MetaTileEntity_OilDrillBase(String aName) {
++ super(aName);
++ }
++
++ @Override
++ public void saveNBTData(NBTTagCompound aNBT) {
++ super.saveNBTData(aNBT);
++ aNBT.setInteger("mOilId", mOilId);
++ }
++
++ @Override
++ public void loadNBTData(NBTTagCompound aNBT) {
++ super.loadNBTData(aNBT);
++ mOilId = aNBT.getInteger("mOilId");
++ }
++
++ protected String[] getDescriptionInternal(String tierSuffix) {
++ String casings = getCasingBlockItem().get(0).getDisplayName();
++ return new String[]{
++ "Controller Block for the Oil Drilling Rig " + (tierSuffix != null ? tierSuffix : ""),
++ "Size(WxHxD): 3x7x3", "Controller (Front middle at bottom)",
++ "3x1x3 Base of " + casings,
++ "1x3x1 " + casings + " pillar (Center of base)",
++ "1x3x1 " + getFrameMaterial().mName + " Frame Boxes (Each pillar side and on top)",
++ "1x Output Hatch (One of base casings)",
++ "1x Maintenance Hatch (One of base casings)",
++ "1x " + VN[getMinTier()] + "+ Energy Hatch (Any bottom layer casing)",
++ "Working on " + getRangeInChunks() + " * " + getRangeInChunks() + " chunks",
++ "Use Programmed Circuits to ignore near exhausted oil field"};
++ }
++
++
++ @Override
++ public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
++ return new GT_GUIContainer_MultiMachine(aPlayerInventory, aBaseMetaTileEntity, getLocalName(), "DrillingRig.png");
++ }
++
++ protected int getRangeInChunks(){
++ return 0;
++ }
++
++ @Override
++ protected boolean checkHatches() {
++ return !mMaintenanceHatches.isEmpty() && !mOutputHatches.isEmpty() && !mEnergyHatches.isEmpty();
++ }
++
++ @Override
++ protected void setElectricityStats() {
++ this.mEfficiency = getCurrentEfficiency(null);
++ this.mEfficiencyIncrease = 10000;
++ //T1 = 24; T2 = 96; T3 = 384
++ this.mEUt = 6 * (1 << (getMinTier() << 1));
++ //160 per chunk in MV
++ this.mMaxProgresstime = (isPickingPipes ? 80 : 640 * getRangeInChunks() * getRangeInChunks()) / (1 << getMinTier());
++
++ long voltage = getMaxInputVoltage();
++ long overclockEu = V[Math.max(1, GT_Utility.getTier(voltage)) - 1];
++ while (this.mEUt <= overclockEu) {
++ this.mEUt *= 4;
++ this.mMaxProgresstime /= 2;
++ }
++
++ this.mEUt = -this.mEUt;
++ this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime);
++ }
++
++ @Override
++ protected boolean workingDownward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, int yHead, int oldYHead){
++ if (!tryLowerPipe()){
++ if (waitForPipes()) return false;
++ if (tryFillChunkList()) {
++ float speed = .5F+(GT_Utility.getTier(getMaxInputVoltage()) - getMinTier()) *.25F;
++ FluidStack tFluid = pumpOil(speed);
++ if (tFluid != null && tFluid.amount > getTotalConfigValue()){
++ this.mOutputFluids = new FluidStack[]{tFluid};
++ return true;
++ }
++ }
++ isPickingPipes = true;
++ return true;
++ }
++ return true;
++ }
++
++ private boolean tryFillChunkList(){
++ FluidStack tFluid, tOil;
++ if (mOilId <= 0) {
++ tFluid = undergroundOil(getBaseMetaTileEntity(), -1);
++ if (tFluid == null) return false;
++ mOilId = tFluid.getFluidID();
++ }
++ tOil = new FluidStack(FluidRegistry.getFluid(mOilId), 0);
++
++ if (mOilFieldChunks.isEmpty()) {
++ Chunk tChunk = getBaseMetaTileEntity().getWorld().getChunkFromBlockCoords(getBaseMetaTileEntity().getXCoord(), getBaseMetaTileEntity().getZCoord());
++ int range = getRangeInChunks();
++ int xChunk = (tChunk.xPosition / range) * range, zChunk = (tChunk.zPosition / range) * range;
++ int xDir = tChunk.xPosition < 0 ? -1 : 1, zDir = tChunk.zPosition < 0 ? -1 : 1;
++ for (int i = 0; i < range; i++) {
++ for (int j = 0; j < range; j++) {
++ tChunk = getBaseMetaTileEntity().getWorld().getChunkFromChunkCoords(xChunk + i * xDir, zChunk + j * zDir);
++ tFluid = undergroundOil(tChunk, -1);
++ if (tOil.isFluidEqual(tFluid))
++ mOilFieldChunks.add(tChunk);
++ }
++ }
++ }
++ if (mOilFieldChunks.isEmpty()) return false;
++ return true;
++ }
++
++ private FluidStack pumpOil(float speed){
++ if (mOilId <= 0) return null;
++ FluidStack tFluid, tOil;
++ tOil = new FluidStack(FluidRegistry.getFluid(mOilId), 0);
++ for (Chunk tChunk : mOilFieldChunks) {
++ tFluid = undergroundOil(getBaseMetaTileEntity(),speed);
++ if (tFluid == null) mOilFieldChunks.remove(tChunk);
++ if (tOil.isFluidEqual(tFluid)) tOil.amount += tFluid.amount;
++ }
++ return tOil.amount == 0 ? null : tOil;
++ }
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java
+index 3d8dbb0..c34d8b0 100644
+--- a/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java
++++ b/src/main/java/gregtech/common/tileentities/machines/multi/GT_MetaTileEntity_OreDrillingPlantBase.java
+@@ -1,18 +1,16 @@
+ package gregtech.common.tileentities.machines.multi;
+
+-import gregtech.api.GregTech_API;
++import static gregtech.api.enums.GT_Values.V;
++import static gregtech.api.enums.GT_Values.VN;
++
++import java.util.ArrayList;
++
+ import gregtech.api.enums.ItemList;
+ import gregtech.api.enums.Materials;
+ import gregtech.api.enums.OrePrefixes;
+-import gregtech.api.enums.Textures;
+ import gregtech.api.gui.GT_GUIContainer_MultiMachine;
+-import gregtech.api.interfaces.ITexture;
+ import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy;
+-import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase;
+-import gregtech.api.objects.GT_RenderedTexture;
+ import gregtech.api.objects.ItemData;
+-import gregtech.api.util.GT_ModHandler;
+ import gregtech.api.util.GT_OreDictUnificator;
+ import gregtech.api.util.GT_Recipe;
+ import gregtech.api.util.GT_Utility;
+@@ -22,106 +20,40 @@ import net.minecraft.block.Block;
+ import net.minecraft.entity.player.InventoryPlayer;
+ import net.minecraft.init.Blocks;
+ import net.minecraft.item.ItemStack;
+-import net.minecraft.nbt.NBTTagCompound;
+ import net.minecraft.tileentity.TileEntity;
+ import net.minecraft.world.ChunkPosition;
+-import net.minecraftforge.common.util.ForgeDirection;
+ import net.minecraftforge.fluids.FluidStack;
+
+-import java.util.ArrayList;
+-
+-import static gregtech.api.enums.GT_Values.*;
+-
+-public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTileEntity_MultiBlockBase {
+- private static final ItemStack miningPipe = GT_ModHandler.getIC2Item("miningPipe", 0);
+- private static final ItemStack miningPipeTip = GT_ModHandler.getIC2Item("miningPipeTip", 0);
+- private static final Block miningPipeBlock = GT_Utility.getBlockFromStack(miningPipe);
+- private static final Block miningPipeTipBlock = GT_Utility.getBlockFromStack(miningPipeTip);
++public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTileEntity_DrillerBase {
+
+ private final ArrayList<ChunkPosition> oreBlockPositions = new ArrayList<>();
+
+- private Block casingBlock;
+- private int casingMeta;
+- private int frameMeta;
+- private int casingTextureIndex;
+-
+- private ForgeDirection back;
+- private int xDrill, yDrill, zDrill, xCenter, zCenter, yHead;
+-
+- private boolean isPickingPipes;
+-
+ public GT_MetaTileEntity_OreDrillingPlantBase(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+- initFields();
+ }
+
+ public GT_MetaTileEntity_OreDrillingPlantBase(String aName) {
+ super(aName);
+- initFields();
+- }
+-
+- private void initFields() {
+- casingBlock = getCasingBlockItem().getBlock();
+- casingMeta = getCasingBlockItem().get(0).getItemDamage();
+- int frameId = 4096 + getFrameMaterial().mMetaItemSubID;
+- frameMeta = GregTech_API.METATILEENTITIES[frameId] != null ? GregTech_API.METATILEENTITIES[frameId].getTileEntityBaseType() : W;
+- casingTextureIndex = getCasingTextureIndex();
+- isPickingPipes = false;
+- }
+-
+- public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, byte aSide, byte aFacing, byte aColorIndex, boolean aActive, boolean aRedstone) {
+- if (aSide == aFacing)
+- return new ITexture[]{Textures.BlockIcons.CASING_BLOCKS[casingTextureIndex],new GT_RenderedTexture(aActive ? Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL_ACTIVE : Textures.BlockIcons.OVERLAY_FRONT_ORE_DRILL)};
+- return new ITexture[]{Textures.BlockIcons.CASING_BLOCKS[casingTextureIndex]};
+ }
+
++ @Override
+ public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
+ return new GT_GUIContainer_MultiMachine(aPlayerInventory, aBaseMetaTileEntity, getLocalName(), "OreDrillingPlant.png");
+ }
+
+ @Override
+- public void saveNBTData(NBTTagCompound aNBT) {
+- super.saveNBTData(aNBT);
+- aNBT.setBoolean("isPickingPipes", isPickingPipes);
+- }
+-
+- @Override
+- public void loadNBTData(NBTTagCompound aNBT) {
+- super.loadNBTData(aNBT);
+- isPickingPipes = aNBT.getBoolean("isPickingPipes");
+- }
+-
+- @Override
+- public boolean checkRecipe(ItemStack aStack) {
+- setElectricityStats();
+- int oldYHead = yHead;
+- if (!checkPipesAndSetYHead() || !isEnergyEnough()) {
+- stopMachine();
+- return false;
+- }
++ protected boolean workingDownward(ItemStack aStack, int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, int yHead, int oldYHead){
+ if (yHead != oldYHead) oreBlockPositions.clear();
+- if (isPickingPipes) {
+- if (tryPickPipe()) {
+- mOutputItems = new ItemStack[] {GT_Utility.copyAmount(1, miningPipe)};
+- return true;
+- } else {
+- isPickingPipes = false;
+- stopMachine();
+- return false;
+- }
+- }
+-
+- putMiningPipesFromInputsInController();
+- if (!tryConsumeDrillingFluid()) return false;
+
+- fillMineListIfEmpty();
++ fillMineListIfEmpty(xDrill, yDrill, zDrill, xPipe, zPipe, yHead);
+ if (oreBlockPositions.isEmpty()) {
+ if (!tryLowerPipe()) {
++ if (waitForPipes()) return false;
+ isPickingPipes = true;
+ return true;
+ }
+ //new layer - fill again
+- fillMineListIfEmpty();
++ fillMineListIfEmpty(xDrill, yDrill, zDrill, xPipe, zPipe, yHead);
+ }
+
+ ChunkPosition oreBlockPos = null;
+@@ -132,6 +64,7 @@ public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTile
+ oreBlock = getBaseMetaTileEntity().getBlock(oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ);
+ }
+
++ if (!tryConsumeDrillingFluid()) return false;
+ if (oreBlock != null && oreBlock != Blocks.air) {
+ ArrayList<ItemStack> oreBlockDrops = getBlockDrops(oreBlock, oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ);
+ getBaseMetaTileEntity().getWorld().setBlockToAir(oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ);
+@@ -141,24 +74,13 @@ public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTile
+ return true;
+ }
+
+- private boolean isEnergyEnough() {
+- long requiredEnergy = 512 + getMaxInputVoltage() * 4;
+- for (GT_MetaTileEntity_Hatch_Energy energyHatch : mEnergyHatches) {
+- requiredEnergy -= energyHatch.getEUVar();
+- if (requiredEnergy <= 0) return true;
+- }
+- return false;
+- }
+-
+- private boolean tryPickPipe() {
+- if (yHead == yDrill) return false;
+- if (checkBlockAndMeta(xCenter, yHead + 1, zCenter, miningPipeBlock, W))
+- getBaseMetaTileEntity().getWorld().setBlock(xCenter, yHead + 1, zCenter, miningPipeTipBlock);
+- getBaseMetaTileEntity().getWorld().setBlockToAir(xCenter, yHead, zCenter);
+- return true;
++ @Override
++ protected boolean checkHatches(){
++ return !mMaintenanceHatches.isEmpty() && !mInputHatches.isEmpty() && !mOutputBusses.isEmpty() && !mEnergyHatches.isEmpty();
+ }
+
+- private void setElectricityStats() {
++ @Override
++ protected void setElectricityStats() {
+ this.mEfficiency = getCurrentEfficiency(null);
+ this.mEfficiencyIncrease = 10000;
+ //T1 = 12; T2 = 48; T3 = 192; T4 = 768
+@@ -227,37 +149,17 @@ public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTile
+ }
+
+ private boolean tryConsumeDrillingFluid() {
+- return depleteInput(new FluidStack(ItemList.sDrillingFluid, 2000));
+- }
+-
+- private void putMiningPipesFromInputsInController() {
+- int maxPipes = miningPipe.getMaxStackSize();
+- if (isHasMiningPipes(maxPipes)) return;
+-
+- ItemStack pipes = getStackInSlot(1);
+- for (ItemStack storedItem : getStoredInputs()) {
+- if (!storedItem.isItemEqual(miningPipe)) continue;
+-
+- if (pipes == null) {
+- setInventorySlotContents(1, GT_Utility.copy(miningPipe));
+- pipes = getStackInSlot(1);
+- }
+-
+- if (pipes.stackSize == maxPipes) break;
+-
+- int needPipes = maxPipes - pipes.stackSize;
+- int transferPipes = storedItem.stackSize < needPipes ? storedItem.stackSize : needPipes;
+-
+- pipes.stackSize += transferPipes;
+- storedItem.stackSize -= transferPipes;
++ if (!depleteInput(new FluidStack(ItemList.sDrillingFluid, 2000))) {
++ mMaxProgresstime = 0;
++ return false;
+ }
+- updateSlots();
++ return true;
+ }
+
+- private void fillMineListIfEmpty() {
++ private void fillMineListIfEmpty(int xDrill, int yDrill, int zDrill, int xPipe, int zPipe, int yHead) {
+ if (!oreBlockPositions.isEmpty()) return;
+
+- tryAddOreBlockToMineList(xCenter, yHead - 1, zCenter);
++ tryAddOreBlockToMineList(xPipe, yHead - 1, zPipe);
+ if (yHead == yDrill) return; //skip controller block layer
+
+ int radius = getRadiusInChunks() << 4;
+@@ -282,131 +184,8 @@ public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTile
+ }
+ }
+
+- private boolean tryLowerPipe() {
+- if (!isHasMiningPipes()) return false;
+-
+- if (yHead <= 0) return false;
+- if (checkBlockAndMeta(xCenter, yHead - 1, zCenter, Blocks.bedrock, W)) return false;
+-
+- getBaseMetaTileEntity().getWorld().setBlock(xCenter, yHead - 1, zCenter, miningPipeTipBlock);
+- if (yHead != yDrill) getBaseMetaTileEntity().getWorld().setBlock(xCenter, yHead, zCenter, miningPipeBlock);
+-
+- getBaseMetaTileEntity().decrStackSize(1, 1);
+- return true;
+- }
+-
+- private boolean isHasMiningPipes() {
+- return isHasMiningPipes(1);
+- }
+-
+- private boolean isHasMiningPipes(int minCount) {
+- ItemStack pipe = getStackInSlot(1);
+- return pipe != null && pipe.stackSize > minCount - 1 && pipe.isItemEqual(miningPipe);
+- }
+-
+- @Override
+- public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+- updateCoordinates();
+- //check base layer
+- for (int xOff = -1 + back.offsetX; xOff <= 1 + back.offsetX; xOff++) {
+- for (int zOff = -1 + back.offsetZ; zOff <= 1 + back.offsetZ; zOff++) {
+- if (xOff == 0 && zOff == 0) continue;
+-
+- IGregTechTileEntity tTileEntity = aBaseMetaTileEntity.getIGregTechTileEntityOffset(xOff, 0, zOff);
+- if (!checkCasingBlock(xOff, 0, zOff)
+- && !addMaintenanceToMachineList(tTileEntity, casingTextureIndex)
+- && !addInputToMachineList(tTileEntity, casingTextureIndex)
+- && !addOutputToMachineList(tTileEntity, casingTextureIndex)
+- && !addEnergyInputToMachineList(tTileEntity, casingTextureIndex))
+- return false;
+- }
+- }
+- if (mMaintenanceHatches.isEmpty() || mInputHatches.isEmpty() || mOutputBusses.isEmpty() || mEnergyHatches.isEmpty()) return false;
+- if (GT_Utility.getTier(getMaxInputVoltage()) < getMinTier()) return false;
+- //check tower
+- for (int yOff = 1; yOff < 4; yOff++) {
+- if (!checkCasingBlock(back.offsetX, yOff, back.offsetZ)
+- || !checkFrameBlock(back.offsetX + 1, yOff, back.offsetZ)
+- || !checkFrameBlock(back.offsetX - 1, yOff, back.offsetZ)
+- || !checkFrameBlock(back.offsetX, yOff, back.offsetZ + 1)
+- || !checkFrameBlock(back.offsetX, yOff, back.offsetZ - 1)
+- || !checkFrameBlock(back.offsetX, yOff + 3, back.offsetZ))
+- return false;
+- }
+- return true;
+- }
+-
+- private void updateCoordinates() {
+- xDrill = getBaseMetaTileEntity().getXCoord();
+- yDrill = getBaseMetaTileEntity().getYCoord();
+- zDrill = getBaseMetaTileEntity().getZCoord();
+- back = ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing());
+- xCenter = xDrill + back.offsetX;
+- zCenter = zDrill + back.offsetZ;
+- }
+-
+- private boolean checkPipesAndSetYHead() {
+- yHead = yDrill - 1;
+- while (checkBlockAndMeta(xCenter, yHead, zCenter, miningPipeBlock, W)) yHead--; //skip pipes
+- //is pipe tip OR is controller layer
+- if (checkBlockAndMeta(xCenter, yHead, zCenter, miningPipeTipBlock, W) || ++yHead == yDrill) return true;
+- //pipe column is broken - try fix
+- getBaseMetaTileEntity().getWorld().setBlock(xCenter, yHead, zCenter, miningPipeTipBlock);
+- return true;
+- }
+-
+- private boolean checkCasingBlock(int xOff, int yOff, int zOff) {
+- return checkBlockAndMetaOffset(xOff, yOff, zOff, casingBlock, casingMeta);
+- }
+- //meta of frame is getTileEntityBaseType; frame should be checked using its drops (possible a high weight operation)
+- private boolean checkFrameBlock(int xOff, int yOff, int zOff) {
+- return checkBlockAndMetaOffset(xOff, yOff, zOff, GregTech_API.sBlockMachines, frameMeta);
+- }
+-
+- private boolean checkBlockAndMetaOffset(int xOff, int yOff, int zOff, Block block, int meta) {
+- return checkBlockAndMeta(xDrill + xOff, yDrill + yOff, zDrill + zOff, block, meta);
+- }
+-
+- private boolean checkBlockAndMeta(int x, int y, int z, Block block, int meta) {
+- return (meta == W || getBaseMetaTileEntity().getMetaID(x, y, z) == meta)
+- && getBaseMetaTileEntity().getBlock(x, y, z) == block;
+- }
+-
+- @Override
+- public boolean isCorrectMachinePart(ItemStack aStack) {
+- return true;
+- }
+-
+- @Override
+- public int getMaxEfficiency(ItemStack aStack) {
+- return 10000;
+- }
+-
+- @Override
+- public int getPollutionPerTick(ItemStack aStack) {
+- return 0;
+- }
+-
+- @Override
+- public int getDamageToComponent(ItemStack aStack) {
+- return 0;
+- }
+-
+- @Override
+- public boolean explodesOnComponentBreak(ItemStack aStack) {
+- return false;
+- }
+-
+- protected abstract ItemList getCasingBlockItem();
+-
+- protected abstract Materials getFrameMaterial();
+-
+- protected abstract int getCasingTextureIndex();
+-
+ protected abstract int getRadiusInChunks();
+
+- protected abstract int getMinTier();
+-
+ protected String[] getDescriptionInternal(String tierSuffix) {
+ String casings = getCasingBlockItem().get(0).getDisplayName();
+ return new String[]{
+@@ -422,4 +201,4 @@ public abstract class GT_MetaTileEntity_OreDrillingPlantBase extends GT_MetaTile
+ "1x " + VN[getMinTier()] + "+ Energy Hatch (Any bottom layer casing)",
+ "Radius is " + (getRadiusInChunks() << 4) + " blocks"};
+ }
+-}
++}
+\ No newline at end of file
+diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java b/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java
+index d0eb0f6..72dcf42 100644
+--- a/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java
++++ b/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java
+@@ -1234,8 +1234,17 @@ public class GT_Loader_MetaTileEntities implements Runnable {//TODO CHECK CIRCUI
+ GT_ModHandler.addCraftingRecipe(ItemList.Seismic_Prospector.get(1L, new Object[0]), bitsd, new Object[]{"WWW", "EME", "CCC", 'M', ItemList.Hull_HP, 'W', OrePrefixes.plateDouble.get(Materials.Steel), 'E', OrePrefixes.circuit.get(Materials.Basic), 'C', ItemList.Sensor_LV});
+ GT_ModHandler.addCraftingRecipe(ItemList.Seismic_Prospector_Adv.get(1L, new Object[0]), bitsd, new Object[] { "WWW", "EME", "CCC", 'M', ItemList.Hull_EV, 'W', OrePrefixes.plateDouble.get(Materials.VanadiumSteel),'E', OrePrefixes.circuit.get(Materials.Data), 'C', ItemList.Sensor_EV });
+
+- ItemList.OilDrill.set(new GT_MetaTileEntity_OilDrill(1157, "multimachine.oildrill", "Oil Drilling Rig").getStackForm(1));
+- GT_ModHandler.addCraftingRecipe(ItemList.OilDrill.get(1L, new Object[0]), bitsd, new Object[]{"WWW", "EME", "CCC", 'M', ItemList.Hull_MV, 'W', OrePrefixes.frameGt.get(Materials.Steel), 'E', OrePrefixes.circuit.get(Materials.Good), 'C', ItemList.Electric_Motor_MV});
++ ItemList.OilDrill1.set(new GT_MetaTileEntity_OilDrill1(1157, "multimachine.oildrill1", "Oil Drilling Rig").getStackForm(1));
++ ItemList.OilDrill2.set(new GT_MetaTileEntity_OilDrill2(133, "multimachine.oildrill2", "Oil Drilling Rig II").getStackForm(1));
++ ItemList.OilDrill3.set(new GT_MetaTileEntity_OilDrill3(134, "multimachine.oildrill3", "Oil Drilling Rig III").getStackForm(1));
++ GT_ModHandler.addCraftingRecipe(ItemList.OilDrill1.get(1L, new Object[0]), bitsd, new Object[]{"WWW", "EME", "CCC", 'M', ItemList.Hull_MV, 'W', OrePrefixes.frameGt.get(Materials.Steel), 'E', OrePrefixes.circuit.get(Materials.Good), 'C', ItemList.Electric_Motor_MV});
++ GT_ModHandler.addCraftingRecipe(ItemList.OilDrill1.get(1L, new Object[0]), bitsd, new Object[]{"WWW", "EME", "CCC", 'M', ItemList.OilDrill1, 'W', OrePrefixes.frameGt.get(Materials.Titanium), 'E', OrePrefixes.circuit.get(Materials.Advanced), 'C', ItemList.Electric_Motor_HV});
++ GT_ModHandler.addCraftingRecipe(ItemList.OilDrill1.get(1L, new Object[0]), bitsd, new Object[]{"WWW", "EME", "CCC", 'M', ItemList.OilDrill2, 'W', OrePrefixes.frameGt.get(Materials.TungstenSteel), 'E', OrePrefixes.circuit.get(Materials.Data), 'C', ItemList.Electric_Motor_EV});
++
++ ItemList.ConcreteBackfiller1.set(new GT_MetaTileEntity_ConcreteBackfiller1(135, "multimachine.concretebackfiller1", "Concrete Backfiller").getStackForm(1));
++ ItemList.ConcreteBackfiller2.set(new GT_MetaTileEntity_ConcreteBackfiller2(136, "multimachine.concretebackfiller3", "Advanced Concrete Backfiller").getStackForm(1));
++ GT_ModHandler.addCraftingRecipe(ItemList.ConcreteBackfiller1.get(1L, new Object[0]), bitsd, new Object[]{"WPW", "EME", "CQC", 'M', ItemList.Hull_MV, 'W', OrePrefixes.frameGt.get(Materials.Steel), 'E', OrePrefixes.circuit.get(Materials.Good), 'C', ItemList.Electric_Motor_MV, 'P', OrePrefixes.pipeLarge.get(Materials.Steel), 'Q', ItemList.Electric_Pump_MV});
++ GT_ModHandler.addCraftingRecipe(ItemList.ConcreteBackfiller2.get(1L, new Object[0]), bitsd, new Object[]{"WPW", "EME", "CQC", 'M', ItemList.ConcreteBackfiller1, 'W', OrePrefixes.frameGt.get(Materials.Titanium), 'E', OrePrefixes.circuit.get(Materials.Data), 'C', ItemList.Electric_Motor_EV, 'P', OrePrefixes.pipeLarge.get(Materials.Steel), 'Q', ItemList.Electric_Pump_EV});
+
+ ItemList.OreDrill1.set(new GT_MetaTileEntity_OreDrillingPlant1(1158, "multimachine.oredrill1", "Ore Drilling Plant").getStackForm(1));
+ GT_ModHandler.addCraftingRecipe(ItemList.OreDrill1.get(1L), bitsd, new Object[]{"WWW", "EME", "CCC", 'M', ItemList.Hull_EV, 'W', OrePrefixes.frameGt.get(Materials.Titanium), 'E', OrePrefixes.circuit.get(Materials.Data), 'C', ItemList.Electric_Motor_EV});
+--
+1.9.5.msysgit.0
+
+From ffc256ab87f905fa21bdb7102212cafa54c9f6bd Mon Sep 17 00:00:00 2001
+From: Dream-Master <dream-master@gmx.net>
+Date: Tue, 12 Sep 2017 22:41:17 +0200
+Subject: [PATCH] cherry pick 61d058201244d9dd6f19ed72c863722b7da0ad14
+ bab71c5349799ba77ac42f80c54725a999fab40c
+
+Fix #1206 #1210 Fix NPE of fluid check.
+https://github.com/Blood-Asp/GT5-Unofficial/pull/1210
+---
+ .../machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java
+index 934be4c..abdc569 100644
+--- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java
++++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_MicrowaveEnergyTransmitter.java
+@@ -153,7 +153,8 @@ public class GT_MetaTileEntity_MicrowaveEnergyTransmitter extends GT_MetaTileEnt
+ sInterDimensionalTeleportAllowed &&
+ (
+ this.hasBlock ||
+- mFluid.isFluidEqual(Materials.Nitrogen.getPlasma(1)) && mFluid.amount >= 1000
++ mFluid != null && mFluid.isFluidEqual(Materials.Nitrogen.getPlasma(1)) && mFluid.amount >= 1000
++
+ )
+ )
+ ;
+--
+1.9.5.msysgit.0
+
+From 9dfe682c4415336f03631c5ccaeb762258be4912 Mon Sep 17 00:00:00 2001
+From: MineAnPlay <gelebekenes@hotmail.com>
+Date: Tue, 12 Sep 2017 12:36:29 +0300
+Subject: [PATCH] Change back to old Rotor Solder Materials #1951
+
+From multiples of 18 to multiples of 16 because obtaining multiples of 16 is easier.
+---
+ src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java
+index d1ed3a8..a88d8ef 100644
+--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java
++++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java
+@@ -14,9 +14,9 @@ public class ProcessingRotor implements gregtech.api.interfaces.IOreRecipeRegist
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName, ItemStack aStack) {
+ if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial) && !aMaterial.contains(SubTag.NO_WORKING)) {
+ GT_ModHandler.addCraftingRecipe(GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), GT_Proxy.tBits, new Object[]{"PhP", "SRf", "PdP", Character.valueOf('P'), aMaterial == Materials.Wood ? OrePrefixes.plank.get(aMaterial) : OrePrefixes.plate.get(aMaterial), Character.valueOf('R'), OrePrefixes.ring.get(aMaterial), Character.valueOf('S'), OrePrefixes.screw.get(aMaterial)});
+- GT_Values.RA.addAssemblerRecipe(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L), GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L), Materials.Tin.getMolten(36), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 240, 24);
+- GT_Values.RA.addAssemblerRecipe(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L), GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L), Materials.Lead.getMolten(54), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 240, 24);
+- GT_Values.RA.addAssemblerRecipe(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L), GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L), Materials.SolderingAlloy.getMolten(18), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 240, 24);
++ GT_Values.RA.addAssemblerRecipe(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L), GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L), Materials.Tin.getMolten(32), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 240, 24);
++ GT_Values.RA.addAssemblerRecipe(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L), GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L), Materials.Lead.getMolten(48), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 240, 24);
++ GT_Values.RA.addAssemblerRecipe(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L), GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L), Materials.SolderingAlloy.getMolten(16), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 240, 24);
+ GT_Values.RA.addExtruderRecipe(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 5L), ItemList.Shape_Extruder_Rotor.get(0L, new Object[0]), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 200, 60);
+ GT_Values.RA.addFluidSolidifierRecipe(ItemList.Shape_Mold_Rotor.get(1L, new Object[0]), aMaterial.getMolten(612L), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 100, 60);
+ }
+--
+1.9.5.msysgit.0
+
+From 9dfe682c4415336f03631c5ccaeb762258be4912 Mon Sep 17 00:00:00 2001
+From: MineAnPlay <gelebekenes@hotmail.com>
+Date: Tue, 12 Sep 2017 12:36:29 +0300
+Subject: [PATCH] Change back to old Rotor Solder Materials #1951
+
+From multiples of 18 to multiples of 16 because obtaining multiples of 16 is easier.
+---
+ src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java
+index d1ed3a8..a88d8ef 100644
+--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java
++++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingRotor.java
+@@ -14,9 +14,9 @@ public class ProcessingRotor implements gregtech.api.interfaces.IOreRecipeRegist
+ public void registerOre(OrePrefixes aPrefix, Materials aMaterial, String aOreDictName, String aModName, ItemStack aStack) {
+ if ((aMaterial.mUnificatable) && (aMaterial.mMaterialInto == aMaterial) && !aMaterial.contains(SubTag.NO_WORKING)) {
+ GT_ModHandler.addCraftingRecipe(GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), GT_Proxy.tBits, new Object[]{"PhP", "SRf", "PdP", Character.valueOf('P'), aMaterial == Materials.Wood ? OrePrefixes.plank.get(aMaterial) : OrePrefixes.plate.get(aMaterial), Character.valueOf('R'), OrePrefixes.ring.get(aMaterial), Character.valueOf('S'), OrePrefixes.screw.get(aMaterial)});
+- GT_Values.RA.addAssemblerRecipe(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L), GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L), Materials.Tin.getMolten(36), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 240, 24);
+- GT_Values.RA.addAssemblerRecipe(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L), GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L), Materials.Lead.getMolten(54), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 240, 24);
+- GT_Values.RA.addAssemblerRecipe(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L), GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L), Materials.SolderingAlloy.getMolten(18), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 240, 24);
++ GT_Values.RA.addAssemblerRecipe(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L), GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L), Materials.Tin.getMolten(32), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 240, 24);
++ GT_Values.RA.addAssemblerRecipe(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L), GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L), Materials.Lead.getMolten(48), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 240, 24);
++ GT_Values.RA.addAssemblerRecipe(GT_OreDictUnificator.get(OrePrefixes.plate, aMaterial, 4L), GT_OreDictUnificator.get(OrePrefixes.ring, aMaterial, 1L), Materials.SolderingAlloy.getMolten(16), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 240, 24);
+ GT_Values.RA.addExtruderRecipe(GT_OreDictUnificator.get(OrePrefixes.ingot, aMaterial, 5L), ItemList.Shape_Extruder_Rotor.get(0L, new Object[0]), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 200, 60);
+ GT_Values.RA.addFluidSolidifierRecipe(ItemList.Shape_Mold_Rotor.get(1L, new Object[0]), aMaterial.getMolten(612L), GT_OreDictUnificator.get(OrePrefixes.rotor, aMaterial, 1L), 100, 60);
+ }
+--
+1.9.5.msysgit.0
+
+From b4764a64f29fdc1d70e233446b432dbd5f84e476 Mon Sep 17 00:00:00 2001
+From: Technus <daniel112092@gmail.com>
+Date: Tue, 12 Sep 2017 06:55:51 +0200
+Subject: [PATCH] Next attempt on wires.
+
+---
+ .../api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+index 34e2303..c12bf2e 100644
+--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
++++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+@@ -23,6 +23,7 @@ import net.minecraft.entity.Entity;
+ import net.minecraft.entity.EntityLivingBase;
+ import net.minecraft.item.ItemStack;
+ import net.minecraft.nbt.NBTTagCompound;
++import net.minecraft.server.MinecraftServer;
+ import net.minecraft.tileentity.TileEntity;
+ import net.minecraft.util.AxisAlignedBB;
+ import net.minecraft.util.EnumChatFormatting;
+@@ -250,8 +251,8 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ mTransferredAmperageOK=mTransferredAmperage;
+ mTransferredAmperage = 0;
+
+- tickDiff=Math.min((int)(aBaseMetaTileEntity.getWorld().getTotalWorldTime()-lastTickTime),1);
+- lastTickTime=aBaseMetaTileEntity.getWorld().getTotalWorldTime();
++ tickDiff=Math.min((int)(MinecraftServer.getServer().getTickCounter()-lastTickTime),1);
++ lastTickTime=MinecraftServer.getServer().getTickCounter();
+ if(lastTickDiff<tickDiff)
+ mOverheat=(short)Math.max(0,mOverheat-100);
+ lastTickDiff=tickDiff;
+--
+1.9.5.msysgit.0
+
+From f6dc74ca534bd488a3c537c09a1e6bb5e73593a4 Mon Sep 17 00:00:00 2001
+From: Technus <daniel112092@gmail.com>
+Date: Tue, 12 Sep 2017 06:49:59 +0200
+Subject: [PATCH] Revert "Implement tick counter?"
+
+This reverts commit 0d9d2040bc43f4e18d227b3c51a3edc4f9994747.
+---
+ .../metatileentity/implementations/GT_MetaPipeEntity_Cable.java | 5 ++---
+ src/main/java/gregtech/common/GT_Proxy.java | 8 --------
+ 2 files changed, 2 insertions(+), 11 deletions(-)
+
+diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+index b7d6b0a..34e2303 100644
+--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
++++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+@@ -33,7 +33,6 @@ import java.util.ArrayList;
+ import java.util.Arrays;
+
+ import static gregtech.api.enums.GT_Values.VN;
+-import static gregtech.common.GT_Proxy.serverSideDimensionWiseTickCounter;
+
+ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTileEntityCable {
+ public final float mThickNess;
+@@ -251,8 +250,8 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ mTransferredAmperageOK=mTransferredAmperage;
+ mTransferredAmperage = 0;
+
+- tickDiff=Math.min((int)(serverSideDimensionWiseTickCounter.get(aBaseMetaTileEntity.getWorld().provider.dimensionId)-lastTickTime),1);
+- lastTickTime=serverSideDimensionWiseTickCounter.get(aBaseMetaTileEntity.getWorld().provider.dimensionId);
++ tickDiff=Math.min((int)(aBaseMetaTileEntity.getWorld().getTotalWorldTime()-lastTickTime),1);
++ lastTickTime=aBaseMetaTileEntity.getWorld().getTotalWorldTime();
+ if(lastTickDiff<tickDiff)
+ mOverheat=(short)Math.max(0,mOverheat-100);
+ lastTickDiff=tickDiff;
+diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java
+index d8d5060..f6d4ca6 100644
+--- a/src/main/java/gregtech/common/GT_Proxy.java
++++ b/src/main/java/gregtech/common/GT_Proxy.java
+@@ -74,7 +74,6 @@ import java.text.DateFormat;
+ import java.util.*;
+
+ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
+- public static HashMap<Integer,Long> serverSideDimensionWiseTickCounter =new HashMap<>();
+ private static final EnumSet<OreGenEvent.GenerateMinable.EventType> PREVENTED_ORES = EnumSet.of(OreGenEvent.GenerateMinable.EventType.COAL,
+ new OreGenEvent.GenerateMinable.EventType[]{OreGenEvent.GenerateMinable.EventType.IRON, OreGenEvent.GenerateMinable.EventType.GOLD,
+ OreGenEvent.GenerateMinable.EventType.DIAMOND, OreGenEvent.GenerateMinable.EventType.REDSTONE, OreGenEvent.GenerateMinable.EventType.LAPIS,
+@@ -1249,13 +1248,6 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
+ }
+ }
+
+- int dimID=aEvent.world.provider.dimensionId;
+- if(serverSideDimensionWiseTickCounter.containsKey(dimID)){
+- serverSideDimensionWiseTickCounter.put(dimID, serverSideDimensionWiseTickCounter.get(dimID)+1);
+- }else{
+- serverSideDimensionWiseTickCounter.put(dimID,0L);
+- }
+-
+ GT_Pollution.onWorldTick(aEvent);
+ }
+ }
+--
+1.9.5.msysgit.0
+
+From b0cbd07d6ebb8c1489ce4b664e2eb9d22497e687 Mon Sep 17 00:00:00 2001
+From: Technus <daniel112092@gmail.com>
+Date: Tue, 12 Sep 2017 06:49:51 +0200
+Subject: [PATCH] Revert "Minor optimization of tick counter"
+
+This reverts commit 9caaa58ea11b6477eaabdd509a554e90f60bc2ac.
+---
+ .../metatileentity/implementations/GT_MetaPipeEntity_Cable.java | 6 +++---
+ src/main/java/gregtech/common/GT_Proxy.java | 8 +++++---
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+index a1a537c..b7d6b0a 100644
+--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
++++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+@@ -250,9 +250,9 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ mTransferredVoltage=0;
+ mTransferredAmperageOK=mTransferredAmperage;
+ mTransferredAmperage = 0;
+- final int dimID=aBaseMetaTileEntity.getWorld().provider.dimensionId;
+- tickDiff=Math.min((int)(serverSideDimensionWiseTickCounter.get(dimID)-lastTickTime),1);
+- lastTickTime=serverSideDimensionWiseTickCounter.get(dimID);
++
++ tickDiff=Math.min((int)(serverSideDimensionWiseTickCounter.get(aBaseMetaTileEntity.getWorld().provider.dimensionId)-lastTickTime),1);
++ lastTickTime=serverSideDimensionWiseTickCounter.get(aBaseMetaTileEntity.getWorld().provider.dimensionId);
+ if(lastTickDiff<tickDiff)
+ mOverheat=(short)Math.max(0,mOverheat-100);
+ lastTickDiff=tickDiff;
+diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java
+index 844f1ef..d8d5060 100644
+--- a/src/main/java/gregtech/common/GT_Proxy.java
++++ b/src/main/java/gregtech/common/GT_Proxy.java
+@@ -1249,10 +1249,12 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
+ }
+ }
+
+- final int dimID=aEvent.world.provider.dimensionId;
+- if(serverSideDimensionWiseTickCounter.containsKey(dimID))
++ int dimID=aEvent.world.provider.dimensionId;
++ if(serverSideDimensionWiseTickCounter.containsKey(dimID)){
+ serverSideDimensionWiseTickCounter.put(dimID, serverSideDimensionWiseTickCounter.get(dimID)+1);
+- else serverSideDimensionWiseTickCounter.put(dimID,0L);
++ }else{
++ serverSideDimensionWiseTickCounter.put(dimID,0L);
++ }
+
+ GT_Pollution.onWorldTick(aEvent);
+ }
+--
+1.9.5.msysgit.0
+
+From f9cef30f7bdaaa101c9dac5feb37bf401582aacf Mon Sep 17 00:00:00 2001
+From: Dream-Master <dream-master@gmx.net>
+Date: Mon, 11 Sep 2017 21:57:22 +0200
+Subject: [PATCH] revert
+
+---
+ build.properties | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/build.properties b/build.properties
+index 476007e..8f302e6 100644
+--- a/build.properties
++++ b/build.properties
+@@ -1,7 +1,7 @@
+ minecraft.version=1.7.10
+ forge.version=10.13.4.1566-1.7.10
+
+-gt.version=5.09.32.02
++gt.version=5.09.32.01
+
+ ae2.version=rv2-beta-33
+ applecore.version=1.7.10-1.2.1+107.59407
+--
+1.9.5.msysgit.0
+
+From 348ad6a1e9d1b4210933a12dbb95b0a5dbfe10a9 Mon Sep 17 00:00:00 2001
+From: Dream-Master <dream-master@gmx.net>
+Date: Mon, 11 Sep 2017 21:56:57 +0200
+Subject: [PATCH] bump version
+
+---
+ build.properties | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/build.properties b/build.properties
+index 8f302e6..476007e 100644
+--- a/build.properties
++++ b/build.properties
+@@ -1,7 +1,7 @@
+ minecraft.version=1.7.10
+ forge.version=10.13.4.1566-1.7.10
+
+-gt.version=5.09.32.01
++gt.version=5.09.32.02
+
+ ae2.version=rv2-beta-33
+ applecore.version=1.7.10-1.2.1+107.59407
+--
+1.9.5.msysgit.0
+
+From 9caaa58ea11b6477eaabdd509a554e90f60bc2ac Mon Sep 17 00:00:00 2001
+From: Technus <daniel112092@gmail.com>
+Date: Mon, 11 Sep 2017 21:43:48 +0200
+Subject: [PATCH] Minor optimization of tick counter
+
+---
+ .../metatileentity/implementations/GT_MetaPipeEntity_Cable.java | 6 +++---
+ src/main/java/gregtech/common/GT_Proxy.java | 8 +++-----
+ 2 files changed, 6 insertions(+), 8 deletions(-)
+
+diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+index b7d6b0a..a1a537c 100644
+--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
++++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+@@ -250,9 +250,9 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ mTransferredVoltage=0;
+ mTransferredAmperageOK=mTransferredAmperage;
+ mTransferredAmperage = 0;
+-
+- tickDiff=Math.min((int)(serverSideDimensionWiseTickCounter.get(aBaseMetaTileEntity.getWorld().provider.dimensionId)-lastTickTime),1);
+- lastTickTime=serverSideDimensionWiseTickCounter.get(aBaseMetaTileEntity.getWorld().provider.dimensionId);
++ final int dimID=aBaseMetaTileEntity.getWorld().provider.dimensionId;
++ tickDiff=Math.min((int)(serverSideDimensionWiseTickCounter.get(dimID)-lastTickTime),1);
++ lastTickTime=serverSideDimensionWiseTickCounter.get(dimID);
+ if(lastTickDiff<tickDiff)
+ mOverheat=(short)Math.max(0,mOverheat-100);
+ lastTickDiff=tickDiff;
+diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java
+index d8d5060..844f1ef 100644
+--- a/src/main/java/gregtech/common/GT_Proxy.java
++++ b/src/main/java/gregtech/common/GT_Proxy.java
+@@ -1249,12 +1249,10 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
+ }
+ }
+
+- int dimID=aEvent.world.provider.dimensionId;
+- if(serverSideDimensionWiseTickCounter.containsKey(dimID)){
++ final int dimID=aEvent.world.provider.dimensionId;
++ if(serverSideDimensionWiseTickCounter.containsKey(dimID))
+ serverSideDimensionWiseTickCounter.put(dimID, serverSideDimensionWiseTickCounter.get(dimID)+1);
+- }else{
+- serverSideDimensionWiseTickCounter.put(dimID,0L);
+- }
++ else serverSideDimensionWiseTickCounter.put(dimID,0L);
+
+ GT_Pollution.onWorldTick(aEvent);
+ }
+--
+1.9.5.msysgit.0
+
+From 0d9d2040bc43f4e18d227b3c51a3edc4f9994747 Mon Sep 17 00:00:00 2001
+From: Technus <daniel112092@gmail.com>
+Date: Mon, 11 Sep 2017 21:40:26 +0200
+Subject: [PATCH] Implement tick counter?
+
+---
+ .../metatileentity/implementations/GT_MetaPipeEntity_Cable.java | 5 +++--
+ src/main/java/gregtech/common/GT_Proxy.java | 8 ++++++++
+ 2 files changed, 11 insertions(+), 2 deletions(-)
+
+diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+index 34e2303..b7d6b0a 100644
+--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
++++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+@@ -33,6 +33,7 @@ import java.util.ArrayList;
+ import java.util.Arrays;
+
+ import static gregtech.api.enums.GT_Values.VN;
++import static gregtech.common.GT_Proxy.serverSideDimensionWiseTickCounter;
+
+ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTileEntityCable {
+ public final float mThickNess;
+@@ -250,8 +251,8 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ mTransferredAmperageOK=mTransferredAmperage;
+ mTransferredAmperage = 0;
+
+- tickDiff=Math.min((int)(aBaseMetaTileEntity.getWorld().getTotalWorldTime()-lastTickTime),1);
+- lastTickTime=aBaseMetaTileEntity.getWorld().getTotalWorldTime();
++ tickDiff=Math.min((int)(serverSideDimensionWiseTickCounter.get(aBaseMetaTileEntity.getWorld().provider.dimensionId)-lastTickTime),1);
++ lastTickTime=serverSideDimensionWiseTickCounter.get(aBaseMetaTileEntity.getWorld().provider.dimensionId);
+ if(lastTickDiff<tickDiff)
+ mOverheat=(short)Math.max(0,mOverheat-100);
+ lastTickDiff=tickDiff;
+diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java
+index f6d4ca6..d8d5060 100644
+--- a/src/main/java/gregtech/common/GT_Proxy.java
++++ b/src/main/java/gregtech/common/GT_Proxy.java
+@@ -74,6 +74,7 @@ import java.text.DateFormat;
+ import java.util.*;
+
+ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
++ public static HashMap<Integer,Long> serverSideDimensionWiseTickCounter =new HashMap<>();
+ private static final EnumSet<OreGenEvent.GenerateMinable.EventType> PREVENTED_ORES = EnumSet.of(OreGenEvent.GenerateMinable.EventType.COAL,
+ new OreGenEvent.GenerateMinable.EventType[]{OreGenEvent.GenerateMinable.EventType.IRON, OreGenEvent.GenerateMinable.EventType.GOLD,
+ OreGenEvent.GenerateMinable.EventType.DIAMOND, OreGenEvent.GenerateMinable.EventType.REDSTONE, OreGenEvent.GenerateMinable.EventType.LAPIS,
+@@ -1248,6 +1249,13 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
+ }
+ }
+
++ int dimID=aEvent.world.provider.dimensionId;
++ if(serverSideDimensionWiseTickCounter.containsKey(dimID)){
++ serverSideDimensionWiseTickCounter.put(dimID, serverSideDimensionWiseTickCounter.get(dimID)+1);
++ }else{
++ serverSideDimensionWiseTickCounter.put(dimID,0L);
++ }
++
+ GT_Pollution.onWorldTick(aEvent);
+ }
+ }
+--
+1.9.5.msysgit.0
+
+From 69683365d7faa798c5d782c8e3779b5d323c6ff6 Mon Sep 17 00:00:00 2001
+From: Technus <daniel112092@gmail.com>
+Date: Mon, 11 Sep 2017 21:28:04 +0200
+Subject: [PATCH] Revert "Revert "Add tickDiff for tick diff detection using
+ totalWorldTime, should prevent spontaneous wire combustion""
+
+This reverts commit 77cc90a0c9892c6ebf61c403ea4ba071f3ffaea7.
+---
+ .../implementations/GT_MetaPipeEntity_Cable.java | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+index aec89a2..34e2303 100644
+--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
++++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+@@ -44,6 +44,8 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ public long mRestRF;
+ public short mOverheat;
+ public static short mMaxOverheat=(short) (GT_Mod.gregtechproxy.mWireHeatingTicks * 100);
++ private int tickDiff=1,lastTickDiff=1;
++ private long lastTickTime;
+
+ public GT_MetaPipeEntity_Cable(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial, long aCableLossPerMeter, long aAmperage, long aVoltage, boolean aInsulated, boolean aCanShock) {
+ super(aID, aName, aNameRegional, 0);
+@@ -229,7 +231,7 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ mTransferredAmperage += rUsedAmperes;
+ mTransferredVoltageLast20 = (Math.max(mTransferredVoltageLast20, aVoltage));
+ mTransferredAmperageLast20 = Math.max(mTransferredAmperageLast20, mTransferredAmperage);
+- if (aVoltage > mVoltage || mTransferredAmperage > mAmperage) {
++ if (aVoltage > mVoltage || mTransferredAmperage > (mAmperage*tickDiff)) {
+ if(mOverheat>mMaxOverheat)
+ getBaseMetaTileEntity().setToFire();
+ else
+@@ -247,6 +249,13 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ mTransferredVoltage=0;
+ mTransferredAmperageOK=mTransferredAmperage;
+ mTransferredAmperage = 0;
++
++ tickDiff=Math.min((int)(aBaseMetaTileEntity.getWorld().getTotalWorldTime()-lastTickTime),1);
++ lastTickTime=aBaseMetaTileEntity.getWorld().getTotalWorldTime();
++ if(lastTickDiff<tickDiff)
++ mOverheat=(short)Math.max(0,mOverheat-100);
++ lastTickDiff=tickDiff;
++
+ if(mOverheat>0)mOverheat--;
+ if (aTick % 20 == 0) {
+ mTransferredVoltageLast20OK=mTransferredVoltageLast20;
+@@ -339,6 +348,7 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ //EnumChatFormatting.BLUE + mName + EnumChatFormatting.RESET,
+ "Heat: "+
+ EnumChatFormatting.RED+ mOverheat +EnumChatFormatting.RESET+" / "+EnumChatFormatting.YELLOW+ mMaxOverheat + EnumChatFormatting.RESET,
++ "TickDiff: "+ EnumChatFormatting.YELLOW+ tickDiff + EnumChatFormatting.RESET,
+ "Max Load (1t):",
+ EnumChatFormatting.GREEN + Integer.toString(mTransferredAmperageOK) + EnumChatFormatting.RESET +" A / "+
+ EnumChatFormatting.YELLOW + Long.toString(mAmperage) + EnumChatFormatting.RESET +" A",
+--
+1.9.5.msysgit.0
+
+From 77cc90a0c9892c6ebf61c403ea4ba071f3ffaea7 Mon Sep 17 00:00:00 2001
+From: Technus <daniel112092@gmail.com>
+Date: Mon, 11 Sep 2017 20:33:30 +0200
+Subject: [PATCH] Revert "Add tickDiff for tick diff detection using
+ totalWorldTime, should prevent spontaneous wire combustion"
+
+This reverts commit 3587d3942fb5e5de5821e8207c96a93a7babc31a.
+---
+ .../implementations/GT_MetaPipeEntity_Cable.java | 12 +-----------
+ 1 file changed, 1 insertion(+), 11 deletions(-)
+
+diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+index 34e2303..aec89a2 100644
+--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
++++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java
+@@ -44,8 +44,6 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ public long mRestRF;
+ public short mOverheat;
+ public static short mMaxOverheat=(short) (GT_Mod.gregtechproxy.mWireHeatingTicks * 100);
+- private int tickDiff=1,lastTickDiff=1;
+- private long lastTickTime;
+
+ public GT_MetaPipeEntity_Cable(int aID, String aName, String aNameRegional, float aThickNess, Materials aMaterial, long aCableLossPerMeter, long aAmperage, long aVoltage, boolean aInsulated, boolean aCanShock) {
+ super(aID, aName, aNameRegional, 0);
+@@ -231,7 +229,7 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ mTransferredAmperage += rUsedAmperes;
+ mTransferredVoltageLast20 = (Math.max(mTransferredVoltageLast20, aVoltage));
+ mTransferredAmperageLast20 = Math.max(mTransferredAmperageLast20, mTransferredAmperage);
+- if (aVoltage > mVoltage || mTransferredAmperage > (mAmperage*tickDiff)) {
++ if (aVoltage > mVoltage || mTransferredAmperage > mAmperage) {
+ if(mOverheat>mMaxOverheat)
+ getBaseMetaTileEntity().setToFire();
+ else
+@@ -249,13 +247,6 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ mTransferredVoltage=0;
+ mTransferredAmperageOK=mTransferredAmperage;
+ mTransferredAmperage = 0;
+-
+- tickDiff=Math.min((int)(aBaseMetaTileEntity.getWorld().getTotalWorldTime()-lastTickTime),1);
+- lastTickTime=aBaseMetaTileEntity.getWorld().getTotalWorldTime();
+- if(lastTickDiff<tickDiff)
+- mOverheat=(short)Math.max(0,mOverheat-100);
+- lastTickDiff=tickDiff;
+-
+ if(mOverheat>0)mOverheat--;
+ if (aTick % 20 == 0) {
+ mTransferredVoltageLast20OK=mTransferredVoltageLast20;
+@@ -348,7 +339,6 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile
+ //EnumChatFormatting.BLUE + mName + EnumChatFormatting.RESET,
+ "Heat: "+
+ EnumChatFormatting.RED+ mOverheat +EnumChatFormatting.RESET+" / "+EnumChatFormatting.YELLOW+ mMaxOverheat + EnumChatFormatting.RESET,
+- "TickDiff: "+ EnumChatFormatting.YELLOW+ tickDiff + EnumChatFormatting.RESET,
+ "Max Load (1t):",
+ EnumChatFormatting.GREEN + Integer.toString(mTransferredAmperageOK) + EnumChatFormatting.RESET +" A / "+
+ EnumChatFormatting.YELLOW + Long.toString(mAmperage) + EnumChatFormatting.RESET +" A",
+--
+1.9.5.msysgit.0
+
+From ce676aaac999865dd05dcf23468c2e3acc6e3c85 Mon Sep 17 00:00:00 2001
+From: Dream-Master <dream-master@gmx.net>
+Date: Sun, 10 Sep 2017 09:59:56 +0200
+Subject: [PATCH] fixed wildcard value in Gravisuit
+
+---
+ src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
+index 5f28da5..a5359e3 100644
+--- a/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
++++ b/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
+@@ -811,7 +811,7 @@ public class GT_CraftingRecipeLoader implements Runnable {
+
+ if (Loader.isModLoaded("GraviSuite")) {
+ GT_ModHandler.removeRecipeByOutput(GT_ModHandler.getModItem("GraviSuite", "advNanoChestPlate", 1, GT_Values.W));
+- GT_ModHandler.addCraftingRecipe(GT_ModHandler.getModItem("GraviSuite", "advNanoChestPlate", 1, GT_Values.W), new Object[]{"CJC", "CNC", "WPW", 'C', OrePrefixes.plateAlloy.get(Materials.Carbon), 'J', GT_ModHandler.getModItem("GraviSuite", "advJetpack", 1, GT_Values.W), 'N', GT_ModHandler.getIC2Item("nanoBodyarmor", 1L), 'W', OrePrefixes.wireGt04.get(Materials.Platinum), 'P', OrePrefixes.circuit.get(Materials.Data)});
++ GT_ModHandler.addCraftingRecipe(GT_ModHandler.getModItem("GraviSuite", "advNanoChestPlate", 1, GT_Values.W), new Object[]{"CJC", "CNC", "WPW", 'C', OrePrefixes.plateAlloy.get(Materials.Carbon), 'J', GT_ModHandler.getModItem("GraviSuite", "advJetpack", 1, GT_Values.W), 'N', GT_ModHandler.getIC2Item("nanoBodyarmor", 1, GT_Values.W), 'W', OrePrefixes.wireGt04.get(Materials.Platinum), 'P', OrePrefixes.circuit.get(Materials.Data)});
+
+ GT_ModHandler.removeRecipeByOutput(GT_ModHandler.getModItem("GraviSuite", "advLappack", 1, GT_Values.W));
+ GT_ModHandler.addCraftingRecipe(GT_ModHandler.getModItem("GraviSuite", "advLappack", 1, GT_Values.W), new Object[]{"CJC", "TAT", "WPW", 'C', OrePrefixes.plateAlloy.get(Materials.Carbon), 'J', GT_ModHandler.getIC2Item( "advJetpack", 1, GT_Values.W), 'N', GT_ModHandler.getIC2Item("itemArmorJetpackElectric", 1, GT_Values.W), 'A', GT_ModHandler.getIC2Item( "itemArmorNanoChestplate", 1, GT_Values.W), 'T', OrePrefixes.plate.get(Materials.TungstenSteel), 'W', OrePrefixes.wireGt12.get(Materials.Platinum), 'P', OrePrefixes.circuit.get(Materials.Elite)});
+--
+1.9.5.msysgit.0
+
+From d73ea0926b94d1afb610fc15d191d2fde6bc957c Mon Sep 17 00:00:00 2001
+From: Dream-Master <dream-master@gmx.net>
+Date: Sun, 10 Sep 2017 00:30:41 +0200
+Subject: [PATCH] [1.5.1.2] Advanced Nanochestplate/Jetpack recepies #1938
+ https://github.com/GTNewHorizons/NewHorizons/issues/1938
+
+---
+ src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
+index 71c7220..5f28da5 100644
+--- a/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
++++ b/src/main/java/gregtech/loaders/postload/GT_CraftingRecipeLoader.java
+@@ -812,6 +812,9 @@ public class GT_CraftingRecipeLoader implements Runnable {
+ if (Loader.isModLoaded("GraviSuite")) {
+ GT_ModHandler.removeRecipeByOutput(GT_ModHandler.getModItem("GraviSuite", "advNanoChestPlate", 1, GT_Values.W));
+ GT_ModHandler.addCraftingRecipe(GT_ModHandler.getModItem("GraviSuite", "advNanoChestPlate", 1, GT_Values.W), new Object[]{"CJC", "CNC", "WPW", 'C', OrePrefixes.plateAlloy.get(Materials.Carbon), 'J', GT_ModHandler.getModItem("GraviSuite", "advJetpack", 1, GT_Values.W), 'N', GT_ModHandler.getIC2Item("nanoBodyarmor", 1L), 'W', OrePrefixes.wireGt04.get(Materials.Platinum), 'P', OrePrefixes.circuit.get(Materials.Data)});
++
++ GT_ModHandler.removeRecipeByOutput(GT_ModHandler.getModItem("GraviSuite", "advLappack", 1, GT_Values.W));
++ GT_ModHandler.addCraftingRecipe(GT_ModHandler.getModItem("GraviSuite", "advLappack", 1, GT_Values.W), new Object[]{"CJC", "TAT", "WPW", 'C', OrePrefixes.plateAlloy.get(Materials.Carbon), 'J', GT_ModHandler.getIC2Item( "advJetpack", 1, GT_Values.W), 'N', GT_ModHandler.getIC2Item("itemArmorJetpackElectric", 1, GT_Values.W), 'A', GT_ModHandler.getIC2Item( "itemArmorNanoChestplate", 1, GT_Values.W), 'T', OrePrefixes.plate.get(Materials.TungstenSteel), 'W', OrePrefixes.wireGt12.get(Materials.Platinum), 'P', OrePrefixes.circuit.get(Materials.Elite)});
+ }
+
+ GT_ModHandler.addShapelessCraftingRecipe(Materials.Fireclay.getDust(2), new Object[]{Materials.Brick.getDust(1), Materials.Clay.getDust(1)});
+--
+1.9.5.msysgit.0
+
+From 53629721d939156ba042ad195e2dbb1950a89586 Mon Sep 17 00:00:00 2001
+From: Dream-Master <dream-master@gmx.net>
+Date: Sun, 10 Sep 2017 00:06:20 +0200
+Subject: [PATCH] [1.5.1.2] Double recipe from wooden slab #1928
+ https://github.com/GTNewHorizons/NewHorizons/issues/1928
+
+---
+ src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java | 2 +-
+ src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java
+index 698b48e..37f90b9 100644
+--- a/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java
++++ b/src/main/java/gregtech/common/items/GT_MetaGenerated_Item_02.java
+@@ -211,7 +211,7 @@ public class GT_MetaGenerated_Item_02 extends GT_MetaGenerated_Item_X32 {
+ ItemList.SFMixture.set(addItem(tLastID = 270, "Super Fuel Binder", "Raw Material", new Object[]{}));
+ ItemList.MSFMixture.set(addItem(tLastID = 271, "Magic Super Fuel Binder", "Raw Material", new Object[]{}));
+
+- GT_ModHandler.addCraftingRecipe(ItemList.Plank_Oak.get(2L, new Object[0]), GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE, new Object[]{"s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 0)});
++ GT_ModHandler.addCraftingRecipe(ItemList.Plank_Oak.get(2L, new Object[0]), GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE, new Object[]{"s ", " P", 'P', new ItemStack(Blocks.wooden_pressure_plate, 1, 0)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Plank_Spruce.get(2L, new Object[0]), GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE, new Object[]{"s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 1)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Plank_Birch.get(2L, new Object[0]), GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE, new Object[]{"s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 2)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Plank_Jungle.get(2L, new Object[0]), GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.REVERSIBLE, new Object[]{"s ", " P", 'P', new ItemStack(Blocks.wooden_slab, 1, 3)});
+diff --git a/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java b/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java
+index 500c5ea..92fc9a9 100644
+--- a/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java
++++ b/src/main/java/gregtech/loaders/postload/GT_MachineRecipeLoader.java
+@@ -1413,7 +1413,7 @@ public class GT_MachineRecipeLoader implements Runnable {
+ for (byte i = 0; i < 16; i = (byte) (i + 1)) {
+ GT_Values.RA.addCutterRecipe(new ItemStack(Blocks.wool, 1, i), new ItemStack(Blocks.carpet, 2, i), GT_Values.NI, 50, 8);
+ }
+- GT_Values.RA.addCutterRecipe(new ItemStack(Blocks.wooden_slab, 1, 0), ItemList.Plank_Oak.get(2L, new Object[0]), GT_Values.NI, 50, 8);
++ GT_Values.RA.addCutterRecipe(new ItemStack(Blocks.wooden_pressure_plate, 1, 0), ItemList.Plank_Oak.get(2L, new Object[0]), GT_Values.NI, 50, 8);
+ GT_Values.RA.addCutterRecipe(new ItemStack(Blocks.wooden_slab, 1, 1), ItemList.Plank_Spruce.get(2L, new Object[0]), GT_Values.NI, 50, 8);
+ GT_Values.RA.addCutterRecipe(new ItemStack(Blocks.wooden_slab, 1, 2), ItemList.Plank_Birch.get(2L, new Object[0]), GT_Values.NI, 50, 8);
+ GT_Values.RA.addCutterRecipe(new ItemStack(Blocks.wooden_slab, 1, 3), ItemList.Plank_Jungle.get(2L, new Object[0]), GT_Values.NI, 50, 8);
+--
+1.9.5.msysgit.0
+