aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java3
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java76
-rw-r--r--api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java9
-rw-r--r--fabric/src/main/resources/roughlyenoughitems.accessWidener3
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java11
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java15
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java27
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/QueuedTooltip.java79
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java15
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;
}
}
}