Digital Miner now mines blocks one chunk at a time - this will make the chunkloading upgrade easy.

This commit is contained in:
Aidan C. Brady 2014-08-08 14:45:09 -04:00
parent c04fdd4432
commit 3523d03274
2 changed files with 133 additions and 71 deletions

View file

@ -4,8 +4,9 @@ import java.util.BitSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import mekanism.api.util.BlockInfo; import mekanism.api.Chunk3D;
import mekanism.api.Coord4D; import mekanism.api.Coord4D;
import mekanism.api.util.BlockInfo;
import mekanism.common.tile.TileEntityBoundingBlock; import mekanism.common.tile.TileEntityBoundingBlock;
import mekanism.common.tile.TileEntityDigitalMiner; import mekanism.common.tile.TileEntityDigitalMiner;
import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils;
@ -18,7 +19,7 @@ public class ThreadMinerSearch extends Thread
public State state = State.IDLE; public State state = State.IDLE;
public BitSet oresToMine = new BitSet(); public Map<Chunk3D, BitSet> oresToMine = new HashMap<Chunk3D, BitSet>();
public Map<Integer, MinerFilter> replaceMap = new HashMap<Integer, MinerFilter>(); public Map<Integer, MinerFilter> replaceMap = new HashMap<Integer, MinerFilter>();
public Map<BlockInfo, MinerFilter> acceptedItems = new HashMap<BlockInfo, MinerFilter>(); public Map<BlockInfo, MinerFilter> acceptedItems = new HashMap<BlockInfo, MinerFilter>();
@ -110,7 +111,7 @@ public class ThreadMinerSearch extends Thread
if(canFilter) if(canFilter)
{ {
oresToMine.set(i); set(i, new Coord4D(x, y, z, tileEntity.getWorldObj().provider.dimensionId));
replaceMap.put(i, filterFound); replaceMap.put(i, filterFound);
found++; found++;
@ -123,6 +124,18 @@ public class ThreadMinerSearch extends Thread
tileEntity.replaceMap = replaceMap; tileEntity.replaceMap = replaceMap;
MekanismUtils.saveChunk(tileEntity); MekanismUtils.saveChunk(tileEntity);
} }
public void set(int i, Coord4D location)
{
Chunk3D chunk = new Chunk3D(location);
if(oresToMine.get(chunk) == null)
{
oresToMine.put(chunk, new BitSet());
}
oresToMine.get(chunk).set(i);
}
public void reset() public void reset()
{ {

View file

@ -11,9 +11,10 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import mekanism.api.Chunk3D;
import mekanism.api.Coord4D; import mekanism.api.Coord4D;
import mekanism.api.Range4D;
import mekanism.api.MekanismConfig.usage; import mekanism.api.MekanismConfig.usage;
import mekanism.api.Range4D;
import mekanism.common.HashList; import mekanism.common.HashList;
import mekanism.common.IActiveState; import mekanism.common.IActiveState;
import mekanism.common.IAdvancedBoundingBlock; import mekanism.common.IAdvancedBoundingBlock;
@ -65,7 +66,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
{ {
public static int[] EJECT_INV; public static int[] EJECT_INV;
public BitSet oresToMine = new BitSet(); public Map<Chunk3D, BitSet> oresToMine = new HashMap<Chunk3D, BitSet>();
public Map<Integer, MinerFilter> replaceMap = new HashMap<Integer, MinerFilter>(); public Map<Integer, MinerFilter> replaceMap = new HashMap<Integer, MinerFilter>();
public HashList<MinerFilter> filters = new HashList<MinerFilter>(); public HashList<MinerFilter> filters = new HashList<MinerFilter>();
@ -150,7 +151,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
ChargeUtils.discharge(27, this); ChargeUtils.discharge(27, this);
if(MekanismUtils.canFunction(this) && running && getEnergy() >= getPerTick() && searcher.state == State.FINISHED && oresToMine.cardinality() > 0) if(MekanismUtils.canFunction(this) && running && getEnergy() >= getPerTick() && searcher.state == State.FINISHED && oresToMine.size() > 0)
{ {
setActive(true); setActive(true);
@ -163,74 +164,110 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
if(delay == 0) if(delay == 0)
{ {
Set<Integer> toRemove = new HashSet<Integer>(); Set<Chunk3D> toRemove = new HashSet<Chunk3D>();
boolean did = false;
int next = 0;
for(Chunk3D chunk : oresToMine.keySet())
while(true)
{ {
int index = oresToMine.nextSetBit(next); BitSet set = oresToMine.get(chunk);
Coord4D coord = getCoordFromIndex(index); int next = 0;
if(index == -1) while(true)
{
int index = set.nextSetBit(next);
Coord4D coord = getCoordFromIndex(index);
if(index == -1)
{
toRemove.add(chunk);
break;
}
if(!coord.exists(worldObj))
{
set.clear(index);
if(set.cardinality() == 0)
{
toRemove.add(chunk);
}
next = index + 1;
continue;
}
Block block = coord.getBlock(worldObj);
int meta = coord.getMetadata(worldObj);
if(block == null || coord.isAirBlock(worldObj))
{
set.clear(index);
if(set.cardinality() == 0)
{
toRemove.add(chunk);
}
next = index + 1;
continue;
}
boolean hasFilter = false;
for(MinerFilter filter : filters)
{
if(filter.canFilter(new ItemStack(block, 1, meta)))
{
hasFilter = true;
break;
}
}
if(inverse ? hasFilter : !hasFilter)
{
set.clear(index);
if(set.cardinality() == 0)
{
toRemove.add(chunk);
break;
}
next = index + 1;
continue;
}
List<ItemStack> drops = MinerUtils.getDrops(worldObj, coord, silkTouch);
if(canInsert(drops) && setReplace(coord, index))
{
did = true;
add(drops);
set.clear(index);
if(set.cardinality() == 0)
{
toRemove.add(chunk);
}
worldObj.playAuxSFXAtEntity(null, 2001, coord.xCoord, coord.yCoord, coord.zCoord, Block.getIdFromBlock(block) + (meta << 12));
missingStack = null;
delay = getDelay();
}
break;
}
if(did)
{ {
break; break;
} }
if(!coord.exists(worldObj))
{
toRemove.add(index);
next = index + 1;
continue;
}
Block block = coord.getBlock(worldObj);
int meta = coord.getMetadata(worldObj);
if(block == null || coord.isAirBlock(worldObj))
{
toRemove.add(index);
next = index + 1;
continue;
}
boolean hasFilter = false;
for(MinerFilter filter : filters)
{
if(filter.canFilter(new ItemStack(block, 1, meta)))
{
hasFilter = true;
break;
}
}
if(inverse ? hasFilter : !hasFilter)
{
toRemove.add(index);
next = index + 1;
continue;
}
List<ItemStack> drops = MinerUtils.getDrops(worldObj, coord, silkTouch);
if(canInsert(drops) && setReplace(coord, index))
{
add(drops);
toRemove.add(index);
worldObj.playAuxSFXAtEntity(null, 2001, coord.xCoord, coord.yCoord, coord.zCoord, Block.getIdFromBlock(block) + (meta << 12));
missingStack = null;
delay = getDelay();
}
break;
} }
for(Integer i : toRemove) for(Chunk3D chunk : toRemove)
{ {
oresToMine.clear(i); oresToMine.remove(chunk);
} }
} }
} }
@ -544,6 +581,18 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
return false; return false;
} }
public int getSize()
{
int size = 0;
for(Chunk3D chunk : oresToMine.keySet())
{
size += oresToMine.get(chunk).cardinality();
}
return size;
}
@Override @Override
public void openInventory() public void openInventory()
@ -797,7 +846,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
data.add(searcher.found); data.add(searcher.found);
} }
else { else {
data.add(oresToMine.cardinality()); data.add(getSize());
} }
data.add(controlType.ordinal()); data.add(controlType.ordinal());
@ -837,7 +886,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
data.add(searcher.found); data.add(searcher.found);
} }
else { else {
data.add(oresToMine.cardinality()); data.add(getSize());
} }
if(missingStack != null) if(missingStack != null)
@ -875,7 +924,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I
data.add(searcher.found); data.add(searcher.found);
} }
else { else {
data.add(oresToMine.cardinality()); data.add(getSize());
} }
data.add(controlType.ordinal()); data.add(controlType.ordinal());