diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-06-20 23:20:05 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-06-20 23:20:05 +0800 |
| commit | 2cc2cfa70062efac58335d62ad8e47105c15fdd7 (patch) | |
| tree | b60bbd87e913080c95f82a0b2d38a8da2a89c332 | |
| parent | 06c695df2c1ae92ddd71dfa23491d7554387156c (diff) | |
| download | RoughlyEnoughItems-2cc2cfa70062efac58335d62ad8e47105c15fdd7.tar.gz RoughlyEnoughItems-2cc2cfa70062efac58335d62ad8e47105c15fdd7.tar.bz2 RoughlyEnoughItems-2cc2cfa70062efac58335d62ad8e47105c15fdd7.zip | |
Properly implement tooltip rendering for bundles
12 files changed, 188 insertions, 62 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java b/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java index b91ee13fe..4df94598e 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java @@ -24,6 +24,7 @@ package me.shedaniel.rei.api.client; import me.shedaniel.rei.api.client.config.ConfigManager; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.FormattingUtils; @@ -142,6 +143,8 @@ public interface ClientHelper { return components; } + void appendModIdToTooltips(Tooltip components, String modId); + /** * Gets the mod from an identifier * diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java index 16d329002..1971bb7d1 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java @@ -26,18 +26,31 @@ package me.shedaniel.rei.api.client.gui.widgets; import dev.architectury.utils.EnvExecutor; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.ClientInternals; import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.Collection; import java.util.List; +@Environment(EnvType.CLIENT) public interface Tooltip { + static Tooltip.Entry entry(Component text) { + return ClientInternals.createTooltipEntry(text); + } + + static Tooltip.Entry entry(ClientTooltipComponent text) { + return ClientInternals.createTooltipEntry(text); + } + static Tooltip create(@Nullable Point point, Collection<Component> texts) { - return ClientInternals.createTooltip(point, texts); + return from(point, CollectionUtils.map(texts, Tooltip::entry)); } static Tooltip create(@Nullable Point point, Component... texts) { @@ -52,13 +65,74 @@ public interface Tooltip { return create(Arrays.asList(texts)); } + static Tooltip from(@Nullable Point point, Collection<Entry> entries) { + return ClientInternals.createTooltip(point, entries); + } + + static Tooltip from(@Nullable Point point, Entry... entries) { + return from(point, Arrays.asList(entries)); + } + + static Tooltip from(Collection<Entry> entries) { + return from(null, entries); + } + + static Tooltip from(Entry... entries) { + return from(Arrays.asList(entries)); + } + int getX(); int getY(); + @Deprecated + @ApiStatus.ScheduledForRemoval List<Component> getText(); + List<Entry> entries(); + + Tooltip add(ClientTooltipComponent component); + + Tooltip add(Component text); + + default Tooltip addAll(ClientTooltipComponent... components) { + for (ClientTooltipComponent component : components) { + add(component); + } + return this; + } + + default Tooltip addAll(Component... text) { + for (Component component : text) { + add(component); + } + return this; + } + + default Tooltip addAllComponents(Iterable<ClientTooltipComponent> text) { + for (ClientTooltipComponent component : text) { + add(component); + } + return this; + } + + default Tooltip addAllTexts(Iterable<Component> text) { + for (Component component : text) { + add(component); + } + return this; + } + default void queue() { EnvExecutor.runInEnv(EnvType.CLIENT, () -> () -> REIRuntime.getInstance().queueTooltip(this)); } + + @ApiStatus.NonExtendable + interface Entry { + boolean isText(); + + Component getAsText(); + + ClientTooltipComponent getAsComponent(); + } } diff --git a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java b/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java index e7d550c2a..5df95263b 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java @@ -60,7 +60,8 @@ public final class ClientInternals { private static BiFunction<Supplier<FavoriteEntry>, Supplier<CompoundTag>, FavoriteEntry> delegateFavoriteEntry = (supplier, toJson) -> throwNotSetup(); private static Function<CompoundTag, FavoriteEntry> favoriteEntryFromJson = (object) -> throwNotSetup(); private static Function<Boolean, ClickArea.Result> clickAreaHandlerResult = (result) -> throwNotSetup(); - private static BiFunction<@Nullable Point, Collection<Component>, Tooltip> tooltipProvider = (point, texts) -> throwNotSetup(); + private static BiFunction<@Nullable Point, Collection<Tooltip.Entry>, Tooltip> tooltipProvider = (point, texts) -> throwNotSetup(); + private static Function<Object, Tooltip.Entry> tooltipEntryProvider = (component) -> throwNotSetup(); private static Supplier<List<String>> jeiCompatMods = ClientInternals::throwNotSetup; private static Supplier<Object> builtinClientPlugin = ClientInternals::throwNotSetup; @@ -113,10 +114,14 @@ public final class ClientInternals { return clickAreaHandlerResult.apply(applicable); } - public static Tooltip createTooltip(@Nullable Point point, Collection<Component> texts) { + public static Tooltip createTooltip(@Nullable Point point, Collection<Tooltip.Entry> texts) { return tooltipProvider.apply(point, texts); } + public static Tooltip.Entry createTooltipEntry(Object component) { + return tooltipEntryProvider.apply(component); + } + public static FavoriteEntry delegateFavoriteEntry(Supplier<FavoriteEntry> supplier, Supplier<CompoundTag> toJoin) { return delegateFavoriteEntry.apply(supplier, toJoin); } diff --git a/fabric/src/main/resources/roughlyenoughitems.accessWidener b/fabric/src/main/resources/roughlyenoughitems.accessWidener index 74966e6f4..c7b8fcc6f 100644 --- a/fabric/src/main/resources/roughlyenoughitems.accessWidener +++ b/fabric/src/main/resources/roughlyenoughitems.accessWidener @@ -36,4 +36,5 @@ mutable field net/minecraft/client/gui/screens/inventory/AbstractContaine extendable method net/minecraft/client/gui/screens/Screen init (Lnet/minecraft/client/Minecraft;II)V accessible method net/minecraft/client/gui/screens/Screen addRenderableWidget (Lnet/minecraft/client/gui/components/events/GuiEventListener;)Lnet/minecraft/client/gui/components/events/GuiEventListener; accessible method net/minecraft/client/gui/screens/Screen addRenderableOnly (Lnet/minecraft/client/gui/components/Widget;)Lnet/minecraft/client/gui/components/Widget; -accessible method net/minecraft/client/gui/screens/Screen addWidget (Lnet/minecraft/client/gui/components/events/GuiEventListener;)Lnet/minecraft/client/gui/components/events/GuiEventListener;
\ No newline at end of file +accessible method net/minecraft/client/gui/screens/Screen addWidget (Lnet/minecraft/client/gui/components/events/GuiEventListener;)Lnet/minecraft/client/gui/components/events/GuiEventListener; +accessible method net/minecraft/client/gui/screens/Screen renderTooltipInternal (Lcom/mojang/blaze3d/vertex/PoseStack;Ljava/util/List;II)V
\ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java index 1985e68b5..dfe241863 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java @@ -35,8 +35,6 @@ import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; -import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; -import me.shedaniel.rei.api.client.gui.Renderer; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; @@ -78,6 +76,7 @@ import net.minecraft.client.gui.components.ImageButton; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.inventory.CraftingScreen; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.gui.screens.recipebook.GhostRecipe; import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; import net.minecraft.client.resources.language.I18n; @@ -95,7 +94,10 @@ import org.apache.commons.lang3.mutable.MutableLong; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.Collection; +import java.util.ConcurrentModificationException; +import java.util.List; +import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -125,7 +127,8 @@ public class RoughlyEnoughItemsCoreClient { ResourceLocation id = new ResourceLocation(type); return Objects.requireNonNull(Objects.requireNonNull(FavoriteEntryType.registry().get(id)).read(object)); }, "favoriteEntryFromJson"); - ClientInternals.attachInstance((BiFunction<@Nullable Point, Collection<Component>, Tooltip>) QueuedTooltip::create, "tooltipProvider"); + ClientInternals.attachInstance((BiFunction<@Nullable Point, Collection<Tooltip.Entry>, Tooltip>) QueuedTooltip::impl, "tooltipProvider"); + ClientInternals.attachInstance((Function<Object, Tooltip.Entry>) QueuedTooltip.TooltipEntryImpl::new, "tooltipEntryProvider"); ClientInternals.attachInstance((Function<@Nullable Boolean, ClickArea.Result>) successful -> new ClickArea.Result() { private List<CategoryIdentifier<?>> categories = Lists.newArrayList(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java index cd488e436..cc834728e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java @@ -36,6 +36,7 @@ import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.DisplayScreenType; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.category.CategoryIdentifier; @@ -43,6 +44,7 @@ import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.EntryStacks; +import me.shedaniel.rei.api.common.util.FormattingUtils; import me.shedaniel.rei.impl.ClientInternals; import me.shedaniel.rei.impl.client.gui.screen.CompositeDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; @@ -130,6 +132,19 @@ public class ClientHelperImpl implements ClientHelper { } @Override + public void appendModIdToTooltips(Tooltip components, String modId) { + final String modName = ClientHelper.getInstance().getModFromModId(modId); + boolean alreadyHasMod = false; + for (Tooltip.Entry s : components.entries()) + if (s.isText() && FormattingUtils.stripFormatting(s.getAsText().getString()).equalsIgnoreCase(modName)) { + alreadyHasMod = true; + break; + } + if (!alreadyHasMod) + components.add(ClientHelper.getInstance().getFormattedModFromModId(modId)); + } + + @Override public String getModFromModId(String modId) { if (modId == null) return ""; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java index 7a4017e45..fabe48aed 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java @@ -75,6 +75,8 @@ import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTextTooltip; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.client.renderer.entity.ItemRenderer; @@ -97,6 +99,7 @@ import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.Stream; @ApiStatus.Internal public class ScreenOverlayImpl extends ScreenOverlay { @@ -545,26 +548,26 @@ public class ScreenOverlayImpl extends ScreenOverlay { } public void renderTooltip(PoseStack matrices, Tooltip tooltip) { - renderTooltip(matrices, tooltip.getText().stream() - .flatMap(component -> Minecraft.getInstance().font.getSplitter().splitLines(component, 100000, Style.EMPTY).stream()) + renderTooltipInner(matrices, tooltip.entries().stream() + .flatMap(component -> { + if (component.isText()) { + return Minecraft.getInstance().font.getSplitter().splitLines(component.getAsText(), 100000, Style.EMPTY).stream() + .map(Language.getInstance()::getVisualOrder) + .map(ClientTooltipComponent::create); + } else { + return Stream.of(component.getAsComponent()); + } + }) .collect(Collectors.toList()), tooltip.getX(), tooltip.getY()); } - public void renderTooltip(PoseStack matrices, List<FormattedText> lines, int mouseX, int mouseY) { - if (lines.isEmpty()) { - return; - } - List<FormattedCharSequence> orderedTexts = CollectionUtils.map(lines, Language.getInstance()::getVisualOrder); - renderTooltipInner(matrices, orderedTexts, mouseX, mouseY); - } - - public void renderTooltipInner(PoseStack matrices, List<FormattedCharSequence> lines, int mouseX, int mouseY) { + public void renderTooltipInner(PoseStack matrices, List<ClientTooltipComponent> lines, int mouseX, int mouseY) { if (lines.isEmpty()) { return; } matrices.pushPose(); matrices.translate(0, 0, 500); - minecraft.screen.renderTooltip(matrices, lines, mouseX, mouseY); + minecraft.screen.renderTooltipInternal(matrices, lines, mouseX, mouseY); matrices.popPose(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java index 781db8d0c..659862c02 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java @@ -312,10 +312,10 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { if (interactableFavorites && ConfigObject.getInstance().doDisplayFavoritesTooltip() && !ConfigObject.getInstance().getFavoriteKeyCode().isUnknown()) { String name = ConfigObject.getInstance().getFavoriteKeyCode().getLocalizedName().getString(); if (reverseFavoritesAction()) - tooltip.getText().addAll(Stream.of(I18n.get("text.rei.remove_favorites_tooltip", name).split("\n")) + tooltip.addAllTexts(Stream.of(I18n.get("text.rei.remove_favorites_tooltip", name).split("\n")) .map(TextComponent::new).collect(Collectors.toList())); else - tooltip.getText().addAll(Stream.of(I18n.get("text.rei.favorites_tooltip", name).split("\n")) + tooltip.addAllTexts(Stream.of(I18n.get("text.rei.favorites_tooltip", name).split("\n")) .map(TextComponent::new).collect(Collectors.toList())); } tooltip.queue(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java index fe195531e..63ca1094e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java @@ -1050,8 +1050,8 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt if (!scrollBounds.contains(point)) return null; Tooltip tooltip = super.getCurrentTooltip(point); if (tooltip != null) { - tooltip.getText().add(ImmutableTextComponent.EMPTY); - tooltip.getText().add(new TranslatableComponent("tooltip.rei.drag_to_add_favorites")); + tooltip.add(ImmutableTextComponent.EMPTY); + tooltip.add(new TranslatableComponent("tooltip.rei.drag_to_add_favorites")); } return tooltip; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/QueuedTooltip.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/QueuedTooltip.java index 6938b16c4..96dff555e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/QueuedTooltip.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/QueuedTooltip.java @@ -25,15 +25,16 @@ package me.shedaniel.rei.impl.client.gui.widget; import com.google.common.collect.Lists; -import dev.architectury.platform.Platform; -import dev.architectury.utils.Env; import me.shedaniel.math.Point; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.common.util.CollectionUtils; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.ApiStatus; -import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -41,66 +42,74 @@ import java.util.List; * @see Tooltip */ @ApiStatus.Internal +@Environment(EnvType.CLIENT) public class QueuedTooltip implements Tooltip { - private Point location; - private List<Component> text; + private List<Tooltip.Entry> components; - private QueuedTooltip(Point location, Collection<Component> text) { + private QueuedTooltip(Point location, Collection<Tooltip.Entry> components) { this.location = location; if (this.location == null) { - if (Platform.getEnvironment() == Env.CLIENT) { - setLocationToMouse(); - } + this.location = PointHelper.ofMouse(); } - this.text = Lists.newArrayList(text); - } - - private void setLocationToMouse() { - this.location = PointHelper.ofMouse(); + this.components = Lists.newArrayList(components); } - public static QueuedTooltip create(Point location, List<Component> text) { + public static QueuedTooltip impl(Point location, Collection<Tooltip.Entry> text) { return new QueuedTooltip(location, text); } - public static QueuedTooltip create(Point location, Collection<Component> text) { - return new QueuedTooltip(location, text); - } - - public static QueuedTooltip create(Point location, Component... text) { - return QueuedTooltip.create(location, Arrays.asList(text)); - } - - public static QueuedTooltip create(List<Component> text) { - return QueuedTooltip.create(null, text); + @Override + public int getX() { + return location.x; } - public static QueuedTooltip create(Collection<Component> text) { - return QueuedTooltip.create(null, text); + @Override + public int getY() { + return location.y; } - public static QueuedTooltip create(Component... text) { - return QueuedTooltip.create(null, text); + @Override + public List<Component> getText() { + return CollectionUtils.filterAndMap(components, Tooltip.Entry::isText, Tooltip.Entry::getAsText); } @Override - public int getX() { - return location.x; + public List<Entry> entries() { + return components; } @Override - public int getY() { - return location.y; + public Tooltip add(Component text) { + components.add(new TooltipEntryImpl(text)); + return this; } @Override - public List<Component> getText() { - return text; + public Tooltip add(ClientTooltipComponent component) { + components.add(new TooltipEntryImpl(component)); + return this; } @Override public void queue() { Tooltip.super.queue(); } + + public record TooltipEntryImpl(Object obj) implements Tooltip.Entry { + @Override + public Component getAsText() { + return (Component) obj; + } + + @Override + public boolean isText() { + return obj instanceof Component; + } + + @Override + public ClientTooltipComponent getAsComponent() { + return (ClientTooltipComponent) obj; + } + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java index 20194e7a7..995dbfe5a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java @@ -158,13 +158,13 @@ public abstract class AbstractEntryStack<A> extends AbstractRenderer implements public Tooltip getTooltip(Point mouse, boolean appendModName) { Mutable<Tooltip> tooltip = new MutableObject<>(getRenderer().<A>cast().getTooltip(this, mouse)); if (tooltip.getValue() == null) return null; - tooltip.getValue().getText().addAll(get(Settings.TOOLTIP_APPEND_EXTRA).apply(this)); + tooltip.getValue().addAllTexts(get(Settings.TOOLTIP_APPEND_EXTRA).apply(this)); tooltip.setValue(get(Settings.TOOLTIP_PROCESSOR).apply(this, tooltip.getValue())); if (tooltip.getValue() == null) return null; if (appendModName) { ResourceLocation location = getIdentifier(); if (location != null) { - ClientHelper.getInstance().appendModIdToTooltips(tooltip.getValue().getText(), location.getNamespace()); + ClientHelper.getInstance().appendModIdToTooltips(tooltip.getValue(), location.getNamespace()); } } return tooltip.getValue(); diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java index ba5e0c08f..95dc8b3e4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java @@ -51,6 +51,7 @@ import net.fabricmc.api.Environment; import net.minecraft.CrashReport; import net.minecraft.CrashReportCategory; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -63,6 +64,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagCollection; import net.minecraft.tags.TagContainer; +import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -71,6 +73,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Optional; public class ItemEntryDefinition implements EntryDefinition<ItemStack>, EntrySerializer<ItemStack> { @Environment(EnvType.CLIENT) @@ -326,7 +329,17 @@ public class ItemEntryDefinition implements EntryDefinition<ItemStack>, EntrySer public Tooltip getTooltip(EntryStack<ItemStack> entry, Point mouse) { if (entry.isEmpty()) return null; - return Tooltip.create(tryGetItemStackToolTip(entry, entry.getValue(), true)); + Tooltip tooltip = Tooltip.create(); + Optional<TooltipComponent> component = entry.getValue().getTooltipImage(); + List<Component> components = tryGetItemStackToolTip(entry, entry.getValue(), true); + if (!components.isEmpty()) { + tooltip.add(components.get(0)); + } + component.ifPresent(tooltipComponent -> tooltip.add(ClientTooltipComponent.create(tooltipComponent))); + for (int i = 1; i < components.size(); i++) { + tooltip.add(components.get(i)); + } + return tooltip; } } } |
