Example usage for net.minecraftforge.fluids.capability IFluidHandler fill

List of usage examples for net.minecraftforge.fluids.capability IFluidHandler fill

Introduction

In this page you can find the example usage for net.minecraftforge.fluids.capability IFluidHandler fill.

Prototype

int fill(FluidStack resource, FluidAction action);

Source Link

Document

Fills fluid into internal tanks, distribution is left entirely to the IFluidHandler.

Usage

From source file:appeng.parts.p2p.PartP2PFluids.java

License:Open Source License

@Override
public int fill(FluidStack resource, boolean doFill) {
    final Deque<PartP2PFluids> stack = this.getDepth();

    for (final PartP2PFluids t : stack) {
        if (t == this) {
            return 0;
        }/*from   w  w  w  . j av a 2s  .c  o m*/
    }

    stack.push(this);

    final List<PartP2PFluids> list = this.getOutputs(resource.getFluid());
    int requestTotal = 0;

    Iterator<PartP2PFluids> i = list.iterator();

    while (i.hasNext()) {
        final PartP2PFluids l = i.next();
        final IFluidHandler tank = l.getTarget();
        if (tank != null) {
            l.tmpUsed = tank.fill(resource.copy(), false);
        } else {
            l.tmpUsed = 0;
        }

        if (l.tmpUsed <= 0) {
            i.remove();
        } else {
            requestTotal += l.tmpUsed;
        }
    }

    if (requestTotal <= 0) {
        if (stack.pop() != this) {
            throw new IllegalStateException("Invalid Recursion detected.");
        }

        return 0;
    }

    if (!doFill) {
        if (stack.pop() != this) {
            throw new IllegalStateException("Invalid Recursion detected.");
        }

        return Math.min(resource.amount, requestTotal);
    }

    int available = resource.amount;

    i = list.iterator();
    int used = 0;

    while (i.hasNext()) {
        final PartP2PFluids l = i.next();

        final FluidStack insert = resource.copy();
        insert.amount = (int) Math.ceil(insert.amount * ((double) l.tmpUsed / (double) requestTotal));
        if (insert.amount > available) {
            insert.amount = available;
        }

        final IFluidHandler tank = l.getTarget();
        if (tank != null) {
            l.tmpUsed = tank.fill(insert.copy(), true);
        } else {
            l.tmpUsed = 0;
        }

        available -= insert.amount;
        used += insert.amount;
    }

    if (stack.pop() != this) {
        throw new IllegalStateException("Invalid Recursion detected.");
    }

    return used;
}

From source file:blusunrize.immersiveengineering.common.blocks.metal.TileEntityFluidPump.java

public int outputFluid(FluidStack fs, boolean simulate) {
    if (fs == null)
        return 0;

    int canAccept = fs.amount;
    if (canAccept <= 0)
        return 0;

    int accelPower = IEConfig.Machines.pump_consumption_accelerate;
    final int fluidForSort = canAccept;
    int sum = 0;/*from  w w  w  .j  a  va  2 s. co m*/
    HashMap<DirectionalFluidOutput, Integer> sorting = new HashMap<DirectionalFluidOutput, Integer>();
    for (EnumFacing f : EnumFacing.values())
        if (sideConfig[f.ordinal()] == 1) {
            TileEntity tile = Utils.getExistingTileEntity(world, getPos().offset(f));
            if (tile != null
                    && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, f.getOpposite())) {
                IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,
                        f.getOpposite());
                FluidStack insertResource = Utils.copyFluidStackWithAmount(fs, fs.amount, true);
                if (tile instanceof TileEntityFluidPipe
                        && this.energyStorage.extractEnergy(accelPower, true) >= accelPower) {
                    insertResource.tag = new NBTTagCompound();
                    insertResource.tag.setBoolean("pressurized", true);
                }
                int temp = handler.fill(insertResource, false);
                if (temp > 0) {
                    sorting.put(new DirectionalFluidOutput(handler, tile, f), temp);
                    sum += temp;
                }
            }
        }
    if (sum > 0) {
        int f = 0;
        int i = 0;
        for (DirectionalFluidOutput output : sorting.keySet()) {
            float prio = sorting.get(output) / (float) sum;
            int amount = (int) (fluidForSort * prio);
            if (i++ == sorting.size() - 1)
                amount = canAccept;
            FluidStack insertResource = Utils.copyFluidStackWithAmount(fs, amount, true);
            if (output.containingTile instanceof TileEntityFluidPipe
                    && this.energyStorage.extractEnergy(accelPower, true) >= accelPower) {
                this.energyStorage.extractEnergy(accelPower, false);
                insertResource.tag = new NBTTagCompound();
                insertResource.tag.setBoolean("pressurized", true);
            }
            int r = output.output.fill(insertResource, !simulate);
            f += r;
            canAccept -= r;
            if (canAccept <= 0)
                break;
        }
        return f;
    }
    return 0;
}

