diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/BasicCraftingTask.java b/src/main/java/refinedstorage/apiimpl/autocrafting/BasicCraftingTask.java index 2cf382c64..9191dd3de 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/BasicCraftingTask.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/BasicCraftingTask.java @@ -10,6 +10,7 @@ import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingTask; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.NetworkUtils; +import refinedstorage.apiimpl.storage.fluid.FluidUtils; import java.util.ArrayList; import java.util.List; @@ -68,7 +69,7 @@ public class BasicCraftingTask implements ICraftingTask { if (!satisfied[i]) { done = false; - ItemStack took = NetworkUtils.extractItem(network, input, 1); + ItemStack took = FluidUtils.extractItemOrIfBucketLookInFluids(network, input, 1); if (took != null) { itemsTook.add(took); diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/ProcessingCraftingTask.java b/src/main/java/refinedstorage/apiimpl/autocrafting/ProcessingCraftingTask.java index 31f04b17a..e22ce9ce4 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/ProcessingCraftingTask.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/ProcessingCraftingTask.java @@ -10,6 +10,7 @@ import refinedstorage.api.autocrafting.ICraftingTask; import refinedstorage.api.network.INetworkMaster; import refinedstorage.api.network.NetworkUtils; import refinedstorage.api.storage.CompareUtils; +import refinedstorage.apiimpl.storage.fluid.FluidUtils; public class ProcessingCraftingTask implements ICraftingTask { public static final int ID = 1; @@ -53,7 +54,7 @@ public class ProcessingCraftingTask implements ICraftingTask { for (int i = 0; i < inserted.length; ++i) { if (!inserted[i]) { ItemStack input = pattern.getInputs()[i]; - ItemStack took = NetworkUtils.extractItem(network, input, 1); + ItemStack took = FluidUtils.extractItemOrIfBucketLookInFluids(network, input, 1); if (took != null) { if (ItemHandlerHelper.insertItem(container.getConnectedItems(), took, true) == null) { diff --git a/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java b/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java index c08972037..afae15666 100755 --- a/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java +++ b/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java @@ -1,11 +1,9 @@ package refinedstorage.apiimpl.network.grid; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.Items; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import refinedstorage.api.network.INetworkMaster; @@ -17,8 +15,6 @@ import refinedstorage.apiimpl.storage.fluid.FluidUtils; import javax.annotation.Nullable; public class FluidGridHandler implements IFluidGridHandler { - private static final ItemStack EMPTY_BUCKET = new ItemStack(Items.BUCKET); - private INetworkMaster network; public FluidGridHandler(INetworkMaster network) { @@ -29,15 +25,15 @@ public class FluidGridHandler implements IFluidGridHandler { public void onExtract(int hash, boolean shift, EntityPlayerMP player) { FluidStack stack = network.getFluidStorage().get(hash); - if (stack != null && (stack.getFluid() == FluidRegistry.WATER || stack.getFluid() == FluidRegistry.LAVA || FluidRegistry.getBucketFluids().contains(stack.getFluid()))) { - ItemStack bucket = NetworkUtils.extractItem(network, EMPTY_BUCKET, 1); + if (stack != null && FluidUtils.hasFluidBucket(stack)) { + ItemStack bucket = FluidUtils.extractBucket(network); if (bucket == null) { for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { ItemStack slot = player.inventory.getStackInSlot(i); - if (CompareUtils.compareStackNoQuantity(EMPTY_BUCKET, slot)) { - bucket = EMPTY_BUCKET.copy(); + if (CompareUtils.compareStackNoQuantity(FluidUtils.EMPTY_BUCKET, slot)) { + bucket = FluidUtils.EMPTY_BUCKET.copy(); player.inventory.decrStackSize(i, 1); diff --git a/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java b/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java index 2845370d9..145817fec 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java +++ b/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java @@ -1,12 +1,18 @@ package refinedstorage.apiimpl.storage.fluid; +import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidContainerItem; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; public final class FluidUtils { + public static final ItemStack EMPTY_BUCKET = new ItemStack(Items.BUCKET); + public static FluidStack copyStackWithSize(FluidStack stack, int size) { FluidStack copy = stack.copy(); copy.amount = size; @@ -26,4 +32,30 @@ public final class FluidUtils { return null; } + + public static boolean hasFluidBucket(FluidStack stack) { + return stack.getFluid() == FluidRegistry.WATER || stack.getFluid() == FluidRegistry.LAVA || FluidRegistry.getBucketFluids().contains(stack.getFluid()); + } + + public static ItemStack extractItemOrIfBucketLookInFluids(INetworkMaster network, ItemStack stack, int size) { + ItemStack result = NetworkUtils.extractItem(network, stack, size); + + if (result == null && stack.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null)) { + FluidStack fluidStack = getFluidFromStack(stack, true); + + if (fluidStack != null && hasFluidBucket(fluidStack)) { + result = extractBucket(network); + + if (result != null) { + result.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null).fill(NetworkUtils.extractFluid(network, fluidStack, Fluid.BUCKET_VOLUME), true); + } + } + } + + return result; + } + + public static ItemStack extractBucket(INetworkMaster network) { + return NetworkUtils.extractItem(network, EMPTY_BUCKET, 1); + } }