diff options
author | Dimach <dimach2142@gmail.com> | 2017-07-06 06:47:55 +0300 |
---|---|---|
committer | Dimach <dimach2142@gmail.com> | 2017-07-06 06:48:18 +0300 |
commit | 424b356feeb02cb3735b928b4b16fdf54631bcae (patch) | |
tree | 7f76d5a124794240bc5b680fbd3a90af064a3bb8 /src/main/java/gregtech/common | |
parent | 110545a24dba455ea8db9ea16e13b411b7dbb4e9 (diff) | |
download | GT5-Unofficial-424b356feeb02cb3735b928b4b16fdf54631bcae.tar.gz GT5-Unofficial-424b356feeb02cb3735b928b4b16fdf54631bcae.tar.bz2 GT5-Unofficial-424b356feeb02cb3735b928b4b16fdf54631bcae.zip |
Added LV and MV miners.
Diffstat (limited to 'src/main/java/gregtech/common')
-rw-r--r-- | src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java | 202 |
1 files changed, 202 insertions, 0 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 new file mode 100644 index 0000000000..a34c481263 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/machines/basic/GT_MetaTileEntity_Miner.java @@ -0,0 +1,202 @@ +package gregtech.common.tileentities.machines.basic; + +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_BasicMachine; +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_Utility; +import gregtech.common.blocks.GT_Block_Ores_Abstract; +import gregtech.common.blocks.GT_TileEntity_Ores; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +import java.util.ArrayList; + +public class GT_MetaTileEntity_Miner extends GT_MetaTileEntity_BasicMachine { + private static final ItemStack miningPipe = GT_ModHandler.getIC2Item("miningPipe", 0); + private static final Block miningPipeBlock = GT_Utility.getBlockFromStack(miningPipe); + private static final Block miningPipeTipBlock = GT_Utility.getBlockFromStack(GT_ModHandler.getIC2Item("miningPipeTip", 0)); + + int drillX, drillY, drillZ; + boolean isPickingPipes; + boolean waitMiningPipe; + static int[] radius = new int[]{8, 8, 24, 40}; //Miner radius per tier + static int[] speed = new int[]{20, 20, 5, 2}; //Miner cycle time per tier + static int[] energy = new int[]{24, 24, 96, 384}; //Miner energy consumption per tier + + public GT_MetaTileEntity_Miner(int aID, String aName, String aNameRegional, int aTier) { + super(aID, aName, aNameRegional, aTier, 1, "Digging ore instead of you", 2, 2, "Miner.png", "", new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE_ACTIVE")), new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_SIDE")), new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT_ACTIVE")), new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_FRONT")), new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP_ACTIVE")), new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_TOP")), new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM_ACTIVE")), new GT_RenderedTexture(new Textures.BlockIcons.CustomIcon("basicmachines/miner/OVERLAY_BOTTOM"))); + } + + 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); + } + + 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); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_Miner(mName, mTier, mDescriptionArray, mTextures, mGUIName, mNEIName); + } + + public boolean allowPutStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, byte aSide, ItemStack aStack) { + return (super.allowPutStack(aBaseMetaTileEntity, aIndex, aSide, aStack)) && (aStack.getItem() == miningPipe.getItem()); + } + + public boolean hasFreeSpace() { + for (int i = getOutputSlot(); i < getOutputSlot() + 2; i++) { + if (mInventory[i] != null) { + return false; + } + } + return true; + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isServerSide()) { + if (aBaseMetaTileEntity.isAllowedToWork() && aBaseMetaTileEntity.isUniversalEnergyStored(energy[mTier] * (speed[mTier] - mProgresstime)) && hasFreeSpace()) { + miningPipe: + if (waitMiningPipe) { + mMaxProgresstime = 0; + for (int i = 0; i < mInputSlotCount; i++) { + ItemStack s = getInputAt(i); + if (s != null && s.getItem() == miningPipe.getItem() && s.stackSize > 0) { + waitMiningPipe = false; + break miningPipe; + } + } + return; + } + aBaseMetaTileEntity.decreaseStoredEnergyUnits(energy[mTier], true); + mMaxProgresstime = speed[mTier]; + } else { + mMaxProgresstime = 0; + return; + } + if (mProgresstime == speed[mTier] - 1) { + if (isPickingPipes) { + if (drillY == 0) { + aBaseMetaTileEntity.disableWorking(); + isPickingPipes = false; + } else if (aBaseMetaTileEntity.getBlockOffset(0, drillY, 0) == miningPipeTipBlock || aBaseMetaTileEntity.getBlockOffset(0, drillY, 0) == miningPipeBlock) { + mOutputItems[0] = miningPipe.copy(); + mOutputItems[0].stackSize = 1; + aBaseMetaTileEntity.getWorld().setBlockToAir(aBaseMetaTileEntity.getXCoord(), aBaseMetaTileEntity.getYCoord() + drillY, aBaseMetaTileEntity.getZCoord()); + drillY++; + } + return; + } + if (drillY == 0) { + if (moveOneDown(aBaseMetaTileEntity)) { + return; + } + } + if (drillZ > radius[mTier]) { + if (moveOneDown(aBaseMetaTileEntity)) { + return; + } + } + if (drillX > radius[mTier]) { + drillX = -radius[mTier]; + drillZ++; + return; + } + while (drillX <= radius[mTier]) { + Block block = aBaseMetaTileEntity.getBlockOffset(drillX, drillY, drillZ); + int blockMeta = aBaseMetaTileEntity.getMetaIDOffset(drillX, drillY, drillZ); + if (block instanceof GT_Block_Ores_Abstract) { + TileEntity tTileEntity = getBaseMetaTileEntity().getTileEntityOffset(drillX, drillY, drillZ); + if (tTileEntity != null && tTileEntity instanceof GT_TileEntity_Ores && ((GT_TileEntity_Ores) tTileEntity).mNatural) { + mineBlock(aBaseMetaTileEntity, drillX, drillY, drillZ); + return; + } + } else { + ItemData association = GT_OreDictUnificator.getAssociation(new ItemStack(block, 1, blockMeta)); + if (association != null && association.mPrefix.toString().startsWith("ore")) { + mineBlock(aBaseMetaTileEntity, drillX, drillY, drillZ); + return; + } + } + drillX++; + } + } + } + } + + public boolean moveOneDown(IGregTechTileEntity aBaseMetaTileEntity) { + if (aBaseMetaTileEntity.getYCoord() + drillY - 1 < 0 || aBaseMetaTileEntity.getBlockOffset(0, drillY - 1, 0) == Blocks.bedrock) { + isPickingPipes = true; + return false; + } + if (aBaseMetaTileEntity.getBlockOffset(0, drillY, 0) == miningPipeTipBlock) { + aBaseMetaTileEntity.getWorld().setBlock(aBaseMetaTileEntity.getXCoord(), aBaseMetaTileEntity.getYCoord() + drillY, aBaseMetaTileEntity.getZCoord(), miningPipeBlock); + } + miningPipes: + { + for (int i = 0; i < mInputSlotCount; i++) { + ItemStack s = getInputAt(i); + if (s != null && s.getItem() == miningPipe.getItem() && s.stackSize > 0) { + s.stackSize--; + if (s.stackSize == 0) { + mInventory[getInputSlot() + i] = null; + } + break miningPipes; + } + } + waitMiningPipe = true; + return false; + } + if (aBaseMetaTileEntity.getBlockOffset(0, drillY - 1, 0) != Blocks.air) { + mineBlock(aBaseMetaTileEntity, 0, drillY - 1, 0); + } + aBaseMetaTileEntity.getWorld().setBlock(aBaseMetaTileEntity.getXCoord(), aBaseMetaTileEntity.getYCoord() + drillY - 1, aBaseMetaTileEntity.getZCoord(), miningPipeTipBlock); + drillY--; + drillZ = -radius[mTier]; + drillX = -radius[mTier]; + return true; + } + + public void mineBlock(IGregTechTileEntity aBaseMetaTileEntity, int x, int y, int z) { + ArrayList<ItemStack> drops = getBlockDrops(aBaseMetaTileEntity.getBlockOffset(x, y, z), aBaseMetaTileEntity.getXCoord() + x, aBaseMetaTileEntity.getYCoord() + y, aBaseMetaTileEntity.getZCoord() + z); + if (drops.size() > 0) + mOutputItems[0] = drops.get(0); + if (drops.size() > 1) + mOutputItems[1] = drops.get(1); + aBaseMetaTileEntity.getWorld().setBlockToAir(aBaseMetaTileEntity.getXCoord() + x, aBaseMetaTileEntity.getYCoord() + y, aBaseMetaTileEntity.getZCoord() + z); + } + + 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, 1); + } + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("isPickingPipe", isPickingPipes); + aNBT.setInteger("drillX", drillX); + aNBT.setInteger("drillY", drillY); + aNBT.setInteger("drillZ", drillZ); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + isPickingPipes = aNBT.getBoolean("isPickingPipe"); + drillX = aNBT.getInteger("drillX"); + drillY = aNBT.getInteger("drillY"); + drillZ = aNBT.getInteger("drillZ"); + } +} |