resonant-induction/archive/java/resonantinduction/old/mechanics/machine/mining/TileApertureExcavator.java
2014-01-11 17:44:07 +08:00

105 lines
2.6 KiB
Java

package resonantinduction.old.mechanics.machine.mining;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.api.events.MachineMiningEvent;
import resonantinduction.core.prefab.tile.TileEntityEnergyMachine;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.utility.InvInteractionHelper;
/** @author Archadia */
public class TileApertureExcavator extends TileEntityEnergyMachine
{
private InvInteractionHelper invExtractionHelper;
private int lastY = -1;
public TileApertureExcavator()
{
super(0, 3);
}
public InvInteractionHelper invHelper()
{
if (invExtractionHelper == null || invExtractionHelper.world != this.worldObj)
{
this.invExtractionHelper = new InvInteractionHelper(this.worldObj, new Vector3(this), new ArrayList<ItemStack>(), false);
}
return invExtractionHelper;
}
@Override
public void updateEntity()
{
// TODO catch player place events and prevent them from placing blocks in the path of the
// drill head. This will save us time in coding blocks to represent the drill shafts
super.updateEntity();
if (!worldObj.isRemote && this.isFunctioning())
{
if (this.ticks % 20 == 0)
{
excavate();
}
}
}
@Override
public boolean canFunction()
{
return super.canFunction() && this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord);
}
public void excavate()
{
if (lastY == -1)
{
lastY = this.yCoord - 1;
}
for (int y = this.yCoord - 1; y > 0 && y < this.yCoord; y--)
{
Vector3 target = new Vector3(this.xCoord, y, this.zCoord);
if (this.consumePower(150, false))
{
Block block = Block.blocksList[target.getBlockID(this.worldObj)];
if (MachineMiningEvent.doMachineMiningCheck(this.worldObj, target, this))
{
List<ItemStack> items = MachineMiningEvent.getItemsMined(this, target);
if (items != null)
{
for (ItemStack stack : items)
{
this.dropItems(stack);
}
}
worldObj.setBlockToAir(target.intX(), target.intY(), target.intZ());
this.consumePower(150, true);
}
else if (block != null)
{
break;
}
if (y < this.lastY)
{
this.lastY = y;
break;
}
}
}
}
private void dropItems(ItemStack item)
{
if (item != null)
{
item = this.invHelper().storeItem(item, ForgeDirection.UP, ForgeDirection.NORTH, ForgeDirection.SOUTH, ForgeDirection.EAST, ForgeDirection.WEST);
if (item != null)
{
this.invHelper().throwItem(new Vector3(this).modifyPositionFromSide(ForgeDirection.UP), item);
item = null;
}
}
}
}