From source file:blusunrize.immersiveengineering.common.blocks.metal.TileEntityMixer.java

@Override
public void update() {
    super.update();
    if (isDummy() || isRSDisabled())
        return;//from  www .j  a v  a 2 s  .co m

    if (world.isRemote) {
        if (shouldRenderAsActive()) {
            if (Utils.RAND.nextInt(8) == 0) {
                FluidStack fs = !tank.fluids.isEmpty() ? tank.fluids.get(0) : null;
                if (fs != null) {
                    float amount = tank.getFluidAmount() / (float) tank.getCapacity() * 1.125f;
                    Vec3d partPos = new Vec3d(
                            getPos().getX() + .5f + facing.getXOffset() * .5f
                                    + (mirrored ? facing.rotateYCCW() : facing.rotateY()).getXOffset() * .5f,
                            getPos().getY() - .0625f + amount, getPos().getZ() + .5f + facing.getZOffset() * .5f
                                    + (mirrored ? facing.rotateYCCW() : facing.rotateY()).getZOffset() * .5f);
                    float r = Utils.RAND.nextFloat() * .8125f;
                    float angleRad = (float) Math.toRadians(animation_agitator);
                    partPos = partPos.add(r * Math.cos(angleRad), 0, r * Math.sin(angleRad));
                    if (Utils.RAND.nextBoolean())
                        ImmersiveEngineering.proxy.spawnBubbleFX(world, fs, partPos.x, partPos.y, partPos.z, 0,
                                0, 0);
                    else
                        ImmersiveEngineering.proxy.spawnFluidSplashFX(world, fs, partPos.x, partPos.y,
                                partPos.z, 0, 0, 0);
                }
            }
            animation_agitator = (animation_agitator + 9) % 360;
        }
    } else {
        boolean update = false;
        boolean foundRecipe = false;
        if (energyStorage.getEnergyStored() > 0 && processQueue.size() < this.getProcessQueueMaxLength()) {
            int tankAmount = tank.getFluidAmount();
            if (tankAmount > 0) {
                Set<Integer> usedInvSlots = new HashSet<Integer>();
                for (MultiblockProcess<MixerRecipe> process : processQueue)
                    if (process instanceof MultiblockProcessInMachine)
                        for (int i : ((MultiblockProcessInMachine<MixerRecipe>) process).inputSlots)
                            usedInvSlots.add(i);
                NonNullList<ItemStack> components = NonNullList.withSize(this.inventory.size(),
                        ItemStack.EMPTY);
                for (int i = 0; i < components.size(); i++)
                    if (!usedInvSlots.contains(i))
                        components.set(i, inventory.get(i));

                for (FluidStack fs : tank.fluids) {
                    MixerRecipe recipe = MixerRecipe.findRecipe(fs, components);
                    if (recipe != null) {
                        foundRecipe = true;
                        MultiblockProcessInMachine process = new MultiblockProcessMixer(recipe,
                                recipe.getUsedSlots(fs, components)).setInputTanks(0);
                        if (this.addProcessToQueue(process, true)) {
                            this.addProcessToQueue(process, false);
                            update = true;
                        }
                    }
                }
            }
        }

        if (this.tank.getFluidTypes() > 1 || !foundRecipe || outputAll) {
            BlockPos outputPos = this.getPos().down().offset(facing.getOpposite(), 2);
            IFluidHandler output = FluidUtil.getFluidHandler(world, outputPos, facing);
            if (output != null) {
                if (!outputAll) {
                    FluidStack inTank = this.tank.getFluid();
                    if (inTank != null) {
                        FluidStack out = Utils.copyFluidStackWithAmount(inTank, Math.min(inTank.amount, 80),
                                false);
                        int accepted = output.fill(out, false);
                        if (accepted > 0) {
                            int drained = output.fill(
                                    Utils.copyFluidStackWithAmount(out, Math.min(out.amount, accepted), false),
                                    true);
                            this.tank.drain(drained, true);
                            update = true;
                        }
                    }
                } else {
                    int totalOut = 0;
                    Iterator<FluidStack> it = this.tank.fluids.iterator();
                    while (it.hasNext()) {
                        FluidStack fs = it.next();
                        if (fs != null) {
                            FluidStack out = Utils.copyFluidStackWithAmount(fs,
                                    Math.min(fs.amount, 80 - totalOut), false);
                            int accepted = output.fill(out, false);
                            if (accepted > 0) {
                                int drained = output.fill(Utils.copyFluidStackWithAmount(out,
                                        Math.min(out.amount, accepted), false), true);
                                MultiFluidTank.drain(drained, fs, it, true);
                                totalOut += drained;
                                update = true;
                            }
                            if (totalOut >= 80)
                                break;
                        }
                    }
                }
            }
        }
        if (update) {
            this.markDirty();
            this.markContainingBlockForUpdate(null);
        }
    }
}

