From 7bf94fb4ef6ddccbc2869b4ea64cd2166a10455e Mon Sep 17 00:00:00 2001 From: Aidan Brady Date: Thu, 30 Jan 2014 16:22:01 -0500 Subject: [PATCH] Digital Miners now have much better redstone & ComputerCraft support that puts into account all bounding blocks --- .../common/IAdvancedBoundingBlock.java | 7 +- .../mekanism/common/block/BlockBounding.java | 10 ++ .../tile/TileEntityAdvancedBoundingBlock.java | 93 ++++++++++++++++++- .../common/tile/TileEntityBoundingBlock.java | 36 +++++++ .../common/tile/TileEntityDigitalMiner.java | 44 ++++++++- 5 files changed, 185 insertions(+), 5 deletions(-) diff --git a/common/mekanism/common/IAdvancedBoundingBlock.java b/common/mekanism/common/IAdvancedBoundingBlock.java index 3e0ebf75c..c05a9653d 100644 --- a/common/mekanism/common/IAdvancedBoundingBlock.java +++ b/common/mekanism/common/IAdvancedBoundingBlock.java @@ -9,12 +9,17 @@ import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import buildcraft.api.power.IPowerReceptor; import cofh.api.energy.IEnergyHandler; +import dan200.computer.api.IPeripheral; -public interface IAdvancedBoundingBlock extends IBoundingBlock, ISidedInventory, IEnergySink, IStrictEnergyAcceptor, IPowerReceptor, IEnergyTile, IStrictEnergyStorage, IEnergyHandler +public interface IAdvancedBoundingBlock extends IBoundingBlock, ISidedInventory, IEnergySink, IStrictEnergyAcceptor, IPowerReceptor, IEnergyTile, IStrictEnergyStorage, IEnergyHandler, IPeripheral { public int[] getBoundSlots(Coord4D location, int side); public boolean canBoundInsert(Coord4D location, int i, ItemStack itemstack); public boolean canBoundExtract(Coord4D location, int i, ItemStack itemstack, int j); + + public void onPower(); + + public void onNoPower(); } diff --git a/common/mekanism/common/block/BlockBounding.java b/common/mekanism/common/block/BlockBounding.java index 744fc9504..09c5820de 100644 --- a/common/mekanism/common/block/BlockBounding.java +++ b/common/mekanism/common/block/BlockBounding.java @@ -60,6 +60,16 @@ public class BlockBounding extends Block return false; } } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, int id) + { + try { + TileEntityBoundingBlock tileEntity = (TileEntityBoundingBlock)world.getBlockTileEntity(x, y, z); + tileEntity.onNeighborChange(id); + Block.blocksList[world.getBlockId(tileEntity.mainX, tileEntity.mainY, tileEntity.mainZ)].onNeighborBlockChange(world, tileEntity.mainX, tileEntity.mainY, tileEntity.mainZ, id); + } catch(Exception e) {} + } @Override public int quantityDropped(Random random) diff --git a/common/mekanism/common/tile/TileEntityAdvancedBoundingBlock.java b/common/mekanism/common/tile/TileEntityAdvancedBoundingBlock.java index 6f0457f5e..b630eaf62 100644 --- a/common/mekanism/common/tile/TileEntityAdvancedBoundingBlock.java +++ b/common/mekanism/common/tile/TileEntityAdvancedBoundingBlock.java @@ -17,8 +17,11 @@ import buildcraft.api.power.IPowerReceptor; import buildcraft.api.power.PowerHandler; import buildcraft.api.power.PowerHandler.PowerReceiver; import cofh.api.energy.IEnergyHandler; +import dan200.computer.api.IComputerAccess; +import dan200.computer.api.ILuaContext; +import dan200.computer.api.IPeripheral; -public class TileEntityAdvancedBoundingBlock extends TileEntityBoundingBlock implements ISidedInventory, IEnergySink, IStrictEnergyAcceptor, IPowerReceptor, IEnergyTile, IStrictEnergyStorage, IEnergyHandler +public class TileEntityAdvancedBoundingBlock extends TileEntityBoundingBlock implements ISidedInventory, IEnergySink, IStrictEnergyAcceptor, IPowerReceptor, IEnergyTile, IStrictEnergyStorage, IEnergyHandler, IPeripheral { @Override public int getSizeInventory() @@ -379,4 +382,92 @@ public class TileEntityAdvancedBoundingBlock extends TileEntityBoundingBlock imp return (IAdvancedBoundingBlock)new Coord4D(mainX, mainY, mainZ, worldObj.provider.dimensionId).getTileEntity(worldObj); } + + @Override + public void onPower() + { + super.onPower(); + + if(getInv() != null) + { + getInv().onPower(); + } + } + + @Override + public void onNoPower() + { + super.onNoPower(); + + if(getInv() != null) + { + getInv().onNoPower(); + } + } + + @Override + public String getType() + { + if(getInv() == null) + { + return null; + } + + return getInv().getType(); + } + + @Override + public String[] getMethodNames() + { + if(getInv() == null) + { + return null; + } + + return getInv().getMethodNames(); + } + + @Override + public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception + { + if(getInv() == null) + { + return null; + } + + return getInv().callMethod(computer, context, method, arguments); + } + + @Override + public boolean canAttachToSide(int side) + { + if(getInv() == null) + { + return false; + } + + return getInv().canAttachToSide(side); + } + + @Override + public void attach(IComputerAccess computer) + { + if(getInv() == null) + { + return; + } + + getInv().attach(computer); + } + + @Override + public void detach(IComputerAccess computer) + { + if(getInv() == null) + { + return; + } + + getInv().detach(computer); + } } diff --git a/common/mekanism/common/tile/TileEntityBoundingBlock.java b/common/mekanism/common/tile/TileEntityBoundingBlock.java index ea68c6177..c352ed697 100644 --- a/common/mekanism/common/tile/TileEntityBoundingBlock.java +++ b/common/mekanism/common/tile/TileEntityBoundingBlock.java @@ -18,6 +18,8 @@ public class TileEntityBoundingBlock extends TileEntity implements ITileNetwork public int mainX; public int mainY; public int mainZ; + + public boolean prevPower; public void setMainLocation(int x, int y, int z) { @@ -47,6 +49,36 @@ public class TileEntityBoundingBlock extends TileEntity implements ITileNetwork { return false; } + + public void onNeighborChange(int id) + { + TileEntity tile = worldObj.getBlockTileEntity(mainX, mainY, mainZ); + + if(tile instanceof TileEntityBasicBlock) + { + TileEntityBasicBlock tileEntity = (TileEntityBasicBlock)tile; + + boolean power = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); + + if(prevPower != power) + { + if(power) + { + onPower(); + } + else { + onNoPower(); + } + + prevPower = power; + PacketHandler.sendPacket(Transmission.CLIENTS_DIM, new PacketTileEntity().setParams(Coord4D.get(tileEntity), tileEntity.getNetworkedData(new ArrayList())), tileEntity.worldObj.provider.dimensionId); + } + } + } + + public void onPower() {} + + public void onNoPower() {} @Override public void handlePacketData(ByteArrayDataInput dataStream) @@ -54,6 +86,7 @@ public class TileEntityBoundingBlock extends TileEntity implements ITileNetwork mainX = dataStream.readInt(); mainY = dataStream.readInt(); mainZ = dataStream.readInt(); + prevPower = dataStream.readBoolean(); } @Override @@ -64,6 +97,7 @@ public class TileEntityBoundingBlock extends TileEntity implements ITileNetwork mainX = nbtTags.getInteger("mainX"); mainY = nbtTags.getInteger("mainY"); mainZ = nbtTags.getInteger("mainZ"); + prevPower = nbtTags.getBoolean("prevPower"); } @Override @@ -74,6 +108,7 @@ public class TileEntityBoundingBlock extends TileEntity implements ITileNetwork nbtTags.setInteger("mainX", mainX); nbtTags.setInteger("mainY", mainY); nbtTags.setInteger("mainZ", mainZ); + nbtTags.setBoolean("prevPower", prevPower); } @Override @@ -82,6 +117,7 @@ public class TileEntityBoundingBlock extends TileEntity implements ITileNetwork data.add(mainX); data.add(mainY); data.add(mainZ); + data.add(prevPower); return data; } diff --git a/common/mekanism/common/tile/TileEntityDigitalMiner.java b/common/mekanism/common/tile/TileEntityDigitalMiner.java index 4ce72af51..620bcb03d 100644 --- a/common/mekanism/common/tile/TileEntityDigitalMiner.java +++ b/common/mekanism/common/tile/TileEntityDigitalMiner.java @@ -92,6 +92,8 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I public boolean initCalc = false; + public int numPowering; + /** This machine's current RedstoneControl type. */ public RedstoneControl controlType = RedstoneControl.DISABLED; @@ -135,7 +137,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I ChargeUtils.discharge(27, this); - if(running && getEnergy() >= getPerTick() && searcher.state == State.FINISHED && oresToMine.size() > 0) + if(MekanismUtils.canFunction(this) && running && getEnergy() >= getPerTick() && searcher.state == State.FINISHED && oresToMine.size() > 0) { setActive(true); @@ -512,6 +514,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I running = nbtTags.getBoolean("running"); delay = nbtTags.getInteger("delay"); silkTouch = nbtTags.getBoolean("silkTouch"); + numPowering = nbtTags.getInteger("numPowering"); searcher.state = State.values()[nbtTags.getInteger("state")]; controlType = RedstoneControl.values()[nbtTags.getInteger("controlType")]; inverse = nbtTags.getBoolean("inverse"); @@ -551,6 +554,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I nbtTags.setBoolean("running", running); nbtTags.setInteger("delay", delay); nbtTags.setBoolean("silkTouch", silkTouch); + nbtTags.setInteger("numPowering", numPowering); nbtTags.setInteger("state", searcher.state.ordinal()); nbtTags.setInteger("controlType", controlType.ordinal()); nbtTags.setBoolean("inverse", inverse); @@ -655,6 +659,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I isActive = dataStream.readBoolean(); running = dataStream.readBoolean(); silkTouch = dataStream.readBoolean(); + numPowering = dataStream.readInt(); searcher.state = State.values()[dataStream.readInt()]; if(dataStream.readBoolean()) @@ -688,6 +693,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I isActive = dataStream.readBoolean(); running = dataStream.readBoolean(); silkTouch = dataStream.readBoolean(); + numPowering = dataStream.readInt(); searcher.state = State.values()[dataStream.readInt()]; if(dataStream.readBoolean()) @@ -736,6 +742,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I data.add(isActive); data.add(running); data.add(silkTouch); + data.add(numPowering); data.add(searcher.state.ordinal()); if(replaceStack != null) @@ -789,6 +796,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I data.add(isActive); data.add(running); data.add(silkTouch); + data.add(numPowering); data.add(searcher.state.ordinal()); if(replaceStack != null) @@ -830,6 +838,12 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I return MekanismUtils.getMaxEnergy(getEnergyMultiplier(), MAX_ELECTRICITY); } + @Override + public boolean isPowered() + { + return redstone || numPowering > 0; + } + @Override public RedstoneControl getControlType() { @@ -1046,14 +1060,26 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I return false; } + + @Override + public void onPower() + { + numPowering++; + } + + @Override + public void onNoPower() + { + numPowering--; + } @Override public String getType() { - return "Digital Miner"; + return getInvName(); } - public String[] names = {"setRadius", "setMin", "setMax", "setReplace", "addFilter", "removeFilter", "addOreFilter", "removeOreFilter"}; + public String[] names = {"setRadius", "setMin", "setMax", "setReplace", "addFilter", "removeFilter", "addOreFilter", "removeOreFilter", "reset", "start", "stop"}; @Override public String[] getMethodNames() @@ -1170,6 +1196,18 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I } } } + else if(method == 8) + { + reset(); + } + else if(method == 9) + { + start(); + } + else if(method == 10) + { + stop(); + } } }