Rewrite Hymn of Syphoning for caps

Needs testing and needs to be optimized.

(cherry picked from commit 3f24e46)
This commit is contained in:
Nicholas Ignoffo 2017-02-25 17:59:10 -08:00
parent 3cbfb0a40f
commit f3d980ee89
2 changed files with 37 additions and 33 deletions

View file

@ -2,28 +2,32 @@ package WayofTime.bloodmagic.ritual;
import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.Constants;
import WayofTime.bloodmagic.api.ritual.*; import WayofTime.bloodmagic.api.ritual.*;
import com.google.common.collect.Lists;
import net.minecraft.block.BlockLiquid; import net.minecraft.block.BlockLiquid;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidBlock;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler; 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.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
public class RitualPump extends Ritual public class RitualPump extends Ritual
{ {
public static final String PUMP_RANGE = "pumpRange"; public static final String PUMP_RANGE = "pumpRange";
private ArrayList<BlockPos> liquidsCache; private List<Pair<BlockPos, FluidStack>> liquidsCache;
private Iterator<BlockPos> blockPosIterator; private Iterator<Pair<BlockPos, FluidStack>> blockPosIterator;
private boolean cached = false;
private BlockPos currentPos;
public RitualPump() public RitualPump()
{ {
@ -31,7 +35,7 @@ public class RitualPump extends Ritual
addBlockRange(PUMP_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-16, -16, -16), new BlockPos(17, 17, 17))); addBlockRange(PUMP_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-16, -16, -16), new BlockPos(17, 17, 17)));
setMaximumVolumeAndDistanceOfRange(PUMP_RANGE, 0, 16, 16); setMaximumVolumeAndDistanceOfRange(PUMP_RANGE, 0, 16, 16);
liquidsCache = new ArrayList<BlockPos>(); liquidsCache = Lists.newArrayList();
} }
@Override @Override
@ -47,39 +51,39 @@ public class RitualPump extends Ritual
return; return;
} }
if (tileEntity != null && tileEntity.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN)) if (tileEntity != null && tileEntity.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN)) {
{
IFluidHandler fluidHandler = tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN); IFluidHandler fluidHandler = tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN);
if (!cached || liquidsCache.isEmpty()) IBlockState tankState = world.getBlockState(masterRitualStone.getBlockPos().up());
{ int maxDrain = fluidHandler.getTankProperties()[0].getCapacity();
if (fluidHandler.drain(1000, false) != null)
{
FluidStack fluidStack = fluidHandler.drain(1000, false);
if (fluidStack == null)
return;
for (BlockPos blockPos : getBlockRange(PUMP_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) if (fluidHandler.getTankProperties()[0].getContents() != null && fluidHandler.getTankProperties()[0].getContents().amount >= maxDrain)
{ return;
if (!liquidsCache.contains(blockPos))
{ for (BlockPos pos : getBlockRange(PUMP_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) {
if (!world.isAirBlock(blockPos) && world.getBlockState(blockPos).getBlock() == fluidStack.getFluid().getBlock() && world.getBlockState(blockPos).getValue(BlockLiquid.LEVEL) == 0) IBlockState state = world.getBlockState(pos);
{ IFluidHandler blockHandler = null;
liquidsCache.add(blockPos); 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<BlockPos, FluidStack> 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<BlockPos, FluidStack> posInfo = blockPosIterator.next();
masterRitualStone.getOwnerNetwork().syphon(getRefreshCost()); masterRitualStone.getOwnerNetwork().syphon(getRefreshCost());
currentPos = blockPosIterator.next(); fluidHandler.fill(posInfo.getRight(), true);
fluidHandler.fill(fluidHandler.drain(1000, false), true); world.setBlockState(posInfo.getLeft(), Blocks.STONE.getDefaultState());
world.setBlockState(currentPos, Blocks.STONE.getDefaultState()); world.notifyBlockUpdate(posInfo.getLeft(), tankState, tankState, 3);
blockPosIterator.remove(); blockPosIterator.remove();
} }
} }

View file

@ -611,7 +611,7 @@ ritual.bloodmagic.meteorRitual=Mark of the Falling Tower
ritual.bloodmagic.cobblestoneRitual=Le Vulcanos Frigius ritual.bloodmagic.cobblestoneRitual=Le Vulcanos Frigius
ritual.bloodmagic.placerRitual=Laying of the Filler ritual.bloodmagic.placerRitual=Laying of the Filler
ritual.bloodmagic.fellingRitual=Crash of the Timberman 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.altarBuilderRitual=The Assembly of the High Altar
ritual.bloodmagic.portalRitual=The Gate of the Fold ritual.bloodmagic.portalRitual=The Gate of the Fold
ritual.bloodmagic.downgradeRitual=Penance of the Leadened Soul ritual.bloodmagic.downgradeRitual=Penance of the Leadened Soul