diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternContainer.java b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternContainer.java index a3ce2e14d..f42539df9 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternContainer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternContainer.java @@ -37,6 +37,10 @@ public interface ICraftingPatternContainer { IItemHandlerModifiable getPatternInventory(); /** + * The name of this container for categorizing in the Crafting Manager GUI. + * Can be a localized or unlocalized name. + * If it's unlocalized, it will automatically format the name. + * * @return the name of this container */ String getName(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java index bb5c7d7d1..e26486ea6 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java @@ -302,15 +302,12 @@ public class CraftingManager implements ICraftingManager { patterns.addAll(container.getPatterns()); - // @todo: ??? - if (container.getPatternInventory().getSlots() == 9 || true) { - // @todo: Crafter first! - if (!containerInventories.containsKey(container.getName())) { - containerInventories.put(container.getName(), new ArrayList<>()); - } - - containerInventories.get(container.getName()).add(container.getPatternInventory()); + // @todo: Crafter first! + if (!containerInventories.containsKey(container.getName())) { + containerInventories.put(container.getName(), new ArrayList<>()); } + + containerInventories.get(container.getName()).add(container.getPatternInventory()); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCrafterManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCrafterManager.java index 4f79a489f..9b109dbe3 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCrafterManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCrafterManager.java @@ -30,8 +30,10 @@ public class NetworkNodeCrafterManager extends NetworkNode { return ID; } - public void send(EntityPlayerMP player) { - RS.INSTANCE.network.sendTo(new MessageCrafterManagerSlotSizes(network.getCraftingManager().getNamedContainers()), player); + public void sendTo(EntityPlayerMP player) { + if (network != null) { + RS.INSTANCE.network.sendTo(new MessageCrafterManagerSlotSizes(network.getCraftingManager().getNamedContainers()), player); + } } public int getSize() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCrafterManager.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCrafterManager.java index e1e9d2ce2..e67a72514 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCrafterManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCrafterManager.java @@ -25,7 +25,7 @@ public class BlockCrafterManager extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote && tryOpenNetworkGui(RSGui.CRAFTER_MANAGER, player, world, pos, side, Permission.MODIFY, Permission.AUTOCRAFTING)) { - ((TileCrafterManager) world.getTileEntity(pos)).getNode().send((EntityPlayerMP) player); + ((TileCrafterManager) world.getTileEntity(pos)).getNode().sendTo((EntityPlayerMP) player); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCrafterManager.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCrafterManager.java index 902c65e74..12d215c60 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCrafterManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCrafterManager.java @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.gui.grid.IGridDisplay; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase; import com.raoulvdberge.refinedstorage.tile.TileCrafterManager; +import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; @@ -98,10 +99,12 @@ public class ContainerCrafterManager extends ContainerBase { if (!player.world.isRemote) { addPlayerInventory(8, display.getYPlayerInventory()); - for (Map.Entry> entry : crafterManager.getNode().getNetwork().getCraftingManager().getNamedContainers().entrySet()) { - for (IItemHandlerModifiable handler : entry.getValue()) { - for (int i = 0; i < handler.getSlots(); ++i) { - addSlotToContainer(new SlotItemHandler(handler, i, 0, 0)); + if (crafterManager.getNode().getNetwork() != null) { + for (Map.Entry> entry : crafterManager.getNode().getNetwork().getCraftingManager().getNamedContainers().entrySet()) { + for (IItemHandlerModifiable handler : entry.getValue()) { + for (int i = 0; i < handler.getSlots(); ++i) { + addSlotToContainer(new SlotItemHandler(handler, i, 0, 0)); + } } } } @@ -125,30 +128,36 @@ public class ContainerCrafterManager extends ContainerBase { addPlayerInventory(8, display.getYPlayerInventory()); int y = 19 + 18 - display.getCurrentOffset() * 18; + int x = 8; for (Map.Entry entry : containerData.entrySet()) { - boolean visible = entry.getKey().toLowerCase().contains(display.getSearchFieldText().toLowerCase()); + // @todo: broken on servers prolly + boolean visible = I18n.format(entry.getKey()).toLowerCase().contains(display.getSearchFieldText().toLowerCase()); - for (int i = 0; i < entry.getValue(); ++i) { - IItemHandlerModifiable dummy; + IItemHandlerModifiable dummy; - if (newContainerData == null) { // We're only resizing, get the previous inventory... - dummy = dummyInventories.get(entry.getKey() + "," + i); - } else { - dummyInventories.put(entry.getKey() + "," + i, dummy = new ItemHandlerBase(9)); - } + if (newContainerData == null) { // We're only resizing, get the previous inventory... + dummy = dummyInventories.get(entry.getKey()); + } else { + dummyInventories.put(entry.getKey(), dummy = new ItemHandlerBase(entry.getValue())); + } - for (int j = 0; j < 9; ++j) { - addSlotToContainer(new SlotCrafterManager(dummy, j, 8 + j * 18, y, visible)); - } + for (int slot = 0; slot < entry.getValue(); ++slot) { + addSlotToContainer(new SlotCrafterManager(dummy, slot, x, y, visible)); if (visible) { - y += 18; + x += 18; + + if ((slot + 1) % 9 == 0) { + x = 8; + y += 18; + } } } if (visible) { - y += 18; + x = 8; + y += 18 * 2; } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafter.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafter.java index 802113607..295a59030 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafter.java @@ -3,7 +3,7 @@ package com.raoulvdberge.refinedstorage.gui; import com.raoulvdberge.refinedstorage.container.ContainerCrafter; import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import com.raoulvdberge.refinedstorage.tile.TileCrafter; -import net.minecraft.client.resources.I18n; +import com.raoulvdberge.refinedstorage.util.RenderUtils; public class GuiCrafter extends GuiBase { public GuiCrafter(ContainerCrafter container) { @@ -28,7 +28,7 @@ public class GuiCrafter extends GuiBase { @Override public void drawForeground(int mouseX, int mouseY) { - drawString(7, 7, t(I18n.format(TileCrafter.NAME.getValue()))); + drawString(7, 7, RenderUtils.shorten(t(TileCrafter.NAME.getValue()), 26)); drawString(7, 43, t("container.inventory")); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafterManager.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafterManager.java index 16176bc9a..586116e5f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafterManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafterManager.java @@ -9,9 +9,11 @@ import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonGridSize; import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import com.raoulvdberge.refinedstorage.tile.TileCrafterManager; import com.raoulvdberge.refinedstorage.tile.data.TileDataManager; +import com.raoulvdberge.refinedstorage.util.RenderUtils; import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.I18n; +import net.minecraft.inventory.Slot; import java.io.IOException; import java.util.Map; @@ -76,9 +78,9 @@ public class GuiCrafterManager extends GuiBase implements IGridDisplay { int rows = 0; for (Map.Entry containerData : container.getContainerData().entrySet()) { - if (containerData.getKey().toLowerCase().contains(getSearchFieldText().toLowerCase())) { + if (t(containerData.getKey()).toLowerCase().contains(getSearchFieldText().toLowerCase())) { rows++; - rows += containerData.getValue(); + rows += Math.ceil((double) Math.max(9, containerData.getValue()) / 9D); } } @@ -141,15 +143,25 @@ public class GuiCrafterManager extends GuiBase implements IGridDisplay { int rows = getVisibleRows(); - for (int i = 0; i < rows; ++i) { - y += 18; + int yy = y; - drawTexture(x, y, 0, getHeader() + (i > 0 ? (i == rows - 1 ? 18 * 2 : 18) : 0), screenWidth, 18); + for (int i = 0; i < rows; ++i) { + yy += 18; + + drawTexture(x, yy, 0, getHeader() + (i > 0 ? (i == rows - 1 ? 18 * 2 : 18) : 0), screenWidth, 18); } - y += 18; + yy += 18; - drawTexture(x, y, 0, getHeader() + (18 * 3), screenWidth, getFooter()); + drawTexture(x, yy, 0, getHeader() + (18 * 3), screenWidth, getFooter()); + + if (container != null) { + for (Slot slot : container.inventorySlots) { + if (slot instanceof ContainerCrafterManager.SlotCrafterManager && slot.isEnabled()) { + drawTexture(x + slot.xPos - 1, y + slot.yPos - 1, 0, 193, 18, 18); + } + } + } if (searchField != null) { searchField.drawTextBox(); @@ -185,12 +197,12 @@ public class GuiCrafterManager extends GuiBase implements IGridDisplay { drawString(7, 7, t("gui.refinedstorage:crafter_manager")); drawString(7, getYPlayerInventory() - 12, t("container.inventory")); - if (container != null) { + if (container != null && container.getContainerData() != null) { int x = 7; int y = 18 - getCurrentOffset() * 18; for (Map.Entry entry : container.getContainerData().entrySet()) { - if (entry.getKey().toLowerCase().contains(getSearchFieldText().toLowerCase())) { + if (t(entry.getKey()).toLowerCase().contains(getSearchFieldText().toLowerCase())) { if (y >= getHeader() - 1 && y < getHeader() + getVisibleRows() * 18 - 1) { GlStateManager.disableLighting(); GlStateManager.color(1, 1, 1); @@ -199,14 +211,12 @@ public class GuiCrafterManager extends GuiBase implements IGridDisplay { drawTexturedModalRect(x, y, 0, 174, 18 * 9, 18); - drawString(x + 4, y + 5, I18n.format(entry.getKey())); + drawString(x + 4, y + 6, RenderUtils.shorten(I18n.format(entry.getKey()), 25)); } - y += (entry.getValue() + 1) * 18; + y += (Math.ceil((double) Math.max(9, entry.getValue()) / 9D) + 1) * 18; } } } } - - } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCrafterManagerSlotSizes.java b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCrafterManagerSlotSizes.java index f7f732a09..81ca4d277 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCrafterManagerSlotSizes.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCrafterManagerSlotSizes.java @@ -41,7 +41,12 @@ public class MessageCrafterManagerSlotSizes implements IMessage, IMessageHandler for (Map.Entry> entry : containerData.entrySet()) { ByteBufUtils.writeUTF8String(buf, entry.getKey()); - buf.writeInt(entry.getValue().size()); + + int slots = 0; + for (IItemHandlerModifiable handler : entry.getValue()) { + slots += handler.getSlots(); + } + buf.writeInt(slots); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/util/RenderUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/util/RenderUtils.java index a841a9308..cc3126b46 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/util/RenderUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/util/RenderUtils.java @@ -54,6 +54,13 @@ public final class RenderUtils { return start.addVector(lookVec.x * reachDistance, lookVec.y * reachDistance, lookVec.z * reachDistance); } + public static String shorten(String text, int length) { + if (text.length() > length) { + text = text.substring(0, length) + "..."; + } + return text; + } + public static AdvancedRayTraceResult collisionRayTrace(BlockPos pos, Vec3d start, Vec3d end, Collection boxes) { double minDistance = Double.POSITIVE_INFINITY; AdvancedRayTraceResult hit = null; diff --git a/src/main/resources/assets/refinedstorage/textures/gui/crafter_manager.png b/src/main/resources/assets/refinedstorage/textures/gui/crafter_manager.png index 03ec08176..3aed4f00f 100644 Binary files a/src/main/resources/assets/refinedstorage/textures/gui/crafter_manager.png and b/src/main/resources/assets/refinedstorage/textures/gui/crafter_manager.png differ