diff --git a/src/main/java/codechicken/nei/BookmarkPanel.java b/src/main/java/codechicken/nei/BookmarkPanel.java index 00b377bc..a1af6d5b 100644 --- a/src/main/java/codechicken/nei/BookmarkPanel.java +++ b/src/main/java/codechicken/nei/BookmarkPanel.java @@ -404,39 +404,39 @@ public class BookmarkPanel extends PanelWidget { } public void addOrRemoveItem(ItemStack stackA) { - addOrRemoveItem(stackA, "", null); + addOrRemoveItem(stackA, null, null, false, false); } - public void addOrRemoveItem(ItemStack stackover, String handlerName, List ingredients) { + public void addOrRemoveItem( + ItemStack stackover, + final String handlerName, + final List ingredients, + boolean saveIngredients, + boolean saveStackSize) { loadBookmarksIfNeeded(); final Point mousePos = getMousePosition(); final ItemPanelSlot slot = getSlotMouseOver(mousePos.x, mousePos.y); - final boolean addFullRecipe = NEIClientUtils.shiftKey(); final BookmarkGrid BGrid = (BookmarkGrid) grid; if (slot != null && StackInfo.equalItemAndNBT(slot.item, stackover, true)) { - BGrid.removeRecipe(slot.slotIndex, addFullRecipe); + BGrid.removeRecipe(slot.slotIndex, saveIngredients); } else { - final boolean saveStackSize = NEIClientUtils.controlKey(); final NBTTagCompound nbTagA = StackInfo.itemStackToNBT(stackover, saveStackSize); final ItemStack normalizedA = StackInfo.loadFromNBT(nbTagA); BookmarkRecipeId recipeId = null; - if (NEIClientConfig.saveCurrentRecipeInBookmarksEnabled() - && handlerName != "" - && ingredients != null - && !ingredients.isEmpty()) { + if (handlerName != "" && ingredients != null && !ingredients.isEmpty()) { recipeId = new BookmarkRecipeId(handlerName, ingredients); } final int idx = BGrid.indexOf(normalizedA, recipeId); if (idx != -1) { - BGrid.removeRecipe(idx, addFullRecipe); + BGrid.removeRecipe(idx, saveIngredients); } else { - if (addFullRecipe && handlerName != "" && ingredients != null && !ingredients.isEmpty()) { + if (saveIngredients && handlerName != "" && ingredients != null && !ingredients.isEmpty()) { final Map unique = new HashMap<>(); final ArrayList sorted = new ArrayList<>(); @@ -448,18 +448,19 @@ public class BookmarkPanel extends PanelWidget { if (unique.get(nbTag) == null) { unique.put(nbTag, 1); sorted.add(nbTag); - } else if (saveStackSize) { + } else { unique.put(nbTag, unique.get(nbTag) + 1); } } for (NBTTagCompound nbTag : sorted) { - nbTag.setInteger("Count", nbTag.getInteger("Count") * unique.get(nbTag)); + final int count = nbTag.getInteger("Count") * unique.get(nbTag); + nbTag.setInteger("Count", count); BGrid.addItem( StackInfo.loadFromNBT(nbTag), new BookmarkStackMeta( - recipeId, - (saveStackSize ? 1 : -1) * nbTag.getInteger("Count"), + recipeId != null ? recipeId.copy() : null, + (saveStackSize ? 1 : -1) * count, true, nbTag.hasKey("gtFluidName"))); } @@ -479,15 +480,14 @@ public class BookmarkPanel extends PanelWidget { saveBookmarks(); } + public BookmarkRecipeId getBookmarkRecipeId(int slotIndex) { + return ((BookmarkGrid) grid).getRecipeId(slotIndex); + } + public BookmarkRecipeId getBookmarkRecipeId(ItemStack stackA) { - - BookmarkRecipeId mouseOverRecipeId = getBookmarkMouseOverRecipeId(stackA); - if (mouseOverRecipeId != null) return mouseOverRecipeId; - BookmarkRecipeId recipeId = ((BookmarkGrid) grid).findRecipeId(stackA); if (recipeId == null) { - for (int idx = 0; idx < namespaces.size() && recipeId == null; idx++) { if (idx == activeNamespaceIndex) continue; recipeId = namespaces.get(idx).findRecipeId(stackA); @@ -497,23 +497,6 @@ public class BookmarkPanel extends PanelWidget { return recipeId; } - public BookmarkRecipeId getBookmarkMouseOverRecipeId(ItemStack stackA) { - final Point mousePos = getMousePosition(); - final ItemPanelSlot slot = getSlotMouseOver(mousePos.x, mousePos.y); - - if (slot != null) { - if (stackA == null || StackInfo.equalItemAndNBT(slot.item, stackA, true)) { - return ((BookmarkGrid) grid).getRecipeId(slot.slotIndex); - } - } - - return null; - } - - public BookmarkRecipeId getBookmarkMouseOverRecipeId() { - return getBookmarkMouseOverRecipeId(null); - } - protected String getNamespaceLabelText(boolean shortFormat) { String activePage = String.valueOf(activeNamespaceIndex + 1); @@ -868,7 +851,7 @@ public class BookmarkPanel extends PanelWidget { int amount = stack.stackSize; if (meta.factor < 0 && !meta.fluidDisplay) { - amount = NEIClientConfig.getItemQuantity(); + amount = NEIClientConfig.showItemQuantityWidget() ? NEIClientConfig.getItemQuantity() : 0; if (amount == 0) { amount = stack.getMaxStackSize(); diff --git a/src/main/java/codechicken/nei/HUDRenderer.java b/src/main/java/codechicken/nei/HUDRenderer.java index 2a8df821..d439d4ee 100644 --- a/src/main/java/codechicken/nei/HUDRenderer.java +++ b/src/main/java/codechicken/nei/HUDRenderer.java @@ -9,9 +9,9 @@ import codechicken.lib.config.ConfigTag; import codechicken.nei.KeyManager.IKeyStateTracker; import codechicken.nei.api.ItemInfo; import codechicken.nei.guihook.GuiContainerManager; +import codechicken.nei.recipe.StackInfo; import java.awt.Dimension; import java.awt.Point; -import java.util.ArrayList; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderHelper; @@ -39,17 +39,12 @@ public class HUDRenderer implements IKeyStateTracker { && mc.objectMouseOver != null && mc.objectMouseOver.typeOfHit == MovingObjectType.BLOCK) { World world = mc.theWorld; - ArrayList items = ItemInfo.getIdentifierItems(world, mc.thePlayer, mc.objectMouseOver); - if (items.isEmpty()) return; + ItemStack[] items = ItemInfo.getIdentifierItems(world, mc.thePlayer, mc.objectMouseOver) + .toArray(new ItemStack[0]); - int minDamage = Integer.MAX_VALUE; - ItemStack stack = null; - for (ItemStack astack : items) { - if (astack.getItem() != null && astack.getItemDamage() < minDamage) { - stack = astack; - minDamage = stack.getItemDamage(); - } - } + if (items.length == 0) return; + + ItemStack stack = StackInfo.getItemStackWithMinimumDamage(items); renderOverlay(stack, ItemInfo.getText(stack, world, mc.thePlayer, mc.objectMouseOver), getPositioning()); } diff --git a/src/main/java/codechicken/nei/ItemPanel.java b/src/main/java/codechicken/nei/ItemPanel.java index 74fbcbca..fcea168e 100644 --- a/src/main/java/codechicken/nei/ItemPanel.java +++ b/src/main/java/codechicken/nei/ItemPanel.java @@ -27,7 +27,6 @@ public class ItemPanel extends PanelWidget { // *looks angrily at AppleCore* return super.getStackMouseOver(mousex, mousey); } - ; public Button more; public Button less; @@ -155,6 +154,8 @@ public class ItemPanel extends PanelWidget { } protected int resizeFooter(GuiContainer gui) { + if (!NEIClientConfig.showItemQuantityWidget()) return 0; + final int BUTTON_SIZE = 16; more.w = less.w = BUTTON_SIZE; @@ -174,7 +175,7 @@ public class ItemPanel extends PanelWidget { public void setVisible() { super.setVisible(); - if (grid.getPerPage() > 0) { + if (grid.getPerPage() > 0 && NEIClientConfig.showItemQuantityWidget()) { LayoutManager.addWidget(more); LayoutManager.addWidget(less); LayoutManager.addWidget(quantity); @@ -185,7 +186,7 @@ public class ItemPanel extends PanelWidget { ItemStack stack = grid.getItem(mouseDownSlot); if (stack != null) { - int amount = NEIClientConfig.getItemQuantity(); + int amount = NEIClientConfig.showItemQuantityWidget() ? NEIClientConfig.getItemQuantity() : 0; if (amount == 0) { amount = stack.getMaxStackSize(); diff --git a/src/main/java/codechicken/nei/ItemQuantityField.java b/src/main/java/codechicken/nei/ItemQuantityField.java index 8f313351..5a654d35 100644 --- a/src/main/java/codechicken/nei/ItemQuantityField.java +++ b/src/main/java/codechicken/nei/ItemQuantityField.java @@ -1,9 +1,12 @@ package codechicken.nei; +import static codechicken.nei.NEIClientUtils.translate; + public class ItemQuantityField extends TextField { public ItemQuantityField(String ident) { super(ident); centered = true; + field.setDisabledTextColour(0xFF303030); } public int intValue() { @@ -34,4 +37,18 @@ public class ItemQuantityField extends TextField { public void onTextChange(String oldText) { NEIClientUtils.setItemQuantity(intValue()); } + + @Override + public void draw(int mousex, int mousey) { + + if (!focused() && intValue() == 0) { + field.setText(translate("itempanel.quantity.default")); + field.setEnabled(false); + super.draw(mousex, mousey); + field.setEnabled(true); + field.setText("0"); + } else { + super.draw(mousex, mousey); + } + } } diff --git a/src/main/java/codechicken/nei/ItemsGrid.java b/src/main/java/codechicken/nei/ItemsGrid.java index 089df8f1..5d2a5f1e 100644 --- a/src/main/java/codechicken/nei/ItemsGrid.java +++ b/src/main/java/codechicken/nei/ItemsGrid.java @@ -176,6 +176,18 @@ public class ItemsGrid { } } + public Rectangle4i getItemRect(int idx) { + final List mask = getMask(); + + for (int i = 0; i < mask.size(); i++) { + if (mask.get(i) != null && idx == mask.get(i)) { + return getSlotRect(i); + } + } + + return null; + } + public Rectangle4i getSlotRect(int i) { return getSlotRect(i / columns, i % columns); } @@ -222,7 +234,7 @@ public class ItemsGrid { GL11.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - framebuffer.bindFramebufferTexture(); + getFrameBuffer().bindFramebufferTexture(); GL11.glEnable(GL11.GL_TEXTURE_2D); ScaledResolution res = new ScaledResolution(minecraft, minecraft.displayWidth, minecraft.displayHeight); Tessellator tessellator = Tessellator.instance; @@ -235,39 +247,17 @@ public class ItemsGrid { OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); } - public void draw(int mousex, int mousey) { - if (getPerPage() == 0) { - return; + private Framebuffer getFrameBuffer() { + + if (framebuffer == null) { + framebuffer = new Framebuffer(1, 1, true); + framebuffer.setFramebufferColor(0.0F, 0.0F, 0.0F, 0.0F); } - boolean shouldCache = NEIClientConfig.shouldCacheItemRendering() && !PresetsWidget.inEditMode(); - if (shouldCache) { - Minecraft minecraft = Minecraft.getMinecraft(); - if (framebuffer == null) { - framebuffer = new Framebuffer(minecraft.displayWidth, minecraft.displayHeight, true); - framebuffer.framebufferColor[0] = 0.0F; - framebuffer.framebufferColor[1] = 0.0F; - framebuffer.framebufferColor[2] = 0.0F; - } - drawSlotOutlines(mousex, mousey); - if (refreshBuffer) { - framebuffer.createBindFramebuffer(minecraft.displayWidth, minecraft.displayHeight); - framebuffer.framebufferClear(); - framebuffer.bindFramebuffer(false); - /* Set up some rendering state needed for items to work correctly */ - GL11.glDisable(GL11.GL_BLEND); - GL11.glDepthMask(true); - OpenGlHelper.glBlendFunc( - GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - } else { - blitExistingBuffer(); - return; - } - } else { - drawSlotOutlines(mousex, mousey); - } + return framebuffer; + } + private void drawItems() { GuiContainerManager.enableMatrixStackLogging(); final List mask = getMask(); @@ -278,11 +268,40 @@ public class ItemsGrid { } GuiContainerManager.disableMatrixStackLogging(); + } - if (refreshBuffer && shouldCache) { - refreshBuffer = false; - Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false); + public void draw(int mousex, int mousey) { + if (getPerPage() == 0) { + return; + } + + if (NEIClientConfig.shouldCacheItemRendering()) { + + if (refreshBuffer) { + Minecraft minecraft = Minecraft.getMinecraft(); + Framebuffer framebuffer = getFrameBuffer(); + framebuffer.createBindFramebuffer(minecraft.displayWidth, minecraft.displayHeight); + framebuffer.framebufferClear(); + framebuffer.bindFramebuffer(false); + + /* Set up some rendering state needed for items to work correctly */ + GL11.glDisable(GL11.GL_BLEND); + GL11.glDepthMask(true); + OpenGlHelper.glBlendFunc( + GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + drawItems(); + + Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false); + refreshBuffer = false; + } + + drawSlotOutlines(mousex, mousey); blitExistingBuffer(); + } else { + drawSlotOutlines(mousex, mousey); + drawItems(); } } @@ -307,9 +326,8 @@ public class ItemsGrid { if (mask.size() > slt && mask.get(slt) != null) { final int idx = mask.get(slt); - final ItemStack stack = getItem(idx).copy(); - return new ItemPanelSlot(idx, stack); + return new ItemPanelSlot(idx, getItem(idx)); } return null; diff --git a/src/main/java/codechicken/nei/KeyManager.java b/src/main/java/codechicken/nei/KeyManager.java index d2153b37..1c8c8044 100644 --- a/src/main/java/codechicken/nei/KeyManager.java +++ b/src/main/java/codechicken/nei/KeyManager.java @@ -3,7 +3,6 @@ package codechicken.nei; import java.util.HashMap; import java.util.LinkedList; import java.util.Map.Entry; -import org.lwjgl.input.Keyboard; /** * Good old down/held/up keystate tracker @@ -24,9 +23,9 @@ public class KeyManager { public static void tickKeyStates() { for (Entry entry : keyStates.entrySet()) { - int keyCode = NEIClientConfig.getKeyBinding(entry.getKey()); - boolean down = keyCode != 0 && Keyboard.isKeyDown(keyCode); - KeyState state = entry.getValue(); + final boolean down = NEIClientConfig.isKeyHashDown(entry.getKey()); + final KeyState state = entry.getValue(); + if (down) { state.down = !state.held; state.up = false; @@ -34,6 +33,7 @@ public class KeyManager { state.up = state.held; state.down = false; } + state.held = down; } diff --git a/src/main/java/codechicken/nei/LayoutManager.java b/src/main/java/codechicken/nei/LayoutManager.java index 5b22ff01..b0b2d4d9 100644 --- a/src/main/java/codechicken/nei/LayoutManager.java +++ b/src/main/java/codechicken/nei/LayoutManager.java @@ -5,7 +5,6 @@ import static codechicken.lib.gui.GuiDraw.drawRect; import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; import static codechicken.nei.NEIClientConfig.canPerformAction; import static codechicken.nei.NEIClientConfig.disabledActions; -import static codechicken.nei.NEIClientConfig.getKeyBinding; import static codechicken.nei.NEIClientConfig.getOptionList; import static codechicken.nei.NEIClientConfig.getSearchExpression; import static codechicken.nei.NEIClientConfig.hasSMPCounterPart; @@ -88,7 +87,7 @@ public class LayoutManager public static BookmarkPanel bookmarkPanel; public static SubsetWidget dropDown; public static PresetsWidget presetsPanel; - public static TextField searchField; + public static SearchField searchField; public static ButtonCycled options; public static ButtonCycled bookmarksButton; @@ -209,11 +208,13 @@ public class LayoutManager @Override public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyID) { - if (keyID == getKeyBinding("gui.hide")) { + + if (NEIClientConfig.isKeyHashDown("gui.hide")) { toggleBooleanSetting("inventory.hidden"); return true; } - if (keyID == getKeyBinding("gui.hide_bookmarks")) { + + if (NEIClientConfig.isKeyHashDown("gui.hide_bookmarks")) { toggleBooleanSetting("inventory.bookmarksEnabled"); return true; } @@ -221,6 +222,7 @@ public class LayoutManager if (isEnabled() && !isHidden()) { for (Widget widget : controlWidgets) if (inputFocused == null) widget.lastKeyTyped(keyID, keyChar); } + return false; } @@ -637,6 +639,7 @@ public class LayoutManager addWidget(presetsPanel); } + searchField.setVisible(visiblity.showSearchSection); if (visiblity.showSearchSection) { addWidget(searchField); } diff --git a/src/main/java/codechicken/nei/NEIClientConfig.java b/src/main/java/codechicken/nei/NEIClientConfig.java index 44a06239..1a90de6a 100644 --- a/src/main/java/codechicken/nei/NEIClientConfig.java +++ b/src/main/java/codechicken/nei/NEIClientConfig.java @@ -223,10 +223,6 @@ public class NEIClientConfig { .setComment("Enable/disable bookmarks") .getBooleanValue(true); API.addOption(new OptionToggleButton("inventory.bookmarksEnabled", true)); - tag.getTag("inventory.saveCurrentRecipeInBookmarksEnabled") - .setComment("Save Current Recipe in Bookmarks") - .getBooleanValue(true); - API.addOption(new OptionToggleButton("inventory.saveCurrentRecipeInBookmarksEnabled", true)); tag.getTag("inventory.useNBTInBookmarks") .setComment("Use NBT in Bookmarks") .getBooleanValue(true); @@ -236,6 +232,11 @@ public class NEIClientConfig { .getBooleanValue(false); API.addOption(new OptionToggleButton("inventory.showRecipeMarker", true)); + tag.getTag("inventory.showItemQuantityWidget") + .setComment("Show Item Quantity Widget") + .getBooleanValue(true); + API.addOption(new OptionToggleButton("inventory.showItemQuantityWidget", true)); + tag.getTag("inventory.jei_style_tabs") .setComment("Enable/disable JEI Style Tabs") .getBooleanValue(true); @@ -311,22 +312,29 @@ public class NEIClientConfig { } private static void setDefaultKeyBindings() { - API.addKeyBind("gui.recipe", Keyboard.KEY_R); - API.addKeyBind("gui.usage", Keyboard.KEY_U); + API.addHashBind("gui.recipe", Keyboard.KEY_R); + API.addHashBind("gui.usage", Keyboard.KEY_U); API.addKeyBind("gui.back", Keyboard.KEY_BACK); - API.addKeyBind("gui.enchant", Keyboard.KEY_X); - API.addKeyBind("gui.potion", Keyboard.KEY_P); + API.addHashBind("gui.enchant", Keyboard.KEY_X); + API.addHashBind("gui.potion", Keyboard.KEY_P); API.addKeyBind("gui.prev", Keyboard.KEY_PRIOR); API.addKeyBind("gui.next", Keyboard.KEY_NEXT); API.addKeyBind("gui.prev_machine", Keyboard.KEY_UP); API.addKeyBind("gui.next_machine", Keyboard.KEY_DOWN); API.addKeyBind("gui.prev_recipe", Keyboard.KEY_LEFT); API.addKeyBind("gui.next_recipe", Keyboard.KEY_RIGHT); - API.addKeyBind("gui.hide", Keyboard.KEY_O); - API.addKeyBind("gui.search", Keyboard.KEY_F); - API.addKeyBind("gui.bookmark", Keyboard.KEY_A); - API.addKeyBind("gui.overlay", Keyboard.KEY_S); - API.addKeyBind("gui.hide_bookmarks", Keyboard.KEY_B); + API.addHashBind("gui.hide", Keyboard.KEY_O); + API.addHashBind("gui.search", Keyboard.KEY_F); + API.addHashBind("gui.bookmark", Keyboard.KEY_A); + API.addHashBind("gui.bookmark_recipe", Keyboard.KEY_A + NEIClientUtils.SHIFT_HASH); + API.addHashBind("gui.bookmark_count", Keyboard.KEY_A + NEIClientUtils.CTRL_HASH); + API.addHashBind( + "gui.bookmark_recipe_count", Keyboard.KEY_A + NEIClientUtils.SHIFT_HASH + NEIClientUtils.CTRL_HASH); + API.addHashBind("gui.overlay", Keyboard.KEY_S); + API.addHashBind("gui.overlay_use", Keyboard.KEY_S + NEIClientUtils.SHIFT_HASH); + API.addHashBind("gui.overlay_hide", Keyboard.KEY_S + NEIClientUtils.CTRL_HASH); + API.addHashBind("gui.hide_bookmarks", Keyboard.KEY_B); + API.addKeyBind("world.chunkoverlay", Keyboard.KEY_F9); API.addKeyBind("world.moboverlay", Keyboard.KEY_F7); API.addKeyBind("world.highlight_tips", Keyboard.KEY_NUMPAD0); @@ -398,6 +406,11 @@ public class NEIClientConfig { getSetting("keys." + string).getIntValue(key); } + public static boolean isKeyHashDown(String string) { + final int hash = getKeyBinding(string); + return hash != Keyboard.CHAR_NONE && hash == NEIClientUtils.getKeyHash(); + } + public static void bootNEI(World world) { if (configLoaded) return; @@ -475,10 +488,6 @@ public class NEIClientConfig { return !getBooleanSetting("inventory.bookmarksEnabled"); } - public static boolean saveCurrentRecipeInBookmarksEnabled() { - return getBooleanSetting("inventory.saveCurrentRecipeInBookmarksEnabled"); - } - public static boolean useNBTInBookmarks() { return getBooleanSetting("inventory.useNBTInBookmarks"); } @@ -487,6 +496,10 @@ public class NEIClientConfig { return getBooleanSetting("inventory.showRecipeMarker"); } + public static boolean showItemQuantityWidget() { + return getBooleanSetting("inventory.showItemQuantityWidget"); + } + public static boolean areJEIStyleTabsVisible() { return getBooleanSetting("inventory.jei_style_tabs"); } diff --git a/src/main/java/codechicken/nei/NEIClientUtils.java b/src/main/java/codechicken/nei/NEIClientUtils.java index c8a2b058..66a9f6c2 100644 --- a/src/main/java/codechicken/nei/NEIClientUtils.java +++ b/src/main/java/codechicken/nei/NEIClientUtils.java @@ -15,16 +15,24 @@ import codechicken.nei.api.GuiInfo; import codechicken.nei.api.IInfiniteItemHandler; import codechicken.nei.api.ItemInfo; import com.google.common.collect.Iterables; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; import java.text.MessageFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.stream.Collectors; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; @@ -38,6 +46,13 @@ import org.lwjgl.input.Keyboard; public class NEIClientUtils extends NEIServerUtils { public static LangProxy lang = new LangProxy("nei"); + /** Formats a number with group separator and at most 2 fraction digits. */ + private static final Map decimalFormatters = new HashMap<>(); + + public static final int ALT_HASH = 1 << 27; + public static final int SHIFT_HASH = 1 << 26; + public static final int CTRL_HASH = 1 << 25; + public static Minecraft mc() { return Minecraft.getMinecraft(); } @@ -50,6 +65,32 @@ public class NEIClientUtils extends NEIServerUtils { if (mc().ingameGUI != null) mc().ingameGUI.getChatGUI().printChatMessage(msg); } + private static DecimalFormat getDecimalFormat() { + return decimalFormatters.computeIfAbsent(Locale.getDefault(Locale.Category.FORMAT), locale -> { + DecimalFormat numberFormat = new DecimalFormat(); // uses the necessary locale inside anyway + numberFormat.setGroupingUsed(true); + numberFormat.setMaximumFractionDigits(2); + numberFormat.setRoundingMode(RoundingMode.HALF_UP); + DecimalFormatSymbols decimalFormatSymbols = numberFormat.getDecimalFormatSymbols(); + decimalFormatSymbols.setGroupingSeparator(','); // Use sensible separator for best clarity. + numberFormat.setDecimalFormatSymbols(decimalFormatSymbols); + + return numberFormat; + }); + } + + public static String formatNumbers(BigInteger aNumber) { + return getDecimalFormat().format(aNumber); + } + + public static String formatNumbers(long aNumber) { + return getDecimalFormat().format(aNumber); + } + + public static String formatNumbers(double aNumber) { + return getDecimalFormat().format(aNumber); + } + public static void deleteHeldItem() { deleteSlotStack(-999); } @@ -319,6 +360,24 @@ public class NEIClientUtils extends NEIServerUtils { return concatIntegersToRanges(damages); } + public static String cropText(FontRenderer fontRenderer, String text, int containerWidth) { + + int textWidth = fontRenderer.getStringWidth(text); + + if (textWidth > containerWidth) { + textWidth += fontRenderer.getStringWidth("..."); + + while (textWidth > containerWidth) { + textWidth -= fontRenderer.getCharWidth(text.charAt(text.length() - 1)); + text = text.substring(0, text.length() - 1); + } + + return text + "..."; + } + + return text; + } + public static boolean safeKeyDown(int keyCode) { try { return Keyboard.isKeyDown(keyCode); @@ -342,6 +401,46 @@ public class NEIClientUtils extends NEIServerUtils { return Keyboard.isKeyDown(Keyboard.KEY_LMENU) || Keyboard.isKeyDown(Keyboard.KEY_RMENU); } + public static int getMetaHash() { + if (Keyboard.getEventKeyState()) { + int hash = 0; + + if (altKey()) { + hash = hash | ALT_HASH; + } + + if (shiftKey()) { + hash = hash | SHIFT_HASH; + } + + if (controlKey()) { + hash = hash | CTRL_HASH; + } + + return hash; + } + + return 0; + } + + public static int getKeyHash() { + + if (Keyboard.getEventKeyState()) { + final int keycode = Keyboard.getEventKey(); + + if (keycode != Keyboard.KEY_LSHIFT + && keycode != Keyboard.KEY_RSHIFT + && keycode != Keyboard.KEY_LCONTROL + && keycode != Keyboard.KEY_RCONTROL + && keycode != Keyboard.KEY_LMENU + && keycode != Keyboard.KEY_RMENU) { + return getMetaHash() + keycode; + } + } + + return Keyboard.CHAR_NONE; + } + public static void playClickSound() { mc().getSoundHandler() .playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); diff --git a/src/main/java/codechicken/nei/PanelWidget.java b/src/main/java/codechicken/nei/PanelWidget.java index 1557c429..084bdf2f 100644 --- a/src/main/java/codechicken/nei/PanelWidget.java +++ b/src/main/java/codechicken/nei/PanelWidget.java @@ -206,10 +206,15 @@ public abstract class PanelWidget extends Widget { return false; } - if (NEIClientConfig.canPerformAction("delete") && NEIClientConfig.canPerformAction("item")) - if (button == 1) NEIClientUtils.decreaseSlotStack(-999); - else NEIClientUtils.deleteHeldItem(); - else NEIClientUtils.dropHeldItem(); + if (NEIClientConfig.canPerformAction("delete") && NEIClientConfig.canPerformAction("item")) { + if (button == 1) { + NEIClientUtils.decreaseSlotStack(-999); + } else { + NEIClientUtils.deleteHeldItem(); + } + } else { + NEIClientUtils.dropHeldItem(); + } return true; } @@ -243,6 +248,11 @@ public abstract class PanelWidget extends Widget { return ItemPanels.bookmarkPanel.handleDraggedClick(mouseX, mouseY, button); } + if (NEIClientUtils.getHeldItem() != null) { + final ItemStack draggedStack = NEIClientUtils.getHeldItem().copy(); + return handleGUIContainerClick(draggedStack, mouseX, mouseY, button); + } + return false; } @@ -251,7 +261,12 @@ public abstract class PanelWidget extends Widget { return false; } - if (handleGUIContainerClick(mouseX, mouseY, button)) { + if (handleGUIContainerClick(draggedStack, mouseX, mouseY, button)) { + + if (draggedStack.stackSize == 0) { + draggedStack = null; + } + return true; } @@ -266,7 +281,7 @@ public abstract class PanelWidget extends Widget { return true; } - protected boolean handleGUIContainerClick(int mouseX, int mouseY, int button) { + protected boolean handleGUIContainerClick(final ItemStack draggedStack, int mouseX, int mouseY, int button) { final GuiContainer gui = NEIClientUtils.getGuiContainer(); boolean handled = false; @@ -274,6 +289,9 @@ public abstract class PanelWidget extends Widget { GuiInfo.readLock.lock(); for (INEIGuiHandler handler : GuiInfo.guiHandlers) { if (handler.handleDragNDrop(gui, mouseX, mouseY, draggedStack, button)) { + + NEIClientConfig.logger.info(handler); + handled = true; break; } @@ -282,10 +300,6 @@ public abstract class PanelWidget extends Widget { GuiInfo.readLock.unlock(); } - if (draggedStack.stackSize == 0) { - draggedStack = null; - } - return handled; } @@ -325,12 +339,12 @@ public abstract class PanelWidget extends Widget { @Override public boolean handleKeyPress(int keyID, char keyChar) { - if (keyID == NEIClientConfig.getKeyBinding("gui.next")) { + if (NEIClientConfig.isKeyHashDown("gui.next")) { grid.shiftPage(1); return true; } - if (keyID == NEIClientConfig.getKeyBinding("gui.prev")) { + if (NEIClientConfig.isKeyHashDown("gui.prev")) { grid.shiftPage(-1); return true; } diff --git a/src/main/java/codechicken/nei/PopupInputHandler.java b/src/main/java/codechicken/nei/PopupInputHandler.java index 1487c701..56b9ac6f 100644 --- a/src/main/java/codechicken/nei/PopupInputHandler.java +++ b/src/main/java/codechicken/nei/PopupInputHandler.java @@ -1,7 +1,6 @@ package codechicken.nei; import static codechicken.nei.NEIClientConfig.canPerformAction; -import static codechicken.nei.NEIClientConfig.getKeyBinding; import codechicken.nei.guihook.IContainerInputHandler; import net.minecraft.client.gui.inventory.GuiContainer; @@ -22,14 +21,17 @@ public class PopupInputHandler implements IContainerInputHandler { @Override public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyID) { - if (keyID == getKeyBinding("gui.enchant") && canPerformAction("enchant")) { + + if (NEIClientConfig.isKeyHashDown("gui.enchant") && canPerformAction("enchant")) { NEICPH.sendOpenEnchantmentWindow(); return true; } - if (keyID == getKeyBinding("gui.potion") && canPerformAction("potion")) { + + if (NEIClientConfig.isKeyHashDown("gui.potion") && canPerformAction("potion")) { NEICPH.sendOpenPotionWindow(); return true; } + return false; } diff --git a/src/main/java/codechicken/nei/PresetsWidget.java b/src/main/java/codechicken/nei/PresetsWidget.java index 58a8e156..af066528 100644 --- a/src/main/java/codechicken/nei/PresetsWidget.java +++ b/src/main/java/codechicken/nei/PresetsWidget.java @@ -312,7 +312,7 @@ public class PresetsWidget extends Widget { final int directionState = direction.contains(x + mx, y + my) ? 1 : 2; final int deleteState = delete.contains(x + mx, y + my) ? 1 : 2; - final String displayName = cropText(tag.displayName, option.w - 6); + final String displayName = NEIClientUtils.cropText(fontRenderer, tag.displayName, option.w - 6); final String dirName = tag.whitelist ? translate("presets.whitelist.label") : translate("presets.blacklist.label"); @@ -416,7 +416,7 @@ public class PresetsWidget extends Widget { public MouseSelection(int slotIndex, boolean append) { final ItemsGrid grid = ItemPanels.itemPanel.getGrid(); - final Rectangle4i rec = grid.getSlotRect(slotIndex - (grid.getPage() - 1) * grid.getPerPage()); + final Rectangle4i rec = grid.getItemRect(slotIndex); this.append = append; endIndex = slotIndex; @@ -456,7 +456,7 @@ public class PresetsWidget extends Widget { @Override public void draw(int mousex, int mousey) { - final String text = cropText(this.text, w); + final String text = NEIClientUtils.cropText(fontRenderer, this.text, w); if (text.equals(this.text)) { GuiDraw.drawString(text, x + w - fontRenderer.getStringWidth(text), y + (h - 8) / 2, colour); @@ -535,24 +535,6 @@ public class PresetsWidget extends Widget { } }; - protected static String cropText(String text, int containerWidth) { - - int textWidth = fontRenderer.getStringWidth(text); - - if (textWidth > containerWidth) { - textWidth += fontRenderer.getStringWidth("..."); - - while (textWidth > containerWidth) { - textWidth -= fontRenderer.getCharWidth(text.charAt(text.length() - 1)); - text = text.substring(0, text.length() - 1); - } - - return text + "..."; - } - - return text; - } - protected static void setEditedTag(final PresetTag tag) { edit = tag; openListBox = false; @@ -832,7 +814,7 @@ public class PresetsWidget extends Widget { mouseSelection.endIndex = slot.slotIndex; mouseSelection.items.clear(); - final Rectangle4i rec = grid.getSlotRect(slot.slotIndex - (grid.getPage() - 1) * grid.getPerPage()); + final Rectangle4i rec = grid.getItemRect(slot.slotIndex); final Rectangle4i sel = new Rectangle4i( Math.min(rec.x, mouseSelection.startX), Math.min(rec.y, mouseSelection.startY), diff --git a/src/main/java/codechicken/nei/SearchField.java b/src/main/java/codechicken/nei/SearchField.java index 3c16a089..c4759266 100644 --- a/src/main/java/codechicken/nei/SearchField.java +++ b/src/main/java/codechicken/nei/SearchField.java @@ -45,6 +45,7 @@ public class SearchField extends TextField implements ItemFilterProvider { } public static List searchProviders = new LinkedList<>(); + private boolean isVisible = true; long lastclicktime; @@ -58,6 +59,14 @@ public class SearchField extends TextField implements ItemFilterProvider { return world.nbt.getBoolean("searchinventories"); } + public boolean isVisible() { + return isVisible; + } + + public void setVisible(boolean visible) { + isVisible = visible; + } + @Override public int getTextColour() { if (ItemPanels.itemPanel.getItems().isEmpty()) { @@ -103,7 +112,10 @@ public class SearchField extends TextField implements ItemFilterProvider { @Override public void lastKeyTyped(int keyID, char keyChar) { - if (keyID == NEIClientConfig.getKeyBinding("gui.search")) setFocus(true); + + if (isVisible() && NEIClientConfig.isKeyHashDown("gui.search")) { + setFocus(true); + } } @Override diff --git a/src/main/java/codechicken/nei/api/API.java b/src/main/java/codechicken/nei/api/API.java index 36291e61..00fdd33c 100644 --- a/src/main/java/codechicken/nei/api/API.java +++ b/src/main/java/codechicken/nei/api/API.java @@ -171,6 +171,16 @@ public class API { addOption(new OptionKeyBind(ident)); } + /** + * Add a custom KeyBinding to be configured in the Controls menu. + * @param ident An identifier for your key, eg "shoot" + * @param defaultKey The default value, commonly obtained from {@link Keyboard} + */ + public static void addHashBind(String ident, int defaultKey) { + NEIClientConfig.setDefaultKeyBinding(ident, defaultKey); + addOption(new OptionKeyBind(ident, true)); + } + public static void addOption(Option option) { NEIClientConfig.getOptionList().addOption(option); } diff --git a/src/main/java/codechicken/nei/api/ItemInfo.java b/src/main/java/codechicken/nei/api/ItemInfo.java index 76b73bef..6ffac2ec 100644 --- a/src/main/java/codechicken/nei/api/ItemInfo.java +++ b/src/main/java/codechicken/nei/api/ItemInfo.java @@ -178,7 +178,7 @@ public class ItemInfo { API.addOption(new RegistryDumper("tools.dump.item") { @Override public String[] header() { - return new String[] {"Name", "ID", "Has Block", "Mod", "Class"}; + return new String[] {"Name", "ID", "Has Block", "Mod", "Class", "Display Name"}; } @Override @@ -188,7 +188,9 @@ public class ItemInfo { Integer.toString(id), Boolean.toString(Block.getBlockFromItem(item) != Blocks.air), ItemInfo.itemOwners.get(item), - item.getClass().getCanonicalName() + item.getClass().getCanonicalName(), + EnumChatFormatting.getTextWithoutFormattingCodes( + GuiContainerManager.itemDisplayNameShort(new ItemStack(item))) }; } @@ -200,17 +202,22 @@ public class ItemInfo { API.addOption(new RegistryDumper("tools.dump.block") { @Override public String[] header() { - return new String[] {"Name", "ID", "Has Item", "Mod", "Class"}; + return new String[] {"Name", "ID", "Has Item", "Mod", "Class", "Display Name"}; } @Override - public String[] dump(Block item, int id, String name) { + public String[] dump(Block block, int id, String name) { + final Item item = Item.getItemFromBlock(block); return new String[] { name, Integer.toString(id), - Boolean.toString(Item.getItemFromBlock(item) != null), - ItemInfo.itemOwners.get(item), - item.getClass().getCanonicalName() + Boolean.toString(item != null), + ItemInfo.itemOwners.get(block), + block.getClass().getCanonicalName(), + item != null + ? EnumChatFormatting.getTextWithoutFormattingCodes( + GuiContainerManager.itemDisplayNameShort(new ItemStack(item))) + : "null" }; } diff --git a/src/main/java/codechicken/nei/config/GuiOptionList.java b/src/main/java/codechicken/nei/config/GuiOptionList.java index acfc15f9..a2188c21 100644 --- a/src/main/java/codechicken/nei/config/GuiOptionList.java +++ b/src/main/java/codechicken/nei/config/GuiOptionList.java @@ -20,6 +20,7 @@ import java.util.LinkedList; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; +import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; public class GuiOptionList extends GuiScreenWidget { @@ -119,12 +120,16 @@ public class GuiOptionList extends GuiScreenWidget { o.copyGlobals(); Option.playClickSound(); } - } else if (slotBounds(slot).contains(mx, my)) options.get(slot).mouseClicked(mx - 24, my - 2, button); + } else if (slotBounds(slot).contains(mx, my)) { + options.get(slot).mouseClicked(mx - 24, my - 2, button); + } } @Override public void mouseClicked(int mx, int my, int button) { - for (Option o : options) o.onMouseClicked(mx, my, button); + for (Option o : options) { + o.onMouseClicked(mx, my, button); + } super.mouseClicked(mx, my, button); } @@ -247,8 +252,7 @@ public class GuiOptionList extends GuiScreenWidget { @Override public void keyTyped(char c, int keycode) { - if (keycode == 1) // esc - { + if (keycode == Keyboard.KEY_ESCAPE) { GuiScreen p = parent; while (p instanceof GuiOptionList) p = ((GuiOptionList) p).parent; diff --git a/src/main/java/codechicken/nei/config/OptionButton.java b/src/main/java/codechicken/nei/config/OptionButton.java index 58edc880..62397c95 100644 --- a/src/main/java/codechicken/nei/config/OptionButton.java +++ b/src/main/java/codechicken/nei/config/OptionButton.java @@ -6,8 +6,10 @@ import static codechicken.lib.gui.GuiDraw.drawStringC; import static codechicken.lib.gui.GuiDraw.getStringWidth; import codechicken.nei.LayoutManager; +import codechicken.nei.NEIClientUtils; import java.awt.Rectangle; import java.util.List; +import net.minecraft.client.Minecraft; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; @@ -53,7 +55,7 @@ public abstract class OptionButton extends Option { public Rectangle buttonSize() { if (getPrefix() == null) return new Rectangle(0, 0, slot.slotWidth(), 20); - int width = Math.max(60, getStringWidth(getButtonText())); + int width = Math.max(60, getStringWidth(getButtonText()) + 8); return new Rectangle(slot.slotWidth() - width, 0, width, 20); } @@ -69,14 +71,34 @@ public abstract class OptionButton extends Option { } public String getTooltip() { - if (tooltip == null) return null; - String s = translateN(tooltip); - if (s.equals(namespaced(tooltip))) return null; - return s; + String tip = null; + + if (tooltip != null) { + String s = translateN(tooltip); + + if (!s.equals(namespaced(tooltip))) { + tip = s; + } + } + + if (tip == null && getPrefix() != null) { + final int width = getStringWidth(getPrefix()); + final Rectangle b = buttonSize(); + + if (width >= b.x) { + tip = translateN(name); + } + } + + return tip; } public void drawPrefix() { - if (getPrefix() != null) drawString(getPrefix(), 10, 6, -1); + final String prefix = getPrefix(); + if (prefix != null) { + final Rectangle b = buttonSize(); + drawString(NEIClientUtils.cropText(Minecraft.getMinecraft().fontRenderer, prefix, b.x - 10), 10, 6, -1); + } } public void drawButton(int mx, int my) { diff --git a/src/main/java/codechicken/nei/config/OptionKeyBind.java b/src/main/java/codechicken/nei/config/OptionKeyBind.java index 06fa5c66..0738cd7d 100644 --- a/src/main/java/codechicken/nei/config/OptionKeyBind.java +++ b/src/main/java/codechicken/nei/config/OptionKeyBind.java @@ -1,46 +1,94 @@ package codechicken.nei.config; +import static codechicken.lib.gui.GuiDraw.drawRect; +import static codechicken.lib.gui.GuiDraw.drawStringC; + +import codechicken.nei.NEIClientUtils; +import java.awt.Rectangle; +import net.minecraft.client.Minecraft; import net.minecraft.util.EnumChatFormatting; import org.lwjgl.input.Keyboard; public class OptionKeyBind extends OptionButton { - private boolean hasFocus = false; + + private boolean editing = false; + private boolean useHash = false; + private int keyboard = Keyboard.CHAR_NONE; public OptionKeyBind(String name) { + this(name, false); + } + + public OptionKeyBind(final String name, final boolean useHash) { super("keys." + name); + this.useHash = useHash; } @Override public void onMouseClicked(int mousex, int mousey, int button) { - hasFocus = false; + if (editing) { + resetChanges(); + } } @Override public void keyTyped(char c, int keycode) { - if (hasFocus) { - setValue(keycode); - hasFocus = false; + + if (!editing) { + return; + } + + if (keycode == Keyboard.KEY_RETURN) { + applyChanges(); + return; + } + + keyboard = useHash ? NEIClientUtils.getKeyHash() : keycode; + + if (keyboard != Keyboard.CHAR_NONE) { + applyChanges(); } } @Override - public boolean onClick(int button) { - if (button == 0) { - hasFocus = true; - return true; - } - if (button == 1 && getValue() != 0) { - setValue(0); + public boolean onClick(int btn) { + + if (editing) { + return true; + } else if (btn == 0) { + editing = true; + return true; + } else if (btn == 1) { + keyboard = Keyboard.CHAR_NONE; + applyChanges(); return true; } + return false; } - public boolean conflicted() { - if (getValue() == 0) return false; + protected void applyChanges() { + setValue(keyboard); + resetChanges(); + } - for (Option o : slot.options) - if (o instanceof OptionKeyBind && o != this && ((OptionKeyBind) o).getValue() == getValue()) return true; + protected void resetChanges() { + editing = false; + keyboard = Keyboard.CHAR_NONE; + } + + public boolean conflicted() { + final int keyboard = getValue(); + + if (keyboard <= 0) { + return false; + } + + for (Option o : slot.options) { + if (o instanceof OptionKeyBind && o != this && ((OptionKeyBind) o).getValue() == keyboard) { + return true; + } + } return false; } @@ -58,19 +106,50 @@ public class OptionKeyBind extends OptionButton { return translateN(name); } + @Override + public void drawButton(int mx, int my) { + + if (editing) { + Rectangle b = buttonSize(); + drawRect(b.x, b.y, b.width, b.height, -6250336); + drawRect(b.x + 1, b.y + 1, b.width - 2, b.height - 2, -16777216); + drawStringC(getButtonText(), b.x, b.y, b.width, b.height, getTextColour(mx, my)); + } else { + super.drawButton(mx, my); + } + } + @Override public String getButtonText() { - if (hasFocus) - return EnumChatFormatting.WHITE + "> " + EnumChatFormatting.YELLOW + "??? " + EnumChatFormatting.WHITE - + "<"; + String keyText = ""; - if (conflicted()) return EnumChatFormatting.RED + Keyboard.getKeyName(getValue()); + if (useHash) { + final int metahash = Math.max(editing ? NEIClientUtils.getMetaHash() : getValue(), 0); + final String DELIMITER = EnumChatFormatting.GRAY + " + " + EnumChatFormatting.RESET; - return Keyboard.getKeyName(getValue()); + if ((metahash & NEIClientUtils.CTRL_HASH) == NEIClientUtils.CTRL_HASH) { + keyText += NEIClientUtils.translate(Minecraft.isRunningOnMac ? "key.ctrl.mac" : "key.ctrl") + DELIMITER; + } + + if ((metahash & NEIClientUtils.SHIFT_HASH) == NEIClientUtils.SHIFT_HASH) { + keyText += "SHIFT" + DELIMITER; + } + + if ((metahash & NEIClientUtils.ALT_HASH) == NEIClientUtils.ALT_HASH) { + keyText += "ALT" + DELIMITER; + } + } + + if (!editing) { + keyText += Keyboard.getKeyName( + getValue() & ~(NEIClientUtils.CTRL_HASH | NEIClientUtils.SHIFT_HASH | NEIClientUtils.ALT_HASH)); + } + + return keyText; } @Override public int getTextColour(int mousex, int mousey) { - return -1; + return !editing && conflicted() ? 0xFFFF6666 : -1; } } diff --git a/src/main/java/codechicken/nei/guihook/GuiContainerManager.java b/src/main/java/codechicken/nei/guihook/GuiContainerManager.java index 7b907732..b4720a14 100644 --- a/src/main/java/codechicken/nei/guihook/GuiContainerManager.java +++ b/src/main/java/codechicken/nei/guihook/GuiContainerManager.java @@ -6,6 +6,8 @@ import static codechicken.lib.gui.GuiDraw.getMousePosition; import static codechicken.lib.gui.GuiDraw.renderEngine; import codechicken.lib.gui.GuiDraw; +import codechicken.nei.NEIClientUtils; +import codechicken.nei.recipe.StackInfo; import java.awt.Point; import java.io.PrintWriter; import java.io.StringWriter; @@ -26,6 +28,7 @@ import net.minecraft.init.Blocks; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.fluids.FluidStack; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; @@ -143,11 +146,50 @@ public class GuiContainerManager { } namelist.set(0, stack.getRarity().rarityColor.toString() + namelist.get(0)); - for (int i = 1; i < namelist.size(); i++) namelist.set(i, "\u00a77" + namelist.get(i)); + + for (int i = 1; i < namelist.size(); i++) { + namelist.set(i, EnumChatFormatting.GRAY + namelist.get(i) + EnumChatFormatting.RESET); + } return namelist; } + protected static String itemCountDetails(ItemStack stack) { + final FluidStack fluid = StackInfo.getFluid(stack); + int maxStackSize = stack.getMaxStackSize(); + int stackSize = stack.stackSize; + String FULL_PATTERN = "Count: %s = %s * %s + %s"; + String SHORT_PATTERN = "Count: %s = %s * %s"; + + if (fluid != null) { + maxStackSize = 144; + stackSize = fluid.amount * Math.max(1, stack.stackSize); + FULL_PATTERN = "Amount: %s L = %s * %s L + %s L"; + SHORT_PATTERN = "Amount: %s L = %s * %s L"; + } + + if (maxStackSize > 1 && stackSize > maxStackSize) { + final int remainder = stackSize % maxStackSize; + + if (remainder > 0) { + return String.format( + FULL_PATTERN, + NEIClientUtils.formatNumbers(stackSize), + NEIClientUtils.formatNumbers(stackSize / maxStackSize), + NEIClientUtils.formatNumbers(maxStackSize), + NEIClientUtils.formatNumbers(remainder)); + } else { + return String.format( + SHORT_PATTERN, + NEIClientUtils.formatNumbers(stackSize), + NEIClientUtils.formatNumbers(stackSize / maxStackSize), + NEIClientUtils.formatNumbers(maxStackSize)); + } + } + + return null; + } + /** * The general name of this item. * @@ -203,7 +245,7 @@ public class GuiContainerManager { int i, int j, ItemStack itemstack, FontRenderer fontRenderer, boolean smallAmount, String stackSize) { enable3DRender(); // for lighting correction - GL11.glEnable(GL12.GL_RESCALE_NORMAL); + boolean glRescale = GL11.glGetBoolean(GL12.GL_RESCALE_NORMAL); float zLevel = drawItems.zLevel += 100F; try { @@ -244,7 +286,12 @@ public class GuiContainerManager { drawItems.renderItemIntoGUI(fontRenderer, renderEngine, new ItemStack(Blocks.fire), i, j); } - GL11.glDisable(GL12.GL_RESCALE_NORMAL); + if (glRescale) { + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + } else { + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + } + enable2DRender(); drawItems.zLevel = zLevel - 100; } @@ -439,7 +486,17 @@ public class GuiContainerManager { if (tooltip.isEmpty() && shouldShowTooltip(window)) { // mouseover tip, not holding an item ItemStack stack = getStackMouseOver(window); font = getFontRenderer(stack); - if (stack != null) tooltip = itemDisplayNameMultiline(stack, window, true); + if (stack != null) { + tooltip = itemDisplayNameMultiline(stack, window, true); + + if (stack.stackSize != Integer.MAX_VALUE && NEIClientUtils.shiftKey()) { + final String itemCount = itemCountDetails(stack); + + if (itemCount != null) { + tooltip.add(String.format(EnumChatFormatting.GRAY + itemCount + EnumChatFormatting.RESET)); + } + } + } synchronized (instanceTooltipHandlers) { for (IContainerTooltipHandler handler : instanceTooltipHandlers) @@ -520,10 +577,25 @@ public class GuiContainerManager { * Delegate for changing item rendering for certain slots. Eg. Shrinking text for large itemstacks */ public void drawSlotItem(Slot slot, ItemStack stack, int x, int y, String quantity) { - if (window instanceof IGuiSlotDraw) ((IGuiSlotDraw) window).drawSlotItem(slot, stack, x, y, quantity); - else { - drawItems.renderItemAndEffectIntoGUI(fontRenderer, window.mc.getTextureManager(), stack, x, y); - drawItems.renderItemOverlayIntoGUI(fontRenderer, window.mc.getTextureManager(), stack, x, y, quantity); + // for lighting correction + boolean glRescale = GL11.glGetBoolean(GL12.GL_RESCALE_NORMAL); + + if (window instanceof IGuiSlotDraw) { + ((IGuiSlotDraw) window).drawSlotItem(slot, stack, x, y, quantity); + } else { + + if (quantity == null) { + quantity = stack != null && stack.stackSize > 1 ? String.valueOf(stack.stackSize) : ""; + } + + drawItems.renderItemAndEffectIntoGUI(fontRenderer, renderEngine, stack, x, y); + drawItems.renderItemOverlayIntoGUI(fontRenderer, renderEngine, stack, x, y, quantity); + } + + if (glRescale) { + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + } else { + GL11.glDisable(GL12.GL_RESCALE_NORMAL); } } diff --git a/src/main/java/codechicken/nei/recipe/BookmarkRecipeId.java b/src/main/java/codechicken/nei/recipe/BookmarkRecipeId.java index 444b5dbb..8254c58c 100644 --- a/src/main/java/codechicken/nei/recipe/BookmarkRecipeId.java +++ b/src/main/java/codechicken/nei/recipe/BookmarkRecipeId.java @@ -27,7 +27,7 @@ public class BookmarkRecipeId { for (Object pos : stacks) { if (pos instanceof PositionedStack) { - pos = getItemStackWithMinimumDamage(((PositionedStack) pos).items); + pos = StackInfo.getItemStackWithMinimumDamage(((PositionedStack) pos).items); } if (pos instanceof ItemStack) { @@ -67,7 +67,8 @@ public class BookmarkRecipeId { Short idx = 0; for (PositionedStack pStack : stacks) { - final NBTTagCompound tagCompoundA = StackInfo.itemStackToNBT(getItemStackWithMinimumDamage(pStack.items)); + final NBTTagCompound tagCompoundA = + StackInfo.itemStackToNBT(StackInfo.getItemStackWithMinimumDamage(pStack.items)); final NBTTagCompound tagCompoundB = ingredients.get(idx); if (tagCompoundB == null || !tagCompoundB.equals(tagCompoundA)) { @@ -80,22 +81,6 @@ public class BookmarkRecipeId { return true; } - public ItemStack getItemStackWithMinimumDamage(ItemStack[] stacks) { - int damage = Short.MAX_VALUE; - ItemStack result = stacks[0]; - - if (stacks.length > 1) { - for (ItemStack stack : stacks) { - if (stack.getItemDamage() < damage) { - damage = stack.getItemDamage(); - result = stack; - } - } - } - - return result.copy(); - } - public JsonObject toJsonObject() { JsonObject json = new JsonObject(); diff --git a/src/main/java/codechicken/nei/recipe/CheatItemHandler.java b/src/main/java/codechicken/nei/recipe/CheatItemHandler.java index 2be1d009..29ad9417 100644 --- a/src/main/java/codechicken/nei/recipe/CheatItemHandler.java +++ b/src/main/java/codechicken/nei/recipe/CheatItemHandler.java @@ -15,7 +15,7 @@ public class CheatItemHandler extends INEIGuiAdapter { public boolean handleDragNDrop(GuiContainer gui, int mouseX, int mouseY, ItemStack draggedStack, int button) { final Slot overSlot = gui.getSlotAtPosition(mouseX, mouseY); - if (overSlot != null && overSlot.isItemValid(draggedStack)) { + if (overSlot != null && overSlot.isItemValid(draggedStack) && NEIClientUtils.getHeldItem() == null) { if (NEIClientConfig.canCheatItem(draggedStack)) { int contents = overSlot.getHasStack() ? overSlot.getStack().stackSize : 0; diff --git a/src/main/java/codechicken/nei/recipe/ContainerRecipe.java b/src/main/java/codechicken/nei/recipe/ContainerRecipe.java index b939987f..8ff5f73e 100644 --- a/src/main/java/codechicken/nei/recipe/ContainerRecipe.java +++ b/src/main/java/codechicken/nei/recipe/ContainerRecipe.java @@ -84,8 +84,12 @@ public class ContainerRecipe extends Container { ItemStack stack = recipeInventory.getStackInSlot(slot); if (stack != null) { - if (button == 0) GuiCraftingRecipe.openRecipeGui("item", stack); - else if (button == 1) GuiUsageRecipe.openRecipeGui("item", stack); + + if (button == 0) { + GuiCraftingRecipe.openRecipeGui("item", stack); + } else if (button == 1) { + GuiUsageRecipe.openRecipeGui("item", stack); + } } return null; } diff --git a/src/main/java/codechicken/nei/recipe/GuiCraftingRecipe.java b/src/main/java/codechicken/nei/recipe/GuiCraftingRecipe.java index ffe57d6f..dda54165 100644 --- a/src/main/java/codechicken/nei/recipe/GuiCraftingRecipe.java +++ b/src/main/java/codechicken/nei/recipe/GuiCraftingRecipe.java @@ -1,9 +1,13 @@ package codechicken.nei.recipe; +import static codechicken.lib.gui.GuiDraw.getMousePosition; + +import codechicken.nei.ItemPanel.ItemPanelSlot; import codechicken.nei.ItemPanels; import codechicken.nei.NEIClientConfig; import codechicken.nei.NEIClientUtils; import codechicken.nei.PositionedStack; +import java.awt.Point; import java.util.ArrayList; import java.util.List; import net.minecraft.client.Minecraft; @@ -15,36 +19,41 @@ public class GuiCraftingRecipe extends GuiRecipe { public static ArrayList serialCraftingHandlers = new ArrayList<>(); public static boolean openRecipeGui(String outputId, Object... results) { - return openRecipeGui(outputId, false, results); + return openRecipeGui(outputId, false, false, results); } - public static boolean openRecipeGui(String outputId, Boolean overlay, Object... results) { - RecipeHandlerQuery recipeQuery = new RecipeHandlerQuery<>( - h -> h.getRecipeHandler(outputId, results), craftinghandlers, serialCraftingHandlers); - ArrayList handlers = recipeQuery.runWithProfiling("recipe.concurrent.crafting"); - if (handlers.isEmpty()) return false; + public static boolean openRecipeGui( + String outputId, final Boolean overlay, final Boolean shift, Object... results) { + final Minecraft mc = NEIClientUtils.mc(); - Minecraft mc = NEIClientUtils.mc(); - - BookmarkRecipeId recipeId = (NEIClientConfig.saveCurrentRecipeInBookmarksEnabled() && "item".equals(outputId)) + final BookmarkRecipeId recipeId = "item".equals(outputId) ? getRecipeId(mc.currentScreen, (ItemStack) results[0]) - : getCurrentRecipe(); + : getCurrentRecipe(mc.currentScreen); if (overlay && recipeId == null) return false; - GuiCraftingRecipe gui = new GuiCraftingRecipe(handlers, recipeId); + final RecipeHandlerQuery recipeQuery = new RecipeHandlerQuery<>( + h -> h.getRecipeHandler(outputId, results), craftinghandlers, serialCraftingHandlers); - mc.displayGuiScreen(gui); + final ArrayList handlers = recipeQuery.runWithProfiling("recipe.concurrent.crafting"); - if (recipeId != null && (!NEIClientUtils.shiftKey() || overlay)) { - gui.openTargetRecipe(gui.recipeId); + if (!handlers.isEmpty()) { + GuiCraftingRecipe gui = new GuiCraftingRecipe(handlers, recipeId); + + mc.displayGuiScreen(gui); + + if (recipeId != null) { + gui.openTargetRecipe(gui.recipeId); + } + + if (overlay) { + gui.overlayRecipe(gui.recipeId.position, shift); + } + + return true; } - if (overlay) { - gui.overlayRecipe(gui.recipeId.position); - } - - return true; + return false; } protected static BookmarkRecipeId getRecipeId(GuiScreen gui, ItemStack stackover) { @@ -58,6 +67,13 @@ public class GuiCraftingRecipe extends GuiRecipe { } } + final Point mouseover = getMousePosition(); + ItemPanelSlot panelSlot = ItemPanels.bookmarkPanel.getSlotMouseOver(mouseover.x, mouseover.y); + + if (panelSlot != null) { + return ItemPanels.bookmarkPanel.getBookmarkRecipeId(panelSlot.slotIndex); + } + return ItemPanels.bookmarkPanel.getBookmarkRecipeId(stackover); } diff --git a/src/main/java/codechicken/nei/recipe/GuiRecipe.java b/src/main/java/codechicken/nei/recipe/GuiRecipe.java index bf1d4594..770d8f51 100644 --- a/src/main/java/codechicken/nei/recipe/GuiRecipe.java +++ b/src/main/java/codechicken/nei/recipe/GuiRecipe.java @@ -28,7 +28,6 @@ import java.util.Optional; import java.util.regex.Matcher; import java.util.stream.Collectors; import java.util.stream.IntStream; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiContainer; @@ -241,12 +240,12 @@ public abstract class GuiRecipe extends GuiContainer HandlerInfo localHandlerInfo = GuiRecipeTab.getHandlerInfo(localHandler); if (localHandlerInfo.getHandlerName().equals(recipeId.handlerName)) { - recipeId.recipetype = j; if (!recipeId.ingredients.isEmpty()) { for (int i = 0; i < localHandler.numRecipes(); i++) { if (recipeId.equalsIngredients(localHandler.getIngredientStacks(i))) { + recipeId.recipetype = j; recipeId.position = i; break; } @@ -319,12 +318,19 @@ public abstract class GuiRecipe extends GuiContainer for (int recipe : getRecipeIndices()) if (handler.keyTyped(this, c, i, recipe)) return; } - if (i == mc.gameSettings.keyBindInventory.getKeyCode()) mc.displayGuiScreen(firstGuiGeneral); - else if (i == NEIClientConfig.getKeyBinding("gui.back")) mc.displayGuiScreen(prevGui); - else if (i == NEIClientConfig.getKeyBinding("gui.prev_machine")) prevType(); - else if (i == NEIClientConfig.getKeyBinding("gui.next_machine")) nextType(); - else if (i == NEIClientConfig.getKeyBinding("gui.prev_recipe")) prevPage(); - else if (i == NEIClientConfig.getKeyBinding("gui.next_recipe")) nextPage(); + if (i == mc.gameSettings.keyBindInventory.getKeyCode()) { + mc.displayGuiScreen(firstGuiGeneral); + } else if (NEIClientConfig.isKeyHashDown("gui.back")) { + mc.displayGuiScreen(prevGui); + } else if (NEIClientConfig.isKeyHashDown("gui.prev_machine")) { + prevType(); + } else if (NEIClientConfig.isKeyHashDown("gui.next_machine")) { + nextType(); + } else if (NEIClientConfig.isKeyHashDown("gui.prev_recipe")) { + prevPage(); + } else if (NEIClientConfig.isKeyHashDown("gui.next_recipe")) { + nextPage(); + } } @Override @@ -373,7 +379,8 @@ public abstract class GuiRecipe extends GuiContainer if (overlayButtons != null && guibutton.id >= OVERLAY_BUTTON_ID_START && guibutton.id < OVERLAY_BUTTON_ID_START + overlayButtons.length) { - overlayRecipe(page * getRecipesPerPage() + guibutton.id - OVERLAY_BUTTON_ID_START); + overlayRecipe( + page * getRecipesPerPage() + guibutton.id - OVERLAY_BUTTON_ID_START, NEIClientUtils.shiftKey()); } } @@ -426,14 +433,13 @@ public abstract class GuiRecipe extends GuiContainer setRecipePage(--recipetype); } - protected void overlayRecipe(int recipe) { + protected void overlayRecipe(int recipe, final boolean shift) { if (handler == null || !handler.hasOverlay(firstGui, firstGui.inventorySlots, recipe)) { mc.displayGuiScreen(firstGui); return; } final IRecipeOverlayRenderer renderer = handler.getOverlayRenderer(firstGui, recipe); final IOverlayHandler overlayHandler = handler.getOverlayHandler(firstGui, recipe); - final boolean shift = NEIClientUtils.shiftKey(); mc.displayGuiScreen(firstGui); if (renderer == null || shift) { @@ -715,14 +721,15 @@ public abstract class GuiRecipe extends GuiContainer return area.intersects(x, y, w, h); } - static BookmarkRecipeId getCurrentRecipe() { - Minecraft mc = NEIClientUtils.mc(); - if (mc.currentScreen instanceof GuiRecipe) { - GuiRecipe gui = (GuiRecipe) mc.currentScreen; + protected static BookmarkRecipeId getCurrentRecipe(GuiScreen gui) { + + if (gui instanceof GuiRecipe) { + GuiRecipe gRecipe = (GuiRecipe) gui; return new BookmarkRecipeId( - gui.handlerInfo.getHandlerName(), - gui.getHandler().getIngredientStacks(gui.page * gui.getRecipesPerPage())); + gRecipe.handlerInfo.getHandlerName(), + gRecipe.getHandler().getIngredientStacks(gRecipe.page * gRecipe.getRecipesPerPage())); } + return null; } } diff --git a/src/main/java/codechicken/nei/recipe/GuiUsageRecipe.java b/src/main/java/codechicken/nei/recipe/GuiUsageRecipe.java index c371f99f..11b70713 100644 --- a/src/main/java/codechicken/nei/recipe/GuiUsageRecipe.java +++ b/src/main/java/codechicken/nei/recipe/GuiUsageRecipe.java @@ -3,6 +3,7 @@ package codechicken.nei.recipe; import codechicken.nei.NEIClientConfig; import codechicken.nei.NEIClientUtils; import java.util.ArrayList; +import net.minecraft.client.Minecraft; public class GuiUsageRecipe extends GuiRecipe { public static ArrayList usagehandlers = new ArrayList<>(); @@ -14,14 +15,13 @@ public class GuiUsageRecipe extends GuiRecipe { ArrayList handlers = recipeQuery.runWithProfiling("recipe.concurrent.usage"); if (handlers.isEmpty()) return false; - BookmarkRecipeId recipeId = getCurrentRecipe(); + Minecraft mc = NEIClientUtils.mc(); + BookmarkRecipeId recipeId = getCurrentRecipe(mc.currentScreen); GuiUsageRecipe gui = new GuiUsageRecipe(handlers, recipeId); - NEIClientUtils.mc().displayGuiScreen(gui); + mc.displayGuiScreen(gui); - if (!NEIClientUtils.shiftKey()) { - gui.openTargetRecipe(gui.recipeId); - } + gui.openTargetRecipe(gui.recipeId); return true; } diff --git a/src/main/java/codechicken/nei/recipe/RecipeItemInputHandler.java b/src/main/java/codechicken/nei/recipe/RecipeItemInputHandler.java index 72737e29..11edbbff 100644 --- a/src/main/java/codechicken/nei/recipe/RecipeItemInputHandler.java +++ b/src/main/java/codechicken/nei/recipe/RecipeItemInputHandler.java @@ -3,7 +3,6 @@ package codechicken.nei.recipe; import codechicken.nei.ItemPanels; import codechicken.nei.LayoutManager; import codechicken.nei.NEIClientConfig; -import codechicken.nei.NEIClientUtils; import codechicken.nei.PositionedStack; import codechicken.nei.guihook.GuiContainerManager; import codechicken.nei.guihook.IContainerInputHandler; @@ -12,41 +11,52 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; public class RecipeItemInputHandler implements IContainerInputHandler { + @Override public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyCode) { - ItemStack stackover = GuiContainerManager.getStackMouseOver(gui); - if (stackover == null) return false; - if (keyCode == NEIClientConfig.getKeyBinding("gui.recipe")) - return GuiCraftingRecipe.openRecipeGui("item", stackover.copy()); - - if (keyCode == NEIClientConfig.getKeyBinding("gui.usage")) - return GuiUsageRecipe.openRecipeGui("item", stackover.copy()); - - if (keyCode == NEIClientConfig.getKeyBinding("gui.bookmark")) { - NEIClientConfig.logger.debug("Adding or removing {} from bookmarks", stackover.getDisplayName()); - List ingredients = null; - String handlerName = ""; - - if (gui instanceof GuiRecipe && NEIClientConfig.saveCurrentRecipeInBookmarksEnabled()) { - ingredients = ((GuiRecipe) gui).getFocusedRecipeIngredients(); - handlerName = ((GuiRecipe) gui).getHandlerName(); - } - - ItemPanels.bookmarkPanel.addOrRemoveItem(stackover.copy(), handlerName, ingredients); + if (NEIClientConfig.isKeyHashDown("gui.overlay_hide")) { + return hideOverlayRecipe(); } - if (keyCode == NEIClientConfig.getKeyBinding("gui.overlay")) { - if (NEIClientUtils.controlKey()) { - LayoutManager.overlayRenderer = null; - return true; - } - if (!NEIClientConfig.saveCurrentRecipeInBookmarksEnabled()) return false; - final BookmarkRecipeId mouseOverRecipeId = ItemPanels.bookmarkPanel.getBookmarkMouseOverRecipeId(); - if (mouseOverRecipeId == null - || mouseOverRecipeId.ingredients == null - || mouseOverRecipeId.ingredients.isEmpty()) return false; - return GuiCraftingRecipe.openRecipeGui("item", true, stackover.copy()); + ItemStack stackover = GuiContainerManager.getStackMouseOver(gui); + + if (stackover == null) { + return false; + } + + stackover = stackover.copy(); + + if (NEIClientConfig.isKeyHashDown("gui.overlay")) { + return openOverlayRecipe(gui, stackover, false); + } + + if (NEIClientConfig.isKeyHashDown("gui.overlay_use")) { + return openOverlayRecipe(gui, stackover, true); + } + + if (NEIClientConfig.isKeyHashDown("gui.recipe")) { + return GuiCraftingRecipe.openRecipeGui("item", stackover); + } + + if (NEIClientConfig.isKeyHashDown("gui.usage")) { + return GuiUsageRecipe.openRecipeGui("item", stackover); + } + + if (NEIClientConfig.isKeyHashDown("gui.bookmark")) { + return saveRecipeInBookmark(gui, stackover, false, false); + } + + if (NEIClientConfig.isKeyHashDown("gui.bookmark_recipe")) { + return saveRecipeInBookmark(gui, stackover, true, false); + } + + if (NEIClientConfig.isKeyHashDown("gui.bookmark_count")) { + return saveRecipeInBookmark(gui, stackover, false, true); + } + + if (NEIClientConfig.isKeyHashDown("gui.bookmark_recipe_count")) { + return saveRecipeInBookmark(gui, stackover, true, true); } return false; @@ -54,22 +64,57 @@ public class RecipeItemInputHandler implements IContainerInputHandler { @Override public boolean mouseClicked(GuiContainer gui, int mousex, int mousey, int button) { + if (!(gui instanceof GuiRecipe) + || ItemPanels.itemPanel.contains(mousex, mousey) + || ItemPanels.bookmarkPanel.contains(mousex, mousey)) return false; + ItemStack stackover = GuiContainerManager.getStackMouseOver(gui); - if (stackover == null) return false; + if (stackover != null) { + if (button == 0) { + return GuiCraftingRecipe.openRecipeGui("item", stackover.copy()); + } else if (button == 1) { + return GuiUsageRecipe.openRecipeGui("item", stackover.copy()); + } + } - if (!(gui instanceof GuiRecipe)) return false; + return false; + } - // disabled open recipe gui if hold shift (player have move recipe) - if (button == 0 - && ItemPanels.bookmarkPanel.getStackMouseOver(mousex, mousey) != null - && NEIClientUtils.shiftKey()) { + private boolean hideOverlayRecipe() { + + if (LayoutManager.overlayRenderer != null) { + LayoutManager.overlayRenderer = null; + return true; + } + + return false; + } + + private boolean openOverlayRecipe(GuiContainer gui, ItemStack stack, boolean shift) { + + if (gui instanceof GuiRecipe) { return false; } - if (button == 0) return GuiCraftingRecipe.openRecipeGui("item", stackover.copy()); + return GuiCraftingRecipe.openRecipeGui("item", true, shift, stack); + } - if (button == 1) return GuiUsageRecipe.openRecipeGui("item", stackover.copy()); + private boolean saveRecipeInBookmark( + GuiContainer gui, ItemStack stack, boolean saveIngredients, boolean saveStackSize) { + + if (stack != null) { + List ingredients = null; + String handlerName = ""; + + if (gui instanceof GuiRecipe) { + ingredients = ((GuiRecipe) gui).getFocusedRecipeIngredients(); + handlerName = ((GuiRecipe) gui).getHandlerName(); + } + + ItemPanels.bookmarkPanel.addOrRemoveItem(stack, handlerName, ingredients, saveIngredients, saveStackSize); + return true; + } return false; } diff --git a/src/main/java/codechicken/nei/recipe/SearchInputDropHandler.java b/src/main/java/codechicken/nei/recipe/SearchInputDropHandler.java index 6a148abd..0babb354 100644 --- a/src/main/java/codechicken/nei/recipe/SearchInputDropHandler.java +++ b/src/main/java/codechicken/nei/recipe/SearchInputDropHandler.java @@ -16,7 +16,7 @@ public class SearchInputDropHandler extends INEIGuiAdapter { @Override public boolean handleDragNDrop(GuiContainer gui, int mouseX, int mouseY, ItemStack draggedStack, int button) { - if (searchField.contains(mouseX, mouseY)) { + if (searchField.isVisible() && searchField.contains(mouseX, mouseY)) { final FluidStack fluidStack = StackInfo.getFluid(draggedStack); if (fluidStack != null) { diff --git a/src/main/java/codechicken/nei/recipe/StackInfo.java b/src/main/java/codechicken/nei/recipe/StackInfo.java index 85477cf4..98e86739 100644 --- a/src/main/java/codechicken/nei/recipe/StackInfo.java +++ b/src/main/java/codechicken/nei/recipe/StackInfo.java @@ -190,4 +190,20 @@ public class StackInfo { guidfilters.put(parts[0], rules); } } + + public static ItemStack getItemStackWithMinimumDamage(ItemStack[] stacks) { + int damage = Short.MAX_VALUE; + ItemStack result = stacks[0]; + + if (stacks.length > 1) { + for (ItemStack stack : stacks) { + if (stack.getItem() != null && stack.getItemDamage() < damage) { + damage = stack.getItemDamage(); + result = stack; + } + } + } + + return result.copy(); + } } diff --git a/src/main/java/codechicken/nei/recipe/TemplateRecipeHandler.java b/src/main/java/codechicken/nei/recipe/TemplateRecipeHandler.java index 8f51b330..a1efc678 100644 --- a/src/main/java/codechicken/nei/recipe/TemplateRecipeHandler.java +++ b/src/main/java/codechicken/nei/recipe/TemplateRecipeHandler.java @@ -4,6 +4,7 @@ import static codechicken.lib.gui.GuiDraw.changeTexture; import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; import static codechicken.lib.gui.GuiDraw.getMousePosition; +import codechicken.lib.vec.Rectangle4i; import codechicken.nei.ItemList; import codechicken.nei.NEIClientConfig; import codechicken.nei.NEIClientUtils; @@ -178,8 +179,12 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH * is available */ public List getCycledIngredients(int cycle, List ingredients) { - for (int itemIndex = 0; itemIndex < ingredients.size(); itemIndex++) - randomRenderPermutation(ingredients.get(itemIndex), cycle + itemIndex); + + if (!NEIClientUtils.shiftKey()) { + for (int itemIndex = 0; itemIndex < ingredients.size(); itemIndex++) { + randomRenderPermutation(ingredients.get(itemIndex), cycle + itemIndex); + } + } return ingredients; } @@ -286,8 +291,11 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyCode) { if (!canHandle(gui)) return false; - if (keyCode == NEIClientConfig.getKeyBinding("gui.recipe")) return transferRect(gui, false); - else if (keyCode == NEIClientConfig.getKeyBinding("gui.usage")) return transferRect(gui, true); + if (NEIClientConfig.isKeyHashDown("gui.recipe")) { + return transferRect(gui, false); + } else if (NEIClientConfig.isKeyHashDown("gui.usage")) { + return transferRect(gui, true); + } return false; } @@ -645,8 +653,12 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH @Override public boolean keyTyped(GuiRecipe gui, char keyChar, int keyCode, int recipe) { - if (keyCode == NEIClientConfig.getKeyBinding("gui.recipe")) return transferRect(gui, recipe, false); - else if (keyCode == NEIClientConfig.getKeyBinding("gui.usage")) return transferRect(gui, recipe, true); + + if (NEIClientConfig.isKeyHashDown("gui.recipe")) { + return transferRect(gui, recipe, false); + } else if (NEIClientConfig.isKeyHashDown("gui.usage")) { + return transferRect(gui, recipe, true); + } return false; } @@ -661,6 +673,28 @@ public abstract class TemplateRecipeHandler implements ICraftingHandler, IUsageH @Override public boolean mouseScrolled(GuiRecipe gui, int scroll, int recipe) { + if (!NEIClientUtils.shiftKey()) return false; + + final Point offset = gui.getRecipePosition(recipe); + final Point pos = getMousePosition(); + final Point relMouse = new Point(pos.x - gui.guiLeft - offset.x, pos.y - gui.guiTop - offset.y); + + for (PositionedStack pStack : getIngredientStacks(recipe)) { + if ((new Rectangle4i(pStack.relx, pStack.rely, 18, 18)).contains(relMouse.x, relMouse.y)) { + int index = pStack.items.length + scroll; + + for (int i = 0; i < pStack.items.length; i++) { + if (NEIServerUtils.areStacksSameTypeCraftingWithNBT(pStack.items[i], pStack.item)) { + index = index + i; + break; + } + } + + pStack.setPermutationToRender(index % pStack.items.length); + return true; + } + } + return false; } diff --git a/src/main/resources/assets/nei/lang/en_US.lang b/src/main/resources/assets/nei/lang/en_US.lang index da5de476..9b876a9a 100644 --- a/src/main/resources/assets/nei/lang/en_US.lang +++ b/src/main/resources/assets/nei/lang/en_US.lang @@ -10,6 +10,8 @@ nei.bookmark.toggle=Bookmarks nei.bookmark.toggle.tip=Toggle visibility of the Bookmark Panel nei.bookmark.viewmode.toggle.tip=Toggle Bookmark View Mode +nei.itempanel.quantity.default=One stack + nei.enchant=Enchant nei.enchant.level=Level nei.enchant.locked=Locked @@ -95,8 +97,13 @@ nei.options.keys.gui.next_machine=Next Machine nei.options.keys.gui.prev_machine=Prev Machine nei.options.keys.gui.search=Focus Search Bar nei.options.keys.gui.bookmark=Add Bookmark +nei.options.keys.gui.bookmark_recipe=Add Bookmark with Recipe +nei.options.keys.gui.bookmark_count=Add Bookmark with Count +nei.options.keys.gui.bookmark_recipe_count=Add Bookmark with Recipe & Count nei.options.keys.gui.hide_bookmarks=Toggle Bookmark Panel Visibility nei.options.keys.gui.overlay=Overlay Recipe +nei.options.keys.gui.overlay_hide=Hide Overlay Recipe +nei.options.keys.gui.overlay_use=Use Overlay Recipe nei.options.keys.world=World nei.options.keys.world.chunkoverlay=Chunk Boundary Overlay nei.options.keys.world.moboverlay=Mob Spawn Overlay @@ -138,6 +145,9 @@ nei.options.inventory.useNBTInBookmarks.false=No nei.options.inventory.showRecipeMarker=Show Recipe Marker nei.options.inventory.showRecipeMarker.true=Yes nei.options.inventory.showRecipeMarker.false=No +nei.options.inventory.showItemQuantityWidget=Show Item Quantity Widget +nei.options.inventory.showItemQuantityWidget.true=Yes +nei.options.inventory.showItemQuantityWidget.false=No nei.options.inventory.creative_tab_style=Creative or JEI tab style nei.options.inventory.creative_tab_style.true=Creative nei.options.inventory.creative_tab_style.false=JEI