diff --git a/CHANGELOG.md b/CHANGELOG.md index d1ad9417e..3f5b2eb89 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Refined Storage Changelog ### 1.9.17 +- Added more slots to the Pattern Grid (Darkere) +- Combined Fluid and Item View in the Pattern Grid (Darkere) ### 1.9.16 diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/AllowedTagList.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/AllowedTagList.java index 6bc7f1732..2fab37882 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/AllowedTagList.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/AllowedTagList.java @@ -22,8 +22,8 @@ public class AllowedTagList { @Nullable private final Runnable listener; - public AllowedTagList(@Nullable Runnable listener) { - for (int i = 0; i < 9; ++i) { + public AllowedTagList(@Nullable Runnable listener, int size) { + for (int i = 0; i < size; ++i) { allowedItemTags.add(new HashSet<>()); allowedFluidTags.add(new HashSet<>()); } diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/CraftingPatternFactory.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/CraftingPatternFactory.java index 6655f7b52..305801d54 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/CraftingPatternFactory.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/autocrafting/CraftingPatternFactory.java @@ -2,6 +2,7 @@ package com.refinedmods.refinedstorage.apiimpl.autocrafting; import com.refinedmods.refinedstorage.api.autocrafting.ICraftingPattern; import com.refinedmods.refinedstorage.api.autocrafting.ICraftingPatternContainer; +import com.refinedmods.refinedstorage.apiimpl.network.node.GridNetworkNode; import com.refinedmods.refinedstorage.item.PatternItem; import net.minecraft.fluid.Fluid; import net.minecraft.inventory.CraftingInventory; @@ -39,7 +40,7 @@ public class CraftingPatternFactory { try { if (processing) { - for (int i = 0; i < 9; ++i) { + for (int i = 0; i < GridNetworkNode.PROCESSING_MATRIX_SIZE; ++i) { fillProcessingInputs(i, stack, inputs, outputs, allowedTagList); fillProcessingFluidInputs(i, stack, fluidInputs, fluidOutputs, allowedTagList); } diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/GridNetworkNode.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/GridNetworkNode.java index 098e2df48..2340e634c 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/GridNetworkNode.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/GridNetworkNode.java @@ -79,7 +79,9 @@ public class GridNetworkNode extends NetworkNode implements INetworkAwareGrid, I private static final String NBT_PROCESSING_MATRIX_FLUIDS = "ProcessingMatrixFluids"; private static final String NBT_ALLOWED_TAGS = "AllowedTags"; - private final AllowedTagList allowedTagList = new AllowedTagList(this::updateAllowedTags); + public static final int PROCESSING_MATRIX_SIZE = 81; + + private final AllowedTagList allowedTagList = new AllowedTagList(this::updateAllowedTags, PROCESSING_MATRIX_SIZE); private final Container craftingContainer = new Container(ContainerType.CRAFTING, 0) { @Override @@ -97,17 +99,17 @@ public class GridNetworkNode extends NetworkNode implements INetworkAwareGrid, I private ICraftingRecipe currentRecipe; private final CraftingInventory matrix = new CraftingInventory(craftingContainer, 3, 3); private final CraftResultInventory result = new CraftResultInventory(); - private final BaseItemHandler processingMatrix = new BaseItemHandler(9 * 2) + private final BaseItemHandler processingMatrix = new BaseItemHandler(PROCESSING_MATRIX_SIZE * 2) .addListener(new NetworkNodeInventoryListener(this)) .addListener((handler, slot, reading) -> { - if (!reading && slot < 9) { + if (!reading && slot < PROCESSING_MATRIX_SIZE) { allowedTagList.clearItemTags(slot); } }); - private final FluidInventory processingMatrixFluids = new FluidInventory(9 * 2, FluidAttributes.BUCKET_VOLUME * 64) + private final FluidInventory processingMatrixFluids = new FluidInventory(PROCESSING_MATRIX_SIZE * 2, FluidAttributes.BUCKET_VOLUME * 64) .addListener(new NetworkNodeFluidInventoryListener(this)) .addListener((handler, slot, reading) -> { - if (!reading && slot < 9) { + if (!reading && slot < PROCESSING_MATRIX_SIZE) { allowedTagList.clearFluidTags(slot); } }); @@ -146,14 +148,11 @@ public class GridNetworkNode extends NetworkNode implements INetworkAwareGrid, I boolean processing = PatternItem.isProcessing(pattern); if (processing) { - for (int i = 0; i < 9; ++i) { + for (int i = 0; i < PROCESSING_MATRIX_SIZE; ++i) { processingMatrix.setStackInSlot(i, PatternItem.getInputSlot(pattern, i)); processingMatrixFluids.setFluid(i, PatternItem.getFluidInputSlot(pattern, i)); - } - - for (int i = 0; i < 9; ++i) { - processingMatrix.setStackInSlot(9 + i, PatternItem.getOutputSlot(pattern, i)); - processingMatrixFluids.setFluid(9 + i, PatternItem.getFluidOutputSlot(pattern, i)); + processingMatrix.setStackInSlot(PROCESSING_MATRIX_SIZE + i, PatternItem.getOutputSlot(pattern, i)); + processingMatrixFluids.setFluid(PROCESSING_MATRIX_SIZE + i, PatternItem.getFluidOutputSlot(pattern, i)); } AllowedTagList allowedTagsFromPattern = PatternItem.getAllowedTags(pattern); @@ -498,10 +497,10 @@ public class GridNetworkNode extends NetworkNode implements INetworkAwareGrid, I } if (processingPattern) { - for (int i = 0; i < 18; ++i) { + for (int i = 0; i < processingMatrix.getSlots(); ++i) { if (!processingMatrix.getStackInSlot(i).isEmpty()) { - if (i >= 9) { - PatternItem.setOutputSlot(pattern, i - 9, processingMatrix.getStackInSlot(i)); + if (i >= PROCESSING_MATRIX_SIZE) { + PatternItem.setOutputSlot(pattern, i - PROCESSING_MATRIX_SIZE, processingMatrix.getStackInSlot(i)); } else { PatternItem.setInputSlot(pattern, i, processingMatrix.getStackInSlot(i)); } @@ -509,8 +508,8 @@ public class GridNetworkNode extends NetworkNode implements INetworkAwareGrid, I FluidStack fluid = processingMatrixFluids.getFluid(i); if (!fluid.isEmpty()) { - if (i >= 9) { - PatternItem.setFluidOutputSlot(pattern, i - 9, fluid); + if (i >= PROCESSING_MATRIX_SIZE) { + PatternItem.setFluidOutputSlot(pattern, i - PROCESSING_MATRIX_SIZE, fluid); } else { PatternItem.setFluidInputSlot(pattern, i, fluid); } @@ -543,7 +542,7 @@ public class GridNetworkNode extends NetworkNode implements INetworkAwareGrid, I int inputsFilled = 0; int outputsFilled = 0; - for (int i = 0; i < 9; ++i) { + for (int i = 0; i < PROCESSING_MATRIX_SIZE; ++i) { if (!processingMatrix.getStackInSlot(i).isEmpty()) { inputsFilled++; } @@ -553,7 +552,7 @@ public class GridNetworkNode extends NetworkNode implements INetworkAwareGrid, I } } - for (int i = 9; i < 18; ++i) { + for (int i = PROCESSING_MATRIX_SIZE; i < processingMatrix.getSlots(); ++i) { if (!processingMatrix.getStackInSlot(i).isEmpty()) { outputsFilled++; } diff --git a/src/main/java/com/refinedmods/refinedstorage/container/GridContainer.java b/src/main/java/com/refinedmods/refinedstorage/container/GridContainer.java index c613c0c4d..70a2ed899 100644 --- a/src/main/java/com/refinedmods/refinedstorage/container/GridContainer.java +++ b/src/main/java/com/refinedmods/refinedstorage/container/GridContainer.java @@ -29,6 +29,8 @@ import net.minecraft.network.play.server.SSetSlotPacket; import net.minecraftforge.items.SlotItemHandler; import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; public class GridContainer extends BaseContainer implements ICraftingGridListener { private final IGrid grid; @@ -38,6 +40,9 @@ public class GridContainer extends BaseContainer implements ICraftingGridListene private ResultCraftingGridSlot craftingResultSlot; private LegacyBaseSlot patternResultSlot; + private List itemPatternSlots = new ArrayList<>(); + private List fluidPatternSlots = new ArrayList<>(); + private int patternScrollOffset; public GridContainer(IGrid grid, @Nullable BaseTile gridTile, PlayerEntity player, int windowId) { super(RSContainers.GRID, gridTile, player, windowId); @@ -162,6 +167,8 @@ public class GridContainer extends BaseContainer implements ICraftingGridListene } private void addPatternSlots() { + itemPatternSlots.clear(); + fluidPatternSlots.clear(); int headerAndSlots = screenInfoProvider.getTopHeight() + (screenInfoProvider.getVisibleRows() * 18); addSlot(new SlotItemHandler(((GridNetworkNode) grid).getPatterns(), 0, 172, headerAndSlots + 4)); @@ -174,25 +181,28 @@ public class GridContainer extends BaseContainer implements ICraftingGridListene int x = ox; int y = headerAndSlots + 4; - for (int i = 0; i < 9 * 2; ++i) { + for (int i = 0; i < GridNetworkNode.PROCESSING_MATRIX_SIZE * 2; ++i) { int itemFilterSlotConfig = FilterSlot.FILTER_ALLOW_SIZE; - if (i < 9) { + if (i < GridNetworkNode.PROCESSING_MATRIX_SIZE) { itemFilterSlotConfig |= FilterSlot.FILTER_ALLOW_ALTERNATIVES; } int fluidFilterSlotConfig = FluidFilterSlot.FILTER_ALLOW_SIZE; - if (i < 9) { + if (i < GridNetworkNode.PROCESSING_MATRIX_SIZE) { fluidFilterSlotConfig |= FluidFilterSlot.FILTER_ALLOW_ALTERNATIVES; } - addSlot(new FilterSlot(((GridNetworkNode) grid).getProcessingMatrix(), i, x, y, itemFilterSlotConfig).setEnableHandler(() -> ((GridNetworkNode) grid).isProcessingPattern() && ((GridNetworkNode) grid).getType() == IType.ITEMS)); - addSlot(new FluidFilterSlot(((GridNetworkNode) grid).getProcessingMatrixFluids(), i, x, y, fluidFilterSlotConfig).setEnableHandler(() -> ((GridNetworkNode) grid).isProcessingPattern() && ((GridNetworkNode) grid).getType() == IType.FLUIDS)); + int finalI = i; + itemPatternSlots.add(addSlot(new FilterSlot(((GridNetworkNode) grid).getProcessingMatrix(), i, x, y, itemFilterSlotConfig) + .setEnableHandler(() -> getSlotEnabled(finalI, true)))); + fluidPatternSlots.add(addSlot(new FluidFilterSlot(((GridNetworkNode) grid).getProcessingMatrixFluids(), i, x, y, fluidFilterSlotConfig) + .setEnableHandler(() -> getSlotEnabled(finalI, false)))); x += 18; if ((i + 1) % 3 == 0) { - if (i == 8) { - ox = 98; + if (i == GridNetworkNode.PROCESSING_MATRIX_SIZE - 1) { + ox = 93; x = ox; y = headerAndSlots + 4; } else { @@ -221,6 +231,42 @@ public class GridContainer extends BaseContainer implements ICraftingGridListene addSlot(patternResultSlot); } + private boolean getSlotEnabled(int i, boolean item) { + if (!((GridNetworkNode) grid).isProcessingPattern() || !isVisible(i)) { + return false; + } + + if (item) { + if (itemPatternSlots.get(i).getHasStack()) { + return true; + } + + if (((FluidFilterSlot) fluidPatternSlots.get(i)).hasStack()) { + return false; + } + + return ((GridNetworkNode) grid).getType() == IType.ITEMS; + } else { + if (((FluidFilterSlot) fluidPatternSlots.get(i)).hasStack()) { + return true; + } + + if (itemPatternSlots.get(i).getHasStack()) { + return false; + } + + return ((GridNetworkNode) grid).getType() == IType.FLUIDS; + } + } + + private boolean isVisible(int slotNumber) { + return (slotNumber >= patternScrollOffset * 3 + && slotNumber < patternScrollOffset * 3 + 9) + + || (slotNumber >= patternScrollOffset * 3 + GridNetworkNode.PROCESSING_MATRIX_SIZE + && slotNumber < patternScrollOffset * 3 + GridNetworkNode.PROCESSING_MATRIX_SIZE + 9); + } + public IGrid getGrid() { return grid; } @@ -293,4 +339,25 @@ public class GridContainer extends BaseContainer implements ICraftingGridListene protected int getDisabledSlotNumber() { return grid.getSlotId(); } -} + + public void updatePatternSlotPositions(int newOffset) { + patternScrollOffset = newOffset; + int yPosition = screenInfoProvider.getTopHeight() + (screenInfoProvider.getVisibleRows() * 18) + 4; + int originalYPosition = yPosition; + + for (int i = 0; i < itemPatternSlots.size(); i++) { + + if (i == GridNetworkNode.PROCESSING_MATRIX_SIZE) { // reset when reaching output slots + yPosition = originalYPosition; + } + + if (isVisible(i)) { + itemPatternSlots.get(i).yPos = yPosition; + fluidPatternSlots.get(i).yPos = yPosition; + if ((i + 1) % 3 == 0) { + yPosition += 18; + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/refinedmods/refinedstorage/container/slot/filter/FluidFilterSlot.java b/src/main/java/com/refinedmods/refinedstorage/container/slot/filter/FluidFilterSlot.java index f6e1f8edd..673c4d5ee 100644 --- a/src/main/java/com/refinedmods/refinedstorage/container/slot/filter/FluidFilterSlot.java +++ b/src/main/java/com/refinedmods/refinedstorage/container/slot/filter/FluidFilterSlot.java @@ -52,4 +52,9 @@ public class FluidFilterSlot extends BaseSlot { public FluidInventory getFluidInventory() { return fluidInventory; } + + // not overriding getHasStack as we do the tooltips ourselves + public boolean hasStack() { + return !fluidInventory.getFluid(getSlotIndex()).isEmpty(); + } } diff --git a/src/main/java/com/refinedmods/refinedstorage/item/PatternItem.java b/src/main/java/com/refinedmods/refinedstorage/item/PatternItem.java index 1e7522bd0..80c4aff0d 100644 --- a/src/main/java/com/refinedmods/refinedstorage/item/PatternItem.java +++ b/src/main/java/com/refinedmods/refinedstorage/item/PatternItem.java @@ -8,6 +8,7 @@ import com.refinedmods.refinedstorage.api.autocrafting.ICraftingPatternProvider; import com.refinedmods.refinedstorage.apiimpl.autocrafting.AllowedTagList; import com.refinedmods.refinedstorage.apiimpl.autocrafting.CraftingPattern; import com.refinedmods.refinedstorage.apiimpl.autocrafting.CraftingPatternFactory; +import com.refinedmods.refinedstorage.apiimpl.network.node.GridNetworkNode; import com.refinedmods.refinedstorage.render.Styles; import com.refinedmods.refinedstorage.render.tesr.PatternItemStackTileRenderer; import com.refinedmods.refinedstorage.util.ItemStackKey; @@ -273,7 +274,7 @@ public class PatternItem extends Item implements ICraftingPatternProvider { return null; } - AllowedTagList allowedTagList = new AllowedTagList(null); + AllowedTagList allowedTagList = new AllowedTagList(null, GridNetworkNode.PROCESSING_MATRIX_SIZE); allowedTagList.readFromNbt(pattern.getTag().getCompound(NBT_ALLOWED_TAGS)); diff --git a/src/main/java/com/refinedmods/refinedstorage/network/grid/GridProcessingTransferMessage.java b/src/main/java/com/refinedmods/refinedstorage/network/grid/GridProcessingTransferMessage.java index 9d8d422ce..751064f9d 100644 --- a/src/main/java/com/refinedmods/refinedstorage/network/grid/GridProcessingTransferMessage.java +++ b/src/main/java/com/refinedmods/refinedstorage/network/grid/GridProcessingTransferMessage.java @@ -108,11 +108,9 @@ public class GridProcessingTransferMessage { clearInputsAndOutputs(handler); clearInputsAndOutputs(handlerFluid); - setInputs(handler, message.inputs); - setOutputs(handler, message.outputs); + setInputs(handler, message.inputs, handlerFluid, message.fluidInputs); + setOutputs(handler, message.outputs, handlerFluid, message.fluidOutputs); - setFluidInputs(handlerFluid, message.fluidInputs); - setFluidOutputs(handlerFluid, message.fluidOutputs); ((GridNetworkNode) grid).setProcessingPattern(true); ((GridNetworkNode) grid).markDirty(); @@ -125,26 +123,26 @@ public class GridProcessingTransferMessage { } private static void clearInputsAndOutputs(BaseItemHandler handler) { - for (int i = 0; i < 9 * 2; ++i) { + for (int i = 0; i < handler.getSlots(); ++i) { handler.setStackInSlot(i, ItemStack.EMPTY); } } private static void clearInputsAndOutputs(FluidInventory handler) { - for (int i = 0; i < 9 * 2; ++i) { + for (int i = 0; i < handler.getSlots(); ++i) { handler.setFluid(i, FluidStack.EMPTY); } } - private static void setInputs(BaseItemHandler handler, Collection stacks) { - setSlots(handler, stacks, 0, 9); + private static void setInputs(BaseItemHandler handler, Collection stacks, FluidInventory fluidHandler, Collection fluidStacks) { + setSlots(handler, stacks, fluidHandler, fluidStacks, 0, handler.getSlots() / 2); } - private static void setOutputs(BaseItemHandler handler, Collection stacks) { - setSlots(handler, stacks, 9, 18); + private static void setOutputs(BaseItemHandler handler, Collection stacks, FluidInventory fluidHandler, Collection fluidStacks) { + setSlots(handler, stacks, fluidHandler, fluidStacks, handler.getSlots() / 2, handler.getSlots()); } - private static void setSlots(BaseItemHandler handler, Collection stacks, int begin, int end) { + private static void setSlots(BaseItemHandler handler, Collection stacks, FluidInventory fluidHandler, Collection fluidStacks, int begin, int end) { for (ItemStack stack : stacks) { handler.setStackInSlot(begin, stack); @@ -154,20 +152,9 @@ public class GridProcessingTransferMessage { break; } } - } + for (FluidStack stack : fluidStacks) { - private static void setFluidInputs(FluidInventory inventory, Collection stacks) { - setFluidSlots(inventory, stacks, 0, 9); - } - - private static void setFluidOutputs(FluidInventory inventory, Collection stacks) { - setFluidSlots(inventory, stacks, 9, 18); - } - - private static void setFluidSlots(FluidInventory inventory, Collection stacks, int begin, int end) { - for (FluidStack stack : stacks) { - - inventory.setFluid(begin, stack.copy()); + fluidHandler.setFluid(begin, stack.copy()); begin++; diff --git a/src/main/java/com/refinedmods/refinedstorage/screen/grid/GridScreen.java b/src/main/java/com/refinedmods/refinedstorage/screen/grid/GridScreen.java index 0a9970d1d..5cb49ffff 100644 --- a/src/main/java/com/refinedmods/refinedstorage/screen/grid/GridScreen.java +++ b/src/main/java/com/refinedmods/refinedstorage/screen/grid/GridScreen.java @@ -25,6 +25,7 @@ import com.refinedmods.refinedstorage.screen.widget.SearchWidget; import com.refinedmods.refinedstorage.screen.widget.TabListWidget; import com.refinedmods.refinedstorage.screen.widget.sidebutton.*; import com.refinedmods.refinedstorage.tile.NetworkNodeTile; +import com.refinedmods.refinedstorage.tile.config.IType; import com.refinedmods.refinedstorage.tile.data.TileDataManager; import com.refinedmods.refinedstorage.tile.grid.GridTile; import com.refinedmods.refinedstorage.tile.grid.portable.IPortableGrid; @@ -38,6 +39,7 @@ import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.util.SoundEvents; import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TranslationTextComponent; import org.lwjgl.glfw.GLFW; import yalter.mousetweaks.api.MouseTweaksDisableWheelTweak; @@ -54,8 +56,10 @@ public class GridScreen extends BaseScreen implements IScreenInfo private SearchWidget searchField; private CheckboxWidget exactPattern; private CheckboxWidget processingPattern; + private CheckboxWidget fluidCheckBox; private ScrollbarWidget scrollbar; + private ScrollbarWidget patternScrollbar; private final IGrid grid; private final TabListWidget tabs; @@ -63,7 +67,12 @@ public class GridScreen extends BaseScreen implements IScreenInfo private boolean wasConnected; private boolean doSort; + private final int patternScrollOffsetAbsoluteMax = GridNetworkNode.PROCESSING_MATRIX_SIZE / 3 - 3; + private int slotNumber; + private int patternScrollOffset; + private int patternScrollOffsetMax; + private boolean updatePatternOffset; public GridScreen(GridContainer container, IGrid grid, PlayerInventory inventory, ITextComponent title) { super(container, 227, 0, inventory, title); @@ -83,6 +92,12 @@ public class GridScreen extends BaseScreen implements IScreenInfo grid.onTabPageChanged(page); } }); + + if (grid instanceof GridNetworkNode && grid.getGridType() == GridType.PATTERN) { + GridNetworkNode node = (GridNetworkNode) grid; + node.getProcessingMatrix().addListener((handler, slot, reading) -> updatePatternOffset = true); + node.getProcessingMatrixFluids().addListener((handler, slot, reading) -> updatePatternOffset = true); + } } @Override @@ -135,12 +150,24 @@ public class GridScreen extends BaseScreen implements IScreenInfo addSideButton(new GridSizeSideButton(this, grid::getSize, grid::onSizeChanged)); if (grid.getGridType() == GridType.PATTERN) { + patternScrollbar = new ScrollbarWidget(this, 160, getTopHeight() + getVisibleRows() * 18 + 4, 6, 18 * 3 - 2, true); + + patternScrollbar.setMaxOffset(patternScrollOffsetAbsoluteMax); + patternScrollbar.setOffset(patternScrollOffset); // keep offset when changing between fluid and item view + + container.updatePatternSlotPositions(patternScrollOffset); + patternScrollbar.addListener((oldOffset, newOffset) -> { + patternScrollOffset = newOffset; + container.updatePatternSlotPositions(newOffset); + }); + processingPattern = addCheckBox(x + 7, y + getTopHeight() + (getVisibleRows() * 18) + 60, new TranslationTextComponent("misc.refinedstorage.processing"), GridTile.PROCESSING_PATTERN.getValue(), btn -> { // Rebuild the inventory slots before the slot change packet arrives. GridTile.PROCESSING_PATTERN.setValue(false, processingPattern.isChecked()); ((GridNetworkNode) grid).clearMatrix(); // The server does this but let's do it earlier so the client doesn't notice. this.container.initSlots(); + patternScrollOffset = 0; // reset offset when switching between crafting and processing TileDataManager.setParameter(GridTile.PROCESSING_PATTERN, processingPattern.isChecked()); }); @@ -152,9 +179,14 @@ public class GridScreen extends BaseScreen implements IScreenInfo GridTile.EXACT_PATTERN.getValue(), btn -> TileDataManager.setParameter(GridTile.EXACT_PATTERN, exactPattern.isChecked()) ); - } + patternScrollbar.setEnabled(false); + } else { + patternScrollbar.setEnabled(true); - addSideButton(new TypeSideButton(this, GridTile.PROCESSING_TYPE)); + fluidCheckBox = addCheckBox(processingPattern.x + processingPattern.getWidth() + 5, y + getTopHeight() + (getVisibleRows() * 18) + 60, new StringTextComponent("Fluids"), ((GridNetworkNode) grid).getType() == IType.FLUIDS, button -> { + TileDataManager.setParameter(GridTile.PROCESSING_TYPE, GridTile.PROCESSING_TYPE.getValue() == IType.ITEMS ? IType.FLUIDS : IType.ITEMS); + }); + } } updateScrollbar(); @@ -180,6 +212,11 @@ public class GridScreen extends BaseScreen implements IScreenInfo view.sort(); } + if (updatePatternOffset) { + updatePatternOffsetMax(); + updatePatternOffset = false; + } + if (isKeyDown(RSKeyBindings.CLEAR_GRID_CRAFTING_MATRIX)) { RS.NETWORK_HANDLER.sendToServer(new GridClearMessage()); } @@ -342,6 +379,10 @@ public class GridScreen extends BaseScreen implements IScreenInfo } blit(matrixStack, x + 172, y + getTopHeight() + (getVisibleRows() * 18) + 22, 240, ty * 16, 16, 16); + if (processingPattern.isChecked()) { + updatePatternScrollbar(); + patternScrollbar.render(matrixStack); + } } tabs.drawForeground(matrixStack, x, y - tabs.getHeight(), mouseX, mouseY, true); @@ -444,7 +485,9 @@ public class GridScreen extends BaseScreen implements IScreenInfo if (scrollbar.mouseClicked(mouseX, mouseY, clickedButton)) { return true; } - + if (grid.getGridType() == GridType.PATTERN && patternScrollbar.mouseClicked(mouseX, mouseY, clickedButton)) { + return true; + } if (RS.CLIENT_CONFIG.getGrid().getPreventSortingWhileShiftIsDown()) { doSort = !isOverSlotArea(mouseX - guiLeft, mouseY - guiTop) && !isOverCraftingOutputArea(mouseX - guiLeft, mouseY - guiTop); } @@ -520,11 +563,17 @@ public class GridScreen extends BaseScreen implements IScreenInfo public void mouseMoved(double mx, double my) { scrollbar.mouseMoved(mx, my); + if (grid.getGridType() == GridType.PATTERN) { + patternScrollbar.mouseMoved(mx, my); + } super.mouseMoved(mx, my); } @Override public boolean mouseReleased(double mx, double my, int button) { + if (grid.getGridType() == GridType.PATTERN && patternScrollbar.mouseReleased(mx, my, button)) { + return true; + } return scrollbar.mouseReleased(mx, my, button) || super.mouseReleased(mx, my, button); } @@ -534,7 +583,6 @@ public class GridScreen extends BaseScreen implements IScreenInfo if (RS.CLIENT_CONFIG.getGrid().getPreventSortingWhileShiftIsDown()) { doSort = !isOverSlotArea(x - guiLeft, y - guiTop) && !isOverCraftingOutputArea(x - guiLeft, y - guiTop); } - if (grid.getGridType() != GridType.FLUID) { if (isOverInventory(x - guiLeft, y - guiTop) && hoveredSlot != null && hoveredSlot.getHasStack()) { RS.NETWORK_HANDLER.sendToServer(new GridItemInventoryScrollMessage(hoveredSlot.getSlotIndex(), hasShiftDown(), delta > 0)); @@ -544,15 +592,23 @@ public class GridScreen extends BaseScreen implements IScreenInfo } return super.mouseScrolled(x, y, delta); - } else { - return this.scrollbar.mouseScrolled(x, y, delta) || super.mouseScrolled(x, y, delta); } + + if (grid.getGridType() == GridType.PATTERN && isOverPatternArea(x - guiLeft, y - guiTop) && patternScrollbar.mouseScrolled(x, y, delta)) { + return true; + } + + return this.scrollbar.mouseScrolled(x, y, delta) || super.mouseScrolled(x, y, delta); } private boolean isOverInventory(double x, double y) { return RenderUtils.inBounds(8, getYPlayerInventory(), 9 * 18 - 2, 4 * 18 + 2, x, y); } + private boolean isOverPatternArea(double x, double y) { + return RenderUtils.inBounds(8, getTopHeight() + getVisibleRows() * 18, 152, 54, x, y); + } + @Override public boolean charTyped(char unknown1, int unknown2) { if (searchField.charTyped(unknown1, unknown2)) { @@ -602,6 +658,51 @@ public class GridScreen extends BaseScreen implements IScreenInfo } } + //check processing matrix and update maximum offset depending on contents + private void updatePatternOffsetMax() { + int filledInputSlots = 0; + int filledOutputSlots = 0; + int lastFilledInputSlot = 0; + int lastFilledOutputSlot = 0; + + for (int i = 0; i < GridNetworkNode.PROCESSING_MATRIX_SIZE * 2; i++) { + if (!isMatrixSlotEmpty(i)) { + if (i > GridNetworkNode.PROCESSING_MATRIX_SIZE - 1) { + filledOutputSlots++; + lastFilledOutputSlot = i - GridNetworkNode.PROCESSING_MATRIX_SIZE - 1; + } else { + filledInputSlots++; + lastFilledInputSlot = i; + } + } + } + + int maxFilledSlots = Math.max(filledInputSlots, filledOutputSlots); + int maxLastFilledSlot = Math.max(lastFilledInputSlot, lastFilledOutputSlot); + + // offset calculation to show next row if 4 of 9 slots are filled. + int filledSlotOffset = Math.floorDiv(maxFilledSlots - 1, 3); + // offset to show the last item in the matrix + int lastSlotOffset = Math.floorDiv(maxLastFilledSlot, 3) - 2; + + patternScrollOffsetMax = Math.max(filledSlotOffset, lastSlotOffset); + } + + private boolean isMatrixSlotEmpty(int slotNumber) { + return ((GridNetworkNode) grid).getProcessingMatrix().getStackInSlot(slotNumber).isEmpty() + && ((GridNetworkNode) grid).getProcessingMatrixFluids().getFluid(slotNumber).isEmpty(); + } + + public void updatePatternScrollbar() { + patternScrollbar.setEnabled(processingPattern.isChecked() && patternScrollOffsetMax > 0); + int oldOffset = patternScrollbar.getOffset(); + patternScrollbar.setMaxOffset(Math.min(patternScrollOffsetMax, patternScrollOffsetAbsoluteMax)); + + if (oldOffset != patternScrollbar.getOffset()) { + container.updatePatternSlotPositions(patternScrollbar.getOffset()); + } + } + public void updateScrollbar() { scrollbar.setEnabled(getRows() > getVisibleRows()); scrollbar.setMaxOffset(getRows() - getVisibleRows()); diff --git a/src/main/java/com/refinedmods/refinedstorage/screen/widget/ScrollbarWidget.java b/src/main/java/com/refinedmods/refinedstorage/screen/widget/ScrollbarWidget.java index 795b42dda..fc93d235c 100644 --- a/src/main/java/com/refinedmods/refinedstorage/screen/widget/ScrollbarWidget.java +++ b/src/main/java/com/refinedmods/refinedstorage/screen/widget/ScrollbarWidget.java @@ -25,6 +25,7 @@ public class ScrollbarWidget implements IGuiEventListener { private int maxOffset; private boolean clicked = false; + private boolean small = false; private final List listeners = new LinkedList<>(); @@ -38,6 +39,11 @@ public class ScrollbarWidget implements IGuiEventListener { this.height = height; } + public ScrollbarWidget(BaseScreen screen, int x, int y, int width, int height, boolean small) { + this(screen, x, y, width, height); + this.small = small; + } + public void addListener(ScrollbarWidgetListener listener) { listeners.add(listener); } @@ -62,7 +68,12 @@ public class ScrollbarWidget implements IGuiEventListener { RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); screen.bindTexture(RS.ID, "icons.png"); - screen.blit(matrixStack, screen.getGuiLeft() + x, screen.getGuiTop() + y + (int) Math.min(height - SCROLLER_HEIGHT, (float) offset / (float) maxOffset * (float) (height - SCROLLER_HEIGHT)), isEnabled() ? 232 : 244, 0, 12, 15); + if (small) { + screen.blit(matrixStack, screen.getGuiLeft() + x, screen.getGuiTop() + y + (int) Math.min(height - SCROLLER_HEIGHT, (float) offset / (float) maxOffset * (float) (height - SCROLLER_HEIGHT)), isEnabled() ? 218 : 225, 0, 7, SCROLLER_HEIGHT); + } else { + screen.blit(matrixStack, screen.getGuiLeft() + x, screen.getGuiTop() + y + (int) Math.min(height - SCROLLER_HEIGHT, (float) offset / (float) maxOffset * (float) (height - SCROLLER_HEIGHT)), isEnabled() ? 232 : 244, 0, 12, SCROLLER_HEIGHT); + } + } @Override diff --git a/src/main/java/com/refinedmods/refinedstorage/screen/widget/sidebutton/TypeSideButton.java b/src/main/java/com/refinedmods/refinedstorage/screen/widget/sidebutton/TypeSideButton.java index 1319f0ded..c41e41357 100644 --- a/src/main/java/com/refinedmods/refinedstorage/screen/widget/sidebutton/TypeSideButton.java +++ b/src/main/java/com/refinedmods/refinedstorage/screen/widget/sidebutton/TypeSideButton.java @@ -2,8 +2,6 @@ package com.refinedmods.refinedstorage.screen.widget.sidebutton; import com.mojang.blaze3d.matrix.MatrixStack; import com.refinedmods.refinedstorage.screen.BaseScreen; -import com.refinedmods.refinedstorage.tile.config.IType; -import com.refinedmods.refinedstorage.tile.data.TileDataManager; import com.refinedmods.refinedstorage.tile.data.TileDataParameter; import net.minecraft.client.resources.I18n; import net.minecraft.util.text.TextFormatting; @@ -29,6 +27,6 @@ public class TypeSideButton extends SideButton { @Override public void onPress() { - TileDataManager.setParameter(type, type.getValue() == IType.ITEMS ? IType.FLUIDS : IType.ITEMS); + } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 1c5b0eb7e..64cad406f 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -2,3 +2,4 @@ protected net.minecraft.inventory.container.Container field_75153_a # inventoryI protected net.minecraft.inventory.container.Container field_75149_d # listeners protected net.minecraft.client.gui.widget.TextFieldWidget field_146212_n # canLoseFocus public net.minecraft.client.gui.widget.button.CheckboxButton field_212943_a # checked +public-f net.minecraft.inventory.container.Slot field_75221_f # yPos \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/textures/gui/pattern_grid_processing.png b/src/main/resources/assets/refinedstorage/textures/gui/pattern_grid_processing.png index e897e8244..bb89bd16f 100644 Binary files a/src/main/resources/assets/refinedstorage/textures/gui/pattern_grid_processing.png and b/src/main/resources/assets/refinedstorage/textures/gui/pattern_grid_processing.png differ diff --git a/src/main/resources/assets/refinedstorage/textures/icons.png b/src/main/resources/assets/refinedstorage/textures/icons.png index 4285d2ac9..91cc023b9 100755 Binary files a/src/main/resources/assets/refinedstorage/textures/icons.png and b/src/main/resources/assets/refinedstorage/textures/icons.png differ