Grate is now working
This commit is contained in:
parent
0d15854a6f
commit
65c1dfad7a
6 changed files with 180 additions and 63 deletions
|
@ -301,57 +301,60 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive
|
|||
@Override
|
||||
public void onInventoryChanged()
|
||||
{
|
||||
if (!worldObj.isRemote)
|
||||
if (worldObj != null)
|
||||
{
|
||||
this.inventory[CRAFTING_OUTPUT_SLOT] = null;
|
||||
|
||||
/** Try to craft from crafting grid. If not possible, then craft from imprint. */
|
||||
boolean didCraft = false;
|
||||
|
||||
/** Simulate an Inventory Crafting Instance */
|
||||
InventoryCrafting inventoryCrafting = this.getCraftingMatrix();
|
||||
|
||||
ItemStack matrixOutput = CraftingManager.getInstance().findMatchingRecipe(inventoryCrafting, this.worldObj);
|
||||
|
||||
if (matrixOutput != null && this.getCraftingManager().getIdealRecipe(matrixOutput) != null)
|
||||
if (!worldObj.isRemote)
|
||||
{
|
||||
this.inventory[CRAFTING_OUTPUT_SLOT] = matrixOutput;
|
||||
didCraft = true;
|
||||
}
|
||||
this.inventory[CRAFTING_OUTPUT_SLOT] = null;
|
||||
|
||||
/**
|
||||
* If output does not exist, try using the filter.
|
||||
*/
|
||||
if (!didCraft)
|
||||
{
|
||||
ItemStack filterStack = craftingMatrix[4];// this.inventory[IMPRINT_SLOT];
|
||||
/** Try to craft from crafting grid. If not possible, then craft from imprint. */
|
||||
boolean didCraft = false;
|
||||
|
||||
if (filterStack != null && filterStack.getItem() instanceof ItemBlockImprint)
|
||||
/** Simulate an Inventory Crafting Instance */
|
||||
InventoryCrafting inventoryCrafting = this.getCraftingMatrix();
|
||||
|
||||
ItemStack matrixOutput = CraftingManager.getInstance().findMatchingRecipe(inventoryCrafting, this.worldObj);
|
||||
|
||||
if (matrixOutput != null && this.getCraftingManager().getIdealRecipe(matrixOutput) != null)
|
||||
{
|
||||
Set<ItemStack> filters = ItemBlockImprint.getFilters(filterStack);
|
||||
this.inventory[CRAFTING_OUTPUT_SLOT] = matrixOutput;
|
||||
didCraft = true;
|
||||
}
|
||||
|
||||
for (ItemStack outputStack : filters)
|
||||
/**
|
||||
* If output does not exist, try using the filter.
|
||||
*/
|
||||
if (!didCraft)
|
||||
{
|
||||
ItemStack filterStack = craftingMatrix[4];// this.inventory[IMPRINT_SLOT];
|
||||
|
||||
if (filterStack != null && filterStack.getItem() instanceof ItemBlockImprint)
|
||||
{
|
||||
if (outputStack != null)
|
||||
{
|
||||
Pair<ItemStack, ItemStack[]> idealRecipe = this.getCraftingManager().getIdealRecipe(outputStack);
|
||||
Set<ItemStack> filters = ItemBlockImprint.getFilters(filterStack);
|
||||
|
||||
if (idealRecipe != null)
|
||||
for (ItemStack outputStack : filters)
|
||||
{
|
||||
if (outputStack != null)
|
||||
{
|
||||
ItemStack recipeOutput = idealRecipe.left();
|
||||
if (recipeOutput != null & recipeOutput.stackSize > 0)
|
||||
Pair<ItemStack, ItemStack[]> idealRecipe = this.getCraftingManager().getIdealRecipe(outputStack);
|
||||
|
||||
if (idealRecipe != null)
|
||||
{
|
||||
this.inventory[CRAFTING_OUTPUT_SLOT] = recipeOutput;
|
||||
didCraft = true;
|
||||
break;
|
||||
ItemStack recipeOutput = idealRecipe.left();
|
||||
if (recipeOutput != null & recipeOutput.stackSize > 0)
|
||||
{
|
||||
this.inventory[CRAFTING_OUTPUT_SLOT] = recipeOutput;
|
||||
didCraft = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
|
||||
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -56,10 +56,10 @@ public class BlockGrate extends BlockRIRotatable
|
|||
{
|
||||
if (side == metadata)
|
||||
{
|
||||
return this.drainIcon;
|
||||
return blockIcon;
|
||||
}
|
||||
|
||||
return this.blockIcon;
|
||||
return drainIcon;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -72,18 +72,11 @@ public class BlockGrate extends BlockRIRotatable
|
|||
{
|
||||
if (dir == ((TileGrate) entity).getDirection())
|
||||
{
|
||||
if (((TileGrate) entity).canDrain())
|
||||
{
|
||||
return this.drainIcon;
|
||||
}
|
||||
else
|
||||
{
|
||||
return this.fillIcon;
|
||||
}
|
||||
return blockIcon;
|
||||
}
|
||||
}
|
||||
|
||||
return this.blockIcon;
|
||||
return ((TileGrate) entity).canDrain() ? drainIcon : fillIcon;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -95,7 +88,8 @@ public class BlockGrate extends BlockRIRotatable
|
|||
|
||||
if (tile instanceof TileGrate)
|
||||
{
|
||||
entityPlayer.sendChatToPlayer(ChatMessageComponent.createFromText("Draining Sources? " + ((TileGrate) tile).canDrain()));
|
||||
((TileGrate) tile).canDrain = !((TileGrate) tile).canDrain;
|
||||
entityPlayer.sendChatToPlayer(ChatMessageComponent.createFromText("Drain fluid mode: " + ((TileGrate) tile).canDrain()));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -6,7 +6,9 @@ import java.util.Iterator;
|
|||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.ForgeDirection;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidContainerRegistry;
|
||||
|
@ -34,9 +36,13 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain
|
|||
private LiquidPathFinder pathDrain;
|
||||
private LiquidPathFinder pathFill;
|
||||
|
||||
private Vector3 lastDrainOrigin;
|
||||
|
||||
public boolean canDrain = true;
|
||||
|
||||
public boolean canDrain()
|
||||
{
|
||||
return this.getBlockMetadata() < 6;
|
||||
return canDrain;
|
||||
}
|
||||
|
||||
public LiquidPathFinder getFillFinder()
|
||||
|
@ -82,17 +88,120 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain
|
|||
/* ONLY FIND NEW SOURCES IF OUR CURRENT LIST RUNS DRY */
|
||||
if (this.getLiquidFinder().results.size() < TileGrate.MAX_WORLD_EDITS_PER_PROCESS + 10)
|
||||
{
|
||||
this.getLiquidFinder().refresh().start(new Vector3(this).modifyPositionFromSide(this.getDirection()), TileGrate.MAX_WORLD_EDITS_PER_PROCESS, false);
|
||||
this.getLiquidFinder().refresh().start(new Vector3(this).translate(this.getDirection()), TileGrate.MAX_WORLD_EDITS_PER_PROCESS, false);
|
||||
}
|
||||
|
||||
if (this.getFillFinder().results.size() < TileGrate.MAX_WORLD_EDITS_PER_PROCESS + 10)
|
||||
{
|
||||
this.getFillFinder().refresh().start(new Vector3(this).modifyPositionFromSide(this.getDirection()), TileGrate.MAX_WORLD_EDITS_PER_PROCESS, true);
|
||||
this.getFillFinder().refresh().start(new Vector3(this).translate(this.getDirection()), TileGrate.MAX_WORLD_EDITS_PER_PROCESS, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* If we can drain, do the drain action.
|
||||
*/
|
||||
if (canDrain())
|
||||
{
|
||||
drainAroundArea(worldObj, new Vector3(this), 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Drains an area starting at the given location
|
||||
*
|
||||
* @param world - world to drain in, most cases will be the TileEntities world
|
||||
* @param loc - origin to start the path finder with. If this is an instance of IDrain this
|
||||
* method will act different
|
||||
*/
|
||||
public void drainAroundArea(World world, Vector3 vec, int update)
|
||||
{
|
||||
Vector3 origin = vec.clone();
|
||||
if (origin == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/* Update last drain origin to prevent failed path finding */
|
||||
if (this.lastDrainOrigin == null || !this.lastDrainOrigin.equals(origin))
|
||||
{
|
||||
this.lastDrainOrigin = origin.clone();
|
||||
this.getLiquidFinder().reset();
|
||||
}
|
||||
|
||||
TileEntity drain = vec.clone().getTileEntity(world);
|
||||
TileEntity originTile = null;
|
||||
|
||||
Set<Vector3> drainList = null;
|
||||
if (drain instanceof IDrain)
|
||||
{
|
||||
if (!((IDrain) drain).canDrain(((IDrain) drain).getDirection()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
origin = vec.translate(((IDrain) drain).getDirection());
|
||||
originTile = origin.getTileEntity(world);
|
||||
|
||||
if (originTile instanceof IFluidHandler)
|
||||
{
|
||||
FluidStack draStack = ((IFluidHandler) originTile).drain(ForgeDirection.UP, MAX_WORLD_EDITS_PER_PROCESS * FluidContainerRegistry.BUCKET_VOLUME, false);
|
||||
|
||||
if (draStack != null && FluidUtility.fillTanksAllSides(worldObj, new Vector3(this), draStack, false, ForgeDirection.DOWN) > 0)
|
||||
{
|
||||
((IFluidHandler) originTile).drain(ForgeDirection.UP, FluidUtility.fillTanksAllSides(worldObj, new Vector3(this), draStack, true, ForgeDirection.DOWN), true);
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
drainList = ((IDrain) drain).getFluidList();
|
||||
}
|
||||
}
|
||||
|
||||
if (drainList == null)
|
||||
{
|
||||
if (this.getLiquidFinder().results.size() < MAX_WORLD_EDITS_PER_PROCESS + 10)
|
||||
{
|
||||
this.getLiquidFinder().setWorld(world).refresh().start(origin, MAX_WORLD_EDITS_PER_PROCESS, false);
|
||||
}
|
||||
drainList = this.getLiquidFinder().refresh().results;
|
||||
}
|
||||
|
||||
if (originTile == null && drainList != null && drainList.size() > 0)
|
||||
{
|
||||
Iterator<Vector3> fluidList = drainList.iterator();
|
||||
|
||||
while (fluidList.hasNext())
|
||||
{
|
||||
if (this.currentWorldEdits >= MAX_WORLD_EDITS_PER_PROCESS)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Vector3 drainLocation = fluidList.next();
|
||||
FluidStack drainStack = FluidUtility.drainBlock(world, drainLocation, false, 3);
|
||||
|
||||
if (drainStack != null && this.fill(null, drainStack, false) >= drainStack.amount)
|
||||
{
|
||||
/* Remove the block that we drained. */
|
||||
FluidUtility.drainBlock(this.worldObj, drainLocation, true, update);
|
||||
this.fill(null, drainStack, true);
|
||||
this.currentWorldEdits++;
|
||||
fluidList.remove();
|
||||
|
||||
if (drain instanceof IDrain)
|
||||
{
|
||||
((IDrain) drain).onUse(drainLocation);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills the area with fluid.
|
||||
*
|
||||
* @return Amount filled
|
||||
*/
|
||||
public int fillArea(FluidStack resource, boolean doFill)
|
||||
{
|
||||
int fillVolume = 0;
|
||||
|
@ -107,8 +216,6 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain
|
|||
|
||||
fillVolume = resource.amount;
|
||||
|
||||
// System.out.println("Drain>>FillArea>>Targets>> " + getFillFinder().results.size());
|
||||
|
||||
List<Vector3> fluids = new ArrayList<Vector3>();
|
||||
List<Vector3> blocks = new ArrayList<Vector3>();
|
||||
List<Vector3> filled = new ArrayList<Vector3>();
|
||||
|
@ -141,8 +248,6 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain
|
|||
{
|
||||
|
||||
fillVolume -= FluidUtility.fillBlock(worldObj, loc, FluidUtility.getStack(resource, fillVolume), doFill);
|
||||
// System.out.println("Drain>>FillArea>>Filling>>" + (doFill ? "" : "Sim>>") +
|
||||
// ">>Fluid>" + loc.toString());
|
||||
|
||||
if (doFill)
|
||||
{
|
||||
|
@ -167,7 +272,6 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain
|
|||
if (FluidUtility.isFillableBlock(worldObj, loc))
|
||||
{
|
||||
fillVolume -= FluidUtility.fillBlock(worldObj, loc, FluidUtility.getStack(resource, fillVolume), doFill);
|
||||
System.out.println("Drain>>FillArea>>Filling>>" + (doFill ? "" : "Sim>>") + ">>Block>" + loc.toString());
|
||||
|
||||
if (doFill)
|
||||
{
|
||||
|
@ -182,8 +286,6 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain
|
|||
}
|
||||
}
|
||||
this.getLiquidFinder().results.removeAll(filled);
|
||||
// System.out.println("Drain>>FillArea>>Filling>>Filled>>" + (doFill ? "" : "Sim>>") +
|
||||
// (resource.amount - fillVolume) + "mb");
|
||||
return Math.max(resource.amount - fillVolume, 0);
|
||||
}
|
||||
return 0;
|
||||
|
@ -218,10 +320,16 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain
|
|||
@Override
|
||||
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
|
||||
{
|
||||
if (resource == null || this.canDrain())
|
||||
if (resource == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (canDrain())
|
||||
{
|
||||
return FluidUtility.fillTanksAllSides(worldObj, new Vector3(this), resource, doFill);
|
||||
}
|
||||
|
||||
return this.fillArea(resource, doFill);
|
||||
}
|
||||
|
||||
|
@ -234,7 +342,6 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain
|
|||
@Override
|
||||
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain)
|
||||
{
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -267,4 +374,18 @@ public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain
|
|||
{
|
||||
this.currentWorldEdits++;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbt)
|
||||
{
|
||||
super.readFromNBT(nbt);
|
||||
canDrain = nbt.getBoolean("canDrain");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToNBT(NBTTagCompound nbt)
|
||||
{
|
||||
super.writeToNBT(nbt);
|
||||
nbt.setBoolean("canDrain", canDrain);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,11 +23,9 @@ public class ItemPipeGauge extends ItemRI
|
|||
|
||||
public ItemPipeGauge()
|
||||
{
|
||||
super("PipeGuage");
|
||||
super("pipeGuage");
|
||||
this.setHasSubtypes(true);
|
||||
this.setCreativeTab(CreativeTabs.tabTools);
|
||||
this.setMaxStackSize(1);
|
||||
this.setTextureName(Reference.PREFIX + "readout.PipeGauge");
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@ tile.resonantinduction\:manipulator.name=Manipulator
|
|||
tile.resonantinduction\:rejector.name=Rejector
|
||||
|
||||
# Fluid pipes
|
||||
item.resonantinduction\:pipeGauge.name=Pipe Gauge
|
||||
item.resonantinduction\:pipe.name=Pipe
|
||||
tile.resonantinduction\:fluidPipe.3.name=Green Wood Trough
|
||||
tile.resonantinduction\:fluidPipe.4.name=Brown Wood Trough
|
||||
|
|
Before Width: | Height: | Size: 349 B After Width: | Height: | Size: 349 B |
Loading…
Reference in a new issue