aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2022-06-09 16:45:30 +0800
committershedaniel <daniel@shedaniel.me>2022-06-09 21:19:14 +0800
commit6fd895753bfe317233f68da38ba3460422674475 (patch)
tree0ffb23456509419206b571f9ae36527ed045604f
parenta8dd27ef4e946c879a2e3e5e163683a41896e78f (diff)
downloadRoughlyEnoughItems-6fd895753bfe317233f68da38ba3460422674475.tar.gz
RoughlyEnoughItems-6fd895753bfe317233f68da38ba3460422674475.tar.bz2
RoughlyEnoughItems-6fd895753bfe317233f68da38ba3460422674475.zip
Add accepted stacks to the tooltip
-rw-r--r--fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java5
-rw-r--r--forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplImpl.java1
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java104
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java46
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/QueuedTooltip.java4
-rwxr-xr-xruntime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json3
6 files changed, 147 insertions, 16 deletions
diff --git a/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java b/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java
index caf42161f..affa0859f 100644
--- a/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java
+++ b/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java
@@ -26,6 +26,7 @@ package me.shedaniel.rei.impl.client.gui.fabric;
import com.mojang.blaze3d.vertex.PoseStack;
import me.shedaniel.rei.api.client.gui.widgets.Tooltip;
import me.shedaniel.rei.impl.ClientInternals;
+import me.shedaniel.rei.impl.client.gui.widget.QueuedTooltip;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
@@ -48,7 +49,7 @@ public class ScreenOverlayImplImpl {
Stream<FormattedCharSequence> sequenceStream = texts.isEmpty() ? Stream.of(component.getAsText().getVisualOrderText())
: texts.stream().map(Language.getInstance()::getVisualOrder);
return sequenceStream.map(ClientTooltipComponent::create);
- } else if (!component.isTooltipComponent()) {
+ } else if (((QueuedTooltip.TooltipEntryImpl) component).isClientComponent()) {
return Stream.of(component.getAsComponent());
} else {
return Stream.empty();
@@ -59,6 +60,8 @@ public class ScreenOverlayImplImpl {
if (entry.isTooltipComponent()) {
TooltipComponent component = entry.getAsTooltipComponent();
+ if (component instanceof ClientTooltipComponent) break;
+
try {
ClientInternals.getClientTooltipComponent(lines, component);
} catch (Throwable exception) {
diff --git a/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplImpl.java b/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplImpl.java
index 6a50e8d71..393137151 100644
--- a/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplImpl.java
+++ b/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplImpl.java
@@ -31,6 +31,7 @@ import me.shedaniel.rei.api.common.util.CollectionUtils;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
import net.minecraft.network.chat.Component;
+import net.minecraft.world.inventory.tooltip.TooltipComponent;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.client.ForgeHooksClient;
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java
index cafdb44be..ff1fd37c2 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java
@@ -24,10 +24,14 @@
package me.shedaniel.rei.impl.client.gui.screen;
import com.google.common.collect.Lists;
+import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.blaze3d.vertex.Tesselator;
+import com.mojang.math.Matrix4f;
import dev.architectury.fluid.FluidStack;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.client.gui.screen.DisplayScreen;
import me.shedaniel.rei.api.client.gui.widgets.Slot;
+import me.shedaniel.rei.api.client.gui.widgets.Tooltip;
import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
import me.shedaniel.rei.api.client.registry.category.CategoryRegistry;
@@ -42,17 +46,29 @@ import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes;
import me.shedaniel.rei.api.common.util.CollectionUtils;
import me.shedaniel.rei.impl.client.ClientHelperImpl;
import me.shedaniel.rei.impl.client.gui.widget.EntryWidget;
+import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget;
import me.shedaniel.rei.impl.display.DisplaySpec;
+import net.minecraft.ChatFormatting;
+import net.minecraft.client.gui.Font;
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.tooltip.ClientTooltipComponent;
+import net.minecraft.client.renderer.MultiBufferSource;
+import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.chat.TextComponent;
+import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.tags.TagKey;
+import net.minecraft.util.Mth;
+import net.minecraft.world.inventory.tooltip.TooltipComponent;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.Nullable;
import java.util.*;
+import java.util.function.UnaryOperator;
import java.util.stream.Stream;
public abstract class AbstractDisplayViewingScreen extends Screen implements DisplayScreen {
@@ -183,6 +199,8 @@ public abstract class AbstractDisplayViewingScreen extends Screen implements Dis
protected void setupTags(List<Widget> widgets) {
outer:
for (EntryWidget widget : Widgets.<EntryWidget>walk(widgets, EntryWidget.class::isInstance)) {
+ if (widget.getNoticeMark() != EntryWidget.INPUT) continue;
+ addCyclingTooltip(widget);
widget.removeTagMatch = false;
if (widget.getEntries().size() <= 1) continue;
EntryType<?> type = null;
@@ -210,4 +228,90 @@ public abstract class AbstractDisplayViewingScreen extends Screen implements Dis
}
}
}
+
+ private static final int MAX_WIDTH = 200;
+
+ private void addCyclingTooltip(EntryWidget widget) {
+ class TooltipProcessor implements UnaryOperator<Tooltip>, TooltipComponent, ClientTooltipComponent {
+ @Override
+ public Tooltip apply(Tooltip tooltip) {
+ if (widget.getEntries().size() > 1) {
+ tooltip.add((ClientTooltipComponent) this);
+ }
+ return tooltip;
+ }
+
+ @Override
+ public int hashCode() {
+ return getClass().hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj instanceof TooltipProcessor;
+ }
+
+ @Override
+ public int getHeight() {
+ int entrySize = EntryListWidget.entrySize();
+ int w = Math.max(1, MAX_WIDTH / entrySize);
+ int height = Math.min(6, Mth.ceil(widget.getEntries().size() / (float) w)) * entrySize + 2;
+ height += 12;
+ if (widget.tagMatch != null) height += 12;
+ return height;
+ }
+
+ @Override
+ public int getWidth(Font font) {
+ int entrySize = EntryListWidget.entrySize();
+ int w = Math.max(1, MAX_WIDTH / entrySize);
+ int size = widget.getEntries().size();
+ int width = Math.min(size, w) * entrySize;
+ width = Math.max(width, font.width(new TranslatableComponent("text.rei.accepts")));
+ if (widget.tagMatch != null) width = Math.max(width, font.width(new TranslatableComponent("text.rei.tag_accept", widget.tagMatch.toString())));
+ return width;
+ }
+
+ @Override
+ public void renderImage(Font font, int x, int y, PoseStack poses, ItemRenderer renderer, int z) {
+ int entrySize = EntryListWidget.entrySize();
+ int w = Math.max(1, MAX_WIDTH / entrySize);
+ int i = 0;
+ poses.pushPose();
+ poses.translate(0, 0, z + 50);
+ for (EntryStack<?> entry : widget.getEntries()) {
+ int x1 = x + (i % w) * entrySize;
+ int y1 = y + 13 + (i / w) * entrySize;
+ i++;
+ if (i / w > 5) {
+ MultiBufferSource.BufferSource source = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder());
+ Component text = new TextComponent("+" + (widget.getEntries().size() - w * 6 + 1)).withStyle(ChatFormatting.GRAY);
+ font.drawInBatch(text, x1 + entrySize / 2 - font.width(text) / 2, y1 + entrySize / 2 - 1, -1, true, poses.last().pose(), source, false, 0, 15728880);
+ source.endBatch();
+ break;
+ } else {
+ entry.render(poses, new Rectangle(x1, y1, entrySize, entrySize), -1000, -1000, 0);
+ }
+ }
+ poses.popPose();
+ }
+
+ @Override
+ public void renderText(Font font, int x, int y, Matrix4f pose, MultiBufferSource.BufferSource buffers) {
+ font.drawInBatch(new TranslatableComponent("text.rei.accepts").withStyle(ChatFormatting.GRAY),
+ x, y + 2, -1, true, pose, buffers, false, 0, 15728880);
+
+ if (widget.tagMatch != null) {
+ int entrySize = EntryListWidget.entrySize();
+ int w = Math.max(1, MAX_WIDTH / entrySize);
+ font.drawInBatch(new TranslatableComponent("text.rei.tag_accept", widget.tagMatch.toString())
+ .withStyle(ChatFormatting.GRAY),
+ x, y + 16 + Math.min(6, Mth.ceil(widget.getEntries().size() / (float) w)) * entrySize,
+ -1, true, pose, buffers, false, 0, 15728880);
+ }
+ }
+ }
+
+ widget.tooltipProcessor(new TooltipProcessor());
+ }
}
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 209de8d69..4d343fce3 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
@@ -31,8 +31,6 @@ import me.shedaniel.clothconfig2.api.animator.NumberAnimator;
import me.shedaniel.clothconfig2.api.animator.ValueAnimator;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
-import me.shedaniel.math.impl.PointHelper;
-import me.shedaniel.rei.api.client.ClientHelper;
import me.shedaniel.rei.api.client.REIRuntime;
import me.shedaniel.rei.api.client.config.ConfigManager;
import me.shedaniel.rei.api.client.config.ConfigObject;
@@ -74,6 +72,7 @@ import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import java.util.*;
+import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -93,6 +92,8 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget {
protected boolean wasClicked = false;
private Rectangle bounds;
private List<EntryStack<?>> entryStacks;
+ @Nullable
+ private Set<UnaryOperator<Tooltip>> tooltipProcessors;
public ResourceLocation tagMatch;
public boolean removeTagMatch = true;
@@ -395,18 +396,6 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget {
protected void queueTooltip(PoseStack matrices, int mouseX, int mouseY, float delta) {
Tooltip tooltip = getCurrentTooltip(new Point(mouseX, mouseY));
if (tooltip != null) {
- if (interactableFavorites && ConfigObject.getInstance().doDisplayFavoritesTooltip() && !ConfigObject.getInstance().getFavoriteKeyCode().isUnknown()) {
- String name = ConfigObject.getInstance().getFavoriteKeyCode().getLocalizedName().getString();
- if (reverseFavoritesAction())
- tooltip.addAllTexts(Stream.of(I18n.get("text.rei.remove_favorites_tooltip", name).split("\n"))
- .map(TextComponent::new).collect(Collectors.toList()));
- else
- tooltip.addAllTexts(Stream.of(I18n.get("text.rei.favorites_tooltip", name).split("\n"))
- .map(TextComponent::new).collect(Collectors.toList()));
- }
- if (tagMatch != null) {
- tooltip.add(new TranslatableComponent("text.rei.tag_match", tagMatch.toString()).withStyle(ChatFormatting.GRAY));
- }
tooltip.queue();
}
}
@@ -423,6 +412,24 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget {
tooltip.add(new TranslatableComponent("text.auto_craft.move_items.tooltip").withStyle(ChatFormatting.YELLOW));
}
+ if (tooltip != null) {
+ if (interactableFavorites && ConfigObject.getInstance().doDisplayFavoritesTooltip() && !ConfigObject.getInstance().getFavoriteKeyCode().isUnknown()) {
+ String name = ConfigObject.getInstance().getFavoriteKeyCode().getLocalizedName().getString();
+ if (reverseFavoritesAction())
+ tooltip.addAllTexts(Stream.of(I18n.get("text.rei.remove_favorites_tooltip", name).split("\n"))
+ .map(TextComponent::new).collect(Collectors.toList()));
+ else
+ tooltip.addAllTexts(Stream.of(I18n.get("text.rei.favorites_tooltip", name).split("\n"))
+ .map(TextComponent::new).collect(Collectors.toList()));
+ }
+
+ if (tooltipProcessors != null) {
+ for (UnaryOperator<Tooltip> processor : tooltipProcessors) {
+ tooltip = processor.apply(tooltip);
+ }
+ }
+ }
+
return tooltip;
}
@@ -453,6 +460,17 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget {
return b;
}
+ public void tooltipProcessor(UnaryOperator<Tooltip> operator) {
+ if (tooltipProcessors == null) {
+ tooltipProcessors = Collections.singleton(operator);
+ } else {
+ if (!(tooltipProcessors instanceof LinkedHashSet)) {
+ tooltipProcessors = new LinkedHashSet<>(tooltipProcessors);
+ }
+ tooltipProcessors.add(operator);
+ }
+ }
+
@Override
public boolean mouseClicked(double mouseX, double mouseY, int button) {
if (containsMouse(mouseX, mouseY))
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 5c992d197..19ebebadb 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
@@ -149,6 +149,10 @@ public class QueuedTooltip implements Tooltip {
@Override
public ClientTooltipComponent getAsComponent() {
+ if (obj instanceof ClientTooltipComponent) {
+ return (ClientTooltipComponent) obj;
+ }
+
if (isTooltipComponent()) {
return ClientTooltipComponent.create((TooltipComponent) obj);
}
diff --git a/runtime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json b/runtime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json
index 1269ca836..db5690e60 100755
--- a/runtime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json
+++ b/runtime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json
@@ -68,7 +68,8 @@
"text.rei.cheat_items": "Gave [{item_name}§f] x{item_count} to {player_name}.",
"text.rei.failed_cheat_items": "§cFailed to give items.",
"text.rei.too_long_nbt": "§cItem NBT is too long to be applied in multiplayer.",
- "text.rei.tag_match": "Accepts Tag: #%s",
+ "text.rei.accepts": "Accepts following:",
+ "text.rei.tag_accept": "Tag: #%s",
"text.rei.performance": "Performance Analysis",
"text.rei.shapeless": "Shapeless",
"ordering.rei.ascending": "Ascending",