diff --git a/src/main/java/refinedstorage/api/network/INetworkMaster.java b/src/main/java/refinedstorage/api/network/INetworkMaster.java index b5178c2ed..9f94b5b25 100755 --- a/src/main/java/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/refinedstorage/api/network/INetworkMaster.java @@ -137,13 +137,31 @@ public interface INetworkMaster { void sendItemStorageToClient(EntityPlayerMP player); /** - * Sends a storage change to all clients that are watching a grid. + * Sends a item storage change to all clients that are watching a grid. * * @param stack The stack * @param delta The delta */ void sendItemStorageDeltaToClient(ItemStack stack, int delta); + /** + * Sends a grid packet with all the fluids to all clients that are watching a grid. + */ + void sendFluidStorageToClient(); + + /** + * Sends a grid packet with all the fluids to a specific player. + */ + void sendFluidStorageToClient(EntityPlayerMP player); + + /** + * Sends a fluids storage change to all clients that are watching a grid. + * + * @param stack The stack + * @param delta The delta + */ + void sendFluidStorageDeltaToClient(FluidStack stack, int delta); + /** * Inserts an item to this network. * diff --git a/src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java b/src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java index eba08be93..44a504c8d 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java +++ b/src/main/java/refinedstorage/apiimpl/storage/fluid/GroupedFluidStorage.java @@ -39,6 +39,8 @@ public class GroupedFluidStorage implements IGroupedFluidStorage { add(stack, true); } } + + network.sendFluidStorageToClient(); } @Override @@ -47,11 +49,19 @@ public class GroupedFluidStorage implements IGroupedFluidStorage { if (otherStack.isFluidEqual(stack)) { otherStack.amount += stack.amount; + if (!rebuilding) { + network.sendFluidStorageDeltaToClient(stack, stack.amount); + } + return; } } stacks.put(stack.getFluid(), stack.copy()); + + if (!rebuilding) { + network.sendFluidStorageDeltaToClient(stack, stack.amount); + } } @Override @@ -64,6 +74,8 @@ public class GroupedFluidStorage implements IGroupedFluidStorage { stacks.remove(otherStack.getFluid(), otherStack); } + network.sendFluidStorageDeltaToClient(stack, -stack.amount); + return; } } diff --git a/src/main/java/refinedstorage/block/BlockGrid.java b/src/main/java/refinedstorage/block/BlockGrid.java index 41e5841eb..7360a1124 100755 --- a/src/main/java/refinedstorage/block/BlockGrid.java +++ b/src/main/java/refinedstorage/block/BlockGrid.java @@ -33,7 +33,7 @@ public class BlockGrid extends BlockNode { @Override public void getSubBlocks(Item item, CreativeTabs tab, List subItems) { - for (int i = 0; i <= 2; i++) { + for (int i = 0; i <= 3; i++) { subItems.add(new ItemStack(item, 1, i)); } } @@ -47,12 +47,12 @@ public class BlockGrid extends BlockNode { @Override public IBlockState getStateFromMeta(int meta) { - return getDefaultState().withProperty(TYPE, meta == 0 ? EnumGridType.NORMAL : (meta == 1 ? EnumGridType.CRAFTING : EnumGridType.PATTERN)); + return getDefaultState().withProperty(TYPE, meta == 0 ? EnumGridType.NORMAL : (meta == 1 ? EnumGridType.CRAFTING : (meta == 2 ? EnumGridType.PATTERN : EnumGridType.FLUID))); } @Override public int getMetaFromState(IBlockState state) { - return state.getValue(TYPE) == EnumGridType.NORMAL ? 0 : (state.getValue(TYPE) == EnumGridType.CRAFTING ? 1 : 2); + return state.getValue(TYPE) == EnumGridType.NORMAL ? 0 : (state.getValue(TYPE) == EnumGridType.CRAFTING ? 1 : (state.getValue(TYPE) == EnumGridType.PATTERN ? 2 : 3)); } @Override diff --git a/src/main/java/refinedstorage/block/EnumGridType.java b/src/main/java/refinedstorage/block/EnumGridType.java index dc0d28de1..8c0293ae5 100755 --- a/src/main/java/refinedstorage/block/EnumGridType.java +++ b/src/main/java/refinedstorage/block/EnumGridType.java @@ -5,7 +5,8 @@ import net.minecraft.util.IStringSerializable; public enum EnumGridType implements IStringSerializable { NORMAL(0, "normal"), CRAFTING(1, "crafting"), - PATTERN(2, "pattern"); + PATTERN(2, "pattern"), + FLUID(3, "fluid"); private int id; private String name; diff --git a/src/main/java/refinedstorage/container/ContainerGrid.java b/src/main/java/refinedstorage/container/ContainerGrid.java index a3c48e8f7..e6c611dac 100755 --- a/src/main/java/refinedstorage/container/ContainerGrid.java +++ b/src/main/java/refinedstorage/container/ContainerGrid.java @@ -61,8 +61,10 @@ public class ContainerGrid extends ContainerBase { addSlotToContainer(new SlotOutput(((TileGrid) grid).getPatterns(), 1, 152, 132)); } - for (int i = 0; i < 4; ++i) { - addSlotToContainer(new SlotItemHandler(grid.getFilter(), i, 204, 6 + (18 * i))); + if (grid.getType() != EnumGridType.FLUID) { + for (int i = 0; i < 4; ++i) { + addSlotToContainer(new SlotItemHandler(grid.getFilter(), i, 204, 6 + (18 * i))); + } } } @@ -104,7 +106,7 @@ 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)) { + } else if (grid.getHandler() != null && slot != patternResultSlot && !(slot instanceof SlotSpecimenLegacy) && grid.getType() != EnumGridType.FLUID) { slot.putStack(grid.getHandler().onInsert(slot.getStack())); detectAndSendChanges(); diff --git a/src/main/java/refinedstorage/gui/GuiBase.java b/src/main/java/refinedstorage/gui/GuiBase.java index 9e99022a8..89ba17288 100755 --- a/src/main/java/refinedstorage/gui/GuiBase.java +++ b/src/main/java/refinedstorage/gui/GuiBase.java @@ -212,28 +212,32 @@ public abstract class GuiBase extends GuiContainer { itemRender.renderItemOverlayIntoGUI(fontRendererObj, stack, x, y, ""); if (text != null) { - GlStateManager.pushMatrix(); - GlStateManager.translate(x, y, 1); - GlStateManager.scale(0.5f, 0.5f, 1); - - GlStateManager.disableLighting(); - GlStateManager.disableRescaleNormal(); - GlStateManager.depthMask(false); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(770, 771); - GlStateManager.disableDepth(); - - fontRendererObj.drawStringWithShadow(text, 30 - fontRendererObj.getStringWidth(text), 22, 16777215); - - GlStateManager.enableDepth(); - GlStateManager.enableTexture2D(); - GlStateManager.depthMask(true); - GlStateManager.enableLighting(); - GlStateManager.disableBlend(); - GlStateManager.popMatrix(); + drawQuantity(x, y, text); } } + public void drawQuantity(int x, int y, String qty) { + GlStateManager.pushMatrix(); + GlStateManager.translate(x, y, 1); + GlStateManager.scale(0.5f, 0.5f, 1); + + GlStateManager.disableLighting(); + GlStateManager.disableRescaleNormal(); + GlStateManager.depthMask(false); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(770, 771); + GlStateManager.disableDepth(); + + fontRendererObj.drawStringWithShadow(qty, 30 - fontRendererObj.getStringWidth(qty), 22, 16777215); + + GlStateManager.enableDepth(); + GlStateManager.enableTexture2D(); + GlStateManager.depthMask(true); + GlStateManager.enableLighting(); + GlStateManager.disableBlend(); + GlStateManager.popMatrix(); + } + public void drawString(int x, int y, String message) { drawString(x, y, message, 4210752); } diff --git a/src/main/java/refinedstorage/gui/grid/GuiGrid.java b/src/main/java/refinedstorage/gui/grid/GuiGrid.java index 89dd33073..a8fcfaacf 100755 --- a/src/main/java/refinedstorage/gui/grid/GuiGrid.java +++ b/src/main/java/refinedstorage/gui/grid/GuiGrid.java @@ -11,6 +11,7 @@ import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fml.common.FMLCommonHandler; import refinedstorage.RefinedStorage; import refinedstorage.api.network.grid.IItemGridHandler; @@ -21,6 +22,7 @@ import refinedstorage.gui.GuiBase; import refinedstorage.gui.Scrollbar; import refinedstorage.gui.grid.sorting.GridSortingName; import refinedstorage.gui.grid.sorting.GridSortingQuantity; +import refinedstorage.gui.grid.stack.ClientStackFluid; import refinedstorage.gui.grid.stack.ClientStackItem; import refinedstorage.gui.grid.stack.IClientStack; import refinedstorage.gui.sidebutton.*; @@ -43,8 +45,10 @@ public class GuiGrid extends GuiBase { public static final GridSortingQuantity SORTING_QUANTITY = new GridSortingQuantity(); public static final GridSortingName SORTING_NAME = new GridSortingName(); - public static Multimap ITEMS = ArrayListMultimap.create(); - public static List SORTED_ITEMS = new ArrayList<>(); + public static Multimap ITEMS = ArrayListMultimap.create(); + public static Multimap FLUIDS = ArrayListMultimap.create(); + + public static List STACKS = new ArrayList<>(); private static boolean markedForSorting; @@ -62,7 +66,7 @@ public class GuiGrid extends GuiBase { public GuiGrid(ContainerGrid container, IGrid grid) { super(container, 227, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN) ? 247 : 208); - setScrollbar(new Scrollbar(174, 20, 12, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN) ? 70 : 88)); + setScrollbar(new Scrollbar(174, 20, 12, (grid.getType() == EnumGridType.CRAFTING || grid.getType() == EnumGridType.PATTERN || grid.getType() == EnumGridType.FLUID) ? 70 : 88)); this.container = container; this.grid = grid; @@ -89,7 +93,10 @@ public class GuiGrid extends GuiBase { searchField.yPosition = sy; } - addSideButton(new SideButtonGridViewType(grid)); + if (grid.getType() != EnumGridType.FLUID) { + addSideButton(new SideButtonGridViewType(grid)); + } + addSideButton(new SideButtonGridSortingDirection(grid)); addSideButton(new SideButtonGridSortingType(grid)); addSideButton(new SideButtonGridSearchBoxMode(this)); @@ -102,44 +109,46 @@ public class GuiGrid extends GuiBase { } private void sortItems() { - List sortedItems = new ArrayList<>(); + List stacks = new ArrayList<>(); if (grid.isConnected()) { - sortedItems.addAll(ITEMS.values()); + stacks.addAll(grid.getType() == EnumGridType.FLUID ? FLUIDS.values() : ITEMS.values()); String query = searchField.getText().trim().toLowerCase(); - Iterator t = sortedItems.iterator(); + Iterator t = stacks.iterator(); while (t.hasNext()) { IClientStack stack = t.next(); - List filteredItems = grid.getFilteredItems(); + if (grid.getType() != EnumGridType.FLUID) { + List filteredItems = grid.getFilteredItems(); - boolean found = filteredItems.isEmpty(); + boolean found = filteredItems.isEmpty(); - for (GridFilteredItem filteredItem : filteredItems) { - if (CompareUtils.compareStack(((ClientStackItem) stack).getStack(), filteredItem.getStack(), filteredItem.getCompare())) { - found = true; + for (GridFilteredItem filteredItem : filteredItems) { + if (CompareUtils.compareStack(((ClientStackItem) stack).getStack(), filteredItem.getStack(), filteredItem.getCompare())) { + found = true; - break; + break; + } } - } - if (!found) { - t.remove(); + if (!found) { + t.remove(); - continue; - } + continue; + } - if (grid.getViewType() == TileGrid.VIEW_TYPE_NON_CRAFTABLES && stack.isCraftable()) { - t.remove(); + if (grid.getViewType() == TileGrid.VIEW_TYPE_NON_CRAFTABLES && ((ClientStackItem) stack).isCraftable()) { + t.remove(); - continue; - } else if (grid.getViewType() == TileGrid.VIEW_TYPE_CRAFTABLES && !stack.isCraftable()) { - t.remove(); + continue; + } else if (grid.getViewType() == TileGrid.VIEW_TYPE_CRAFTABLES && !((ClientStackItem) stack).isCraftable()) { + t.remove(); - continue; + continue; + } } if (query.startsWith("@")) { @@ -173,14 +182,14 @@ public class GuiGrid extends GuiBase { SORTING_NAME.setSortingDirection(grid.getSortingDirection()); SORTING_QUANTITY.setSortingDirection(grid.getSortingDirection()); - Collections.sort(sortedItems, SORTING_NAME); + Collections.sort(stacks, SORTING_NAME); if (grid.getSortingType() == TileGrid.SORTING_TYPE_QUANTITY) { - Collections.sort(sortedItems, SORTING_QUANTITY); + Collections.sort(stacks, SORTING_QUANTITY); } } - SORTED_ITEMS = sortedItems; + STACKS = stacks; getScrollbar().setEnabled(getRows() > getVisibleRows()); getScrollbar().setMaxOffset(getRows() - getVisibleRows()); @@ -196,11 +205,11 @@ public class GuiGrid extends GuiBase { } private int getRows() { - return Math.max(0, (int) Math.ceil((float) SORTED_ITEMS.size() / 9F)); + return Math.max(0, (int) Math.ceil((float) STACKS.size() / 9F)); } private boolean isOverSlotWithItem() { - return grid.isConnected() && isOverSlot() && slotNumber < SORTED_ITEMS.size(); + return grid.isConnected() && isOverSlot() && slotNumber < STACKS.size(); } private boolean isOverSlot() { @@ -236,6 +245,8 @@ public class GuiGrid extends GuiBase { bindTexture("gui/crafting_grid.png"); } else if (grid.getType() == EnumGridType.PATTERN) { bindTexture("gui/pattern_grid.png"); + } else if (grid.getType() == EnumGridType.FLUID) { + bindTexture("gui/fluid_grid.png"); } else { bindTexture("gui/grid.png"); } @@ -278,8 +289,8 @@ public class GuiGrid extends GuiBase { this.slotNumber = slot; } - if (slot < SORTED_ITEMS.size()) { - SORTED_ITEMS.get(slot).draw(this, x, y, GuiScreen.isShiftKeyDown() && slotNumber == slot); + if (slot < STACKS.size()) { + STACKS.get(slot).draw(this, x, y, GuiScreen.isShiftKeyDown() && slotNumber == slot); } if (inBounds(x, y, 16, 16, mouseX, mouseY) || !grid.isConnected()) { @@ -307,7 +318,7 @@ public class GuiGrid extends GuiBase { } if (isOverSlotWithItem()) { - drawTooltip(mouseX, mouseY, SORTED_ITEMS.get(slotNumber).getTooltip()); + drawTooltip(mouseX, mouseY, STACKS.get(slotNumber).getTooltip()); } if (isOverClear(mouseX, mouseY)) { @@ -341,21 +352,21 @@ 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()) { + } else if (grid.isConnected() && grid.getType() != EnumGridType.FLUID) { if (clickedClear) { RefinedStorage.INSTANCE.network.sendToServer(new MessageGridCraftingClear((TileGrid) grid)); } ItemStack held = container.getPlayer().inventory.getItemStack(); - ClientStackItem stack = (ClientStackItem) SORTED_ITEMS.get(slotNumber); - if (isOverSlotArea(mouseX - guiLeft, mouseY - guiTop) && held != null && (clickedButton == 0 || clickedButton == 1)) { RefinedStorage.INSTANCE.network.sendToServer(new MessageGridInsertHeld(clickedButton == 1)); } if (isOverSlotWithItem() && (held == null || (held != null && clickedButton == 2))) { - if (SORTED_ITEMS.get(slotNumber).isCraftable() && (stack.getQuantity() == 0 || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown()))) { + 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)); } else { int flags = 0; diff --git a/src/main/java/refinedstorage/gui/grid/stack/ClientStackFluid.java b/src/main/java/refinedstorage/gui/grid/stack/ClientStackFluid.java new file mode 100755 index 000000000..60d165993 --- /dev/null +++ b/src/main/java/refinedstorage/gui/grid/stack/ClientStackFluid.java @@ -0,0 +1,64 @@ +package refinedstorage.gui.grid.stack; + +import io.netty.buffer.ByteBuf; +import mezz.jei.gui.ingredients.FluidStackRenderer; +import net.minecraft.client.Minecraft; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.network.ByteBufUtils; +import refinedstorage.gui.GuiBase; + +import java.util.Locale; + +public class ClientStackFluid implements IClientStack { + 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); + } + + public FluidStack getStack() { + return stack; + } + + @Override + public String getName() { + return stack.getFluid().getLocalizedName(stack); + } + + // @todo: ;-) + @Override + public String getModId() { + return "minecraft"; + } + + @Override + public String getTooltip() { + return stack.getFluid().getLocalizedName(stack); + } + + @Override + public int getQuantity() { + return stack.amount; + } + + @Override + public void draw(GuiBase gui, int x, int y, boolean isOverWithShift) { + renderer.draw(Minecraft.getMinecraft(), x, y, stack); + + gui.drawQuantity(x, y, String.format(Locale.US, "%.1f", (float) stack.amount / 1000).replace(".0", "") + "B"); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ClientStackFluid && ((ClientStackFluid) obj).getStack().isFluidEqual(stack); + } + + public static void write(ByteBuf buf, FluidStack 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 ae3908859..b9b0ac9d9 100755 --- a/src/main/java/refinedstorage/gui/grid/stack/ClientStackItem.java +++ b/src/main/java/refinedstorage/gui/grid/stack/ClientStackItem.java @@ -32,7 +32,6 @@ public class ClientStackItem implements IClientStack { return stack; } - @Override public boolean isCraftable() { return craftable; } diff --git a/src/main/java/refinedstorage/gui/grid/stack/IClientStack.java b/src/main/java/refinedstorage/gui/grid/stack/IClientStack.java index c5a0dc007..e6820103b 100755 --- a/src/main/java/refinedstorage/gui/grid/stack/IClientStack.java +++ b/src/main/java/refinedstorage/gui/grid/stack/IClientStack.java @@ -3,8 +3,6 @@ package refinedstorage.gui.grid.stack; import refinedstorage.gui.GuiBase; public interface IClientStack { - boolean isCraftable(); - String getName(); String getModId(); diff --git a/src/main/java/refinedstorage/network/MessageGridFluidDelta.java b/src/main/java/refinedstorage/network/MessageGridFluidDelta.java new file mode 100755 index 000000000..a14070fee --- /dev/null +++ b/src/main/java/refinedstorage/network/MessageGridFluidDelta.java @@ -0,0 +1,61 @@ +package refinedstorage.network; + +import io.netty.buffer.ByteBuf; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import refinedstorage.gui.grid.GuiGrid; +import refinedstorage.gui.grid.stack.ClientStackFluid; + +public class MessageGridFluidDelta implements IMessage, IMessageHandler { + private FluidStack stack; + private int delta; + + private ClientStackFluid clientStack; + + public MessageGridFluidDelta() { + } + + public MessageGridFluidDelta(FluidStack stack, int delta) { + this.stack = stack; + this.delta = delta; + } + + @Override + public void fromBytes(ByteBuf buf) { + clientStack = new ClientStackFluid(buf); + delta = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + ClientStackFluid.write(buf, stack); + buf.writeInt(delta); + } + + @Override + public IMessage onMessage(MessageGridFluidDelta message, MessageContext ctx) { + Fluid fluid = message.clientStack.getStack().getFluid(); + + for (ClientStackFluid stack : GuiGrid.FLUIDS.get(fluid)) { + if (stack.equals(message.clientStack)) { + if (stack.getStack().amount + message.delta == 0) { + GuiGrid.FLUIDS.remove(fluid, stack); + } else { + stack.getStack().amount += message.delta; + } + + GuiGrid.markForSorting(); + + return null; + } + } + + GuiGrid.FLUIDS.put(fluid, message.clientStack); + GuiGrid.markForSorting(); + + return null; + } +} diff --git a/src/main/java/refinedstorage/network/MessageGridFluidUpdate.java b/src/main/java/refinedstorage/network/MessageGridFluidUpdate.java new file mode 100755 index 000000000..fa88d7c45 --- /dev/null +++ b/src/main/java/refinedstorage/network/MessageGridFluidUpdate.java @@ -0,0 +1,56 @@ +package refinedstorage.network; + +import io.netty.buffer.ByteBuf; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import refinedstorage.api.network.INetworkMaster; +import refinedstorage.gui.grid.GuiGrid; +import refinedstorage.gui.grid.stack.ClientStackFluid; + +import java.util.ArrayList; +import java.util.List; + +public class MessageGridFluidUpdate implements IMessage, IMessageHandler { + private INetworkMaster network; + private List stacks = new ArrayList<>(); + + public MessageGridFluidUpdate() { + } + + public MessageGridFluidUpdate(INetworkMaster network) { + this.network = network; + } + + @Override + public void fromBytes(ByteBuf buf) { + int items = buf.readInt(); + + for (int i = 0; i < items; ++i) { + this.stacks.add(new ClientStackFluid(buf)); + } + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(network.getFluidStorage().getStacks().size()); + + for (FluidStack stack : network.getFluidStorage().getStacks()) { + ClientStackFluid.write(buf, stack); + } + } + + @Override + public IMessage onMessage(MessageGridFluidUpdate message, MessageContext ctx) { + GuiGrid.FLUIDS.clear(); + + for (ClientStackFluid item : message.stacks) { + GuiGrid.FLUIDS.put(item.getStack().getFluid(), item); + } + + GuiGrid.markForSorting(); + + return null; + } +} diff --git a/src/main/java/refinedstorage/network/MessageGridDelta.java b/src/main/java/refinedstorage/network/MessageGridItemDelta.java similarity index 77% rename from src/main/java/refinedstorage/network/MessageGridDelta.java rename to src/main/java/refinedstorage/network/MessageGridItemDelta.java index 89f4b19be..dc6e5c838 100755 --- a/src/main/java/refinedstorage/network/MessageGridDelta.java +++ b/src/main/java/refinedstorage/network/MessageGridItemDelta.java @@ -9,19 +9,18 @@ import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; import refinedstorage.api.network.INetworkMaster; import refinedstorage.gui.grid.GuiGrid; import refinedstorage.gui.grid.stack.ClientStackItem; -import refinedstorage.gui.grid.stack.IClientStack; -public class MessageGridDelta implements IMessage, IMessageHandler { +public class MessageGridItemDelta implements IMessage, IMessageHandler { private INetworkMaster network; private ItemStack stack; private int delta; private ClientStackItem clientStack; - public MessageGridDelta() { + public MessageGridItemDelta() { } - public MessageGridDelta(INetworkMaster network, ItemStack stack, int delta) { + public MessageGridItemDelta(INetworkMaster network, ItemStack stack, int delta) { this.network = network; this.stack = stack; this.delta = delta; @@ -40,12 +39,10 @@ public class MessageGridDelta implements IMessage, IMessageHandler { +public class MessageGridItemUpdate implements IMessage, IMessageHandler { private INetworkMaster network; - private List items = new ArrayList<>(); + private List stacks = new ArrayList<>(); - public MessageGridUpdate() { + public MessageGridItemUpdate() { } - public MessageGridUpdate(INetworkMaster network) { + public MessageGridItemUpdate(INetworkMaster network) { this.network = network; } @@ -28,7 +28,7 @@ public class MessageGridUpdate implements IMessage, IMessageHandler isWatchingGrid(player, EnumGridType.NORMAL, EnumGridType.CRAFTING, EnumGridType.PATTERN)) .forEach(this::sendItemStorageToClient); } @Override public void sendItemStorageToClient(EntityPlayerMP player) { - RefinedStorage.INSTANCE.network.sendTo(new MessageGridUpdate(this), player); + RefinedStorage.INSTANCE.network.sendTo(new MessageGridItemUpdate(this), player); } @Override public void sendItemStorageDeltaToClient(ItemStack stack, int delta) { worldObj.getMinecraftServer().getPlayerList().getPlayerList().stream() - .filter(this::isWatchingGrid) - .forEach(player -> RefinedStorage.INSTANCE.network.sendTo(new MessageGridDelta(this, stack, delta), player)); + .filter(player -> isWatchingGrid(player, EnumGridType.NORMAL, EnumGridType.CRAFTING, EnumGridType.PATTERN)) + .forEach(player -> RefinedStorage.INSTANCE.network.sendTo(new MessageGridItemDelta(this, stack, delta), player)); } - private boolean isWatchingGrid(EntityPlayer player) { - return player.openContainer.getClass() == ContainerGrid.class && pos.equals(((ContainerGrid) player.openContainer).getGrid().getNetworkPosition()); + @Override + public void sendFluidStorageToClient() { + worldObj.getMinecraftServer().getPlayerList().getPlayerList().stream() + .filter(player -> isWatchingGrid(player, EnumGridType.FLUID)) + .forEach(this::sendFluidStorageToClient); + } + + @Override + public void sendFluidStorageToClient(EntityPlayerMP player) { + RefinedStorage.INSTANCE.network.sendTo(new MessageGridFluidUpdate(this), player); + } + + @Override + public void sendFluidStorageDeltaToClient(FluidStack stack, int delta) { + worldObj.getMinecraftServer().getPlayerList().getPlayerList().stream() + .filter(player -> isWatchingGrid(player, EnumGridType.FLUID)) + .forEach(player -> RefinedStorage.INSTANCE.network.sendTo(new MessageGridFluidDelta(stack, delta), player)); + } + + private boolean isWatchingGrid(EntityPlayer player, EnumGridType... types) { + if (player.openContainer.getClass() == ContainerGrid.class) { + IGrid grid = ((ContainerGrid) player.openContainer).getGrid(); + + if (pos.equals(grid.getNetworkPosition())) { + return Arrays.asList(types).contains(grid.getType()); + } + } + + return false; } @Override diff --git a/src/main/java/refinedstorage/tile/grid/TileGrid.java b/src/main/java/refinedstorage/tile/grid/TileGrid.java index ac4c04741..33fe14ca9 100755 --- a/src/main/java/refinedstorage/tile/grid/TileGrid.java +++ b/src/main/java/refinedstorage/tile/grid/TileGrid.java @@ -190,7 +190,11 @@ public class TileGrid extends TileNode implements IGrid { public void onGridOpened(EntityPlayer player) { if (isConnected()) { - network.sendItemStorageToClient((EntityPlayerMP) player); + if (getType() == EnumGridType.FLUID) { + network.sendFluidStorageToClient((EntityPlayerMP) player); + } else { + network.sendItemStorageToClient((EntityPlayerMP) player); + } } } diff --git a/src/main/resources/assets/refinedstorage/lang/en_US.lang b/src/main/resources/assets/refinedstorage/lang/en_US.lang index 7f2a306d3..842dc93c0 100755 --- a/src/main/resources/assets/refinedstorage/lang/en_US.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_US.lang @@ -102,6 +102,7 @@ block.refinedstorage:cable.name=Cable block.refinedstorage:grid.0.name=Grid block.refinedstorage:grid.1.name=Crafting Grid block.refinedstorage:grid.2.name=Pattern Grid +block.refinedstorage:grid.3.name=Fluid Grid block.refinedstorage:disk_drive.name=Disk Drive block.refinedstorage:external_storage.name=External Storage block.refinedstorage:importer.name=Importer diff --git a/src/main/resources/assets/refinedstorage/textures/gui/fluid_grid.png b/src/main/resources/assets/refinedstorage/textures/gui/fluid_grid.png new file mode 100755 index 000000000..5ba8ff87f Binary files /dev/null and b/src/main/resources/assets/refinedstorage/textures/gui/fluid_grid.png differ