Implemented the new changes into TankUpdateProtocol
This commit is contained in:
parent
7e6be317af
commit
66971fd753
4 changed files with 80 additions and 445 deletions
|
@ -1,196 +1,89 @@
|
||||||
package mekanism.common.content.tank;
|
package mekanism.common.content.tank;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import mekanism.api.Coord4D;
|
import mekanism.api.Coord4D;
|
||||||
import mekanism.api.util.StackUtils;
|
import mekanism.api.util.StackUtils;
|
||||||
import mekanism.common.Mekanism;
|
import mekanism.common.Mekanism;
|
||||||
import mekanism.common.MekanismBlocks;
|
import mekanism.common.MekanismBlocks;
|
||||||
import mekanism.common.content.tank.SynchronizedTankData.ValveData;
|
import mekanism.common.content.tank.SynchronizedTankData.ValveData;
|
||||||
|
import mekanism.common.multiblock.MultiblockCache;
|
||||||
|
import mekanism.common.multiblock.MultiblockManager;
|
||||||
|
import mekanism.common.multiblock.SynchronizedData;
|
||||||
|
import mekanism.common.multiblock.UpdateProtocol;
|
||||||
import mekanism.common.tile.TileEntityDynamicTank;
|
import mekanism.common.tile.TileEntityDynamicTank;
|
||||||
import mekanism.common.tile.TileEntityDynamicValve;
|
import mekanism.common.tile.TileEntityDynamicValve;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.world.World;
|
|
||||||
import net.minecraftforge.common.util.ForgeDirection;
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
|
|
||||||
public class TankUpdateProtocol
|
public class TankUpdateProtocol extends UpdateProtocol<SynchronizedTankData>
|
||||||
{
|
{
|
||||||
public static final int FLUID_PER_TANK = 16000;
|
public static final int FLUID_PER_TANK = 16000;
|
||||||
|
|
||||||
/** The dynamic tank nodes that have already been iterated over. */
|
public TankUpdateProtocol(TileEntityDynamicTank tileEntity)
|
||||||
public Set<TileEntityDynamicTank> iteratedNodes = new HashSet<TileEntityDynamicTank>();
|
|
||||||
|
|
||||||
/** The structures found, all connected by some nodes to the pointer. */
|
|
||||||
public SynchronizedTankData structureFound = null;
|
|
||||||
|
|
||||||
/** The original block the calculation is getting run from. */
|
|
||||||
public TileEntity pointer;
|
|
||||||
|
|
||||||
public TankUpdateProtocol(TileEntity tileEntity)
|
|
||||||
{
|
{
|
||||||
pointer = tileEntity;
|
super(tileEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Recursively loops through each node connected to the given TileEntity.
|
protected boolean isValidFrame(int x, int y, int z)
|
||||||
* @param tile - the TileEntity to loop over
|
|
||||||
*/
|
|
||||||
public void loopThrough(TileEntity tile)
|
|
||||||
{
|
{
|
||||||
World worldObj = tile.getWorldObj();
|
return pointer.getWorldObj().getBlock(x, y, z) == MekanismBlocks.BasicBlock && pointer.getWorldObj().getBlockMetadata(x, y, z) == 9;
|
||||||
|
}
|
||||||
|
|
||||||
int origX = tile.xCoord, origY = tile.yCoord, origZ = tile.zCoord;
|
@Override
|
||||||
|
protected DynamicTankCache getNewCache()
|
||||||
boolean isCorner = true;
|
|
||||||
boolean isHollow = true;
|
|
||||||
boolean rightBlocks = true;
|
|
||||||
boolean rightFrame = true;
|
|
||||||
|
|
||||||
Set<Coord4D> locations = new HashSet<Coord4D>();
|
|
||||||
|
|
||||||
int xmin = 0, xmax = 0, ymin = 0, ymax = 0, zmin = 0, zmax = 0;
|
|
||||||
|
|
||||||
int x = 0, y = 0, z = 0;
|
|
||||||
|
|
||||||
int volume = 0;
|
|
||||||
|
|
||||||
if((isViableNode(origX + 1, origY, origZ) && isViableNode(origX - 1, origY, origZ)) ||
|
|
||||||
(isViableNode(origX, origY + 1, origZ) && isViableNode(origX, origY - 1, origZ)) ||
|
|
||||||
(isViableNode(origX, origY, origZ + 1) && isViableNode(origX, origY, origZ - 1)))
|
|
||||||
{
|
{
|
||||||
isCorner = false;
|
return new DynamicTankCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isCorner)
|
@Override
|
||||||
|
protected SynchronizedTankData getNewStructure()
|
||||||
{
|
{
|
||||||
if(isViableNode(origX+1, origY, origZ))
|
return new SynchronizedTankData();
|
||||||
{
|
|
||||||
xmin = 0;
|
|
||||||
|
|
||||||
while(isViableNode(origX+x+1, origY, origZ))
|
|
||||||
{
|
|
||||||
x++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
xmax = x;
|
@Override
|
||||||
}
|
protected MultiblockManager<SynchronizedTankData> getManager()
|
||||||
else {
|
|
||||||
xmax = 0;
|
|
||||||
|
|
||||||
while(isViableNode(origX+x-1, origY, origZ))
|
|
||||||
{
|
{
|
||||||
x--;
|
return Mekanism.tankManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
xmin = x;
|
@Override
|
||||||
|
protected void mergeCaches(List<ItemStack> rejectedItems, MultiblockCache<SynchronizedTankData> cache, MultiblockCache<SynchronizedTankData> merge)
|
||||||
|
{
|
||||||
|
if(((DynamicTankCache)cache).fluid == null)
|
||||||
|
{
|
||||||
|
((DynamicTankCache)cache).fluid = ((DynamicTankCache)merge).fluid;
|
||||||
|
}
|
||||||
|
else if(((DynamicTankCache)merge).fluid != null && ((DynamicTankCache)cache).fluid.isFluidEqual(((DynamicTankCache)merge).fluid))
|
||||||
|
{
|
||||||
|
((DynamicTankCache)cache).fluid.amount += ((DynamicTankCache)merge).fluid.amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isViableNode(origX, origY+1, origZ))
|
List<ItemStack> rejects = StackUtils.getMergeRejects(((DynamicTankCache)cache).inventory, ((DynamicTankCache)merge).inventory);
|
||||||
{
|
|
||||||
ymin = 0;
|
|
||||||
|
|
||||||
while(isViableNode(origX, origY+y+1, origZ))
|
if(!rejects.isEmpty())
|
||||||
{
|
{
|
||||||
y++;
|
rejectedItems.addAll(rejects);
|
||||||
}
|
}
|
||||||
|
|
||||||
ymax = y;
|
StackUtils.merge(((DynamicTankCache)cache).inventory, ((DynamicTankCache)merge).inventory);
|
||||||
}
|
|
||||||
else {
|
|
||||||
ymax = 0;
|
|
||||||
|
|
||||||
while(isViableNode(origX, origY+y-1 ,origZ))
|
|
||||||
{
|
|
||||||
y--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ymin = y;
|
@Override
|
||||||
}
|
protected void onFormed()
|
||||||
|
|
||||||
if(isViableNode(origX, origY, origZ+1))
|
|
||||||
{
|
{
|
||||||
zmin = 0;
|
if(((SynchronizedTankData)structureFound).fluidStored != null)
|
||||||
|
|
||||||
while(isViableNode(origX, origY, origZ+z+1))
|
|
||||||
{
|
{
|
||||||
z++;
|
((SynchronizedTankData)structureFound).fluidStored.amount = Math.min(((SynchronizedTankData)structureFound).fluidStored.amount, structureFound.volume*FLUID_PER_TANK);
|
||||||
}
|
|
||||||
|
|
||||||
zmax = z;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
zmax = 0;
|
|
||||||
|
|
||||||
while(isViableNode(origX, origY, origZ+z-1))
|
|
||||||
{
|
|
||||||
z--;
|
|
||||||
}
|
|
||||||
|
|
||||||
zmin = z;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(x = xmin; x <= xmax; x++)
|
|
||||||
{
|
|
||||||
for(y = ymin; y <= ymax; y++)
|
|
||||||
{
|
|
||||||
for(z = zmin; z <= zmax; z++)
|
|
||||||
{
|
|
||||||
if(x == xmin || x == xmax || y == ymin || y == ymax || z == zmin || z == zmax)
|
|
||||||
{
|
|
||||||
if(!isViableNode(origX+x, origY+y, origZ+z))
|
|
||||||
{
|
|
||||||
rightBlocks = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if(isFrame(Coord4D.get(tile).translate(x, y, z), origX+xmin, origX+xmax, origY+ymin, origY+ymax, origZ+zmin, origZ+zmax) && !isValidFrame(origX+x, origY+y, origZ+z))
|
|
||||||
{
|
|
||||||
rightFrame = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
locations.add(Coord4D.get(tile).translate(x, y, z));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(!isAir(origX+x, origY+y, origZ+z))
|
|
||||||
{
|
|
||||||
isHollow = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
volume++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!isHollow || !rightBlocks || !rightFrame)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!isHollow || !rightBlocks || !rightFrame)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
volume += locations.size();
|
@Override
|
||||||
|
protected void onStructureCreated(SynchronizedData<SynchronizedTankData> structure, int origX, int origY, int origZ, int xmin, int xmax, int ymin, int ymax, int zmin, int zmax)
|
||||||
if(volume >= 27 && volume <= 5832 && locations.size() >= 26)
|
|
||||||
{
|
{
|
||||||
if(rightBlocks && rightFrame && isHollow && isCorner)
|
|
||||||
{
|
|
||||||
SynchronizedTankData structure = new SynchronizedTankData();
|
|
||||||
structure.locations = locations;
|
|
||||||
structure.volLength = Math.abs(xmax-xmin)+1;
|
|
||||||
structure.volHeight = Math.abs(ymax-ymin)+1;
|
|
||||||
structure.volWidth = Math.abs(zmax-zmin)+1;
|
|
||||||
structure.volume = volume;
|
|
||||||
structure.renderLocation = Coord4D.get(tile).translate(0, 1, 0);
|
|
||||||
|
|
||||||
for(Coord4D obj : structure.locations)
|
for(Coord4D obj : structure.locations)
|
||||||
{
|
{
|
||||||
if(obj.getTileEntity(pointer.getWorldObj()) instanceof TileEntityDynamicValve)
|
if(obj.getTileEntity(pointer.getWorldObj()) instanceof TileEntityDynamicValve)
|
||||||
|
@ -199,268 +92,7 @@ public class TankUpdateProtocol
|
||||||
data.location = obj;
|
data.location = obj;
|
||||||
data.side = getSide(obj, origX+xmin, origX+xmax, origY+ymin, origY+ymax, origZ+zmin, origZ+zmax);
|
data.side = getSide(obj, origX+xmin, origX+xmax, origY+ymin, origY+ymax, origZ+zmin, origZ+zmax);
|
||||||
|
|
||||||
structure.valves.add(data);
|
((SynchronizedTankData)structure).valves.add(data);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(structure.locations.contains(Coord4D.get(pointer)) && isCorrectCorner(Coord4D.get(tile), origX+xmin, origY+ymin, origZ+zmin))
|
|
||||||
{
|
|
||||||
structureFound = structure;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iteratedNodes.add((TileEntityDynamicTank)tile);
|
|
||||||
|
|
||||||
for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
|
|
||||||
{
|
|
||||||
TileEntity tileEntity = Coord4D.get(tile).getFromSide(side).getTileEntity(tile.getWorldObj());
|
|
||||||
|
|
||||||
if(tileEntity instanceof TileEntityDynamicTank)
|
|
||||||
{
|
|
||||||
if(!iteratedNodes.contains(tileEntity))
|
|
||||||
{
|
|
||||||
loopThrough(tileEntity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ForgeDirection getSide(Coord4D obj, int xmin, int xmax, int ymin, int ymax, int zmin, int zmax)
|
|
||||||
{
|
|
||||||
if(obj.xCoord == xmin)
|
|
||||||
{
|
|
||||||
return ForgeDirection.WEST;
|
|
||||||
}
|
|
||||||
else if(obj.xCoord == xmax)
|
|
||||||
{
|
|
||||||
return ForgeDirection.EAST;
|
|
||||||
}
|
|
||||||
else if(obj.yCoord == ymin)
|
|
||||||
{
|
|
||||||
return ForgeDirection.DOWN;
|
|
||||||
}
|
|
||||||
else if(obj.yCoord == ymax)
|
|
||||||
{
|
|
||||||
return ForgeDirection.UP;
|
|
||||||
}
|
|
||||||
else if(obj.zCoord == zmin)
|
|
||||||
{
|
|
||||||
return ForgeDirection.NORTH;
|
|
||||||
}
|
|
||||||
else if(obj.zCoord == zmax)
|
|
||||||
{
|
|
||||||
return ForgeDirection.SOUTH;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ForgeDirection.UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether or not the block at the specified location is an air block.
|
|
||||||
* @param x - x coordinate
|
|
||||||
* @param y - y coordinate
|
|
||||||
* @param z - z coordinate
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private boolean isAir(int x, int y, int z)
|
|
||||||
{
|
|
||||||
return pointer.getWorldObj().isAirBlock(x, y, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether or not the block at the specified location is a viable node for a dynamic tank.
|
|
||||||
* @param x - x coordinate
|
|
||||||
* @param y - y coordinate
|
|
||||||
* @param z - z coordinate
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private boolean isViableNode(int x, int y, int z)
|
|
||||||
{
|
|
||||||
if(pointer.getWorldObj().getTileEntity(x, y, z) instanceof TileEntityDynamicTank)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If the block at the specified location is on the minimum of all angles of this dynamic tank, and the one to use for the
|
|
||||||
* actual calculation.
|
|
||||||
* @param obj - location to check
|
|
||||||
* @param xmin - minimum x value
|
|
||||||
* @param ymin - minimum y value
|
|
||||||
* @param zmin - minimum z value
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private boolean isCorrectCorner(Coord4D obj, int xmin, int ymin, int zmin)
|
|
||||||
{
|
|
||||||
if(obj.xCoord == xmin && obj.yCoord == ymin && obj.zCoord == zmin)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether or not the block at the specified location is considered a frame on the dynamic tank.
|
|
||||||
* @param obj - location to check
|
|
||||||
* @param xmin - minimum x value
|
|
||||||
* @param xmax - maximum x value
|
|
||||||
* @param ymin - minimum y value
|
|
||||||
* @param ymax - maximum y value
|
|
||||||
* @param zmin - minimum z value
|
|
||||||
* @param zmax - maximum z value
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private boolean isFrame(Coord4D obj, int xmin, int xmax, int ymin, int ymax, int zmin, int zmax)
|
|
||||||
{
|
|
||||||
if(obj.xCoord == xmin && obj.yCoord == ymin)
|
|
||||||
return true;
|
|
||||||
if(obj.xCoord == xmax && obj.yCoord == ymin)
|
|
||||||
return true;
|
|
||||||
if(obj.xCoord == xmin && obj.yCoord == ymax)
|
|
||||||
return true;
|
|
||||||
if(obj.xCoord == xmax && obj.yCoord == ymax)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if(obj.xCoord == xmin && obj.zCoord == zmin)
|
|
||||||
return true;
|
|
||||||
if(obj.xCoord == xmax && obj.zCoord == zmin)
|
|
||||||
return true;
|
|
||||||
if(obj.xCoord == xmin && obj.zCoord == zmax)
|
|
||||||
return true;
|
|
||||||
if(obj.xCoord == xmax && obj.zCoord == zmax)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if(obj.yCoord == ymin && obj.zCoord == zmin)
|
|
||||||
return true;
|
|
||||||
if(obj.yCoord == ymax && obj.zCoord == zmin)
|
|
||||||
return true;
|
|
||||||
if(obj.yCoord == ymin && obj.zCoord == zmax)
|
|
||||||
return true;
|
|
||||||
if(obj.yCoord == ymax && obj.zCoord == zmax)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether or not the block at the specified location serves as a frame for a dynamic tank.
|
|
||||||
* @param x - x coordinate
|
|
||||||
* @param y - y coordinate
|
|
||||||
* @param z - z coordinate
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private boolean isValidFrame(int x, int y, int z)
|
|
||||||
{
|
|
||||||
return pointer.getWorldObj().getBlock(x, y, z) == MekanismBlocks.BasicBlock && pointer.getWorldObj().getBlockMetadata(x, y, z) == 9;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs the protocol and updates all tanks that make a part of the dynamic tank.
|
|
||||||
*/
|
|
||||||
public void doUpdate()
|
|
||||||
{
|
|
||||||
loopThrough(pointer);
|
|
||||||
|
|
||||||
if(structureFound != null)
|
|
||||||
{
|
|
||||||
for(TileEntityDynamicTank tileEntity : iteratedNodes)
|
|
||||||
{
|
|
||||||
if(!structureFound.locations.contains(Coord4D.get(tileEntity)))
|
|
||||||
{
|
|
||||||
for(TileEntity tile : iteratedNodes)
|
|
||||||
{
|
|
||||||
((TileEntityDynamicTank)tileEntity).structure = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Integer> idsFound = new ArrayList<Integer>();
|
|
||||||
int idToUse = -1;
|
|
||||||
|
|
||||||
for(Coord4D obj : structureFound.locations)
|
|
||||||
{
|
|
||||||
TileEntityDynamicTank tileEntity = (TileEntityDynamicTank)obj.getTileEntity(pointer.getWorldObj());
|
|
||||||
int id = Mekanism.tankManager.getInventoryId(tileEntity);
|
|
||||||
|
|
||||||
if(id != -1)
|
|
||||||
{
|
|
||||||
idsFound.add(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicTankCache cache = new DynamicTankCache();
|
|
||||||
List<ItemStack> rejectedItems = new ArrayList<ItemStack>();
|
|
||||||
|
|
||||||
if(!idsFound.isEmpty())
|
|
||||||
{
|
|
||||||
for(int id : idsFound)
|
|
||||||
{
|
|
||||||
if(Mekanism.tankManager.inventories.get(id) != null)
|
|
||||||
{
|
|
||||||
if(cache == null)
|
|
||||||
{
|
|
||||||
cache = (DynamicTankCache)Mekanism.tankManager.pullInventory(pointer.getWorldObj(), id);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
DynamicTankCache merge = (DynamicTankCache)Mekanism.tankManager.pullInventory(pointer.getWorldObj(), id);
|
|
||||||
|
|
||||||
if(cache.fluid == null)
|
|
||||||
{
|
|
||||||
cache.fluid = merge.fluid;
|
|
||||||
}
|
|
||||||
else if(merge.fluid != null && cache.fluid.isFluidEqual(merge.fluid))
|
|
||||||
{
|
|
||||||
cache.fluid.amount += merge.fluid.amount;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<ItemStack> rejects = StackUtils.getMergeRejects(cache.inventory, merge.inventory);
|
|
||||||
|
|
||||||
if(!rejects.isEmpty())
|
|
||||||
{
|
|
||||||
rejectedItems.addAll(rejects);
|
|
||||||
}
|
|
||||||
|
|
||||||
StackUtils.merge(cache.inventory, merge.inventory);
|
|
||||||
}
|
|
||||||
|
|
||||||
idToUse = id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
idToUse = Mekanism.tankManager.getUniqueInventoryID();
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO someday: drop all items in rejectedItems
|
|
||||||
|
|
||||||
cache.apply(structureFound);
|
|
||||||
|
|
||||||
if(structureFound.fluidStored != null)
|
|
||||||
{
|
|
||||||
structureFound.fluidStored.amount = Math.min(structureFound.fluidStored.amount, structureFound.volume*FLUID_PER_TANK);
|
|
||||||
}
|
|
||||||
|
|
||||||
structureFound.inventoryID = idToUse;
|
|
||||||
|
|
||||||
for(Coord4D obj : structureFound.locations)
|
|
||||||
{
|
|
||||||
TileEntityDynamicTank tileEntity = (TileEntityDynamicTank)obj.getTileEntity(pointer.getWorldObj());
|
|
||||||
|
|
||||||
tileEntity.structure = structureFound;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for(TileEntity tileEntity : iteratedNodes)
|
|
||||||
{
|
|
||||||
((TileEntityDynamicTank)tileEntity).structure = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ import java.util.Set;
|
||||||
|
|
||||||
import mekanism.api.Coord4D;
|
import mekanism.api.Coord4D;
|
||||||
import mekanism.common.Mekanism;
|
import mekanism.common.Mekanism;
|
||||||
import mekanism.common.MekanismBlocks;
|
|
||||||
import mekanism.common.tile.TileEntityMultiblock;
|
import mekanism.common.tile.TileEntityMultiblock;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
@ -16,8 +15,6 @@ import net.minecraftforge.common.util.ForgeDirection;
|
||||||
|
|
||||||
public abstract class UpdateProtocol<T>
|
public abstract class UpdateProtocol<T>
|
||||||
{
|
{
|
||||||
public static final int FLUID_PER_TANK = 16000;
|
|
||||||
|
|
||||||
/** The multiblock nodes that have already been iterated over. */
|
/** The multiblock nodes that have already been iterated over. */
|
||||||
public Set<TileEntityMultiblock<T>> iteratedNodes = new HashSet<TileEntityMultiblock<T>>();
|
public Set<TileEntityMultiblock<T>> iteratedNodes = new HashSet<TileEntityMultiblock<T>>();
|
||||||
|
|
||||||
|
@ -344,10 +341,7 @@ public abstract class UpdateProtocol<T>
|
||||||
* @param z - z coordinate
|
* @param z - z coordinate
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private boolean isValidFrame(int x, int y, int z)
|
protected abstract boolean isValidFrame(int x, int y, int z);
|
||||||
{
|
|
||||||
return pointer.getWorldObj().getBlock(x, y, z) == MekanismBlocks.BasicBlock && pointer.getWorldObj().getBlockMetadata(x, y, z) == 9;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract MultiblockCache<T> getNewCache();
|
protected abstract MultiblockCache<T> getNewCache();
|
||||||
|
|
||||||
|
@ -355,7 +349,7 @@ public abstract class UpdateProtocol<T>
|
||||||
|
|
||||||
protected abstract MultiblockManager<T> getManager();
|
protected abstract MultiblockManager<T> getManager();
|
||||||
|
|
||||||
protected abstract void mergeCaches(MultiblockCache<T> cache, MultiblockCache<T> merge);
|
protected abstract void mergeCaches(List<ItemStack> rejectedItems, MultiblockCache<T> cache, MultiblockCache<T> merge);
|
||||||
|
|
||||||
protected void onFormed() {}
|
protected void onFormed() {}
|
||||||
|
|
||||||
|
@ -411,7 +405,7 @@ public abstract class UpdateProtocol<T>
|
||||||
cache = (MultiblockCache<T>)Mekanism.tankManager.pullInventory(pointer.getWorldObj(), id);
|
cache = (MultiblockCache<T>)Mekanism.tankManager.pullInventory(pointer.getWorldObj(), id);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
mergeCaches(cache, (MultiblockCache<T>)getManager().pullInventory(pointer.getWorldObj(), id));
|
mergeCaches(rejectedItems, cache, (MultiblockCache<T>)getManager().pullInventory(pointer.getWorldObj(), id));
|
||||||
}
|
}
|
||||||
|
|
||||||
idToUse = id;
|
idToUse = id;
|
||||||
|
|
|
@ -261,6 +261,12 @@ public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTank
|
||||||
return new SynchronizedTankData();
|
return new SynchronizedTankData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected TankUpdateProtocol getProtocol()
|
||||||
|
{
|
||||||
|
return new TankUpdateProtocol(this);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MultiblockManager<SynchronizedTankData> getManager()
|
public MultiblockManager<SynchronizedTankData> getManager()
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,6 +11,7 @@ import mekanism.common.content.tank.TankUpdateProtocol;
|
||||||
import mekanism.common.multiblock.IMultiblock;
|
import mekanism.common.multiblock.IMultiblock;
|
||||||
import mekanism.common.multiblock.MultiblockManager;
|
import mekanism.common.multiblock.MultiblockManager;
|
||||||
import mekanism.common.multiblock.SynchronizedData;
|
import mekanism.common.multiblock.SynchronizedData;
|
||||||
|
import mekanism.common.multiblock.UpdateProtocol;
|
||||||
import mekanism.common.network.PacketTileEntity.TileEntityMessage;
|
import mekanism.common.network.PacketTileEntity.TileEntityMessage;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
@ -122,7 +123,7 @@ public abstract class TileEntityMultiblock<T> extends TileEntityContainerBlock i
|
||||||
{
|
{
|
||||||
if(!worldObj.isRemote && (structure == null || !getSynchronizedData().didTick))
|
if(!worldObj.isRemote && (structure == null || !getSynchronizedData().didTick))
|
||||||
{
|
{
|
||||||
new TankUpdateProtocol(this).doUpdate();
|
getProtocol().doUpdate();
|
||||||
|
|
||||||
if(structure != null)
|
if(structure != null)
|
||||||
{
|
{
|
||||||
|
@ -149,6 +150,8 @@ public abstract class TileEntityMultiblock<T> extends TileEntityContainerBlock i
|
||||||
|
|
||||||
protected abstract T getNewStructure();
|
protected abstract T getNewStructure();
|
||||||
|
|
||||||
|
protected abstract UpdateProtocol<T> getProtocol();
|
||||||
|
|
||||||
public abstract MultiblockManager<T> getManager();
|
public abstract MultiblockManager<T> getManager();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in a new issue