diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java index 35c8b981..48ef6552 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualPump.java @@ -2,27 +2,32 @@ package WayofTime.bloodmagic.ritual; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.*; +import com.google.common.collect.Lists; import net.minecraft.block.BlockLiquid; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidHandler; +import net.minecraftforge.fluids.IFluidBlock; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.wrappers.BlockLiquidWrapper; +import net.minecraftforge.fluids.capability.wrappers.FluidBlockWrapper; +import org.apache.commons.lang3.tuple.Pair; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; public class RitualPump extends Ritual { public static final String PUMP_RANGE = "pumpRange"; - private ArrayList liquidsCache; - private Iterator blockPosIterator; - - private boolean cached = false; - private BlockPos currentPos; + private List> liquidsCache; + private Iterator> blockPosIterator; public RitualPump() { @@ -30,7 +35,7 @@ public class RitualPump extends Ritual addBlockRange(PUMP_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-16, -16, -16), new BlockPos(17, 17, 17))); setMaximumVolumeAndDistanceOfRange(PUMP_RANGE, 0, 16, 16); - liquidsCache = new ArrayList(); + liquidsCache = Lists.newArrayList(); } @Override @@ -46,36 +51,39 @@ public class RitualPump extends Ritual return; } - if (tileEntity != null && tileEntity instanceof IFluidHandler) - { - IFluidHandler fluidHandler = (IFluidHandler) tileEntity; - if (!cached || liquidsCache.isEmpty()) - { - if (fluidHandler.drain(EnumFacing.DOWN, 1000, false) != null) - { - FluidStack fluidStack = fluidHandler.drain(EnumFacing.DOWN, 1000, false); - for (BlockPos blockPos : getBlockRange(PUMP_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) - { - if (!liquidsCache.contains(blockPos)) - { - if (!world.isAirBlock(blockPos) && world.getBlockState(blockPos).getBlock() == fluidStack.getFluid().getBlock() && world.getBlockState(blockPos).getValue(BlockLiquid.LEVEL) == 0) - { - liquidsCache.add(blockPos); - } - } + if (tileEntity != null && tileEntity.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN)) { + IFluidHandler fluidHandler = tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN); + IBlockState tankState = world.getBlockState(masterRitualStone.getBlockPos().up()); + int maxDrain = fluidHandler.getTankProperties()[0].getCapacity(); + + if (fluidHandler.getTankProperties()[0].getContents() != null && fluidHandler.getTankProperties()[0].getContents().amount >= maxDrain) + return; + + for (BlockPos pos : getBlockRange(PUMP_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) { + IBlockState state = world.getBlockState(pos); + IFluidHandler blockHandler = null; + if (state.getBlock() instanceof BlockLiquid) + blockHandler = new BlockLiquidWrapper((BlockLiquid) state.getBlock(), world, pos); + else if (state.getBlock() instanceof IFluidHandler) + blockHandler = new FluidBlockWrapper((IFluidBlock) state.getBlock(), world, pos); + + if (blockHandler != null) { + FluidStack blockDrain = blockHandler.drain(maxDrain, false); + if (blockDrain != null && fluidHandler.fill(blockDrain, false) == blockDrain.amount) { + Pair posInfo = Pair.of(pos, blockHandler.drain(maxDrain, false)); + if (!liquidsCache.contains(posInfo)) + liquidsCache.add(posInfo); } } - - cached = true; - blockPosIterator = liquidsCache.iterator(); } - if (blockPosIterator.hasNext()) - { + blockPosIterator = liquidsCache.iterator(); + if (blockPosIterator.hasNext()) { + Pair posInfo = blockPosIterator.next(); masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); - currentPos = blockPosIterator.next(); - fluidHandler.fill(EnumFacing.DOWN, fluidHandler.drain(EnumFacing.DOWN, 1000, false), true); - world.setBlockState(currentPos, Blocks.STONE.getDefaultState()); + fluidHandler.fill(posInfo.getRight(), true); + world.setBlockState(posInfo.getLeft(), Blocks.STONE.getDefaultState()); + world.notifyBlockUpdate(posInfo.getLeft(), tankState, tankState, 3); blockPosIterator.remove(); } } diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 577be153..e91b2364 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -611,7 +611,7 @@ ritual.BloodMagic.meteorRitual=Mark of the Falling Tower ritual.BloodMagic.cobblestoneRitual=Le Vulcanos Frigius ritual.BloodMagic.placerRitual=Laying of the Filler ritual.BloodMagic.fellingRitual=Crash of the Timberman -ritual.BloodMagic.pumpRitual=Hymn of Siphoning +ritual.BloodMagic.pumpRitual=Hymn of Syphoning ritual.BloodMagic.altarBuilderRitual=The Assembly of the High Altar ritual.BloodMagic.portalRitual=The Gate of the Fold ritual.BloodMagic.downgradeRitual=Penance of the Leadened Soul