Step 1 of another Digital Miner refactor

This commit is contained in:
Aidan Brady 2014-02-15 15:00:42 -05:00
parent 1a179b914c
commit 73be8c65d7
5 changed files with 234 additions and 104 deletions

View file

@ -9,6 +9,7 @@ import mekanism.client.gui.GuiEnergyInfo.IInfoHandler;
import mekanism.common.PacketHandler; import mekanism.common.PacketHandler;
import mekanism.common.PacketHandler.Transmission; import mekanism.common.PacketHandler.Transmission;
import mekanism.common.inventory.container.ContainerDigitalMiner; import mekanism.common.inventory.container.ContainerDigitalMiner;
import mekanism.common.miner.ThreadMinerSearch.State;
import mekanism.common.network.PacketDigitalMinerGui; import mekanism.common.network.PacketDigitalMinerGui;
import mekanism.common.network.PacketDigitalMinerGui.MinerGuiPacket; import mekanism.common.network.PacketDigitalMinerGui.MinerGuiPacket;
import mekanism.common.network.PacketTileEntity; import mekanism.common.network.PacketTileEntity;
@ -66,21 +67,21 @@ public class GuiDigitalMiner extends GuiMekanism
buttonList.clear(); buttonList.clear();
startButton = new GuiButton(0, guiWidth + 69, guiHeight + 17, 60, 20, MekanismUtils.localize("gui.start")); startButton = new GuiButton(0, guiWidth + 69, guiHeight + 17, 60, 20, MekanismUtils.localize("gui.start"));
if(tileEntity.running) if(tileEntity.searcher.state != State.IDLE && tileEntity.running)
{ {
startButton.enabled = false; startButton.enabled = false;
} }
stopButton = new GuiButton(1, guiWidth + 69, guiHeight + 37, 60, 20, MekanismUtils.localize("gui.stop")); stopButton = new GuiButton(1, guiWidth + 69, guiHeight + 37, 60, 20, MekanismUtils.localize("gui.stop"));
if(!tileEntity.running) if(tileEntity.searcher.state == State.IDLE || !tileEntity.running)
{ {
stopButton.enabled = false; stopButton.enabled = false;
} }
configButton = new GuiButton(2, guiWidth + 69, guiHeight + 57, 60, 20, MekanismUtils.localize("gui.config")); configButton = new GuiButton(2, guiWidth + 69, guiHeight + 57, 60, 20, MekanismUtils.localize("gui.config"));
if(tileEntity.running || tileEntity.searched > 0) if(tileEntity.searcher.state != State.IDLE)
{ {
configButton.enabled = false; configButton.enabled = false;
} }
@ -120,7 +121,7 @@ public class GuiDigitalMiner extends GuiMekanism
{ {
super.updateScreen(); super.updateScreen();
if(tileEntity.running) if(tileEntity.searcher.state != State.IDLE && tileEntity.running)
{ {
startButton.enabled = false; startButton.enabled = false;
} }
@ -128,7 +129,7 @@ public class GuiDigitalMiner extends GuiMekanism
startButton.enabled = true; startButton.enabled = true;
} }
if(!tileEntity.running) if(tileEntity.searcher.state == State.IDLE || !tileEntity.running)
{ {
stopButton.enabled = false; stopButton.enabled = false;
} }
@ -136,7 +137,7 @@ public class GuiDigitalMiner extends GuiMekanism
stopButton.enabled = true; stopButton.enabled = true;
} }
if(tileEntity.running || tileEntity.searched > 0) if(tileEntity.searcher.state != State.IDLE)
{ {
configButton.enabled = false; configButton.enabled = false;
} }
@ -155,13 +156,14 @@ public class GuiDigitalMiner extends GuiMekanism
fontRenderer.drawString(MekanismUtils.localize("container.inventory"), 8, (ySize - 96) + 2, 0x404040); fontRenderer.drawString(MekanismUtils.localize("container.inventory"), 8, (ySize - 96) + 2, 0x404040);
fontRenderer.drawString(tileEntity.running ? MekanismUtils.localize("gui.digitalMiner.running") : MekanismUtils.localize("gui.idle"), 9, 10, 0x00CD00); fontRenderer.drawString(tileEntity.running ? MekanismUtils.localize("gui.digitalMiner.running") : MekanismUtils.localize("gui.idle"), 9, 10, 0x00CD00);
fontRenderer.drawString(tileEntity.searcher.state.desc, 9, 19, 0x00CD00);
fontRenderer.drawString(MekanismUtils.localize("gui.eject") + ": " + MekanismUtils.localize("gui." + (tileEntity.doEject ? "on" : "off")), 9, 30, 0x00CD00); fontRenderer.drawString(MekanismUtils.localize("gui.eject") + ": " + MekanismUtils.localize("gui." + (tileEntity.doEject ? "on" : "off")), 9, 30, 0x00CD00);
fontRenderer.drawString(MekanismUtils.localize("gui.digitalMiner.pull") + ": " + MekanismUtils.localize("gui." + (tileEntity.doPull ? "on" : "off")), 9, 39, 0x00CD00); fontRenderer.drawString(MekanismUtils.localize("gui.digitalMiner.pull") + ": " + MekanismUtils.localize("gui." + (tileEntity.doPull ? "on" : "off")), 9, 39, 0x00CD00);
fontRenderer.drawString(MekanismUtils.localize("gui.digitalMiner.silk") + ": " + MekanismUtils.localize("gui." + (tileEntity.silkTouch ? "on" : "off")), 9, 48, 0x00CD00); fontRenderer.drawString(MekanismUtils.localize("gui.digitalMiner.silk") + ": " + MekanismUtils.localize("gui." + (tileEntity.silkTouch ? "on" : "off")), 9, 48, 0x00CD00);
fontRenderer.drawString(MekanismUtils.localize("gui.digitalMiner.searched") + ":", 9, 59, 0x00CD00); fontRenderer.drawString(MekanismUtils.localize("gui.digitalMiner.toMine") + ":", 9, 59, 0x00CD00);
fontRenderer.drawString("" + tileEntity.searched, 9, 68, 0x00CD00); fontRenderer.drawString("" + tileEntity.clientToMine, 9, 68, 0x00CD00);
if(tileEntity.replaceStack != null) if(tileEntity.replaceStack != null)
{ {

View file

@ -82,20 +82,16 @@ public class ItemProxy extends Item
public void registerIcons(IconRegister register) {} public void registerIcons(IconRegister register) {}
@Override @Override
public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean flag) public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5)
{ {
if(entity instanceof EntityPlayer) if (par3Entity instanceof EntityPlayer)
{ {
EntityPlayer player = (EntityPlayer)entity; EntityPlayer player = (EntityPlayer) par3Entity;
for (Object o : player.inventoryContainer.inventorySlots)
for(Object o : player.inventoryContainer.inventorySlots)
{ {
Slot s = (Slot)o; Slot s = (Slot) o;
if (s.getStack() != null && s.getStack().getItem() == this)
if(s.getStack() != null && s.getStack().getItem() == this)
{
player.inventory.decrStackSize(s.slotNumber, 64); player.inventory.decrStackSize(s.slotNumber, 64);
}
} }
} }
} }

