Jump to content

Tooltip depth


FoxBox

Recommended Posts

GUI screens are actually 3d in minecraft. The z direction is the distance out of the screen.

Look at how the class Screen handles tool tips by both translating the z co-ord of the PoseStack and changing ItemRenderer.blitOffset which controls the same thing for the drawing items.

Note how it uses +400 in renderTooltipInternal() and +200 in ItemRender.renderGuiItemDecorations() - the latter being things like the damage bar.

Boilerplate:

If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one.

If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install

Large files should be posted to a file sharing site like https://gist.github.com  You should also read the support forum sticky post.

Link to comment
Share on other sites

49 minutes ago, warjort said:

GUI screens are actually 3d in minecraft. The z direction is the distance out of the screen.

Look at how the class Screen handles tool tips by both translating the z co-ord of the PoseStack and changing ItemRenderer.blitOffset which controls the same thing for the drawing items.

Note how it uses +400 in renderTooltipInternal() and +200 in ItemRender.renderGuiItemDecorations() - the latter being things like the damage bar.

How exactly can I move the tooltip closer? Nothing changes when I move the PoseStack before the tooltip renders until the tooltip goes out of the camera...

pose.pushPose();

pose.translate(mouseX, mouseY, 500F);

inventory.renderTooltip(pose, lines, Optional.empty(), 0, 0);

pose.popPose();

Link to comment
Share on other sites

You need to show what you are actually doing.

I already guessed (wrongly) once on this thread that you were doing custom rendering.

I shouldn't have to guess.

From that small snippet of code out of context it looks like you are calling Screen's renderTooltip() which should do it for you.

There is something else you are doing wrong.

Edited by warjort

Boilerplate:

If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one.

If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install

Large files should be posted to a file sharing site like https://gist.github.com  You should also read the support forum sticky post.

Link to comment
Share on other sites

44 minutes ago, warjort said:

You need to show what you are actually doing.

I already guessed (wrongly) once on this thread that you were doing custom rendering.

I shouldn't have to guess.

From that small snippet of code out of context it looks like you are calling Screen's renderTooltip() which should do it for you.

There is something else you are doing wrong.

