diff --git a/src/main/java/refinedstorage/api/network/INetworkMaster.java b/src/main/java/refinedstorage/api/network/INetworkMaster.java index 9f94b5b25..bf1288b1b 100755 --- a/src/main/java/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/refinedstorage/api/network/INetworkMaster.java @@ -7,6 +7,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraftforge.fluids.FluidStack; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.ICraftingTask; +import refinedstorage.api.network.grid.IFluidGridHandler; import refinedstorage.api.network.grid.IItemGridHandler; import refinedstorage.api.storage.CompareUtils; import refinedstorage.api.storage.fluid.IGroupedFluidStorage; @@ -50,6 +51,11 @@ public interface INetworkMaster { */ IItemGridHandler getItemGridHandler(); + /** + * @return The {@link IFluidGridHandler} for this network + */ + IFluidGridHandler getFluidGridHandler(); + /** * @return The {@link IWirelessGridHandler} for this network */ diff --git a/src/main/java/refinedstorage/api/network/NetworkUtils.java b/src/main/java/refinedstorage/api/network/NetworkUtils.java index 2c250ec31..343e726d5 100755 --- a/src/main/java/refinedstorage/api/network/NetworkUtils.java +++ b/src/main/java/refinedstorage/api/network/NetworkUtils.java @@ -2,6 +2,7 @@ package refinedstorage.api.network; import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.storage.CompareUtils; @@ -29,6 +30,10 @@ public final class NetworkUtils { return stack.getItem().hashCode() * (stack.getItemDamage() + 1) * (stack.hasTagCompound() ? stack.getTagCompound().hashCode() : 1); } + public static int getFluidStackHashCode(FluidStack stack) { + return stack.getFluid().hashCode() * (stack.tag != null ? stack.tag.hashCode() : 1); + } + public static int getNodeHashCode(World world, INetworkNode node) { int result = node.getPosition().hashCode(); result = 31 * result + world.provider.getDimension(); diff --git a/src/main/java/refinedstorage/api/network/grid/IFluidGridHandler.java b/src/main/java/refinedstorage/api/network/grid/IFluidGridHandler.java new file mode 100755 index 000000000..dde84a07a --- /dev/null +++ b/src/main/java/refinedstorage/api/network/grid/IFluidGridHandler.java @@ -0,0 +1,36 @@ +package refinedstorage.api.network.grid; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; + +import javax.annotation.Nullable; + +/** + * Defines the behavior of item grids. + */ +public interface IFluidGridHandler { + /** + * Called when a player tries to extract a fluid from the grid. + * + * @param hash The hash of the fluid we're trying to extract, see {@link refinedstorage.api.network.NetworkUtils#getFluidStackHashCode(net.minecraftforge.fluids.FluidStack)} + * @param shift If we're shift clicking + * @param player The player that is attempting the extraction + */ + void onExtract(int hash, boolean shift, EntityPlayerMP player); + + /** + * Called when a player tries to insert fluids to the grid. + * + * @param container A stack with a container we're trying to insert + * @return The remainder, or null if there is no remainder + */ + @Nullable + ItemStack onInsert(ItemStack container); + + /** + * Called when a player is trying to insert a fluid that it is holding in their hand in the GUI. + * + * @param player The player that is attempting the insert + */ + void onInsertHeldContainer(EntityPlayerMP player); +} diff --git a/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java b/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java new file mode 100755 index 000000000..0086c85e8 --- /dev/null +++ b/src/main/java/refinedstorage/apiimpl/network/grid/FluidGridHandler.java @@ -0,0 +1,33 @@ +package refinedstorage.apiimpl.network.grid; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.api.network.grid.IFluidGridHandler; + +import javax.annotation.Nullable; + +public class FluidGridHandler implements IFluidGridHandler { + private INetworkMaster network; + + public FluidGridHandler(INetworkMaster network) { + this.network = network; + } + + @Override + public void onExtract(int hash, boolean shift, EntityPlayerMP player) { + System.out.println("Extract " + hash); + } + + @Nullable + @Override + public ItemStack onInsert(ItemStack container) { + System.out.println("Insert " + container); + return container; + } + + @Override + public void onInsertHeldContainer(EntityPlayerMP player) { + System.out.println("Insert held!"); + } +} diff --git a/src/main/java/refinedstorage/container/ContainerGrid.java b/src/main/java/refinedstorage/container/ContainerGrid.java index e6c611dac..353ee34c3 100755 --- a/src/main/java/refinedstorage/container/ContainerGrid.java +++ b/src/main/java/refinedstorage/container/ContainerGrid.java @@ -106,8 +106,12 @@ public class ContainerGrid extends ContainerBase { if (slot.getHasStack()) { if (slot == craftingResultSlot) { ((TileGrid) grid).onCraftedShift(this, player); - } else if (grid.getHandler() != null && slot != patternResultSlot && !(slot instanceof SlotSpecimenLegacy) && grid.getType() != EnumGridType.FLUID) { - slot.putStack(grid.getHandler().onInsert(slot.getStack())); + } else if (slot != patternResultSlot && !(slot instanceof SlotSpecimenLegacy)) { + if (grid.getType() != EnumGridType.FLUID && grid.getItemHandler() != null) { + slot.putStack(grid.getItemHandler().onInsert(slot.getStack())); + } else if (grid.getType() == EnumGridType.FLUID && grid.getFluidHandler() != null) { + slot.putStack(grid.getFluidHandler().onInsert(slot.getStack())); + } detectAndSendChanges(); } diff --git a/src/main/java/refinedstorage/gui/grid/GuiGrid.java b/src/main/java/refinedstorage/gui/grid/GuiGrid.java index a8fcfaacf..bc7cdc264 100755 --- a/src/main/java/refinedstorage/gui/grid/GuiGrid.java +++ b/src/main/java/refinedstorage/gui/grid/GuiGrid.java @@ -27,10 +27,7 @@ import refinedstorage.gui.grid.stack.ClientStackItem; import refinedstorage.gui.grid.stack.IClientStack; import refinedstorage.gui.sidebutton.*; import refinedstorage.integration.jei.IntegrationJEI; -import refinedstorage.network.MessageGridCraftingClear; -import refinedstorage.network.MessageGridInsertHeld; -import refinedstorage.network.MessageGridPatternCreate; -import refinedstorage.network.MessageGridPull; +import refinedstorage.network.*; import refinedstorage.tile.grid.IGrid; import refinedstorage.tile.grid.TileGrid; import refinedstorage.tile.grid.WirelessGrid; @@ -352,7 +349,7 @@ public class GuiGrid extends GuiBase { BlockPos gridPos = ((TileGrid) grid).getPos(); RefinedStorage.INSTANCE.network.sendToServer(new MessageGridPatternCreate(gridPos.getX(), gridPos.getY(), gridPos.getZ())); - } else if (grid.isConnected() && grid.getType() != EnumGridType.FLUID) { + } else if (grid.isConnected()) { if (clickedClear) { RefinedStorage.INSTANCE.network.sendToServer(new MessageGridCraftingClear((TileGrid) grid)); } @@ -360,30 +357,34 @@ public class GuiGrid extends GuiBase { ItemStack held = container.getPlayer().inventory.getItemStack(); if (isOverSlotArea(mouseX - guiLeft, mouseY - guiTop) && held != null && (clickedButton == 0 || clickedButton == 1)) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageGridInsertHeld(clickedButton == 1)); + RefinedStorage.INSTANCE.network.sendToServer(grid.getType() == EnumGridType.FLUID ? new MessageGridFluidInsertHeld() : new MessageGridItemInsertHeld(clickedButton == 1)); } if (isOverSlotWithItem() && (held == null || (held != null && clickedButton == 2))) { - ClientStackItem stack = (ClientStackItem) STACKS.get(slotNumber); + if (grid.getType() != EnumGridType.FLUID) { + ClientStackItem stack = (ClientStackItem) STACKS.get(slotNumber); - if (stack.isCraftable() && (stack.getQuantity() == 0 || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown()))) { - FMLCommonHandler.instance().showGuiScreen(new GuiCraftingSettings(this, container.getPlayer(), stack)); + if (stack.isCraftable() && (stack.getQuantity() == 0 || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown()))) { + FMLCommonHandler.instance().showGuiScreen(new GuiCraftingSettings(this, container.getPlayer(), stack)); + } else { + int flags = 0; + + if (clickedButton == 1) { + flags |= IItemGridHandler.EXTRACT_HALF; + } + + if (GuiScreen.isShiftKeyDown()) { + flags |= IItemGridHandler.EXTRACT_SHIFT; + } + + if (clickedButton == 2) { + flags |= IItemGridHandler.EXTRACT_SINGLE; + } + + RefinedStorage.INSTANCE.network.sendToServer(new MessageGridItemPull(stack.getHash(), flags)); + } } else { - int flags = 0; - - if (clickedButton == 1) { - flags |= IItemGridHandler.EXTRACT_HALF; - } - - if (GuiScreen.isShiftKeyDown()) { - flags |= IItemGridHandler.EXTRACT_SHIFT; - } - - if (clickedButton == 2) { - flags |= IItemGridHandler.EXTRACT_SINGLE; - } - - RefinedStorage.INSTANCE.network.sendToServer(new MessageGridPull(stack.getHash(), flags)); + RefinedStorage.INSTANCE.network.sendToServer(new MessageGridFluidPull(STACKS.get(slotNumber).getHash(), GuiScreen.isShiftKeyDown())); } } } diff --git a/src/main/java/refinedstorage/gui/grid/stack/ClientStackFluid.java b/src/main/java/refinedstorage/gui/grid/stack/ClientStackFluid.java index 60d165993..13e9b5d6d 100755 --- a/src/main/java/refinedstorage/gui/grid/stack/ClientStackFluid.java +++ b/src/main/java/refinedstorage/gui/grid/stack/ClientStackFluid.java @@ -6,32 +6,40 @@ import net.minecraft.client.Minecraft; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.common.network.ByteBufUtils; +import refinedstorage.api.network.NetworkUtils; import refinedstorage.gui.GuiBase; import java.util.Locale; public class ClientStackFluid implements IClientStack { + private int hash; private FluidStack stack; private FluidStackRenderer renderer; public ClientStackFluid(ByteBuf buf) { - stack = new FluidStack(FluidRegistry.getFluid(ByteBufUtils.readUTF8String(buf)), buf.readInt(), ByteBufUtils.readTag(buf)); - renderer = new FluidStackRenderer(1000, false, 16, 16, null); + this.hash = buf.readInt(); + this.stack = new FluidStack(FluidRegistry.getFluid(ByteBufUtils.readUTF8String(buf)), buf.readInt(), ByteBufUtils.readTag(buf)); + // @TODO: Switch to own implementation + this.renderer = new FluidStackRenderer(1000, false, 16, 16, null); } public FluidStack getStack() { return stack; } + @Override + public int getHash() { + return hash; + } + @Override public String getName() { return stack.getFluid().getLocalizedName(stack); } - // @todo: ;-) @Override public String getModId() { - return "minecraft"; + return stack.getFluid().getStill(stack).getResourceDomain(); } @Override @@ -57,6 +65,7 @@ public class ClientStackFluid implements IClientStack { } public static void write(ByteBuf buf, FluidStack stack) { + buf.writeInt(NetworkUtils.getFluidStackHashCode(stack)); ByteBufUtils.writeUTF8String(buf, FluidRegistry.getFluidName(stack.getFluid())); buf.writeInt(stack.amount); ByteBufUtils.writeTag(buf, stack.tag); diff --git a/src/main/java/refinedstorage/gui/grid/stack/ClientStackItem.java b/src/main/java/refinedstorage/gui/grid/stack/ClientStackItem.java index b9b0ac9d9..20eb9ea07 100755 --- a/src/main/java/refinedstorage/gui/grid/stack/ClientStackItem.java +++ b/src/main/java/refinedstorage/gui/grid/stack/ClientStackItem.java @@ -24,10 +24,6 @@ public class ClientStackItem implements IClientStack { craftable = buf.readBoolean(); } - public int getHash() { - return hash; - } - public ItemStack getStack() { return stack; } @@ -36,6 +32,11 @@ public class ClientStackItem implements IClientStack { return craftable; } + @Override + public int getHash() { + return hash; + } + @Override public String getName() { return stack.getDisplayName(); diff --git a/src/main/java/refinedstorage/gui/grid/stack/IClientStack.java b/src/main/java/refinedstorage/gui/grid/stack/IClientStack.java index e6820103b..8aae2cc32 100755 --- a/src/main/java/refinedstorage/gui/grid/stack/IClientStack.java +++ b/src/main/java/refinedstorage/gui/grid/stack/IClientStack.java @@ -3,6 +3,8 @@ package refinedstorage.gui.grid.stack; import refinedstorage.gui.GuiBase; public interface IClientStack { + int getHash(); + String getName(); String getModId(); diff --git a/src/main/java/refinedstorage/network/MessageGridCraftingStart.java b/src/main/java/refinedstorage/network/MessageGridCraftingStart.java index 853d95a60..e13ad0159 100755 --- a/src/main/java/refinedstorage/network/MessageGridCraftingStart.java +++ b/src/main/java/refinedstorage/network/MessageGridCraftingStart.java @@ -36,7 +36,7 @@ public class MessageGridCraftingStart extends MessageHandlerPlayerToServer implements IMessage { + public MessageGridFluidInsertHeld() { + } + + @Override + public void fromBytes(ByteBuf buf) { + } + + @Override + public void toBytes(ByteBuf buf) { + } + + @Override + public void handle(MessageGridFluidInsertHeld message, EntityPlayerMP player) { + Container container = player.openContainer; + + if (container instanceof ContainerGrid) { + IFluidGridHandler handler = ((ContainerGrid) container).getGrid().getFluidHandler(); + + if (handler != null) { + handler.onInsertHeldContainer(player); + } + } + } +} diff --git a/src/main/java/refinedstorage/network/MessageGridFluidPull.java b/src/main/java/refinedstorage/network/MessageGridFluidPull.java new file mode 100755 index 000000000..0210ef782 --- /dev/null +++ b/src/main/java/refinedstorage/network/MessageGridFluidPull.java @@ -0,0 +1,46 @@ +package refinedstorage.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Container; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import refinedstorage.api.network.grid.IFluidGridHandler; +import refinedstorage.container.ContainerGrid; + +public class MessageGridFluidPull extends MessageHandlerPlayerToServer implements IMessage { + private int hash; + private boolean shift; + + public MessageGridFluidPull() { + } + + public MessageGridFluidPull(int hash, boolean shift) { + this.hash = hash; + this.shift = shift; + } + + @Override + public void fromBytes(ByteBuf buf) { + hash = buf.readInt(); + shift = buf.readBoolean(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(hash); + buf.writeBoolean(shift); + } + + @Override + public void handle(MessageGridFluidPull message, EntityPlayerMP player) { + Container container = player.openContainer; + + if (container instanceof ContainerGrid) { + IFluidGridHandler handler = ((ContainerGrid) container).getGrid().getFluidHandler(); + + if (handler != null) { + handler.onExtract(message.hash, message.shift, player); + } + } + } +} diff --git a/src/main/java/refinedstorage/network/MessageGridInsertHeld.java b/src/main/java/refinedstorage/network/MessageGridItemInsertHeld.java similarity index 73% rename from src/main/java/refinedstorage/network/MessageGridInsertHeld.java rename to src/main/java/refinedstorage/network/MessageGridItemInsertHeld.java index d931e944e..8aee35947 100755 --- a/src/main/java/refinedstorage/network/MessageGridInsertHeld.java +++ b/src/main/java/refinedstorage/network/MessageGridItemInsertHeld.java @@ -7,13 +7,13 @@ import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import refinedstorage.api.network.grid.IItemGridHandler; import refinedstorage.container.ContainerGrid; -public class MessageGridInsertHeld extends MessageHandlerPlayerToServer implements IMessage { +public class MessageGridItemInsertHeld extends MessageHandlerPlayerToServer implements IMessage { private boolean single; - public MessageGridInsertHeld() { + public MessageGridItemInsertHeld() { } - public MessageGridInsertHeld(boolean single) { + public MessageGridItemInsertHeld(boolean single) { this.single = single; } @@ -28,11 +28,11 @@ public class MessageGridInsertHeld extends MessageHandlerPlayerToServer implements IMessage { +public class MessageGridItemPull extends MessageHandlerPlayerToServer implements IMessage { private int hash; private int flags; - public MessageGridPull() { + public MessageGridItemPull() { } - public MessageGridPull(int hash, int flags) { + public MessageGridItemPull(int hash, int flags) { this.hash = hash; this.flags = flags; } @@ -32,11 +32,11 @@ public class MessageGridPull extends MessageHandlerPlayerToServer