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.

This commit is contained in:
Florian Nücke 2016-09-18 18:39:59 +02:00
parent 884842b843
commit f702949d48

View File

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