Fixed NPE and added Fill tank method to fluidhelper
Fixed a null point crash with getting the block when trying to fill a tile. Added: FillTanksAllSides to make it easy for tiles to fill IFluidHandlers around them
This commit is contained in:
parent
472a6894db
commit
2fa69b1221
1 changed files with 84 additions and 33 deletions
|
@ -4,6 +4,8 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockFluid;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
import net.minecraftforge.fluids.Fluid;
|
import net.minecraftforge.fluids.Fluid;
|
||||||
|
@ -11,6 +13,7 @@ import net.minecraftforge.fluids.FluidContainerRegistry;
|
||||||
import net.minecraftforge.fluids.FluidRegistry;
|
import net.minecraftforge.fluids.FluidRegistry;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fluids.IFluidBlock;
|
import net.minecraftforge.fluids.IFluidBlock;
|
||||||
|
import net.minecraftforge.fluids.IFluidHandler;
|
||||||
import universalelectricity.core.vector.Vector3;
|
import universalelectricity.core.vector.Vector3;
|
||||||
|
|
||||||
public class FluidHelper
|
public class FluidHelper
|
||||||
|
@ -98,12 +101,12 @@ public class FluidHelper
|
||||||
Vector3 vec = node.clone().modifyPositionFromSide(ForgeDirection.UP);
|
Vector3 vec = node.clone().modifyPositionFromSide(ForgeDirection.UP);
|
||||||
if (vec.getBlockID(world) == Block.waterlily.blockID)
|
if (vec.getBlockID(world) == Block.waterlily.blockID)
|
||||||
{
|
{
|
||||||
vec.setBlock(world, 0);
|
vec.setBlock(world, 0, 0, 2);
|
||||||
node.setBlock(world, blockID, meta);
|
node.setBlock(world, blockID, meta);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
node.setBlock(world, 0);
|
node.setBlock(world, 0, 0, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new FluidStack(FluidRegistry.getFluid("water"), FluidContainerRegistry.BUCKET_VOLUME);
|
return new FluidStack(FluidRegistry.getFluid("water"), FluidContainerRegistry.BUCKET_VOLUME);
|
||||||
|
@ -112,7 +115,7 @@ public class FluidHelper
|
||||||
{
|
{
|
||||||
if (doDrain)
|
if (doDrain)
|
||||||
{
|
{
|
||||||
node.setBlock(world, 0);
|
node.setBlock(world, 0, 0, 2);
|
||||||
}
|
}
|
||||||
return new FluidStack(FluidRegistry.getFluid("lava"), FluidContainerRegistry.BUCKET_VOLUME);
|
return new FluidStack(FluidRegistry.getFluid("lava"), FluidContainerRegistry.BUCKET_VOLUME);
|
||||||
}
|
}
|
||||||
|
@ -120,7 +123,30 @@ public class FluidHelper
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isFillable(World world, Vector3 node)
|
/** Checks to see if a non-fluid block is able to be filled with fluid */
|
||||||
|
public static boolean isFillableBlock(World world, Vector3 node)
|
||||||
|
{
|
||||||
|
if (world == null || node == null || isFillableFluid(world, node))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int blockID = node.getBlockID(world);
|
||||||
|
int meta = node.getBlockMetadata(world);
|
||||||
|
Block block = Block.blocksList[blockID];
|
||||||
|
if (block == null || block.blockID == 0 || block.isAirBlock(world, node.intX(), node.intY(), node.intZ()))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (block.isBlockReplaceable(world, node.intX(), node.intY(), node.intZ()) || replacableBlockMeta.contains(new Pair<Integer, Integer>(blockID, meta)) || replacableBlocks.contains(block))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Checks to see if a fluid related block is able to be filled */
|
||||||
|
public static boolean isFillableFluid(World world, Vector3 node)
|
||||||
{
|
{
|
||||||
if (world == null || node == null)
|
if (world == null || node == null)
|
||||||
{
|
{
|
||||||
|
@ -131,58 +157,83 @@ public class FluidHelper
|
||||||
int meta = node.getBlockMetadata(world);
|
int meta = node.getBlockMetadata(world);
|
||||||
Block block = Block.blocksList[blockID];
|
Block block = Block.blocksList[blockID];
|
||||||
|
|
||||||
if (block == null || block.blockID == 0 || block.isAirBlock(world, node.intX(), node.intY(), node.intZ()))
|
if (block instanceof IFluidBlock)
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (block.isBlockReplaceable(world, node.intX(), node.intY(), node.intZ()) || replacableBlockMeta.contains(new Pair<Integer, Integer>(blockID, meta)) || replacableBlocks.contains(block))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if ((blockID == Block.waterMoving.blockID || blockID == Block.waterStill.blockID) && meta != 0)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if ((blockID == Block.lavaMoving.blockID || blockID == Block.lavaStill.blockID) && meta != 0)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (block instanceof IFluidBlock)
|
|
||||||
{
|
{
|
||||||
//TODO when added change this to call canFill and fill
|
//TODO when added change this to call canFill and fill
|
||||||
return node.getBlockMetadata(world) != 0;
|
return meta != 0;
|
||||||
|
}
|
||||||
|
else if (block instanceof BlockFluid)
|
||||||
|
{
|
||||||
|
return meta != 0;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Helper method to fill a location with a fluid
|
/** Helper method to fill a location with a fluid
|
||||||
|
*
|
||||||
|
* Note: This does not update the block to prevent the liquid from flowing
|
||||||
*
|
*
|
||||||
* @return */
|
* @return */
|
||||||
public static int fillBlock(World world, Vector3 node, FluidStack stack, boolean doFill)
|
public static int fillBlock(World world, Vector3 node, FluidStack stack, boolean doFill)
|
||||||
{
|
{
|
||||||
if (isFillable(world, node) && stack != null && stack.amount >= FluidContainerRegistry.BUCKET_VOLUME)
|
if ((isFillableBlock(world, node) || isFillableFluid(world, node)) && stack != null && stack.amount >= FluidContainerRegistry.BUCKET_VOLUME)
|
||||||
{
|
{
|
||||||
if (doFill)
|
if (doFill)
|
||||||
{
|
{
|
||||||
node.setBlock(world, stack.getFluid().getBlockID(), 0);
|
|
||||||
|
|
||||||
int blockID = node.getBlockID(world);
|
int blockID = node.getBlockID(world);
|
||||||
int meta = node.getBlockMetadata(world);
|
int meta = node.getBlockMetadata(world);
|
||||||
Block block = Block.blocksList[blockID];
|
Block block = Block.blocksList[blockID];
|
||||||
Vector3 vec = node.clone().modifyPositionFromSide(ForgeDirection.UP);
|
Vector3 vec = node.clone().modifyPositionFromSide(ForgeDirection.UP);
|
||||||
if (block.blockID == Block.waterlily.blockID && vec.getBlockID(world) == 0)
|
|
||||||
|
if (block != null)
|
||||||
{
|
{
|
||||||
vec.setBlock(world, blockID, meta);
|
if (block.blockID == Block.waterlily.blockID && vec.getBlockID(world) == 0)
|
||||||
}
|
{
|
||||||
else if (block != null && replacableBlocks.contains(block) && !nonBlockDropList.contains(block))
|
vec.setBlock(world, blockID, meta);
|
||||||
{
|
}
|
||||||
block.dropBlockAsItem(world, node.intX(), node.intY(), node.intZ(), meta, 1);
|
else if (block != null && replacableBlocks.contains(block) && !nonBlockDropList.contains(block))
|
||||||
block.breakBlock(world, node.intX(), node.intY(), node.intZ(), blockID, meta);
|
{
|
||||||
|
block.dropBlockAsItem(world, node.intX(), node.intY(), node.intZ(), meta, 1);
|
||||||
|
block.breakBlock(world, node.intX(), node.intY(), node.intZ(), blockID, meta);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
node.setBlock(world, stack.getFluid().getBlockID(), 0, 2);
|
||||||
}
|
}
|
||||||
return stack.amount - FluidContainerRegistry.BUCKET_VOLUME;
|
return FluidContainerRegistry.BUCKET_VOLUME;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int fillTanksAllSides(World world, Vector3 origin, FluidStack stack,boolean doFill, ForgeDirection...ignore )
|
||||||
|
{
|
||||||
|
int filled = 0;
|
||||||
|
FluidStack fillStack = stack != null ? stack.copy() : null;
|
||||||
|
for(ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS)
|
||||||
|
{
|
||||||
|
if(fillStack == null || fillStack.amount <= 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(ignore != null)
|
||||||
|
{
|
||||||
|
for(int i =0; i < ignore.length; i++)
|
||||||
|
{
|
||||||
|
if(direction == ignore[i])
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TileEntity entity = origin.clone().modifyPositionFromSide(direction).getTileEntity(world);
|
||||||
|
if(entity instanceof IFluidHandler && ((IFluidHandler) entity).canFill(direction.getOpposite(), fillStack.getFluid()))
|
||||||
|
{
|
||||||
|
int f = ((IFluidHandler)entity).fill(direction.getOpposite(), fillStack, doFill);
|
||||||
|
filled += f;
|
||||||
|
fillStack.amount -=f;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return filled;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue