diff options
Diffstat (limited to 'src/main/java/gregtech/common/tileentities')
-rw-r--r-- | src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java | 485 |
1 files changed, 221 insertions, 264 deletions
diff --git a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java index a11ab7fa41..cf3ed75291 100644 --- a/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java +++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java @@ -1,5 +1,7 @@ package gregtech.common.tileentities.machines.basic; +import java.util.ArrayList; + import gregtech.api.enums.Textures; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; @@ -7,13 +9,14 @@ import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; import gregtech.api.render.TextureFactory; import gregtech.api.util.GT_Log; -import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_Utility; import gregtech.common.blocks.GT_Block_Ores_Abstract; import gregtech.common.blocks.GT_TileEntity_Ores; +import gregtech.common.misc.GT_IDrillingLogicDelegateOwner; +import gregtech.common.misc.GT_DrillingLogicDelegate; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -21,75 +24,85 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; import net.minecraft.world.ChunkPosition; import net.minecraftforge.common.util.FakePlayer; - -import java.util.ArrayList; - import static gregtech.api.enums.GT_Values.V; import static gregtech.api.enums.GT_Values.debugBlockMiner; -public class GT_MetaTileEntity_Miner extends GT_MetaTileEntity_BasicMachine { - private static final ItemStack MINING_PIPE = GT_ModHandler.getIC2Item("miningPipe", 0); - private static final Block MINING_PIPE_BLOCK = GT_Utility.getBlockFromStack(MINING_PIPE); - private static final Block MINING_PIPE_TIP_BLOCK = GT_Utility.getBlockFromStack(GT_ModHandler.getIC2Item("miningPipeTip", 0)); - - int drillY = 0; - boolean mRetractDone; - - boolean waitMiningPipe; +@SuppressWarnings("ObjectEquality") +public class GT_MetaTileEntity_Miner extends GT_MetaTileEntity_BasicMachine implements GT_IDrillingLogicDelegateOwner { static final int[] RADIUS = {8, 8, 16, 24, 32}; //Miner radius per tier static final int[] SPEED = {160, 160, 80, 40, 20}; //Miner cycle time per tier static final int[] ENERGY = {8, 8, 32, 128, 512}; //Miner energy consumption per tier - private int radiusConfig; //Miner configured radius + /** Miner configured radius */ + private int radiusConfig; + /** Found ore blocks cache of current drill depth */ private final ArrayList<ChunkPosition> oreBlockPositions = new ArrayList<>(); + /** General pipe accessor */ + private final GT_DrillingLogicDelegate pipe = new GT_DrillingLogicDelegate(this); + private final int mSpeed; + public GT_MetaTileEntity_Miner(int aID, String aName, String aNameRegional, int aTier) { super(aID, aName, aNameRegional, aTier, 1, - new String[]{ - "Digging ore instead of you", - "Use Screwdriver to regulate work area", - "Use Soft Mallet to disable and retract the pipe", - ENERGY[aTier] + " EU/t, " + SPEED[aTier] / 20 + " sec per block, no stuttering", - "Maximum work area " + (RADIUS[aTier] * 2 + 1) + "x" + (RADIUS[aTier] * 2 + 1), - "Fortune bonus of " + aTier}, - 2, 2, "Miner.png", "", - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_ACTIVE")), - TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_ACTIVE_GLOW")).glow().build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE")), - TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_GLOW")).glow().build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_ACTIVE")), - TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_ACTIVE_GLOW")).glow().build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT")), - TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_GLOW")).glow().build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_ACTIVE")), - TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW")).glow().build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP")), - TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_GLOW")).glow().build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_ACTIVE")), - TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_ACTIVE_GLOW")).glow().build()), - TextureFactory.of( - TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM")), - TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_GLOW")).glow().build()) - ); + new String[]{ + "Digging ore instead of you", + "Use Screwdriver to regulate work area", + "Use Soft Mallet to disable and retract the pipe", + String.format("%d EU/t, %d sec per block, no stuttering", ENERGY[aTier], SPEED[aTier] / 20), + String.format("Maximum work area %dx%d", (RADIUS[aTier] * 2 + 1), (RADIUS[aTier] * 2 + 1)), + String.format("Fortune bonus of %d", aTier) + }, + 2, + 2, + "Miner.png", + "", + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_ACTIVE")), + TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_ACTIVE_GLOW")).glow().build() + ), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE")), + TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_GLOW")).glow().build() + ), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_ACTIVE")), + TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_ACTIVE_GLOW")).glow().build() + ), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT")), + TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_GLOW")).glow().build() + ), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_ACTIVE")), + TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_ACTIVE_GLOW")).glow().build() + ), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP")), + TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_GLOW")).glow().build() + ), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_ACTIVE")), + TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_ACTIVE_GLOW")).glow().build() + ), + TextureFactory.of( + TextureFactory.of(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM")), + TextureFactory.builder().addIcon(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_GLOW")).glow().build() + ) + ); + mSpeed = SPEED[aTier]; radiusConfig = RADIUS[mTier]; -} + } public GT_MetaTileEntity_Miner(String aName, int aTier, String aDescription, ITexture[][][] aTextures, String aGUIName, String aNEIName) { super(aName, aTier, 1, aDescription, aTextures, 1, 1, aGUIName, aNEIName); + mSpeed = SPEED[aTier]; radiusConfig = RADIUS[mTier]; -} + } public GT_MetaTileEntity_Miner(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures, String aGUIName, String aNEIName) { super(aName, aTier, 1, aDescription, aTextures, 2, 2, aGUIName, aNEIName); + mSpeed = SPEED[aTier]; radiusConfig = RADIUS[mTier]; - } @Override @@ -98,10 +111,18 @@ public class GT_MetaTileEntity_Miner extends GT_MetaTileEntity_BasicMachine { } @Override + public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { + pipe.findTipDepth(); + fillOreList(aBaseMetaTileEntity); + } + + @Override protected boolean allowPutStackValidated(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, byte aSide, ItemStack aStack) { - return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, aSide, aStack) && aStack.getItem() == MINING_PIPE.getItem(); + return super.allowPutStackValidated(aBaseMetaTileEntity, aIndex, aSide, aStack) // + && aStack.getItem() == GT_DrillingLogicDelegate.MINING_PIPE_STACK.getItem(); } + /** Both output slots must be free to work */ public boolean hasFreeSpace() { for (int i = getOutputSlot(); i < getOutputSlot() + 2; i++) { if (mInventory[i] != null) { @@ -119,24 +140,28 @@ public class GT_MetaTileEntity_Miner extends GT_MetaTileEntity_BasicMachine { if (radiusConfig >= 0) { radiusConfig--; } - if (radiusConfig < 0) + if (radiusConfig < 0) { radiusConfig = RADIUS[mTier]; - } else { + } + } + else { if (radiusConfig <= RADIUS[mTier]) { radiusConfig++; } - if (radiusConfig > RADIUS[mTier]) + if (radiusConfig > RADIUS[mTier]) { radiusConfig = 0; + } } - GT_Utility.sendChatToPlayer(aPlayer, StatCollector.translateToLocal("GT5U.machines.workareaset") + " " + (radiusConfig * 2 + 1) + "x" + (radiusConfig * 2 + 1));//TODO Add translation support - oreBlockPositions.clear(); + + GT_Utility.sendChatToPlayer( + aPlayer, + String.format("%s %dx%d", StatCollector.translateToLocal("GT5U.machines.workareaset"), (radiusConfig * 2 + 1), (radiusConfig * 2 + 1)) + ); + + // Rebuild ore cache after change config fillOreList(getBaseMetaTileEntity()); } } - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - fillOreList(aBaseMetaTileEntity); - } @Override public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { @@ -145,281 +170,213 @@ public class GT_MetaTileEntity_Miner extends GT_MetaTileEntity_BasicMachine { if (!aBaseMetaTileEntity.isServerSide()) { return; } - // If the machine was disabled - try to retract pipe - if (!aBaseMetaTileEntity.isAllowedToWork()){ + + // Pipe workaround + pipe.onOwnerPostTick(aBaseMetaTileEntity, aTick); + + if (!aBaseMetaTileEntity.isAllowedToWork()) { mMaxProgresstime = 0; - onPostTickRetract(aBaseMetaTileEntity, aTick); + if (debugBlockMiner) { + GT_Log.out.println("MINER: Disabled"); + } return; } - // If the machine was re-enabled - we should reset the retracting process - mRetractDone = false; - - boolean hasFreeSpace = hasFreeSpace(); - boolean hasEnergy = aBaseMetaTileEntity.isUniversalEnergyStored(ENERGY[mTier] * (SPEED[mTier] - mProgresstime)); - if (!hasEnergy || !hasFreeSpace){ + if (!hasFreeSpace()) { mMaxProgresstime = 0; if (debugBlockMiner) { - if (!aBaseMetaTileEntity.isAllowedToWork()) { - GT_Log.out.println("MINER: Disabled"); - } - if (!hasEnergy) { - GT_Log.out.println("MINER: Not enough energy yet, want " + (ENERGY[mTier] * SPEED[mTier]) + " have " + aBaseMetaTileEntity.getUniversalEnergyStored()); - } - if (!hasFreeSpace) { - GT_Log.out.println("MINER: No free space"); - } + GT_Log.out.println("MINER: No free space"); } return; } - ItemStack minigPipeStack = getMiningPipe(0); - if (waitMiningPipe){ - if (minigPipeStack == null || minigPipeStack.stackSize == 0){ - mMaxProgresstime = 0; - if (debugBlockMiner){ - GT_Log.out.println("MINER: Pipe found in input"); - } - return; + if (!aBaseMetaTileEntity.isUniversalEnergyStored((long)ENERGY[mTier] * (mSpeed - mProgresstime))) { + mMaxProgresstime = 0; + if (debugBlockMiner) { + GT_Log.out.println("MINER: Not enough energy yet, want " + (ENERGY[mTier] * mSpeed) + " have " + aBaseMetaTileEntity.getUniversalEnergyStored()); } + return; + } + + /* Checks if machine are waiting new mining pipe item */ + if (!pipe.canContinueDrilling(aTick)) { + mMaxProgresstime = 0; + return; } + mMaxProgresstime = mSpeed; + aBaseMetaTileEntity.decreaseStoredEnergyUnits(ENERGY[mTier], true); - mMaxProgresstime = SPEED[mTier]; - - if (mProgresstime == SPEED[mTier] - 1) { - if (drillY == 0 || oreBlockPositions.isEmpty()) { - moveOneDown(aBaseMetaTileEntity); - } else { - ChunkPosition oreBlockPos; - int x = 0, y = 0, z = 0; + + // Real working only when progress done. TODO some legacy code... refactorings needed + if (mProgresstime == mSpeed - 1) { + if (pipe.getTipDepth() == 0 || oreBlockPositions.isEmpty()) { + boolean descends = pipe.descent(aBaseMetaTileEntity); + if (descends) { + fillOreList(aBaseMetaTileEntity); + } + } + else { + int x; + int y; + int z; Block oreBlock; - int oreBlockMetadata = 0; + boolean isOre; do { - oreBlockPos = oreBlockPositions.remove(0); + ChunkPosition oreBlockPos = oreBlockPositions.remove(0); oreBlock = aBaseMetaTileEntity.getBlockOffset(oreBlockPos.chunkPosX, oreBlockPos.chunkPosY, oreBlockPos.chunkPosZ); x = aBaseMetaTileEntity.getXCoord() + oreBlockPos.chunkPosX; y = aBaseMetaTileEntity.getYCoord() + oreBlockPos.chunkPosY; z = aBaseMetaTileEntity.getZCoord() + oreBlockPos.chunkPosZ; - oreBlockMetadata = getBaseMetaTileEntity().getWorld().getBlockMetadata(x, y, z); + isOre = GT_Utility.isOre(oreBlock, aBaseMetaTileEntity.getWorld().getBlockMetadata(x, y, z)); } // someone else might have removed the block - while (!GT_Utility.isOre(oreBlock, oreBlockMetadata) && !oreBlockPositions.isEmpty()); + while (!isOre && !oreBlockPositions.isEmpty()); - if (GT_Utility.isOre(oreBlock, oreBlockMetadata)) { - mineBlock(aBaseMetaTileEntity, oreBlock, x, y, z); + if (isOre) { + pipe.mineBlock(aBaseMetaTileEntity, oreBlock, x, y, z); } } } } - /** - * If the machine are disabled - tried to retract pipe - */ - private void onPostTickRetract(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (mRetractDone) { - return; - } - // If retracting process just touch the miner - if (drillY == 0) { - mRetractDone = true; - return; - } - // Once per N ticks (depends on tier) - if ((aTick % (SPEED[mTier] / 5)) != 0) { - return; - } - // Check the pipe fits the first output slot - int outSlotIndex = getOutputSlot(); - ItemStack outSlotItem = this.mInventory[outSlotIndex]; - if (outSlotItem != null && !GT_Utility.areStacksEqual(outSlotItem, MINING_PIPE)) { - return; - } - // Inspect target block - it should be a pipe tip, else something went wrong. - Block inspectedBlock = aBaseMetaTileEntity.getBlockOffset(0, drillY, 0); - boolean isPipeTip = inspectedBlock == MINING_PIPE_TIP_BLOCK; - if (!isPipeTip) { + /** Finds the ores in current drill Y level */ + private void fillOreList(IGregTechTileEntity aBaseMetaTileEntity) { + if (pipe.getTipDepth() == 0) { return; } - // Retract the pipe/tip - int xCoord = aBaseMetaTileEntity.getXCoord(); - int yCoord = aBaseMetaTileEntity.getYCoord(); - int zCoord = aBaseMetaTileEntity.getZCoord(); - int actualDrillY = yCoord + drillY; - // Move the pipe tip position - if (actualDrillY < yCoord - 1) { - getBaseMetaTileEntity().getWorld().setBlock(xCoord, actualDrillY + 1, zCoord, MINING_PIPE_TIP_BLOCK); - } - // Remove the old pipe tip - aBaseMetaTileEntity.getWorld().setBlockToAir(xCoord, actualDrillY, zCoord); - // Return the pipe into the machine - if (outSlotItem == null) { - final ItemStack copy = MINING_PIPE.copy(); - copy.stackSize = 1; - this.setInventorySlotContents(outSlotIndex, copy); - } else { - this.mInventory[outSlotIndex].stackSize++; + oreBlockPositions.clear(); + for (int z = -radiusConfig; z <= radiusConfig; ++z) { + for (int x = -radiusConfig; x <= radiusConfig; ++x) { + Block block = aBaseMetaTileEntity.getBlockOffset(x, pipe.getTipDepth(), z); + int blockMeta = aBaseMetaTileEntity.getMetaIDOffset(x, pipe.getTipDepth(), z); + + // todo some weird checks. refactorings needed + if (block instanceof GT_Block_Ores_Abstract) { + TileEntity oreEntity = aBaseMetaTileEntity.getTileEntityOffset(x, pipe.getTipDepth(), z); + if (oreEntity instanceof GT_TileEntity_Ores && ((GT_TileEntity_Ores)oreEntity).mNatural) { + oreBlockPositions.add(new ChunkPosition(x, pipe.getTipDepth(), z)); + } + } + else if (GT_Utility.isOre(block, blockMeta)) { + oreBlockPositions.add(new ChunkPosition(x, pipe.getTipDepth(), z)); + } + } } - drillY++; } - /** - * Returns first available pipe from input slots - */ - private ItemStack getMiningPipe(int modify) { + /** Pulls (or check can pull) items from an input slots. */ + @Override + public boolean pullInputs(Item item, int count, boolean simulate) { for (int i = 0; i < mInputSlotCount; i++) { ItemStack stack = getInputAt(i); - if (stack != null && stack.getItem() == MINING_PIPE.getItem() && stack.stackSize > 0) { - stack.stackSize += modify; + if (stack != null && stack.getItem() == item && stack.stackSize >= count) { + if (simulate) { + return true; + } + stack.stackSize -= count; if (stack.stackSize == 0) { mInventory[getInputSlot() + i] = null; } - return stack; + return true; } } - return null; + return false; } - /** - * Findsw the ores in current drill Y level - */ - private void fillOreList(IGregTechTileEntity aBaseMetaTileEntity) { - if (drillY == 0) - return; - for (int z = -radiusConfig; z <= radiusConfig; ++z) { - for (int x = -radiusConfig; x <= radiusConfig; ++x) { - Block block = aBaseMetaTileEntity.getBlockOffset(x, drillY, z); - int blockMeta = aBaseMetaTileEntity.getMetaIDOffset(x, drillY, z); - if (block instanceof GT_Block_Ores_Abstract) { - TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntityOffset(x, drillY, z); - if (tTileEntity instanceof GT_TileEntity_Ores && ((GT_TileEntity_Ores) tTileEntity).mNatural) - oreBlockPositions.add(new ChunkPosition(x, drillY, z)); - } else if (GT_Utility.isOre(block, blockMeta)) - oreBlockPositions.add(new ChunkPosition(x, drillY, z)); - } - } - } + /** Pushes (or check can push) item to output slots. */ @Override - public long maxEUStore() { - return mTier == 1 ? 4096 : V[mTier] * 64; - } - - public boolean moveOneDown(IGregTechTileEntity aBaseMetaTileEntity) { - int xCoord = aBaseMetaTileEntity.getXCoord(); - int zCoord = aBaseMetaTileEntity.getZCoord(); - int yCoord = aBaseMetaTileEntity.getYCoord(); - boolean isHitsTheVoid = yCoord + drillY - 1 < 0; - boolean isHitsBedrock = GT_Utility.getBlockHardnessAt(aBaseMetaTileEntity.getWorld(), xCoord, yCoord + drillY - 1, zCoord) < 0; - boolean isFakePlayerAllowed = GT_Utility.setBlockByFakePlayer(getFakePlayer(aBaseMetaTileEntity), xCoord, yCoord + drillY - 1, zCoord, MINING_PIPE_TIP_BLOCK, 0, true); - - if (isHitsTheVoid || isHitsBedrock || !isFakePlayerAllowed) { - aBaseMetaTileEntity.disableWorking(); - if (debugBlockMiner) { - if (isHitsTheVoid) { - GT_Log.out.println("MINER: Hit bottom"); - } - if (isHitsBedrock) { - GT_Log.out.println("MINER: Hit block with -1 hardness"); - } - if (!isFakePlayerAllowed) { - GT_Log.out.println("MINER: Unable to set mining pipe tip"); + public boolean pushOutputs(ItemStack stack, int count, boolean simulate, boolean allowInputSlots) { + int startSlot = allowInputSlots ? getInputSlot() : getOutputSlot(); + int maxSlot = mInventory.length; + for (int i = startSlot; i < maxSlot; i++) { + ItemStack slot = mInventory[i]; + if (slot == null || slot.stackSize == 0) { + if (!simulate) { + ItemStack copy = stack.copy(); + copy.stackSize = count; + mInventory[i] = copy; } + return true; } - return false; - } - // Replace the tip onto pipe - if (aBaseMetaTileEntity.getBlockOffset(0, drillY, 0) == MINING_PIPE_TIP_BLOCK) { - aBaseMetaTileEntity.getWorld().setBlock(xCoord, yCoord + drillY, zCoord, MINING_PIPE_BLOCK); - } - // Get and decrease pipe from the machine - ItemStack pipeInSlot = getMiningPipe(-1); - if (pipeInSlot == null) { - // If there was nothing - wainting for the pipes (just for prevent unnecessary checks) - waitMiningPipe = true; - return false; - } - // If there is something - mine it (todo don't matter what? maybe some checks like in mining method?) - Block block = aBaseMetaTileEntity.getBlockOffset(0, drillY - 1, 0); - if (block != Blocks.air) { - mineBlock(aBaseMetaTileEntity, block, xCoord, yCoord + drillY - 1, zCoord); - } - // Raise the pipe tip - aBaseMetaTileEntity.getWorld().setBlock(xCoord, yCoord + drillY - 1, zCoord, MINING_PIPE_TIP_BLOCK); - drillY--; - fillOreList(aBaseMetaTileEntity); - return true; - } - - public void mineBlock(IGregTechTileEntity aBaseMetaTileEntity, Block block, int x, int y, int z) { - if (!GT_Utility.eraseBlockByFakePlayer(getFakePlayer(aBaseMetaTileEntity), x, y, z, true)) { - if (debugBlockMiner) - GT_Log.out.println("MINER: FakePlayer cannot mine block at " + x + ", " + y + ", " + z); - } else { - ArrayList<ItemStack> drops = getBlockDrops(block, x, y, z); - if (drops.size() > 0) - mOutputItems[0] = drops.get(0); - if (drops.size() > 1) - mOutputItems[1] = drops.get(1); - - short metaData = 0; - TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntity(x, y, z); - if (tTileEntity instanceof GT_TileEntity_Ores) { - metaData = ((GT_TileEntity_Ores) tTileEntity).mMetaData; + else if (GT_Utility.areStacksEqual(slot, stack) && slot.stackSize <= slot.getMaxStackSize() - count) { + if (!simulate) { + slot.stackSize += count; + } + return true; } - - ItemStack cobble = GT_Utility.getCobbleForOre(block, metaData); - aBaseMetaTileEntity.getWorld().setBlock(x, y, z, Block.getBlockFromItem(cobble.getItem()), cobble.getItemDamage(), 3); - if (debugBlockMiner) - GT_Log.out.println("MINER: Mining GT ore block at " + x + " " + y + " " + z); } + return false; } - private ArrayList<ItemStack> getBlockDrops(final Block oreBlock, int posX, int posY, int posZ) { - final int blockMeta = getBaseMetaTileEntity().getMetaID(posX, posY, posZ); - return oreBlock.getDrops(getBaseMetaTileEntity().getWorld(), posX, posY, posZ, blockMeta, mTier); + @Override + public long maxEUStore() { + return Math.max(V[mTier] * 64, 4096); } @Override public void setItemNBT(NBTTagCompound aNBT) { super.setItemNBT(aNBT); - aNBT.setByte("mTier", mTier); aNBT.setInteger("radiusConfig", radiusConfig); } @Override public void saveNBTData(NBTTagCompound aNBT) { super.saveNBTData(aNBT); - aNBT.setInteger("drillY", drillY); aNBT.setInteger("radiusConfig", radiusConfig); } @Override public void loadNBTData(NBTTagCompound aNBT) { super.loadNBTData(aNBT); - // todo actually we need to find pipes from the 0Y in the up direction until the miner, and don't need to save it - drillY = aNBT.getInteger("drillY"); - if (aNBT.hasKey("radiusConfig")) - radiusConfig = aNBT.getInteger("radiusConfig"); - } - - private FakePlayer mFakePlayer = null; - - protected FakePlayer getFakePlayer(IGregTechTileEntity aBaseTile) { - if (mFakePlayer == null) - mFakePlayer = GT_Utility.getFakePlayer(aBaseTile); - if (mFakePlayer != null) { - mFakePlayer.setWorld(aBaseTile.getWorld()); - mFakePlayer.setPosition(aBaseTile.getXCoord(), aBaseTile.getYCoord(), aBaseTile.getZCoord()); + if (aNBT.hasKey("radiusConfig")) { + int newRadius = aNBT.getInteger("radiusConfig"); + if (RADIUS[mTier] <= newRadius && newRadius > 0) { + radiusConfig = newRadius; + } } - return mFakePlayer; } @Override public String[] getInfoData() { return new String[]{ - EnumChatFormatting.BLUE+StatCollector.translateToLocal("GT5U.machines.miner")+EnumChatFormatting.RESET, - StatCollector.translateToLocal("GT5U.machines.workarea")+": " + EnumChatFormatting.GREEN + (radiusConfig * 2 + 1)+ - EnumChatFormatting.RESET+" " + StatCollector.translateToLocal("GT5U.machines.blocks") + String.format("%s%s%s", EnumChatFormatting.BLUE, StatCollector.translateToLocal("GT5U.machines.miner"), EnumChatFormatting.RESET), + String.format("%s: %s%d%s %s", + StatCollector.translateToLocal("GT5U.machines.workarea"), + EnumChatFormatting.GREEN, + (radiusConfig * 2 + 1), + EnumChatFormatting.RESET, + StatCollector.translateToLocal("GT5U.machines.blocks") + ) }; } + @Override + public int getMachineTier() { + return mTier; + } + + @Override + public int getMachineSpeed() { + return mSpeed; + } + + /** @deprecated This method are obsolete, and may be removed in further updates. Please use 'this.getPipe().descent()' access! */ + @Deprecated + public boolean moveOneDown(IGregTechTileEntity tileEntity) { + boolean descends = pipe.descent(tileEntity); + if (descends) { + fillOreList(tileEntity); + } + return descends; + } + + /** @deprecated This method are obsolete, and may be removed in further updates. Please use 'this.getPipe().getFakePlayer(te)' access! */ + @Deprecated + protected FakePlayer getFakePlayer(IGregTechTileEntity aBaseTile) { + return pipe.getFakePlayer(aBaseTile); + } + + public GT_DrillingLogicDelegate getPipe() { + return pipe; + } } |