From source file:blusunrize.immersiveengineering.common.blocks.metal.TileEntitySheetmetalTank.java

@Override
public void update() {
    ApiUtils.checkForNeedlessTicking(this);
    if (pos == 4 && !world.isRemote && world.getRedstonePowerFromNeighbors(getPos()) > 0)
        for (int i = 0; i < 6; i++)
            if (i != 1 && tank.getFluidAmount() > 0) {
                EnumFacing f = EnumFacing.byIndex(i);
                int outSize = Math.min(144, tank.getFluidAmount());
                FluidStack out = Utils.copyFluidStackWithAmount(tank.getFluid(), outSize, false);
                BlockPos outputPos = getPos().offset(f);
                IFluidHandler output = FluidUtil.getFluidHandler(world, outputPos, f.getOpposite());
                if (output != null) {
                    int accepted = output.fill(out, false);
                    if (accepted > 0) {
                        int drained = output.fill(
                                Utils.copyFluidStackWithAmount(out, Math.min(out.amount, accepted), false),
                                true);//w w w  .  ja va  2s .  co  m
                        this.tank.drain(drained, true);
                        this.markContainingBlockForUpdate(null);
                        updateComparatorValuesPart2();
                    }
                }
            }
}

From source file:blusunrize.immersiveengineering.common.blocks.wooden.TileEntityFluidSorter.java

private int doInsert(FluidStack stack, EnumFacing[] sides, boolean doFill) {
    int ret = 0;/*w  ww.  j av  a 2s  .  co m*/
    int lengthFiltered = sides.length;
    while (lengthFiltered > 0 && stack.amount > 0) {
        int rand = Utils.RAND.nextInt(lengthFiltered);
        EnumFacing currentSide = sides[rand];
        TileEntity te = Utils.getExistingTileEntity(world, pos.offset(currentSide));
        if (te != null && te.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,
                currentSide.getOpposite())) {
            IFluidHandler fluidOut = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,
                    currentSide.getOpposite());
            assert fluidOut != null;
            int filledHere = fluidOut.fill(stack, doFill);
            stack.amount -= filledHere;
            ret += filledHere;
        }
        sides[rand] = sides[lengthFiltered - 1];
        lengthFiltered--;
    }
    return ret;
}

From source file:blusunrize.immersiveengineering.common.blocks.wooden.TileEntityWoodenBarrel.java

@Override
public void update() {
    if (world.isRemote)
        return;/*  w  w  w .ja  va  2 s .co  m*/

    boolean update = false;
    for (int i = 0; i < 2; i++)
        if (tank.getFluidAmount() > 0 && sideConfig[i] == 1) {
            EnumFacing f = EnumFacing.byIndex(i);
            int out = Math.min(40, tank.getFluidAmount());
            TileEntity te = world.getTileEntity(getPos().offset(f));
            if (te != null
                    && te.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, f.getOpposite())) {
                IFluidHandler handler = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,
                        f.getOpposite());
                int accepted = handler.fill(Utils.copyFluidStackWithAmount(tank.getFluid(), out, false), false);
                FluidStack drained = this.tank.drain(accepted, true);
                if (drained != null) {
                    handler.fill(drained, true);
                    update = true;
                }
            }
        }
    if (update) {
        this.markDirty();
        this.markContainingBlockForUpdate(null);
    }
}

From source file:com.buuz135.industrial.item.addon.movility.FluidTransferAddon.java

License:Open Source License

@Override
public boolean actionTransfer(World world, BlockPos pos, EnumFacing facing, int transferAmount) {
    TileEntity tileEntityOrigin = world.getTileEntity(pos);
    TileEntity tileEntityDestination = world.getTileEntity(pos.offset(facing));
    if (tileEntityOrigin != null && tileEntityDestination != null
            && tileEntityOrigin.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, facing)
            && tileEntityDestination.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,
                    facing.getOpposite())) {
        IFluidHandler fluidHandlerOrigin = getCapabilityOriginByMode(tileEntityOrigin, tileEntityDestination,
                facing);//from  w  ww .ja  v a  2s. co m
        IFluidHandler fluidHandlerDestination = getCapabilityDestinationByMode(tileEntityOrigin,
                tileEntityDestination, facing);
        FluidStack fluidStack = fluidHandlerOrigin.drain(transferAmount * 100, false);
        if (fluidStack != null) {
            fluidHandlerOrigin.drain(fluidHandlerDestination.fill(fluidStack, true), true);
            return true;
        }
    }
    return false;
}

