List of usage examples for net.minecraftforge.fluids.capability IFluidHandler fill
int fill(FluidStack resource, FluidAction action);
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); }