Files
NeoForge/patches/net/minecraft/client/gui/GuiGraphicsExtractor.java.patch
T
f6b195024f Port to 26.2-pre-2
Co-Authored-By: Dennis C <[email protected]>
Co-Authored-By: RogueLogix <[email protected]>
2026-06-15 12:29:10 +01:00

168 lines
8.7 KiB
Diff

--- a/net/minecraft/client/gui/GuiGraphicsExtractor.java
+++ b/net/minecraft/client/gui/GuiGraphicsExtractor.java
@@ -102,6 +_,7 @@
private @Nullable Style hoveredTextStyle;
private @Nullable Style clickableTextStyle;
private @Nullable Renderable preeditOverlay;
+ private ItemStack tooltipStack = ItemStack.EMPTY;
private GuiGraphicsExtractor(Minecraft minecraft, Matrix3x2fStack pose, GuiRenderState guiRenderState, int mouseX, int mouseY) {
this.minecraft = minecraft;
@@ -877,6 +_,7 @@
this.itemCooldown(itemStack, x, y);
this.itemCount(font, itemStack, x, y, countText);
this.pose.popMatrix();
+ net.neoforged.neoforge.client.ItemDecoratorHandler.of(itemStack).render(this, font, itemStack, x, y);
}
}
@@ -1017,9 +_,21 @@
}
public void setTooltipForNextFrame(Font font, ItemStack itemStack, int xo, int yo) {
+ this.tooltipStack = itemStack;
this.setTooltipForNextFrame(
font, Screen.getTooltipFromItem(this.minecraft, itemStack), itemStack.getTooltipImage(), xo, yo, itemStack.get(DataComponents.TOOLTIP_STYLE)
);
+ this.tooltipStack = ItemStack.EMPTY;
+ }
+
+ public void setTooltipForNextFrame(Font font, List<Component> textComponents, Optional<TooltipComponent> tooltipComponent, ItemStack stack, int mouseX, int mouseY) {
+ setTooltipForNextFrame(font, textComponents, tooltipComponent, stack, mouseX, mouseY, null);
+ }
+
+ public void setTooltipForNextFrame(Font font, List<Component> textComponents, Optional<TooltipComponent> tooltipComponent, ItemStack stack, int mouseX, int mouseY, @Nullable Identifier backgroundTexture) {
+ this.tooltipStack = stack;
+ this.setTooltipForNextFrame(font, textComponents, tooltipComponent, mouseX, mouseY, backgroundTexture);
+ this.tooltipStack = ItemStack.EMPTY;
}
public void setTooltipForNextFrame(Font font, List<Component> texts, Optional<TooltipComponent> optionalImage, int xo, int yo) {
@@ -1027,11 +_,7 @@
}
public void setTooltipForNextFrame(Font font, List<Component> texts, Optional<TooltipComponent> optionalImage, int xo, int yo, @Nullable Identifier style) {
- List<ClientTooltipComponent> components = texts.stream()
- .map(Component::getVisualOrderText)
- .map(ClientTooltipComponent::create)
- .collect(Util.toMutableList());
- optionalImage.ifPresent(image -> components.add(components.isEmpty() ? 0 : 1, ClientTooltipComponent.create(image)));
+ List<ClientTooltipComponent> components = net.neoforged.neoforge.client.ClientHooks.gatherTooltipComponents(this.tooltipStack, texts, optionalImage, xo, guiWidth(), guiHeight(), font);
this.setTooltipForNextFrameInternal(font, components, xo, yo, DefaultTooltipPositioner.INSTANCE, style, false);
}
@@ -1059,13 +_,14 @@
}
public void setComponentTooltipForNextFrame(Font font, List<Component> lines, int xo, int yo) {
- this.setComponentTooltipForNextFrame(font, lines, xo, yo, null);
+ this.setComponentTooltipForNextFrame(font, lines, xo, yo, (Identifier) null);
}
public void setComponentTooltipForNextFrame(Font font, List<Component> lines, int xo, int yo, @Nullable Identifier style) {
+ List<ClientTooltipComponent> components = net.neoforged.neoforge.client.ClientHooks.gatherTooltipComponents(this.tooltipStack, lines, xo, guiWidth(), guiHeight(), font);
this.setTooltipForNextFrameInternal(
font,
- lines.stream().map(Component::getVisualOrderText).map(ClientTooltipComponent::create).toList(),
+ components,
xo,
yo,
DefaultTooltipPositioner.INSTANCE,
@@ -1074,6 +_,28 @@
);
}
+ public void setComponentTooltipForNextFrame(Font font, List<? extends FormattedText> tooltips, int mouseX, int mouseY, ItemStack stack) {
+ setComponentTooltipForNextFrame(font, tooltips, mouseX, mouseY, stack, null);
+ }
+
+ public void setComponentTooltipForNextFrame(Font font, List<? extends FormattedText> tooltips, int mouseX, int mouseY, ItemStack stack, @Nullable Identifier backgroundTexture) {
+ this.tooltipStack = stack;
+ List<ClientTooltipComponent> components = net.neoforged.neoforge.client.ClientHooks.gatherTooltipComponents(stack, tooltips, mouseX, guiWidth(), guiHeight(), font);
+ this.setTooltipForNextFrameInternal(font, components, mouseX, mouseY, DefaultTooltipPositioner.INSTANCE, backgroundTexture, false);
+ this.tooltipStack = ItemStack.EMPTY;
+ }
+
+ public void setComponentTooltipFromElementsForNextFrame(Font font, List<com.mojang.datafixers.util.Either<FormattedText, TooltipComponent>> elements, int mouseX, int mouseY, ItemStack stack) {
+ setComponentTooltipFromElementsForNextFrame(font, elements, mouseX, mouseY, stack, null);
+ }
+
+ public void setComponentTooltipFromElementsForNextFrame(Font font, List<com.mojang.datafixers.util.Either<FormattedText, TooltipComponent>> elements, int mouseX, int mouseY, ItemStack stack, @Nullable Identifier backgroundTexture) {
+ this.tooltipStack = stack;
+ List<ClientTooltipComponent> components = net.neoforged.neoforge.client.ClientHooks.gatherTooltipComponentsFromElements(stack, elements, mouseX, guiWidth(), guiHeight(), font);
+ this.setTooltipForNextFrameInternal(font, components, mouseX, mouseY, DefaultTooltipPositioner.INSTANCE, backgroundTexture, false);
+ this.tooltipStack = ItemStack.EMPTY;
+ }
+
public void setTooltipForNextFrame(Font font, List<? extends FormattedCharSequence> lines, int xo, int yo) {
this.setTooltipForNextFrame(font, lines, xo, yo, null);
}
@@ -1097,12 +_,24 @@
) {
if (!lines.isEmpty()) {
if (this.deferredTooltip == null || replaceExisting) {
- this.deferredTooltip = () -> this.tooltip(font, lines, xo, yo, positioner, style);
+ ItemStack capturedTooltipStack = this.tooltipStack;
+ this.deferredTooltip = () -> this.tooltip(font, lines, xo, yo, positioner, style, capturedTooltipStack);
}
}
}
public void tooltip(Font font, List<ClientTooltipComponent> lines, int xo, int yo, ClientTooltipPositioner positioner, @Nullable Identifier style) {
+ this.tooltip(font, lines, xo, yo, positioner, style, ItemStack.EMPTY);
+ }
+
+ public void tooltip(Font font, List<ClientTooltipComponent> lines, int xo, int yo, ClientTooltipPositioner positioner, @Nullable Identifier style, ItemStack tooltipStack) {
+ var preEvent = net.neoforged.neoforge.client.ClientHooks.onRenderTooltipPre(tooltipStack, this, xo, yo, guiWidth(), guiHeight(), lines, font, positioner);
+ if (preEvent.isCanceled()) return;
+
+ font = preEvent.getFont();
+ xo = preEvent.getX();
+ yo = preEvent.getY();
+
int textWidth = 0;
int tempHeight = lines.size() == 1 ? -2 : 0;
@@ -1121,7 +_,8 @@
int x = positionedTooltip.x();
int y = positionedTooltip.y();
this.pose.pushMatrix();
- TooltipRenderUtil.extractTooltipBackground(this, x, y, w, h, style);
+ var textureEvent = net.neoforged.neoforge.client.ClientHooks.onRenderTooltipTexture(tooltipStack, this, x, y, preEvent.getFont(), lines, style);
+ TooltipRenderUtil.extractTooltipBackground(this, x, y, textWidth, tempHeight, textureEvent.getTexture());
int localY = y;
for (int i = 0; i < lines.size(); i++) {
@@ -1183,6 +_,31 @@
default:
}
}
+ }
+
+ /**
+ * Neo: Submit a custom {@link net.minecraft.client.renderer.state.gui.GuiElementRenderState} for rendering
+ */
+ public void submitGuiElementRenderState(net.minecraft.client.renderer.state.gui.GuiElementRenderState renderState) {
+ this.guiRenderState.addGuiElement(renderState);
+ }
+
+ /**
+ * Neo: Submit a custom {@link net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState} for rendering
+ *
+ * @see net.neoforged.neoforge.client.event.RegisterPictureInPictureRenderersEvent
+ */
+ public void submitPictureInPictureRenderState(net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState renderState) {
+ this.guiRenderState.addPicturesInPictureState(renderState);
+ }
+
+ /**
+ * Neo: Returns the top-most scissor rectangle, if present, for use with custom {@link net.minecraft.client.renderer.state.gui.GuiElementRenderState}s
+ * and {@link net.minecraft.client.renderer.state.gui.pip.PictureInPictureRenderState}s
+ */
+ @Nullable
+ public ScreenRectangle peekScissorStack() {
+ return this.scissorStack.peek();
}
public TextureAtlasSprite getSprite(SpriteId sprite) {