View file

@ -0,0 +1,111 @@
package mekanism.common.miner;
import java.util.Collections;
import mekanism.api.Coord4D;
import mekanism.common.IBoundingBlock;
import mekanism.common.tile.TileEntityDigitalMiner;
import mekanism.common.util.MekanismUtils;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
public class ThreadMinerSearch extends Thread
{
public TileEntityDigitalMiner tileEntity;
public State state = State.IDLE;
public ThreadMinerSearch(TileEntityDigitalMiner tile)
{
tileEntity = tile;
}
@Override
public void run()
{
state = State.SEARCHING;
if(tileEntity.filters.isEmpty())
{
state = State.FINISHED;
return;
}
for(int y = tileEntity.maxY; y >= tileEntity.minY; y--)
{
for(int x = tileEntity.xCoord-tileEntity.radius; x <= tileEntity.xCoord+tileEntity.radius; x++)
{
for(int z = tileEntity.zCoord-tileEntity.radius; z <= tileEntity.zCoord+tileEntity.radius; z++)
{
if(tileEntity.isInvalid())
{
return;
}
if(Coord4D.get(tileEntity).equals(new Coord4D(x, y, z, tileEntity.worldObj.provider.dimensionId)))
{
continue;
}
if(new Coord4D(x, y, z, tileEntity.worldObj.provider.dimensionId).getTileEntity(tileEntity.worldObj) instanceof IBoundingBlock)
{
continue;
}
int blockID = tileEntity.worldObj.getBlockId(x, y, z);
int meta = tileEntity.worldObj.getBlockMetadata(x, y, z);
if(blockID != 0 && blockID != Block.bedrock.blockID)
{
ItemStack stack = new ItemStack(blockID, 1, meta);
if(tileEntity.replaceStack != null && tileEntity.replaceStack.isItemEqual(stack))
{
continue;
}
boolean hasFilter = false;
for(MinerFilter filter : tileEntity.filters)
{
if(filter.canFilter(stack))
{
hasFilter = true;
}
}
if(tileEntity.inverse ? !hasFilter : hasFilter)
{
tileEntity.oresToMine.add(new Coord4D(x, y, z, tileEntity.worldObj.provider.dimensionId));
}
}
}
}
}
Collections.shuffle(tileEntity.oresToMine);
state = State.FINISHED;
MekanismUtils.saveChunk(tileEntity);
}
public void reset()
{
state = State.IDLE;
}
public static enum State
{
IDLE("Not ready"),
SEARCHING("Searching"),
PAUSED("Paused"),
FINISHED("Ready");
public String desc;
private State(String s)
{
desc = s;
}
}
}

