Jump to content

Recommended Posts

Posted

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.

Posted
  On 11/4/2022 at 7:09 PM, 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.

Expand  

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();

Posted (edited)

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.

Posted
  On 11/4/2022 at 8:34 PM, 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.

Expand  
@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);
                }
            });
        }
    }

 

Posted

The only unusual thing I'll do is dynamically update the contents and position of the tooltip, as the displayed information and button position may change while viewing it.

Posted

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.

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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Make a test with another Launcher like the Curseforge Launcher, MultiMC or AT Launcher
    • can anyone help me i am opening forge and add modpacks and then it says unable to update native luancher and i redownlaod java and the luancher it self?
    • The problem occurs also in 1.20.1 Forge, but with an "Error executing task on client" instead. I have "Sinytra Connector" installed. On 1.21.5 Fabric, there is no problem. When this happens, the chat message before the death screen appears gets sent, with an extra dash added.
    • Well, as usual, it was user error. Naming mismatch in sounds.json.  Please delete this post if you find it necessary. 
    • Hello Forge community.  I'm running into an issue with a mod I'm working on.  To preface, I can call /playsound modId:name music @a and I can hear the sound I registered being played in game. Great!  However, I cannot get it to trigger via my mod code.    Registration: public static final RegistryObject<SoundEvent> A_WORLD_OF_MADNESS = SOUND_EVENTS.register("a_world_of_madness", () -> new SoundEvent(new ResourceLocation("tetheredsouls", "a_world_of_madness")));   Playback: Minecraft mc = Minecraft.getInstance(); if (!(mc.player instanceof LocalPlayer) || mc.level == null) return; LocalPlayer player = (LocalPlayer) mc.player; BlockPos pos = player.blockPosition(); SoundEvent track = ModSounds.A_WORLD_OF_MADNESS.get(); System.out.println(track); System.out.println(pos); System.out.println(player); // play exactly like the tutorial: client-only, at the player's position try { mc.level.playLocalSound( player.getX(), player.getY(), player.getZ(), track, SoundSource.MUSIC, // Or MASTER if needed 1f, 1f, false ); System.out.println("[DEBUG] playSound success: " + track.getLocation()); } catch (Exception e) { System.err.println("[ERROR] Failed to play sound: " + track.getLocation()); e.printStackTrace(); } Sounds.json:   { "theme_of_laura": { "category": "music", "sounds": [ { "name": "tetheredsouls:a_world_of_madness", "stream": true } ] } } Things I have tried: - multiple .ogg files. Short .ogg files (5 seconds, <100KB).  - default minecraft sounds imported from import net.minecraft.sounds.SoundEvents; These work given my code. No idea why these are different.  - playSound() method, as well as several others in past iterations that did not work   I would be forever grateful if somebody could point me in the right direction. I've looked at several mod github repositories and found extremely similar code to what I'm doing. I've also found several threads in this forum that did not solve my issue. I just cannot figure out what I'm doing differently, and why I'm able to queue sounds manually with playsound but the code won't play it (despite confirming the code is being run with the debug statements.)
  • Topics

×
×
  • Create New...

Important Information

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