@SubscribeEvent
    public static void onPlayerInventory(@NotNull ScreenEvent.InitScreenEvent.Post event) {
        if (event.getScreen() instanceof InventoryScreen inventory && event.getScreen().getMinecraft().player != null) {
            //ACTIONS
            Button.OnPress attributes = button -> event.getScreen().getMinecraft().setScreen(new ObscureBookScreen(
                    new ObscureBookMenu(1, event.getScreen().getMinecraft().player.getInventory(), new FriendlyByteBuf(Unpooled.buffer()).writeBlockPos(new BlockPos(0,0,0)) ),
                    event.getScreen().getMinecraft().player.getInventory(),
                    new TextComponent("attributes")));
            Button.OnPress factions = button -> event.getScreen().getMinecraft().setScreen(new ObscureBookScreen(
                    new ObscureBookMenu(1, event.getScreen().getMinecraft().player.getInventory(), new FriendlyByteBuf(Unpooled.buffer()).writeBlockPos(new BlockPos(0,0,0)) ),
                    event.getScreen().getMinecraft().player.getInventory(),
                    new TextComponent("factions")));
            //TOOLTIPS
            Button.OnTooltip tooltipStats = new Button.OnTooltip() {
                public void onTooltip(Button button, PoseStack pose, int mouseX, int mouseY) {
                    List<Component> lines = new ArrayList<>();
                    for (String line : getStats().split(">"))
                        lines.add(FontHelper.component(line));
                    pose.pushPose();
                    assert Minecraft.getInstance().screen != null;
                    final float scale = Math.max(1, (float) Minecraft.getInstance().options.guiScale -
                            (ObscureAPIConfig.Client.reduceTooltips.get() ? 1F : 0)) / (float) Minecraft.getInstance().options.guiScale;
                    pose.scale(scale, scale, 1F);
                    pose.translate(mouseX, mouseY, 500F);
                    inventory.renderTooltip(pose, lines, Optional.empty(), 0, 0);
                    pose.popPose();
                }
                public void narrateTooltip(Consumer<Component> text) {
                    text.accept(new TextComponent(""));
                }
            };
            Button.OnTooltip tooltipFractions = new Button.OnTooltip() {
                public void onTooltip(@NotNull Button button, @NotNull PoseStack pose, int mouseX, int mouseY) {
                    List<Component> lines = new ArrayList<>();
                    for (String line : getFactions().split(">"))
                        lines.add(FontHelper.component(line));
                    pose.pushPose();
                    assert Minecraft.getInstance().screen != null;
                    final float scale = Math.max(1, (float) Minecraft.getInstance().options.guiScale -
                            (ObscureAPIConfig.Client.reduceTooltips.get() ? 1F : 0)) / (float) Minecraft.getInstance().options.guiScale;
                    pose.translate(mouseX, mouseY, 0F);
                    pose.scale(scale, scale, 1F);
                    inventory.renderTooltip(pose, lines, Optional.empty(), 0, 0);
                    pose.popPose();
                }
                public void narrateTooltip(Consumer<Component> text) {
                    text.accept(new TextComponent(""));
                }
            };
            final int width = 20;
            final int height = 20;
            event.addListener(new ImageButton(0, 0, width, height,0, 0, 20, BUTTONS_LOCATION, 200, 200, attributes, tooltipStats, new TextComponent("")) {
                @Override
                public void renderButton(PoseStack pose, int mouseX, int mouseY, float partialTicks) {
                    assert Minecraft.getInstance().screen != null;
                    final int posX = Math.max(16, Math.min(Minecraft.getInstance().screen.width - 16,
                            (inventory.getGuiLeft() - width / 2) + 162 + ObscureAPIConfig.Client.buttonsOffsetX.get()));
                    final int posY = Math.max(16, Math.min(Minecraft.getInstance().screen.width - 16,
                            (Minecraft.getInstance().screen.height / 2 - height / 2) - 96 + ObscureAPIConfig.Client.buttonsOffsetY.get()));
                    this.x = posX;
                    this.y = posY;
                    super.renderButton(pose, mouseX, mouseY, partialTicks);
                }
            });
            event.addListener(new ImageButton(0, 0, width, height,20, 0, 20, BUTTONS_LOCATION, 200, 200, factions, tooltipFractions, new TextComponent("")) {
                @Override
                public void renderButton(PoseStack pose, int mouseX, int mouseY, float partialTicks) {
                    assert Minecraft.getInstance().screen != null;
                    final int posX = Math.max(16, Math.min(Minecraft.getInstance().screen.width - 16,
                            (inventory.getGuiLeft() - width / 2) + 140 + ObscureAPIConfig.Client.buttonsOffsetX.get()));
                    final int posY = Math.max(16, Math.min(Minecraft.getInstance().screen.width - 16,
                            (Minecraft.getInstance().screen.height / 2 - height / 2) - 96 + ObscureAPIConfig.Client.buttonsOffsetY.get()));
                    this.x = posX;
                    this.y = posY;
                    super.renderButton(pose, mouseX, mouseY, partialTicks);
                }
            });
        }
    }

 

Link to comment
Share on other sites

This looks like a flaw in the way AbstractContainerScreen works.

Or at least it didn't anticipate you doing this.

 

I wrote this simple test which reproduces your problem.

@Mod.EventBusSubscriber(modid = MODID, value = Dist.CLIENT)
public class TestScreenToolTip {

    static List<Component> LIST = Collections.nCopies(10, Component.literal("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));

    @SubscribeEvent
    public static void testInit(ScreenEvent.Init.Post event) {
        if (event.getScreen() instanceof InventoryScreen screen) {
            event.addListener(new MyButton(screen));
        }
    }

    static class MyButton extends Button {
        public MyButton(Screen screen) {
            super(screen.width / 2 - 100, 140, 200, 20, CommonComponents.GUI_CANCEL, (button) -> {
                // nothing
            }, (button, poseStack, mouseX, mouseY) -> {
                screen.renderTooltip(poseStack, LIST, Optional.empty(), mouseX, mouseY);
            });
        }
    }
}

 

If you look at AbstractContainerScreen.render() the widgets get rendered before everything else, the super.render() call.

Then when it comes to drawing the item decoration's damage bar (which is after) it does RenderSystem.disableDepthTest() so it ignores the z co-ord and just draws it.

 

Normally if you were the writing the screen yourself, you could just change the render method to draw the buttons last or at least after the slots.

But you don't control the order of things for this screen.

 

I can confirm that fixes the problem by adding an additional event listener.

    @SubscribeEvent
    public static void testRender(ScreenEvent.Render.Post event) {
        if (event.getScreen() instanceof InventoryScreen screen) {
            screen.renderables.forEach(widget -> {
                if (widget instanceof MyButton) {
                    widget.render(event.getPoseStack(), event.getMouseX(), event.getMouseY(), event.getPartialTick());
                }
            });
        }
    }

The issue with the above fix is I am drawing my button twice. Once normally and then again at the end of the screen rendering.

 

There must be a better solution to this problem? 🙂 

Boilerplate:

If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one.

If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install

Large files should be posted to a file sharing site like https://gist.github.com  You should also read the support forum sticky post.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.