diff --git a/dependencies.gradle b/dependencies.gradle index bc1b969d..47d19c11 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -2,5 +2,7 @@ dependencies { api('com.github.GTNewHorizons:CodeChickenCore:1.4.0:dev') + implementation('com.github.GTNewHorizons:GTNHLib:0.6.0:dev') + shadowImplementation('org.apache.commons:commons-csv:1.10.0') } diff --git a/src/main/java/codechicken/nei/NEIModContainer.java b/src/main/java/codechicken/nei/NEIModContainer.java index 81724b29..8e18ef02 100644 --- a/src/main/java/codechicken/nei/NEIModContainer.java +++ b/src/main/java/codechicken/nei/NEIModContainer.java @@ -1,6 +1,7 @@ package codechicken.nei; import java.io.File; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedList; @@ -38,6 +39,7 @@ public class NEIModContainer extends DummyModContainer { public static LinkedList plugins = new LinkedList<>(); private static boolean gregTech5Loaded; + private static boolean gtnhLibLoaded; public NEIModContainer() { super(getModMetadata()); @@ -59,16 +61,23 @@ public class NEIModContainer extends DummyModContainer { return gregTech5Loaded; } + public static boolean isGTNHLibLoaded() { + return gtnhLibLoaded; + } + @Override public Set getRequirements() { Set deps = new HashSet<>(); - deps.add(VersionParser.parseVersionReference("CodeChickenCore@[" + CodeChickenCorePlugin.version + ",)")); + deps.add(VersionParser.parseVersionReference("CodeChickenCore@[" + codechicken.core.asm.Tags.VERSION + ",)")); return deps; } @Override public List getDependencies() { - return new LinkedList<>(getRequirements()); + List deps = new ArrayList<>(); + deps.add(VersionParser.parseVersionReference("CodeChickenCore@[" + codechicken.core.asm.Tags.VERSION + ",)")); + deps.add(VersionParser.parseVersionReference("gtnhlib@[0.6.0,)")); + return deps; } private String description; @@ -106,6 +115,7 @@ public class NEIModContainer extends DummyModContainer { @Subscribe public void preInit(FMLPreInitializationEvent event) { gregTech5Loaded = Loader.isModLoaded("gregtech") && !Loader.isModLoaded("gregapi_post"); + gtnhLibLoaded = Loader.isModLoaded("gtnhlib"); if (CommonUtils.isClient()) ClientHandler.preInit(); } diff --git a/src/main/java/codechicken/nei/guihook/GuiContainerManager.java b/src/main/java/codechicken/nei/guihook/GuiContainerManager.java index 555d7499..acb73825 100644 --- a/src/main/java/codechicken/nei/guihook/GuiContainerManager.java +++ b/src/main/java/codechicken/nei/guihook/GuiContainerManager.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Map; import java.util.StringJoiner; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Consumer; import java.util.regex.Pattern; import javax.annotation.Nullable; @@ -24,6 +25,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.resources.IResourceManager; @@ -38,15 +40,18 @@ import net.minecraftforge.fluids.FluidStack; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; import codechicken.lib.gui.GuiDraw; import codechicken.nei.ItemStackSet; import codechicken.nei.NEIClientConfig; import codechicken.nei.NEIClientUtils; +import codechicken.nei.NEIModContainer; import codechicken.nei.SearchField; import codechicken.nei.recipe.StackInfo; import codechicken.nei.search.TooltipFilter; import codechicken.nei.util.ReadableNumberConverter; +import codechicken.nei.util.RenderTooltipEventHelper; public class GuiContainerManager { @@ -552,8 +557,8 @@ public class GuiContainerManager { tooltip = handler.handleTooltip(window, mousex, mousey, tooltip); } + ItemStack stack = getStackMouseOver(window); 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); @@ -600,7 +605,32 @@ public class GuiContainerManager { } } - drawPagedTooltip(font, mousex + 12, mousey - 12, tooltip); + if (NEIModContainer.isGTNHLibLoaded() && !tooltip.isEmpty()) { + if (RenderTooltipEventHelper.post(stack, this.window, mousex, mousey, font)) { + return; + } + Consumer> alternativeRenderer = RenderTooltipEventHelper.getAlternativeRenderer(); + if (alternativeRenderer == null) { + drawPagedTooltip( + RenderTooltipEventHelper.getFont(), + RenderTooltipEventHelper.getX() + 12, + RenderTooltipEventHelper.getY() - 12, + tooltip); + } else { + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GuiDraw.gui.incZLevel(300.0f); + alternativeRenderer.accept(tooltip); + GuiDraw.gui.incZLevel(-300.0f); + GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderHelper.enableStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + } + RenderTooltipEventHelper.flush(); + } else { + drawPagedTooltip(font, mousex + 12, mousey - 12, tooltip); + } for (IContainerDrawHandler drawHandler : drawHandlers) { drawHandler.postRenderTooltips(window, mousex, mousey, tooltip); @@ -625,6 +655,18 @@ public class GuiContainerManager { tooltips.size(), NEIClientConfig.getKeyName("gui.next_tooltip"))); } + if (NEIModContainer.isGTNHLibLoaded()) { + drawMultilineTip( + font, + x, + y, + tooltips.get(tooltipPage), + RenderTooltipEventHelper.getBackgroundStart(), + RenderTooltipEventHelper.getBackgroundEnd(), + RenderTooltipEventHelper.getBorderStart(), + RenderTooltipEventHelper.getBorderEnd()); + return; + } drawMultilineTip(font, x, y, tooltips.get(tooltipPage)); } @@ -713,7 +755,7 @@ public class GuiContainerManager { if (Keyboard.getEventKeyState() || (k == 0 && Character.isDefined(c))) { try { keyTyped(c, k); - } catch (java.lang.IndexOutOfBoundsException e) { + } catch (IndexOutOfBoundsException e) { System.err.println("Caught out of bounds exception pressing " + c + " " + k); e.printStackTrace(); } diff --git a/src/main/java/codechicken/nei/util/RenderTooltipEventHelper.java b/src/main/java/codechicken/nei/util/RenderTooltipEventHelper.java new file mode 100644 index 00000000..c48fe8ee --- /dev/null +++ b/src/main/java/codechicken/nei/util/RenderTooltipEventHelper.java @@ -0,0 +1,78 @@ +package codechicken.nei.util; + +import static com.gtnewhorizon.gtnhlib.client.event.RenderTooltipEvent.*; + +import java.util.List; +import java.util.function.Consumer; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.MinecraftForge; + +import com.gtnewhorizon.gtnhlib.client.event.RenderTooltipEvent; + +public class RenderTooltipEventHelper { + + private static RenderTooltipEvent event; + + /** + * @return {@code true} if the event has been canceled + */ + public static boolean post(ItemStack stack, GuiScreen gui, int x, int y, FontRenderer font) { + event = new RenderTooltipEvent( + stack, + gui, + ORIGINAL_BG_START, + ORIGINAL_BG_END, + ORIGINAL_BORDER_START, + ORIGINAL_BORDER_END, + x, + y, + font); + if (stack != null) { + MinecraftForge.EVENT_BUS.post(event); + if (event.isCanceled()) { + flush(); + return true; + } + } + return false; + } + + public static void flush() { + event = null; + } + + public static int getBackgroundStart() { + return event == null ? ORIGINAL_BG_START : event.backgroundStart; + } + + public static int getBackgroundEnd() { + return event == null ? ORIGINAL_BG_END : event.backgroundEnd; + } + + public static int getBorderStart() { + return event == null ? ORIGINAL_BORDER_START : event.borderStart; + } + + public static int getBorderEnd() { + return event == null ? ORIGINAL_BORDER_END : event.borderEnd; + } + + public static int getX() { + return event.x; + } + + public static int getY() { + return event.y; + } + + public static FontRenderer getFont() { + return event.font; + } + + public static Consumer> getAlternativeRenderer() { + return event.alternativeRenderer; + } +}