diff --git a/src/main/java/codechicken/nei/FormattedTextField.java b/src/main/java/codechicken/nei/FormattedTextField.java index 239b357e..749f2c14 100644 --- a/src/main/java/codechicken/nei/FormattedTextField.java +++ b/src/main/java/codechicken/nei/FormattedTextField.java @@ -4,6 +4,7 @@ import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.ChatAllowedCharacters; import net.minecraft.util.EnumChatFormatting; import org.lwjgl.opengl.GL11; @@ -102,6 +103,39 @@ public class FormattedTextField extends GuiTextField { this.editable = p_146184_1_; } + @Override + public void writeText(String p_146191_1_) { + String newText = ""; + String substr = ChatAllowedCharacters.filerAllowedCharacters(p_146191_1_); + int cursorPosition = getCursorPosition(); + int maxStringLength = getMaxStringLength(); + String text = getText(); + + if (text.isEmpty()) { + newText = substr.substring(0, Math.min(maxStringLength, substr.length())); + cursorPosition = newText.length(); + } else { + int selectionEnd = getSelectionEnd(); + String textStart = text.substring(0, Math.min(cursorPosition, selectionEnd)); + String textEnd = text.substring(Math.max(cursorPosition, selectionEnd)); + newText = textStart + substr + textEnd; + + if (newText.length() > maxStringLength) { + newText = newText.substring(0, maxStringLength); + } + + cursorPosition = Math.min(textStart.length() + substr.length(), newText.length()); + } + + setText(newText); + setCursorPosition(cursorPosition); + } + + @Override + public int getNthWordFromPos(int p_146183_1_, int p_146183_2_) { + return this.func_146197_a(p_146183_1_, p_146183_2_, true); + } + @Override public void drawTextBox() { if (this.getVisible()) { diff --git a/src/main/java/codechicken/nei/LayoutManager.java b/src/main/java/codechicken/nei/LayoutManager.java index 08b9fa8a..3600e48c 100644 --- a/src/main/java/codechicken/nei/LayoutManager.java +++ b/src/main/java/codechicken/nei/LayoutManager.java @@ -234,8 +234,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH return true; } - if (NEIClientConfig.isKeyHashDown("gui.next_tooltip")) { - GuiContainerManager.incrementTooltipPage(); + if (NEIClientConfig.isKeyHashDown("gui.next_tooltip") && GuiContainerManager.incrementTooltipPage()) { return true; } diff --git a/src/main/java/codechicken/nei/LayoutStyleMinecraft.java b/src/main/java/codechicken/nei/LayoutStyleMinecraft.java index c15bedc8..fd50a708 100644 --- a/src/main/java/codechicken/nei/LayoutStyleMinecraft.java +++ b/src/main/java/codechicken/nei/LayoutStyleMinecraft.java @@ -184,7 +184,7 @@ public class LayoutStyleMinecraft extends LayoutStyle { final Rectangle4i area = new Rectangle4i(0, 0, 0, BUTTON_SIZE); if (NEIClientConfig.isSearchWidgetCentered()) { - area.w = gui.xSize - MARGIN * 2; + area.w = Math.min(gui.xSize, 176) - MARGIN * 2; area.x = (gui.width - area.w) / 2; area.y = gui.height - BUTTON_SIZE - MARGIN; } else if (NEIClientConfig.showItemQuantityWidget()) { diff --git a/src/main/java/codechicken/nei/NEIClientConfig.java b/src/main/java/codechicken/nei/NEIClientConfig.java index 2d423b93..6819dbaa 100644 --- a/src/main/java/codechicken/nei/NEIClientConfig.java +++ b/src/main/java/codechicken/nei/NEIClientConfig.java @@ -46,7 +46,6 @@ import codechicken.nei.config.GuiHighlightTips; import codechicken.nei.config.GuiNEIOptionList; import codechicken.nei.config.GuiOptionList; import codechicken.nei.config.GuiPanelSettings; -import codechicken.nei.config.OptionButton; import codechicken.nei.config.OptionCycled; import codechicken.nei.config.OptionGamemodes; import codechicken.nei.config.OptionIntegerField; @@ -289,19 +288,6 @@ public class NEIClientConfig { 0, OptionIntegerField.UNSIGNED_INT_MAX)); - API.addOption( - new OptionButton( - "inventory.collapsibleItems.reloadLabel", - "inventory.collapsibleItems.reloadButton", - "inventory.collapsibleItems.reloadTip") { - - @Override - public boolean onClick(int button) { - LayoutManager.markItemsDirty(); - return super.onClick(button); - } - }); - tag.getTag("inventory.itemzoom.enabled").getBooleanValue(true); API.addOption(new OptionToggleButton("inventory.itemzoom.enabled", true)); @@ -369,6 +355,9 @@ public class NEIClientConfig { tag.getTag("inventory.gridRenderingCacheMode").getIntValue(0); API.addOption(new OptionCycled("inventory.gridRenderingCacheMode", 3, true)); + tag.getTag("inventory.hotkeysHelpText").getBooleanValue(true); + API.addOption(new OptionToggleButton("inventory.hotkeysHelpText", true)); + tag.getTag("loadPluginsInParallel").getBooleanValue(true); tag.getTag("itemLoadingTimeout").getIntValue(500); diff --git a/src/main/java/codechicken/nei/guihook/GuiContainerManager.java b/src/main/java/codechicken/nei/guihook/GuiContainerManager.java index dfbd0ede..1b68cc90 100644 --- a/src/main/java/codechicken/nei/guihook/GuiContainerManager.java +++ b/src/main/java/codechicken/nei/guihook/GuiContainerManager.java @@ -554,7 +554,8 @@ public class GuiContainerManager { } ItemStack stack = getStackMouseOver(window); - if (tooltip.isEmpty() && shouldShowTooltip(window)) { // mouseover tip, not holding an item + boolean showTooltip = shouldShowTooltip(window); + if (tooltip.isEmpty() && showTooltip) { // mouseover tip, not holding an item font = getFontRenderer(stack); if (stack != null) { tooltip = itemDisplayNameMultiline(stack, window, true); @@ -569,7 +570,7 @@ public class GuiContainerManager { if (!tooltip.isEmpty()) tooltip.set(0, tooltip.get(0) + GuiDraw.TOOLTIP_LINESPACE); // add space after 'title' - if (shouldShowTooltip(window)) { + if (showTooltip) { List hotkeystips = collectHotkeyTips(mousex, mousey); if (!hotkeystips.isEmpty()) { @@ -615,23 +616,19 @@ public class GuiContainerManager { } private List collectHotkeyTips(int mousex, int mousey) { - Map hotkeys = new HashMap<>(); - synchronized (instanceTooltipHandlers) { - for (IContainerTooltipHandler handler : instanceTooltipHandlers) { - hotkeys = handler.handleHotkeys(window, mousex, mousey, hotkeys); + if (NEIClientUtils.altKey()) { + Map hotkeys = new HashMap<>(); + + synchronized (instanceTooltipHandlers) { + for (IContainerTooltipHandler handler : instanceTooltipHandlers) { + hotkeys = handler.handleHotkeys(window, mousex, mousey, hotkeys); + } } - } - if (!hotkeys.isEmpty()) { - List hotkeystips = new ArrayList<>(); + if (!hotkeys.isEmpty()) { + List hotkeystips = new ArrayList<>(); - if (!NEIClientUtils.altKey()) { - hotkeystips.add( - EnumChatFormatting.GRAY + translate( - "showHotkeys", - EnumChatFormatting.GOLD + translate("key.alt") + EnumChatFormatting.GRAY)); - } else { Map> messages = new HashMap<>(); hotkeys.remove(null); hotkeys.remove(""); @@ -664,9 +661,28 @@ public class GuiContainerManager { hotkeystips.set( hotkeystips.size() - 1, hotkeystips.get(hotkeystips.size() - 1) + GuiDraw.TOOLTIP_LINESPACE); + + return hotkeystips; } - return hotkeystips; + } else if (NEIClientConfig.getBooleanSetting("inventory.hotkeysHelpText")) { + boolean existsHotkeys = false; + + synchronized (instanceTooltipHandlers) { + for (IContainerTooltipHandler handler : instanceTooltipHandlers) { + if (!handler.handleHotkeys(window, mousex, mousey, new HashMap<>()).isEmpty()) { + existsHotkeys = true; + break; + } + } + } + + if (existsHotkeys) { + return Collections.singletonList( + EnumChatFormatting.GRAY + translate( + "showHotkeys", + EnumChatFormatting.GOLD + translate("key.alt") + EnumChatFormatting.GRAY)); + } } return Collections.emptyList(); @@ -675,39 +691,50 @@ public class GuiContainerManager { private String getHotkeyTip(List keys, String message) { return EnumChatFormatting.GOLD + String.join(EnumChatFormatting.DARK_GRAY + " / " + EnumChatFormatting.GOLD, keys) - + EnumChatFormatting.GRAY + + EnumChatFormatting.DARK_GRAY + " - " + + EnumChatFormatting.GRAY + message + EnumChatFormatting.RESET; } private static int tooltipPage; + private static int maxTooltipPage; public static void drawPagedTooltip(FontRenderer font, int x, int y, List list) { if (list.isEmpty()) return; List> tooltips = splitTooltipByPage(list); - tooltipPage = tooltipPage < tooltips.size() ? tooltipPage : 0; - if (tooltips.size() > 1) { - tooltips.get(tooltipPage).add( - EnumChatFormatting.ITALIC + NEIClientUtils.translate( - "inventory.tooltip.page", - tooltipPage + 1, - tooltips.size(), - NEIClientConfig.getKeyName("gui.next_tooltip"))); + maxTooltipPage = tooltips.size(); + tooltipPage = tooltipPage < maxTooltipPage ? tooltipPage : 0; + final List currentTooltip = tooltips.get(tooltipPage); + + if (maxTooltipPage > 1) { + final String pageTooltip = EnumChatFormatting.ITALIC + NEIClientUtils.translate( + "inventory.tooltip.page", + tooltipPage + 1, + maxTooltipPage, + NEIClientConfig.getKeyName("gui.next_tooltip")); + + currentTooltip.set( + currentTooltip.size() - 1, + currentTooltip.get(currentTooltip.size() - 1) + GuiDraw.TOOLTIP_LINESPACE); + + currentTooltip.add(pageTooltip); } + if (NEIModContainer.isGTNHLibLoaded()) { drawMultilineTip( font, x, y, - tooltips.get(tooltipPage), + currentTooltip, RenderTooltipEventHelper.getBackgroundStart(), RenderTooltipEventHelper.getBackgroundEnd(), RenderTooltipEventHelper.getBorderStart(), RenderTooltipEventHelper.getBorderEnd()); - return; + } else { + drawMultilineTip(font, x, y, currentTooltip); } - drawMultilineTip(font, x, y, tooltips.get(tooltipPage)); } public static List> splitTooltipByPage(List list) { @@ -752,8 +779,8 @@ public class GuiContainerManager { } } - public static void incrementTooltipPage() { - tooltipPage++; + public static boolean incrementTooltipPage() { + return tooltipPage != Math.min(tooltipPage++, maxTooltipPage); } public void renderSlotUnderlay(Slot slot) { diff --git a/src/main/java/codechicken/nei/recipe/StackInfo.java b/src/main/java/codechicken/nei/recipe/StackInfo.java index 80510f86..81733323 100644 --- a/src/main/java/codechicken/nei/recipe/StackInfo.java +++ b/src/main/java/codechicken/nei/recipe/StackInfo.java @@ -86,7 +86,7 @@ public class StackInfo { } public static boolean equalItemAndNBT(ItemStack stackA, ItemStack stackB, boolean useNBT) { - if (stackA == null || stackB == null || !stackA.isItemEqual(stackB)) { + if (stackA == null || stackB == null || stackA.getItem() != stackB.getItem()) { return false; } diff --git a/src/main/java/codechicken/nei/recipe/stackinfo/DefaultStackStringifyHandler.java b/src/main/java/codechicken/nei/recipe/stackinfo/DefaultStackStringifyHandler.java index 37975c10..049f1f3f 100644 --- a/src/main/java/codechicken/nei/recipe/stackinfo/DefaultStackStringifyHandler.java +++ b/src/main/java/codechicken/nei/recipe/stackinfo/DefaultStackStringifyHandler.java @@ -24,7 +24,7 @@ public class DefaultStackStringifyHandler implements IStackStringifyHandler { nbTag.setInteger("Count", saveStackSize ? stack.stackSize : 1); nbTag.setShort("Damage", (short) stack.getItemDamage()); - if (stack.hasTagCompound()) { + if (stack.hasTagCompound() && !stack.getTagCompound().hasNoTags()) { nbTag.setTag("tag", stack.getTagCompound()); } diff --git a/src/main/java/codechicken/nei/util/NEIMouseUtils.java b/src/main/java/codechicken/nei/util/NEIMouseUtils.java index dcd7e834..55260bb6 100644 --- a/src/main/java/codechicken/nei/util/NEIMouseUtils.java +++ b/src/main/java/codechicken/nei/util/NEIMouseUtils.java @@ -38,13 +38,13 @@ public class NEIMouseUtils { if (mouseBind >= 0) { int button = unhash(mouseBind); switch (button) { - case 0: + case MOUSE_BTN_LMB: mouseText.add(NEIClientUtils.translate("mouse.left")); break; - case 1: + case MOUSE_BTN_RMB: mouseText.add(NEIClientUtils.translate("mouse.right")); break; - case 2: + case MOUSE_BTN_MMB: mouseText.add(NEIClientUtils.translate("mouse.middle")); break; default: diff --git a/src/main/java/codechicken/nei/util/ReadableNumberConverter.java b/src/main/java/codechicken/nei/util/ReadableNumberConverter.java index 9fe88459..df97ca90 100644 --- a/src/main/java/codechicken/nei/util/ReadableNumberConverter.java +++ b/src/main/java/codechicken/nei/util/ReadableNumberConverter.java @@ -24,7 +24,7 @@ public enum ReadableNumberConverter { /** * String representation of the sorted postfixes */ - private static final char[] ENCODED_POSTFIXES = "KMGTPE".toCharArray(); + private static final char[] ENCODED_POSTFIXES = "kMGTPE".toCharArray(); private final Format format; diff --git a/src/main/resources/assets/nei/lang/en_US.lang b/src/main/resources/assets/nei/lang/en_US.lang index 69833ff7..d4375696 100644 --- a/src/main/resources/assets/nei/lang/en_US.lang +++ b/src/main/resources/assets/nei/lang/en_US.lang @@ -198,6 +198,9 @@ nei.options.inventory.bookmarks.ignorePotionOverlap.false=No nei.options.inventory.bookmarks.worldSpecific=World Specific Bookmarks nei.options.inventory.bookmarks.worldSpecific.true=Yes nei.options.inventory.bookmarks.worldSpecific.false=No +nei.options.inventory.hotkeysHelpText=Show Hotkeys Help Text +nei.options.inventory.hotkeysHelpText.true=Yes +nei.options.inventory.hotkeysHelpText.false=No nei.options.inventory.guirecipe=Recipes GUI nei.options.inventory.guirecipe.jeiStyleTabs=JEI Style Tabs nei.options.inventory.guirecipe.jeiStyleTabs.true=Yes @@ -326,8 +329,6 @@ nei.options.inventory.collapsibleItems.customName.true=Yes nei.options.inventory.collapsibleItems.customName.false=No nei.options.inventory.collapsibleItems.expandedColor=Expanded Color nei.options.inventory.collapsibleItems.collapsedColor=Collapsed Color -nei.options.inventory.collapsibleItems.reloadLabel=Reload -nei.options.inventory.collapsibleItems.reloadButton=Run nei.options.inventory.history=History Panel nei.options.inventory.history.enabled=History Panel Visibility nei.options.inventory.history.enabled.true=Enabled diff --git a/src/main/resources/assets/nei/lang/ru_RU.lang b/src/main/resources/assets/nei/lang/ru_RU.lang index ec7d64a1..c9f07f17 100644 --- a/src/main/resources/assets/nei/lang/ru_RU.lang +++ b/src/main/resources/assets/nei/lang/ru_RU.lang @@ -301,8 +301,6 @@ nei.options.inventory.collapsibleItems.customName.true=Да nei.options.inventory.collapsibleItems.customName.false=Нет nei.options.inventory.collapsibleItems.expandedColor=Цвет развернутого nei.options.inventory.collapsibleItems.collapsedColor=Цвет свернутого -nei.options.inventory.collapsibleItems.reloadLabel=Перезагрузить -nei.options.inventory.collapsibleItems.reloadButton=Запустить nei.options.inventory.history=Панель истории nei.options.inventory.history.enabled=Видимость панели истории nei.options.inventory.history.enabled.true=Включено