From source file:com.buuz135.industrial.proxy.block.upgrade.ConveyorInsertionUpgrade.java

License:Open Source License

@Override
public void update() {
    if (getWorld().isRemote)
        return;// w  w  w .j  a  va  2s .c o  m
    if (getWorld().getTotalWorldTime() % 2 == 0 && getContainer() instanceof TileEntityConveyor) {
        IFluidTank tank = ((TileEntityConveyor) getContainer()).getTank();
        IFluidHandler fluidHandler = getHandlerCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY);
        if (fluidHandler != null && tank.drain(50, false) != null
                && fluidHandler.fill(tank.drain(50, false), false) > 0
                && whitelist == filter.matches(tank.drain(50, false))) {
            FluidStack drain = tank.drain(fluidHandler.fill(tank.drain(50, false), true), true);
            if (drain != null && drain.amount > 0)
                getContainer().requestFluidSync();
        }
    }
}

From source file:com.lothrazar.cyclicmagic.util.UtilFluid.java

License:Open Source License

public static boolean tryFillPositionFromTank(World world, BlockPos posSide, EnumFacing sideOpp,
        FluidTank tankFrom, int amount) {
    try {/* ww w .ja  va2  s.co m*/
        IFluidHandler fluidTo = FluidUtil.getFluidHandler(world, posSide, sideOpp);
        if (fluidTo != null) {
            //its not my facing dir
            // SO: pull fluid from that into myself
            FluidStack wasDrained = tankFrom.drain(amount, false);
            if (wasDrained == null) {
                return false;
            }
            int filled = fluidTo.fill(wasDrained, false);
            if (wasDrained != null && wasDrained.amount > 0 && filled > 0) {
                int realAmt = Math.min(filled, wasDrained.amount);
                wasDrained = tankFrom.drain(realAmt, true);
                if (wasDrained == null) {
                    return false;
                }
                return fluidTo.fill(wasDrained, true) > 0;
            }
        }
        return false;
    } catch (Exception e) {
        ModCyclic.logger.error("A fluid tank had an issue when we tried to fill", e);
        //charset crashes here i guess
        //https://github.com/PrinceOfAmber/Cyclic/issues/605
        // https://github.com/PrinceOfAmber/Cyclic/issues/605https://pastebin.com/YVtMYsF6
        return false;
    }
}

From source file:com.teambrmodding.neotech.api.jei.fluidGenerator.JEIFluidGeneratorCategory.java

License:Creative Commons License

/**
 * Actually exposes the recipe to JEI/*from   w  w  w .j  a  va  2  s.c o m*/
 * @param recipeLayout The object to hold al the info
 * @param recipeWrapper The recipe, not always needed as all ingredients are added to ingredients
 * @param ingredients What holds the ingredients
 */
@Override
public void setRecipe(IRecipeLayout recipeLayout, JEIFluidGeneratorRecipeWrapper recipeWrapper,
        IIngredients ingredients) {
    IGuiFluidStackGroup fluidStackGroup = recipeLayout.getFluidStacks();
    IGuiItemStackGroup itemStackGroup = recipeLayout.getItemStacks();

    // Load
    fluidStackGroup.init(0, true, 141, 9, 16, 62, 2000, false, null);
    itemStackGroup.init(0, true, 119, 8);
    itemStackGroup.init(1, false, 119, 54);

    // Set to layout
    recipeLayout.getFluidStacks().set(0, ingredients.getInputs(FluidStack.class).get(0));

    List<ItemStack> filledStacks = new ArrayList<>();
    List<ItemStack> emptyStacks = new ArrayList<>();
    for (Item item : Item.REGISTRY) {
        ItemStack stack = new ItemStack(item);
        IFluidHandler provider = FluidUtil.getFluidHandler(stack);
        if (provider != null) {
            int amount = provider.fill(ingredients.getInputs(FluidStack.class).get(0).get(0), false);
            if (amount > 0) {
                emptyStacks.add(stack.copy());
                provider.fill(ingredients.getInputs(FluidStack.class).get(0).get(0), true);
                filledStacks.add(stack);
            }
        }
    }
    recipeLayout.getItemStacks().set(0, filledStacks);
    recipeLayout.getItemStacks().set(1, emptyStacks);
}