From f702949d48b8e7107f19aaeda04b7cfe27b963d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 18 Sep 2016 18:39:59 +0200 Subject: [PATCH] Allow draining dynamic liquid blocks if they're "full" and work around the fluid registry not knowing dynamic liquid blocks... fixes ##2015. Should also fix #2023. --- src/main/scala/li/cil/oc/util/FluidUtils.scala | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/util/FluidUtils.scala b/src/main/scala/li/cil/oc/util/FluidUtils.scala index 0e52027d0..804be4a6e 100644 --- a/src/main/scala/li/cil/oc/util/FluidUtils.scala +++ b/src/main/scala/li/cil/oc/util/FluidUtils.scala @@ -3,8 +3,10 @@ package li.cil.oc.util import li.cil.oc.util.ExtendedBlock._ import li.cil.oc.util.ExtendedWorld._ import net.minecraft.block.Block +import net.minecraft.block.BlockDynamicLiquid import net.minecraft.block.BlockLiquid import net.minecraft.block.BlockStaticLiquid +import net.minecraft.init.Blocks import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.fluids.Fluid import net.minecraftforge.fluids.FluidContainerRegistry @@ -56,6 +58,15 @@ object FluidUtils { fluidHandlerAt(sinkPos).fold(0)(sink => transferBetweenFluidHandlers(source, sourceSide, sink, sinkSide, limit))) + /** + * Lookup fluid taking into account flowing liquid blocks... + */ + def lookupFluidForBlock(block: Block): Fluid = { + if (block == Blocks.flowing_lava) FluidRegistry.LAVA + else if (block == Blocks.flowing_water) FluidRegistry.WATER + else FluidRegistry.lookupFluidForBlock(block) + } + // ----------------------------------------------------------------------- // private class GenericBlockWrapper(position: BlockPosition) extends IFluidHandler { @@ -73,7 +84,8 @@ object FluidUtils { def currentWrapper = if (position.world.get.blockExists(position)) position.world.get.getBlock(position) match { case block: IFluidBlock => Option(new FluidBlockWrapper(position, block)) - case block: BlockStaticLiquid if FluidRegistry.lookupFluidForBlock(block) != null && isFullLiquidBlock => Option(new LiquidBlockWrapper(position, block)) + case block: BlockStaticLiquid if lookupFluidForBlock(block) != null && isFullLiquidBlock => Option(new LiquidBlockWrapper(position, block)) + case block: BlockDynamicLiquid if lookupFluidForBlock(block) != null && isFullLiquidBlock => Option(new LiquidBlockWrapper(position, block)) case block: Block if block.isAir(position) || block.isReplaceable(position) => Option(new AirBlockWrapper(position, block)) case _ => None } @@ -117,7 +129,7 @@ object FluidUtils { } private class LiquidBlockWrapper(val position: BlockPosition, val block: BlockLiquid) extends BlockWrapperBase { - val fluid = FluidRegistry.lookupFluidForBlock(block) + val fluid = lookupFluidForBlock(block) override def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = true