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.Transmission;
import mekanism.common.inventory.container.ContainerDigitalMiner;
import mekanism.common.miner.ThreadMinerSearch.State;
import mekanism.common.network.PacketDigitalMinerGui;
import mekanism.common.network.PacketDigitalMinerGui.MinerGuiPacket;
import mekanism.common.network.PacketTileEntity;
@ -66,21 +67,21 @@ public class GuiDigitalMiner extends GuiMekanism
buttonList.clear();
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;
}
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;
}
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;
}
@ -120,7 +121,7 @@ public class GuiDigitalMiner extends GuiMekanism
{
super.updateScreen();
if(tileEntity.running)
if(tileEntity.searcher.state != State.IDLE && tileEntity.running)
{
startButton.enabled = false;
}
@ -128,7 +129,7 @@ public class GuiDigitalMiner extends GuiMekanism
startButton.enabled = true;
}
if(!tileEntity.running)
if(tileEntity.searcher.state == State.IDLE || !tileEntity.running)
{
stopButton.enabled = false;
}
@ -136,7 +137,7 @@ public class GuiDigitalMiner extends GuiMekanism
stopButton.enabled = true;
}
if(tileEntity.running || tileEntity.searched > 0)
if(tileEntity.searcher.state != State.IDLE)
{
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(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.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.searched") + ":", 9, 59, 0x00CD00);
fontRenderer.drawString("" + tileEntity.searched, 9, 68, 0x00CD00);
fontRenderer.drawString(MekanismUtils.localize("gui.digitalMiner.toMine") + ":", 9, 59, 0x00CD00);
fontRenderer.drawString("" + tileEntity.clientToMine, 9, 68, 0x00CD00);
if(tileEntity.replaceStack != null)
{

View file

@ -82,20 +82,16 @@ public class ItemProxy extends Item
public void registerIcons(IconRegister register) {}
@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;
for(Object o : player.inventoryContainer.inventorySlots)
EntityPlayer player = (EntityPlayer) par3Entity;
for (Object o : player.inventoryContainer.inventorySlots)
{
Slot s = (Slot)o;
if(s.getStack() != null && s.getStack().getItem() == this)
{
Slot s = (Slot) o;
if (s.getStack() != null && s.getStack().getItem() == this)
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;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import mekanism.api.Coord4D;
import mekanism.common.HashList;
import mekanism.common.IActiveState;
import mekanism.common.IAdvancedBoundingBlock;
import mekanism.common.IBoundingBlock;
import mekanism.common.ILogisticalTransporter;
import mekanism.common.IRedstoneControl;
import mekanism.common.IUpgradeTile;
@ -21,6 +22,8 @@ import mekanism.common.inventory.container.ContainerNull;
import mekanism.common.miner.MItemStackFilter;
import mekanism.common.miner.MOreDictFilter;
import mekanism.common.miner.MinerFilter;
import mekanism.common.miner.ThreadMinerSearch;
import mekanism.common.miner.ThreadMinerSearch.State;
import mekanism.common.network.PacketTileEntity;
import mekanism.common.tile.component.TileComponentUpgrade;
import mekanism.common.transporter.InvStack;
@ -52,11 +55,11 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
{
public static int[] EJECT_INV;
public int searched = 0;
public List<Coord4D> oresToMine = new ArrayList<Coord4D>();
public HashList<MinerFilter> filters = new HashList<MinerFilter>();
public Coord4D currentNode;
public ThreadMinerSearch searcher = new ThreadMinerSearch(this);
public final double ENERGY_USAGE = Mekanism.digitalMinerUsage;
@ -72,6 +75,8 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
public int delay;
public int clientToMine;
public ItemStack replaceStack;
public boolean isActive;
@ -85,6 +90,8 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
public int delayTicks;
public boolean initCalc = false;
public int numPowering;
/** This machine's current RedstoneControl type. */
@ -117,9 +124,20 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
if(!worldObj.isRemote)
{
if(!initCalc)
{
if(searcher.state == State.FINISHED)
{
reset();
start();
}
initCalc = true;
}
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);
@ -132,48 +150,61 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
if(delay == 0)
{
currentNode = getNextBlock();
Set<Coord4D> toRemove = new HashSet<Coord4D>();
if(currentNode != null)
for(Coord4D obj : oresToMine)
{
searched++;
if(!currentNode.isAirBlock(worldObj) && !Coord4D.get(this).equals(currentNode) && !(currentNode.getTileEntity(worldObj) instanceof IBoundingBlock))
if(!obj.exists(worldObj))
{
int id = currentNode.getBlockId(worldObj);
int meta = currentNode.getMetadata(worldObj);
continue;
}
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;
}
}
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();
}
hasFilter = true;
break;
}
}
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;
stop();
for(Coord4D obj : toRemove)
{
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()
{
double ret = MekanismUtils.getEnergyPerTick(getSpeedMultiplier(), getEnergyMultiplier(), ENERGY_USAGE);
@ -265,7 +272,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
public int getDelay()
{
return MekanismUtils.getTicks(getSpeedMultiplier(), 60);
return MekanismUtils.getTicks(getSpeedMultiplier(), 80);
}
public void setReplace(Coord4D obj)
@ -443,6 +450,11 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
public void start()
{
if(searcher.state == State.IDLE)
{
searcher.start();
}
running = true;
MekanismUtils.saveChunk(this);
@ -450,16 +462,26 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
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);
}
public void reset()
{
searched = 0;
currentNode = null;
searcher = new ThreadMinerSearch(this);
running = false;
oresToMine.clear();
MekanismUtils.saveChunk(this);
}
@ -493,14 +515,9 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
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");
searched = nbtTags.getInteger("searched");
if(nbtTags.hasKey("currentNode"))
{
currentNode = Coord4D.read(nbtTags.getCompoundTag("currentNode"));
}
if(nbtTags.hasKey("replaceStack"))
{
@ -523,6 +540,11 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
{
super.writeToNBT(nbtTags);
if(searcher.state == State.SEARCHING)
{
reset();
}
nbtTags.setInteger("radius", radius);
nbtTags.setInteger("minY", minY);
nbtTags.setInteger("maxY", maxY);
@ -533,14 +555,9 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
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);
nbtTags.setInteger("searched", searched);
if(currentNode != null)
{
nbtTags.setCompoundTag("currentNode", currentNode.write(new NBTTagCompound()));
}
if(replaceStack != null)
{
@ -643,6 +660,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
running = dataStream.readBoolean();
silkTouch = dataStream.readBoolean();
numPowering = dataStream.readInt();
searcher.state = State.values()[dataStream.readInt()];
if(dataStream.readBoolean())
{
@ -652,9 +670,9 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
replaceStack = null;
}
clientToMine = dataStream.readInt();
controlType = RedstoneControl.values()[dataStream.readInt()];
inverse = dataStream.readBoolean();
searched = dataStream.readInt();
filters.clear();
@ -676,6 +694,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
running = dataStream.readBoolean();
silkTouch = dataStream.readBoolean();
numPowering = dataStream.readInt();
searcher.state = State.values()[dataStream.readInt()];
if(dataStream.readBoolean())
{
@ -685,9 +704,9 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
replaceStack = null;
}
clientToMine = dataStream.readInt();
controlType = RedstoneControl.values()[dataStream.readInt()];
inverse = dataStream.readBoolean();
searched = dataStream.readInt();
}
else if(type == 2)
{
@ -704,7 +723,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
{
isActive = 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(silkTouch);
data.add(numPowering);
data.add(searcher.state.ordinal());
if(replaceStack != null)
{
@ -735,9 +755,9 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
data.add(false);
}
data.add(oresToMine.size());
data.add(controlType.ordinal());
data.add(inverse);
data.add(searched);
data.add(filters.size());
@ -757,7 +777,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
data.add(isActive);
data.add(running);
data.add(searched);
data.add(oresToMine.size());
return data;
}
@ -777,6 +797,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
data.add(running);
data.add(silkTouch);
data.add(numPowering);
data.add(searcher.state.ordinal());
if(replaceStack != null)
{
@ -788,9 +809,9 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
data.add(false);
}
data.add(oresToMine.size());
data.add(controlType.ordinal());
data.add(inverse);
data.add(searched);
return data;
}

View file

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