diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-06-09 16:45:30 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2022-06-09 21:19:14 +0800 |
| commit | 6fd895753bfe317233f68da38ba3460422674475 (patch) | |
| tree | 0ffb23456509419206b571f9ae36527ed045604f | |
| parent | a8dd27ef4e946c879a2e3e5e163683a41896e78f (diff) | |
| download | RoughlyEnoughItems-6fd895753bfe317233f68da38ba3460422674475.tar.gz RoughlyEnoughItems-6fd895753bfe317233f68da38ba3460422674475.tar.bz2 RoughlyEnoughItems-6fd895753bfe317233f68da38ba3460422674475.zip | |
Add accepted stacks to the tooltip
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", |
