diff --git a/src/main/java/refinedstorage/api/network/NetworkUtils.java b/src/main/java/refinedstorage/api/network/NetworkUtils.java index 343e726d5..c576b1c20 100755 --- a/src/main/java/refinedstorage/api/network/NetworkUtils.java +++ b/src/main/java/refinedstorage/api/network/NetworkUtils.java @@ -14,6 +14,10 @@ public final class NetworkUtils { return network.extractItem(stack, size, CompareUtils.COMPARE_DAMAGE | CompareUtils.COMPARE_NBT); } + public static FluidStack extractFluid(INetworkMaster network, FluidStack stack, int size) { + return network.extractFluid(stack, size, CompareUtils.COMPARE_NBT); + } + public static ICraftingPattern getPattern(INetworkMaster network, ItemStack stack) { return network.getPattern(stack, CompareUtils.COMPARE_DAMAGE | CompareUtils.COMPARE_NBT); } diff --git a/src/main/java/refinedstorage/api/storage/fluid/IGroupedFluidStorage.java b/src/main/java/refinedstorage/api/storage/fluid/IGroupedFluidStorage.java index ec12b05f9..fef2a937f 100755 --- a/src/main/java/refinedstorage/api/storage/fluid/IGroupedFluidStorage.java +++ b/src/main/java/refinedstorage/api/storage/fluid/IGroupedFluidStorage.java @@ -56,6 +56,14 @@ public interface IGroupedFluidStorage { @Nullable FluidStack get(@Nonnull FluidStack stack, int flags); + /** + * Gets a fluid from the network by hash, see {@link refinedstorage.api.network.NetworkUtils#getFluidStackHashCode(FluidStack)}. + * + * @return Null if no fluid is found matching the hash, or the {@link FluidStack}, do NOT modify + */ + @Nullable + FluidStack get(int hash); + /** * @return All fluids in this storage network */ diff --git a/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java b/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java index 1633fb8fc..a0dfd1964 100755 --- a/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java +++ b/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java @@ -1,12 +1,15 @@ 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.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; import refinedstorage.api.network.grid.IFluidGridHandler; import javax.annotation.Nullable; @@ -20,7 +23,24 @@ public class FluidGridHandler implements IFluidGridHandler { @Override public void onExtract(int hash, boolean shift, EntityPlayerMP player) { - System.out.println("Extract " + hash + " (shift = " + shift + ")"); + FluidStack stack = network.getFluidStorage().get(hash); + + if (stack != null) { + ItemStack bucket = NetworkUtils.extractItem(network, new ItemStack(Items.BUCKET), 1); + + if (bucket != null) { + bucket.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null).fill(NetworkUtils.extractFluid(network, stack, 1000), true); + + if (shift) { + if (!player.inventory.addItemStackToInventory(bucket.copy())) { + InventoryHelper.spawnItemStack(player.worldObj, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), bucket); + } + } else { + player.inventory.setItemStack(bucket); + player.updateHeldItem(); + } + } + } } @Nullable diff --git a/src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java b/src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java index 44a504c8d..99ee93854 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java +++ b/src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java @@ -5,6 +5,7 @@ import com.google.common.collect.Multimap; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.NetworkUtils; import refinedstorage.api.storage.fluid.IFluidStorage; import refinedstorage.api.storage.fluid.IFluidStorageProvider; import refinedstorage.api.storage.fluid.IGroupedFluidStorage; @@ -93,6 +94,18 @@ public class GroupedFluidStorage implements IGroupedFluidStorage { return null; } + @Override + @Nullable + public FluidStack get(int hash) { + for (FluidStack stack : this.stacks.values()) { + if (NetworkUtils.getFluidStackHashCode(stack) == hash) { + return stack; + } + } + + return null; + } + @Override public Collection getStacks() { return stacks.values(); diff --git a/src/main/java/refinedstorage/gui/grid/GuiGrid.java b/src/main/java/refinedstorage/gui/grid/GuiGrid.java index bc7cdc264..d37177c77 100755 --- a/src/main/java/refinedstorage/gui/grid/GuiGrid.java +++ b/src/main/java/refinedstorage/gui/grid/GuiGrid.java @@ -360,8 +360,8 @@ public class GuiGrid extends GuiBase { RefinedStorage.INSTANCE.network.sendToServer(grid.getType() == EnumGridType.FLUID ? new MessageGridFluidInsertHeld() : new MessageGridItemInsertHeld(clickedButton == 1)); } - if (isOverSlotWithItem() && (held == null || (held != null && clickedButton == 2))) { - if (grid.getType() != EnumGridType.FLUID) { + if (isOverSlotWithItem()) { + if (grid.getType() != EnumGridType.FLUID && (held == null || (held != null && clickedButton == 2))) { ClientStackItem stack = (ClientStackItem) STACKS.get(slotNumber); if (stack.isCraftable() && (stack.getQuantity() == 0 || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown()))) { @@ -383,7 +383,7 @@ public class GuiGrid extends GuiBase { RefinedStorage.INSTANCE.network.sendToServer(new MessageGridItemPull(stack.getHash(), flags)); } - } else { + } else if (grid.getType() == EnumGridType.FLUID && held == null) { RefinedStorage.INSTANCE.network.sendToServer(new MessageGridFluidPull(STACKS.get(slotNumber).getHash(), GuiScreen.isShiftKeyDown())); } } diff --git a/src/main/java/refinedstorage/tile/TileDiskDrive.java b/src/main/java/refinedstorage/tile/TileDiskDrive.java index 94e80794f..bcf4a0dfa 100755 --- a/src/main/java/refinedstorage/tile/TileDiskDrive.java +++ b/src/main/java/refinedstorage/tile/TileDiskDrive.java @@ -179,6 +179,7 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl super.onConnectionChange(network, state); network.getItemStorage().rebuild(); + network.getFluidStorage().rebuild(); } @Override