mirror of
https://github.com/neoforged/NeoForge.git
synced 2026-10-12 02:19:42 +00:00
Co-Authored-By: Dennis C <[email protected]> Co-Authored-By: RogueLogix <[email protected]>
168 lines
8.7 KiB
Diff
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) {
|