From 472a6894db110778933d38fce48c0aad3db35acb Mon Sep 17 00:00:00 2001 From: DarkGuardsman Date: Fri, 26 Jul 2013 21:53:54 -0400 Subject: [PATCH] Changed drain and added fill method to FluidHelper --- src/dark/core/helpers/FluidHelper.java | 116 ++++++++++++++++++++++--- 1 file changed, 103 insertions(+), 13 deletions(-) diff --git a/src/dark/core/helpers/FluidHelper.java b/src/dark/core/helpers/FluidHelper.java index 4d168d21..c563784a 100644 --- a/src/dark/core/helpers/FluidHelper.java +++ b/src/dark/core/helpers/FluidHelper.java @@ -1,7 +1,11 @@ package dark.core.helpers; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.Block; import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidRegistry; @@ -11,9 +15,31 @@ import universalelectricity.core.vector.Vector3; public class FluidHelper { + public static List> replacableBlockMeta = new ArrayList>(); + public static List replacableBlocks = new ArrayList(); + public static List nonBlockDropList = new ArrayList(); + + static + { + replacableBlocks.add(Block.crops); + replacableBlocks.add(Block.deadBush); + nonBlockDropList.add(Block.deadBush); + //TODO have waterlily raise and lower when automaticly filling or draining a block rather than remove it + replacableBlocks.add(Block.waterlily); + replacableBlocks.add(Block.mushroomRed); + replacableBlocks.add(Block.mushroomBrown); + replacableBlocks.add(Block.netherStalk); + replacableBlocks.add(Block.sapling); + replacableBlocks.add(Block.melonStem); + nonBlockDropList.add(Block.melonStem); + replacableBlocks.add(Block.pumpkinStem); + nonBlockDropList.add(Block.pumpkinStem); + replacableBlocks.add(Block.tallGrass); + replacableBlocks.add(Block.torchWood); + } /** Gets the block's fluid if it has one - * + * * @param world - world we are working in * @param vector - 3D location in world * @return @Fluid that the block is */ @@ -49,28 +75,44 @@ public class FluidHelper return stack; } - public static FluidStack drainBlock(World world, Vector3 vector, boolean doDrain) + public static FluidStack drainBlock(World world, Vector3 node, boolean doDrain) { - Block block = Block.blocksList[vector.getBlockID(world)]; + if (world == null || node == null) + { + return null; + } + + int blockID = node.getBlockID(world); + int meta = node.getBlockMetadata(world); + Block block = Block.blocksList[blockID]; if (block != null) { - if (block instanceof IFluidBlock && ((IFluidBlock) block).canDrain(world, vector.intX(), vector.intY(), vector.intZ())) + if (block instanceof IFluidBlock && ((IFluidBlock) block).canDrain(world, node.intX(), node.intY(), node.intZ())) { - return ((IFluidBlock) block).drain(world, vector.intX(), vector.intY(), vector.intZ(), doDrain); + return ((IFluidBlock) block).drain(world, node.intX(), node.intY(), node.intZ(), doDrain); } - else if (block.blockID == Block.waterStill.blockID && vector.getBlockMetadata(world) == 0) + else if (block.blockID == Block.waterStill.blockID && node.getBlockMetadata(world) == 0) { if (doDrain) { - vector.setBlock(world, 0); + Vector3 vec = node.clone().modifyPositionFromSide(ForgeDirection.UP); + if (vec.getBlockID(world) == Block.waterlily.blockID) + { + vec.setBlock(world, 0); + node.setBlock(world, blockID, meta); + } + else + { + node.setBlock(world, 0); + } } return new FluidStack(FluidRegistry.getFluid("water"), FluidContainerRegistry.BUCKET_VOLUME); } - else if (block.blockID == Block.lavaStill.blockID && vector.getBlockMetadata(world) == 0) + else if (block.blockID == Block.lavaStill.blockID && node.getBlockMetadata(world) == 0) { if (doDrain) { - vector.setBlock(world, 0); + node.setBlock(world, 0); } return new FluidStack(FluidRegistry.getFluid("lava"), FluidContainerRegistry.BUCKET_VOLUME); } @@ -80,19 +122,67 @@ public class FluidHelper public static boolean isFillable(World world, Vector3 node) { - Block block = Block.blocksList[node.getBlockID(world)]; - if ((block.blockID == Block.waterStill.blockID || block.blockID == Block.waterMoving.blockID) && node.getBlockMetadata(world) != 0) + if (world == null || node == null) + { + 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.blockID == Block.lavaStill.blockID || block.blockID == Block.lavaMoving.blockID) && node.getBlockMetadata(world) != 0) + else if (block.isBlockReplaceable(world, node.intX(), node.intY(), node.intZ()) || replacableBlockMeta.contains(new Pair(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 + return node.getBlockMetadata(world) != 0; } return false; } + + /** Helper method to fill a location with a fluid + * + * @return */ + public static int fillBlock(World world, Vector3 node, FluidStack stack, boolean doFill) + { + if (isFillable(world, node) && stack != null && stack.amount >= FluidContainerRegistry.BUCKET_VOLUME) + { + if (doFill) + { + node.setBlock(world, stack.getFluid().getBlockID(), 0); + + int blockID = node.getBlockID(world); + int meta = node.getBlockMetadata(world); + Block block = Block.blocksList[blockID]; + Vector3 vec = node.clone().modifyPositionFromSide(ForgeDirection.UP); + if (block.blockID == Block.waterlily.blockID && vec.getBlockID(world) == 0) + { + vec.setBlock(world, blockID, meta); + } + else if (block != null && replacableBlocks.contains(block) && !nonBlockDropList.contains(block)) + { + block.dropBlockAsItem(world, node.intX(), node.intY(), node.intZ(), meta, 1); + block.breakBlock(world, node.intX(), node.intY(), node.intZ(), blockID, meta); + } + + } + return stack.amount - FluidContainerRegistry.BUCKET_VOLUME; + } + return 0; + } }