buildcraft/common/buildcraft/factory/TileMiningWell.java
2017-11-10 19:30:36 +01:00

171 lines
4.4 KiB
Java

/**
* Copyright (c) 2011-2017, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
* <p/>
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.factory;
import io.netty.buffer.ByteBuf;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftCore;
import buildcraft.BuildCraftFactory;
import buildcraft.api.blueprints.BuilderAPI;
import buildcraft.api.core.SafeTimeTracker;
import buildcraft.api.tiles.IControllable;
import buildcraft.api.tiles.IHasWork;
import buildcraft.api.transport.IPipeConnection;
import buildcraft.api.transport.IPipeTile;
import buildcraft.core.internal.ILEDProvider;
import buildcraft.core.lib.RFBattery;
import buildcraft.core.lib.block.TileBuildCraft;
import buildcraft.core.lib.utils.BlockMiner;
import buildcraft.core.lib.utils.BlockUtils;
public class TileMiningWell extends TileBuildCraft implements IHasWork, IPipeConnection, IControllable, ILEDProvider {
private boolean isDigging = true;
private BlockMiner miner;
private int ledState;
private int ticksSinceAction = 9001;
private SafeTimeTracker updateTracker = new SafeTimeTracker(BuildCraftCore.updateFactor);
public TileMiningWell() {
super();
this.setBattery(new RFBattery(2 * 64 * BuilderAPI.BREAK_ENERGY, BuilderAPI.BREAK_ENERGY * 4 + BuilderAPI.BUILD_ENERGY, 0));
}
/**
* Dig the next available piece of land if not done. As soon as it reaches
* bedrock, lava or goes below 0, it's considered done.
*/
@Override
public void updateEntity() {
super.updateEntity();
if (worldObj.isRemote) {
return;
}
if (updateTracker.markTimeIfDelay(worldObj)) {
sendNetworkUpdate();
}
ticksSinceAction++;
if (mode == Mode.Off) {
if (miner != null) {
miner.invalidate();
miner = null;
}
isDigging = false;
return;
}
if (getBattery().getEnergyStored() == 0) {
return;
}
if (miner == null) {
World world = worldObj;
int depth = yCoord - 1;
while (world.getBlock(xCoord, depth, zCoord) == BuildCraftFactory.plainPipeBlock) {
depth = depth - 1;
}
if (depth < 1 || depth < yCoord - BuildCraftFactory.miningDepth || !BlockUtils.canChangeBlock(world, xCoord, depth, zCoord)) {
isDigging = false;
// Drain energy, because at 0 energy this will stop doing calculations.
getBattery().useEnergy(0, 10, false);
return;
}
if (world.isAirBlock(xCoord, depth, zCoord) || world.getBlock(xCoord, depth, zCoord).isReplaceable(world, xCoord, depth, zCoord)) {
ticksSinceAction = 0;
world.setBlock(xCoord, depth, zCoord, BuildCraftFactory.plainPipeBlock);
} else {
miner = new BlockMiner(world, this, xCoord, depth, zCoord);
}
}
if (miner != null) {
isDigging = true;
ticksSinceAction = 0;
int usedEnergy = miner.acceptEnergy(getBattery().getEnergyStored());
getBattery().useEnergy(usedEnergy, usedEnergy, false);
if (miner.hasFailed()) {
isDigging = false;
}
if (miner.hasFailed() || miner.hasMined()) {
miner = null;
}
}
}
@Override
public void invalidate() {
super.invalidate();
if (miner != null) {
miner.invalidate();
}
if (worldObj != null && yCoord > 2) {
BuildCraftFactory.miningWellBlock.removePipes(worldObj, xCoord, yCoord, zCoord);
}
}
@Override
public void writeData(ByteBuf stream) {
super.writeData(stream);
ledState = (ticksSinceAction < 2 ? 16 : 0) | (getBattery().getEnergyStored() * 15 / getBattery().getMaxEnergyStored());
stream.writeByte(ledState);
}
@Override
public void readData(ByteBuf stream) {
super.readData(stream);
int newLedState = stream.readUnsignedByte();
if (newLedState != ledState) {
ledState = newLedState;
worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord);
}
}
@Override
public boolean hasWork() {
return isDigging;
}
@Override
public ConnectOverride overridePipeConnection(IPipeTile.PipeType type,
ForgeDirection with) {
return type == IPipeTile.PipeType.ITEM ? ConnectOverride.CONNECT : ConnectOverride.DEFAULT;
}
@Override
public boolean acceptsControlMode(Mode mode) {
return mode == Mode.Off || mode == Mode.On;
}
@Override
public int getLEDLevel(int led) {
if (led == 0) { // Red LED
return ledState & 15;
} else { // Green LED
return (ledState >> 4) > 0 ? 15 : 0;
}
}
}