View file

@ -1,14 +1,15 @@
package mekanism.common.tile; package mekanism.common.tile;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set;
import mekanism.api.Coord4D; import mekanism.api.Coord4D;
import mekanism.common.HashList; import mekanism.common.HashList;
import mekanism.common.IActiveState; import mekanism.common.IActiveState;
import mekanism.common.IAdvancedBoundingBlock; import mekanism.common.IAdvancedBoundingBlock;
import mekanism.common.IBoundingBlock;
import mekanism.common.ILogisticalTransporter; import mekanism.common.ILogisticalTransporter;
import mekanism.common.IRedstoneControl; import mekanism.common.IRedstoneControl;
import mekanism.common.IUpgradeTile; import mekanism.common.IUpgradeTile;
@ -21,6 +22,8 @@ import mekanism.common.inventory.container.ContainerNull;
import mekanism.common.miner.MItemStackFilter; import mekanism.common.miner.MItemStackFilter;
import mekanism.common.miner.MOreDictFilter; import mekanism.common.miner.MOreDictFilter;
import mekanism.common.miner.MinerFilter; import mekanism.common.miner.MinerFilter;
import mekanism.common.miner.ThreadMinerSearch;
import mekanism.common.miner.ThreadMinerSearch.State;
import mekanism.common.network.PacketTileEntity; import mekanism.common.network.PacketTileEntity;
import mekanism.common.tile.component.TileComponentUpgrade; import mekanism.common.tile.component.TileComponentUpgrade;
import mekanism.common.transporter.InvStack; import mekanism.common.transporter.InvStack;
@ -52,11 +55,11 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
{ {
public static int[] EJECT_INV; public static int[] EJECT_INV;
public int searched = 0; public List<Coord4D> oresToMine = new ArrayList<Coord4D>();
public HashList<MinerFilter> filters = new HashList<MinerFilter>(); public HashList<MinerFilter> filters = new HashList<MinerFilter>();
public Coord4D currentNode; public ThreadMinerSearch searcher = new ThreadMinerSearch(this);
public final double ENERGY_USAGE = Mekanism.digitalMinerUsage; public final double ENERGY_USAGE = Mekanism.digitalMinerUsage;
@ -72,6 +75,8 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
public int delay; public int delay;
public int clientToMine;
public ItemStack replaceStack; public ItemStack replaceStack;
public boolean isActive; public boolean isActive;
@ -85,6 +90,8 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
public int delayTicks; public int delayTicks;
public boolean initCalc = false;
public int numPowering; public int numPowering;
/** This machine's current RedstoneControl type. */ /** This machine's current RedstoneControl type. */
@ -117,9 +124,20 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
if(!worldObj.isRemote) if(!worldObj.isRemote)
{ {
if(!initCalc)
{
if(searcher.state == State.FINISHED)
{
reset();
start();
}
initCalc = true;
}
ChargeUtils.discharge(27, this); ChargeUtils.discharge(27, this);
if(MekanismUtils.canFunction(this) && running && getEnergy() >= getPerTick()) if(MekanismUtils.canFunction(this) && running && getEnergy() >= getPerTick() && searcher.state == State.FINISHED && oresToMine.size() > 0)
{ {
setActive(true); setActive(true);
@ -132,48 +150,61 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
if(delay == 0) if(delay == 0)
{ {
currentNode = getNextBlock(); Set<Coord4D> toRemove = new HashSet<Coord4D>();
if(currentNode != null) for(Coord4D obj : oresToMine)
{ {
searched++; if(!obj.exists(worldObj))
if(!currentNode.isAirBlock(worldObj) && !Coord4D.get(this).equals(currentNode) && !(currentNode.getTileEntity(worldObj) instanceof IBoundingBlock))
{ {
int id = currentNode.getBlockId(worldObj); continue;
int meta = currentNode.getMetadata(worldObj); }
boolean hasFilter = false; int id = obj.getBlockId(worldObj);
int meta = obj.getMetadata(worldObj);
for(MinerFilter filter : filters) if(id == 0)
{
toRemove.add(obj);
continue;
}
boolean hasFilter = false;
for(MinerFilter filter : filters)
{
if(filter.canFilter(new ItemStack(id, 1, meta)))
{ {
if(filter.canFilter(new ItemStack(id, 1, meta))) hasFilter = true;
{ break;
hasFilter = true;
break;
}
}
if(inverse ? !hasFilter : hasFilter)
{
List<ItemStack> drops = MinerUtils.getDrops(worldObj, currentNode, silkTouch);
if(canInsert(drops))
{
add(drops);
setReplace(currentNode);
worldObj.playAuxSFXAtEntity(null, 2001, currentNode.xCoord, currentNode.yCoord, currentNode.zCoord, id + (meta << 12));
delay = getDelay();
}
} }
} }
if(inverse ? hasFilter : !hasFilter)
{
toRemove.add(obj);
continue;
}
List<ItemStack> drops = MinerUtils.getDrops(worldObj, obj, silkTouch);
if(canInsert(drops))
{
add(drops);
setReplace(obj);
toRemove.add(obj);
worldObj.playAuxSFXAtEntity(null, 2001, obj.xCoord, obj.yCoord, obj.zCoord, id + (meta << 12));
delay = getDelay();
break;
}
} }
else {
searched = 0; for(Coord4D obj : toRemove)
stop(); {
oresToMine.remove(obj);
} }
} }
} }
@ -221,30 +252,6 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
} }
} }
public Coord4D getNextBlock()
{
if(currentNode == null)
{
return new Coord4D(xCoord-radius, maxY, zCoord-radius, worldObj.provider.dimensionId);
}
if(currentNode.xCoord < xCoord+radius)
{
return currentNode.getFromSide(ForgeDirection.EAST);
}
else if(currentNode.zCoord < zCoord+radius)
{
return new Coord4D(xCoord-radius, currentNode.yCoord, currentNode.zCoord+1);
}
else if(currentNode.yCoord > minY)
{
return new Coord4D(xCoord-radius, currentNode.yCoord-1, zCoord-radius);
}
else {
return null;
}
}
public double getPerTick() public double getPerTick()
{ {
double ret = MekanismUtils.getEnergyPerTick(getSpeedMultiplier(), getEnergyMultiplier(), ENERGY_USAGE); double ret = MekanismUtils.getEnergyPerTick(getSpeedMultiplier(), getEnergyMultiplier(), ENERGY_USAGE);
@ -265,7 +272,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
public int getDelay() public int getDelay()
{ {
return MekanismUtils.getTicks(getSpeedMultiplier(), 60); return MekanismUtils.getTicks(getSpeedMultiplier(), 80);
} }
public void setReplace(Coord4D obj) public void setReplace(Coord4D obj)
@ -443,6 +450,11 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
public void start() public void start()
{ {
if(searcher.state == State.IDLE)
{
searcher.start();
}
running = true; running = true;
MekanismUtils.saveChunk(this); MekanismUtils.saveChunk(this);
@ -450,16 +462,26 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
public void stop() public void stop()
{ {
running = false; if(searcher.state == State.SEARCHING)
{
searcher.interrupt();
reset();
return;
}
else if(searcher.state == State.FINISHED)
{
running = false;
}
MekanismUtils.saveChunk(this); MekanismUtils.saveChunk(this);
} }
public void reset() public void reset()
{ {
searched = 0; searcher = new ThreadMinerSearch(this);
currentNode = null;
running = false; running = false;
oresToMine.clear();
MekanismUtils.saveChunk(this); MekanismUtils.saveChunk(this);
} }
@ -493,14 +515,9 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
delay = nbtTags.getInteger("delay"); delay = nbtTags.getInteger("delay");
silkTouch = nbtTags.getBoolean("silkTouch"); silkTouch = nbtTags.getBoolean("silkTouch");
numPowering = nbtTags.getInteger("numPowering"); numPowering = nbtTags.getInteger("numPowering");
searcher.state = State.values()[nbtTags.getInteger("state")];
controlType = RedstoneControl.values()[nbtTags.getInteger("controlType")]; controlType = RedstoneControl.values()[nbtTags.getInteger("controlType")];
inverse = nbtTags.getBoolean("inverse"); inverse = nbtTags.getBoolean("inverse");
searched = nbtTags.getInteger("searched");
if(nbtTags.hasKey("currentNode"))
{
currentNode = Coord4D.read(nbtTags.getCompoundTag("currentNode"));
}
if(nbtTags.hasKey("replaceStack")) if(nbtTags.hasKey("replaceStack"))
{ {
@ -523,6 +540,11 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
{ {
super.writeToNBT(nbtTags); super.writeToNBT(nbtTags);
if(searcher.state == State.SEARCHING)
{
reset();
}
nbtTags.setInteger("radius", radius); nbtTags.setInteger("radius", radius);
nbtTags.setInteger("minY", minY); nbtTags.setInteger("minY", minY);
nbtTags.setInteger("maxY", maxY); nbtTags.setInteger("maxY", maxY);
@ -533,14 +555,9 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
nbtTags.setInteger("delay", delay); nbtTags.setInteger("delay", delay);
nbtTags.setBoolean("silkTouch", silkTouch); nbtTags.setBoolean("silkTouch", silkTouch);
nbtTags.setInteger("numPowering", numPowering); nbtTags.setInteger("numPowering", numPowering);
nbtTags.setInteger("state", searcher.state.ordinal());
nbtTags.setInteger("controlType", controlType.ordinal()); nbtTags.setInteger("controlType", controlType.ordinal());
nbtTags.setBoolean("inverse", inverse); nbtTags.setBoolean("inverse", inverse);
nbtTags.setInteger("searched", searched);
if(currentNode != null)
{
nbtTags.setCompoundTag("currentNode", currentNode.write(new NBTTagCompound()));
}
if(replaceStack != null) if(replaceStack != null)
{ {
@ -643,6 +660,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
running = dataStream.readBoolean(); running = dataStream.readBoolean();
silkTouch = dataStream.readBoolean(); silkTouch = dataStream.readBoolean();
numPowering = dataStream.readInt(); numPowering = dataStream.readInt();
searcher.state = State.values()[dataStream.readInt()];
if(dataStream.readBoolean()) if(dataStream.readBoolean())
{ {
@ -652,9 +670,9 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
replaceStack = null; replaceStack = null;
} }
clientToMine = dataStream.readInt();
controlType = RedstoneControl.values()[dataStream.readInt()]; controlType = RedstoneControl.values()[dataStream.readInt()];
inverse = dataStream.readBoolean(); inverse = dataStream.readBoolean();
searched = dataStream.readInt();
filters.clear(); filters.clear();
@ -676,6 +694,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
running = dataStream.readBoolean(); running = dataStream.readBoolean();
silkTouch = dataStream.readBoolean(); silkTouch = dataStream.readBoolean();
numPowering = dataStream.readInt(); numPowering = dataStream.readInt();
searcher.state = State.values()[dataStream.readInt()];
if(dataStream.readBoolean()) if(dataStream.readBoolean())
{ {
@ -685,9 +704,9 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
replaceStack = null; replaceStack = null;
} }
clientToMine = dataStream.readInt();
controlType = RedstoneControl.values()[dataStream.readInt()]; controlType = RedstoneControl.values()[dataStream.readInt()];
inverse = dataStream.readBoolean(); inverse = dataStream.readBoolean();
searched = dataStream.readInt();
} }
else if(type == 2) else if(type == 2)
{ {
@ -704,7 +723,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
{ {
isActive = dataStream.readBoolean(); isActive = dataStream.readBoolean();
running = dataStream.readBoolean(); running = dataStream.readBoolean();
searched = dataStream.readInt(); clientToMine = dataStream.readInt();
} }
} }
@ -724,6 +743,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
data.add(running); data.add(running);
data.add(silkTouch); data.add(silkTouch);
data.add(numPowering); data.add(numPowering);
data.add(searcher.state.ordinal());
if(replaceStack != null) if(replaceStack != null)
{ {
@ -735,9 +755,9 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
data.add(false); data.add(false);
} }
data.add(oresToMine.size());
data.add(controlType.ordinal()); data.add(controlType.ordinal());
data.add(inverse); data.add(inverse);
data.add(searched);
data.add(filters.size()); data.add(filters.size());
@ -757,7 +777,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
data.add(isActive); data.add(isActive);
data.add(running); data.add(running);
data.add(searched); data.add(oresToMine.size());
return data; return data;
} }
@ -777,6 +797,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
data.add(running); data.add(running);
data.add(silkTouch); data.add(silkTouch);
data.add(numPowering); data.add(numPowering);
data.add(searcher.state.ordinal());
if(replaceStack != null) if(replaceStack != null)
{ {
@ -788,9 +809,9 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
data.add(false); data.add(false);
} }
data.add(oresToMine.size());
data.add(controlType.ordinal()); data.add(controlType.ordinal());
data.add(inverse); data.add(inverse);
data.add(searched);
return data; return data;
} }

View file

@ -33,7 +33,7 @@ public abstract class Finder
{ {
List<String> oreKeys = MekanismUtils.getOreDictName(stack); List<String> oreKeys = MekanismUtils.getOreDictName(stack);
if(!oreDictName.equals("*") && oreKeys.isEmpty()) if(oreKeys.isEmpty())
{ {
return false; return false;
} }