Grate is now working

This commit is contained in:
Calclavia 2014-01-23 22:50:22 +08:00
parent 0d15854a6f
commit 65c1dfad7a
6 changed files with 180 additions and 63 deletions

View file

@ -239,7 +239,7 @@ public class TileEngineeringTable extends TileAdvanced implements IPacketReceive
}
}
}
onInventoryChanged();
}
@ -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);
}
}
}

View file

@ -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;

View file

@ -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);
}
}

View file

@ -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");
}

View file

@ -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