Cleanup of drain code
rewrote pathfinder as well so not to need the second path finder to find highest block. Instead it works its way up first, then to everywhere else.
This commit is contained in:
parent
dc5d67a22d
commit
7967909aa0
2 changed files with 114 additions and 120 deletions
|
@ -47,6 +47,7 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
{
|
||||
return "Set to " + (canDrainSources() ? "input liquids" : "output liquids");
|
||||
}
|
||||
|
||||
public boolean canDrainSources()
|
||||
{
|
||||
int meta = 0;
|
||||
|
@ -56,6 +57,7 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
}
|
||||
return meta < 6;
|
||||
}
|
||||
|
||||
public ForgeDirection getFacing()
|
||||
{
|
||||
int meta = 0;
|
||||
|
@ -73,49 +75,21 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
@Override
|
||||
public void updateEntity()
|
||||
{
|
||||
|
||||
if (!this.worldObj.isRemote)
|
||||
{
|
||||
if (this.ticks % (20 + new Random().nextInt(100)) == 0 && updateQue.size() > 0)
|
||||
{
|
||||
Iterator pp = this.updateQue.iterator();
|
||||
while (pp.hasNext())
|
||||
{
|
||||
Vector3 vec = (Vector3) pp.next();
|
||||
worldObj.markBlockForUpdate(vec.intX(), vec.intY(), vec.intZ());
|
||||
pp.remove();
|
||||
}
|
||||
}
|
||||
if (this.ticks % 20 == 0)
|
||||
{
|
||||
/* CLEANUP MAP */
|
||||
Iterator mn = this.requestMap.entrySet().iterator();
|
||||
while (mn.hasNext())
|
||||
{
|
||||
Entry<TileEntityConstructionPump, LiquidStack> entry = (Entry<TileEntityConstructionPump, LiquidStack>) mn.next();
|
||||
TileEntity entity = entry.getKey();
|
||||
if (entity == null)
|
||||
{
|
||||
mn.remove();
|
||||
}
|
||||
else if (entity.isInvalid())
|
||||
{
|
||||
mn.remove();
|
||||
}
|
||||
}
|
||||
|
||||
this.currentDrains = 0;
|
||||
/* MAIN LOGIC PATH FOR DRAINING BODIES OF LIQUID */
|
||||
if (this.canDrainSources())
|
||||
if (!this.worldObj.isRemote && this.canDrainSources() && this.ticks % 20 == 0 && this.requestMap.size() > 0)
|
||||
{
|
||||
this.currentDrains = 0;
|
||||
this.doCleanup();
|
||||
/* ONLY FIND NEW SOURCES IF OUR CURRENT LIST RUNS DRY */
|
||||
if (this.targetSources.size() < this.MAX_DRAIN_PER_PROCESS + 10)
|
||||
{
|
||||
this.getNextFluidBlock();
|
||||
}
|
||||
|
||||
TileEntity pipe = VectorHelper.getTileEntityFromSide(worldObj, new Vector3(this), this.getFacing().getOpposite());
|
||||
|
||||
if (pipe instanceof IFluidNetworkPart)
|
||||
{
|
||||
if (this.requestMap.size() > 0)
|
||||
{
|
||||
this.getNextFluidBlock();
|
||||
|
||||
for (Entry<TileEntityConstructionPump, LiquidStack> request : requestMap.entrySet())
|
||||
{
|
||||
if (this.currentDrains >= MAX_DRAIN_PER_PROCESS)
|
||||
|
@ -125,7 +99,6 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
if (((IFluidNetworkPart) pipe).getNetwork().isConnected(request.getKey()) && targetSources.size() > 0)
|
||||
{
|
||||
Iterator it = this.targetSources.iterator();
|
||||
int m = 0;
|
||||
while (it.hasNext())
|
||||
{
|
||||
Vector3 loc = (Vector3) it.next();
|
||||
|
@ -136,6 +109,7 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
|
||||
if (FluidHelper.isSourceBlock(this.worldObj, loc))
|
||||
{
|
||||
/* GET STACKS */
|
||||
LiquidStack stack = FluidHelper.getLiquidFromBlockId(loc.getBlockID(this.worldObj));
|
||||
LiquidStack requestStack = request.getValue();
|
||||
|
||||
|
@ -143,6 +117,8 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
{
|
||||
if (request.getKey().fill(0, stack, false) > 0)
|
||||
{
|
||||
|
||||
/* EDIT REQUEST IN MAP */
|
||||
int requestAmmount = requestStack.amount - request.getKey().fill(0, stack, true);
|
||||
if (requestAmmount <= 0)
|
||||
{
|
||||
|
@ -152,10 +128,14 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
{
|
||||
request.setValue(FluidHelper.getStack(requestStack, requestAmmount));
|
||||
}
|
||||
if (++m >= 3 && !this.updateQue.contains(loc))
|
||||
|
||||
/* ADD TO UPDATE QUE */
|
||||
if (!this.updateQue.contains(loc))
|
||||
{
|
||||
this.updateQue.add(loc);
|
||||
}
|
||||
|
||||
/* REMOVE BLOCK */
|
||||
loc.setBlock(this.worldObj, 0, 0, 2);
|
||||
this.currentDrains++;
|
||||
it.remove();
|
||||
|
@ -169,12 +149,52 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
}
|
||||
}
|
||||
}
|
||||
// END OF DRAIN
|
||||
else
|
||||
|
||||
/**
|
||||
* Finds more liquid blocks using a path finder to be drained
|
||||
*/
|
||||
public void getNextFluidBlock()
|
||||
{
|
||||
// TODO time to have fun finding a place for this block to exist
|
||||
//this.fillArea(LiquidDictionary.getLiquid("Water", LiquidContainerRegistry.BUCKET_VOLUME * 5), true);
|
||||
PathfinderCheckerLiquid pathFinder = new PathfinderCheckerLiquid(this.worldObj, this);
|
||||
pathFinder.init(new Vector3(this.xCoord + this.getFacing().offsetX, this.yCoord + this.getFacing().offsetY, this.zCoord + this.getFacing().offsetZ));
|
||||
}
|
||||
|
||||
public void doCleanup()
|
||||
{
|
||||
/* CALL UPDATE ON EDITED BLOCKS */
|
||||
if (this.ticks % 100 == 0 && updateQue.size() > 0)
|
||||
{
|
||||
Iterator pp = this.updateQue.iterator();
|
||||
while (pp.hasNext())
|
||||
{
|
||||
Vector3 vec = (Vector3) pp.next();
|
||||
worldObj.markBlockForUpdate(vec.intX(), vec.intY(), vec.intZ());
|
||||
pp.remove();
|
||||
}
|
||||
}
|
||||
/* CLEANUP REQUEST MAP AND REMOVE INVALID TILES */
|
||||
Iterator requests = this.requestMap.entrySet().iterator();
|
||||
while (requests.hasNext())
|
||||
{
|
||||
Entry<TileEntityConstructionPump, LiquidStack> entry = (Entry<TileEntityConstructionPump, LiquidStack>) requests.next();
|
||||
TileEntity entity = entry.getKey();
|
||||
if (entity == null)
|
||||
{
|
||||
requests.remove();
|
||||
}
|
||||
else if (entity.isInvalid())
|
||||
{
|
||||
requests.remove();
|
||||
}
|
||||
}
|
||||
/* CLEANUP TARGET LIST AND REMOVE INVALID SOURCES */
|
||||
Iterator mn = this.targetSources.iterator();
|
||||
while (mn.hasNext())
|
||||
{
|
||||
Vector3 vec = (Vector3) mn.next();
|
||||
if (!FluidHelper.isSourceBlock(this.worldObj, vec))
|
||||
{
|
||||
mn.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -183,6 +203,7 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
public int fillArea(LiquidStack resource, boolean doFill)
|
||||
{
|
||||
int drained = 0;
|
||||
/* INIT SET FILL HEIGHT */
|
||||
if (yFillStart == 0 || yFillStart >= 255)
|
||||
{
|
||||
yFillStart = this.yCoord + this.getFacing().offsetY;
|
||||
|
@ -190,13 +211,12 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
|
||||
if (!this.canDrainSources())
|
||||
{
|
||||
System.out.println("Filling Area: " + doFill);
|
||||
/* ID LIQUID BLOCK AND SET VARS FOR BLOCK PLACEMENT */
|
||||
if (resource == null || resource.amount < LiquidContainerRegistry.BUCKET_VOLUME)
|
||||
{
|
||||
System.out.println("Invalid Resource");
|
||||
return 0;
|
||||
}
|
||||
System.out.println("Resource: " + LiquidDictionary.findLiquidName(resource) + ":" + resource.amount);
|
||||
|
||||
int blockID = resource.itemID;
|
||||
int meta = resource.itemMeta;
|
||||
if (resource.itemID == Block.waterStill.blockID)
|
||||
|
@ -222,9 +242,11 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
|
||||
int blocks = (resource.amount / LiquidContainerRegistry.BUCKET_VOLUME);
|
||||
|
||||
/* FIND ALL VALID BLOCKS ON LEVEL OR BELLOW */
|
||||
PathfinderCheckerFindFillable pathFinder = new PathfinderCheckerFindFillable(this.worldObj);
|
||||
pathFinder.init(new Vector3(this.xCoord + this.getFacing().offsetX, yFillStart, this.zCoord + this.getFacing().offsetZ));
|
||||
System.out.println("Nodes: " + pathFinder.closedSet.size());
|
||||
|
||||
/* START FILLING IN OR CHECKING IF CAN FILL AREA */
|
||||
int fillable = 0;
|
||||
for (Vector3 loc : pathFinder.closedSet)
|
||||
{
|
||||
|
@ -240,7 +262,6 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
blocks--;
|
||||
if (doFill)
|
||||
{
|
||||
System.out.println("PlacedAt:Flowing: " + loc.toString());
|
||||
loc.setBlock(worldObj, blockID, meta);
|
||||
if (!this.updateQue.contains(loc))
|
||||
{
|
||||
|
@ -264,7 +285,6 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
blocks--;
|
||||
if (doFill)
|
||||
{
|
||||
System.out.println("PlacedAt:Air: " + loc.toString());
|
||||
loc.setBlock(worldObj, blockID, meta);
|
||||
if (!this.updateQue.contains(loc))
|
||||
{
|
||||
|
@ -273,6 +293,8 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* IF NO FILL TARGETS WERE FOUND ON THIS LEVEL INCREASE YFILLSTART */
|
||||
if (fillable == 0)
|
||||
{
|
||||
this.yFillStart++;
|
||||
|
@ -310,28 +332,6 @@ public class TileEntityDrain extends TileEntityFluidDevice implements ITankConta
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds more liquid blocks using a path finder to be drained
|
||||
*/
|
||||
public void getNextFluidBlock()
|
||||
{
|
||||
/* FIND HIGHEST DRAIN POINT FIRST */
|
||||
PathfinderFindHighestSource path = new PathfinderFindHighestSource(this.worldObj, null);
|
||||
path.init(new Vector3(this.xCoord + this.getFacing().offsetX, this.yCoord + this.getFacing().offsetY, this.zCoord + this.getFacing().offsetZ));
|
||||
int y = path.highestY;
|
||||
|
||||
/* FIND 10 UNMARKED SOURCES */
|
||||
PathfinderCheckerLiquid pathFinder = new PathfinderCheckerLiquid(this.worldObj, new Vector3(this), null);
|
||||
pathFinder.init(new Vector3(this.xCoord, y, this.zCoord));
|
||||
for (Vector3 loc : pathFinder.closedSet)
|
||||
{
|
||||
if (!this.targetSources.contains(loc))
|
||||
{
|
||||
this.targetSources.add(loc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int fill(ForgeDirection from, LiquidStack resource, boolean doFill)
|
||||
{
|
||||
|
|
|
@ -22,7 +22,7 @@ public class PathfinderCheckerLiquid extends Pathfinder
|
|||
{
|
||||
public List<Vector3> targetList = new ArrayList<Vector3>();
|
||||
|
||||
public PathfinderCheckerLiquid(final World world, final Vector3 callLoc, final LiquidStack resource, final Vector3... ignoreList)
|
||||
public PathfinderCheckerLiquid(final World world, final TileEntityDrain drain)
|
||||
{
|
||||
super(new IPathCallBack()
|
||||
{
|
||||
|
@ -34,8 +34,7 @@ public class PathfinderCheckerLiquid extends Pathfinder
|
|||
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS)
|
||||
{
|
||||
Vector3 pos = currentNode.clone().modifyPositionFromSide(direction);
|
||||
LiquidStack liquid = FluidHelper.getLiquidFromBlockId(pos.getBlockID(world));
|
||||
if (pos.getBlockID(world) != 0 && liquid != null && (liquid.equals(resource) || resource == null))
|
||||
if (FluidHelper.isSourceBlock(world, pos))
|
||||
{
|
||||
neighbors.add(pos);
|
||||
}
|
||||
|
@ -47,14 +46,9 @@ public class PathfinderCheckerLiquid extends Pathfinder
|
|||
@Override
|
||||
public boolean onSearch(Pathfinder finder, Vector3 node)
|
||||
{
|
||||
LiquidStack liquid = FluidHelper.getLiquidFromBlockId(node.getBlockID(world));
|
||||
if (liquid != null && (liquid.equals(resource) || resource == null) && node.getBlockMetadata(world) == 0)
|
||||
if (FluidHelper.isSourceBlock(world, node))
|
||||
{
|
||||
TileEntity entity = callLoc.getTileEntity(world);
|
||||
if (entity instanceof TileEntityDrain)
|
||||
{
|
||||
((TileEntityDrain) entity).addVectorToQue(node);
|
||||
}
|
||||
drain.addVectorToQue(node);
|
||||
}
|
||||
if (finder.closedSet.size() >= 2000)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue