diff options
Diffstat (limited to 'src/main/java')
3 files changed, 104 insertions, 1 deletions
diff --git a/src/main/java/com/anthonyhilyard/iceberg/mixin/ScreenMixin.java b/src/main/java/com/anthonyhilyard/iceberg/mixin/ScreenMixin.java new file mode 100644 index 0000000..5b79256 --- /dev/null +++ b/src/main/java/com/anthonyhilyard/iceberg/mixin/ScreenMixin.java @@ -0,0 +1,71 @@ +package com.anthonyhilyard.iceberg.mixin; + +import java.util.ArrayList; +import java.util.List; + +import com.anthonyhilyard.iceberg.util.StringRecomposer; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.components.events.AbstractContainerEventHandler; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTextTooltip; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.network.chat.FormattedText; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.client.event.RenderTooltipEvent; +import net.minecraftforge.common.MinecraftForge; + +@Mixin(Screen.class) +public class ScreenMixin extends AbstractContainerEventHandler +{ + @Shadow(remap = false) + private Font tooltipFont = null; + + @Shadow(remap = false) + private ItemStack tooltipStack = ItemStack.EMPTY; + + @Final + @Shadow + private final List<GuiEventListener> children = Lists.newArrayList(); + + @SuppressWarnings("removal") + @Inject(method = "renderTooltipInternal", + at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/entity/ItemRenderer;blitOffset:F", ordinal = 2, shift = Shift.AFTER), + locals = LocalCapture.CAPTURE_FAILEXCEPTION) + private void renderTooltipInternal(PoseStack poseStack, List<ClientTooltipComponent> components, int x, int y, CallbackInfo info, RenderTooltipEvent.Pre pre, int tooltipWidth, int tooltipHeight, int postX, int postY) + { + if (!components.isEmpty()) + { + List<FormattedText> standinLines = new ArrayList<>(); + for (ClientTooltipComponent component : components) + { + if (component instanceof ClientTextTooltip) + { + StringRecomposer recomposer = new StringRecomposer(); + ((ClientTextTooltip)component).text.accept(recomposer); + standinLines.add(recomposer.getFormattedText()); + } + } + + MinecraftForge.EVENT_BUS.post(new RenderTooltipEvent.PostText(tooltipStack, standinLines, poseStack, postX, postY, tooltipFont, tooltipWidth, tooltipHeight)); + } + } + + @Override + public List<? extends GuiEventListener> children() + { + return children; + } +} diff --git a/src/main/java/com/anthonyhilyard/iceberg/util/Easing.java b/src/main/java/com/anthonyhilyard/iceberg/util/Easing.java index bc4e39b..2274ce2 100644 --- a/src/main/java/com/anthonyhilyard/iceberg/util/Easing.java +++ b/src/main/java/com/anthonyhilyard/iceberg/util/Easing.java @@ -3,7 +3,7 @@ package com.anthonyhilyard.iceberg.util; import net.minecraft.network.chat.TextColor; /** - * Helper functions for smooth easing/interpolation. If you need linear, use net.minecraft.util.math.MathHelper.lerp instead. + * Helper functions for smooth easing/interpolation. */ public final class Easing { diff --git a/src/main/java/com/anthonyhilyard/iceberg/util/StringRecomposer.java b/src/main/java/com/anthonyhilyard/iceberg/util/StringRecomposer.java new file mode 100644 index 0000000..d88ae41 --- /dev/null +++ b/src/main/java/com/anthonyhilyard/iceberg/util/StringRecomposer.java @@ -0,0 +1,32 @@ +package com.anthonyhilyard.iceberg.util; + +import net.minecraft.network.chat.FormattedText; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.util.FormattedCharSink; + +public class StringRecomposer implements FormattedCharSink +{ + private StringBuilder builder = new StringBuilder(); + private MutableComponent text = new TextComponent("").withStyle(Style.EMPTY); + + @Override + public boolean accept(int index, Style style, int charCode) + { + builder.append(Character.toChars(charCode)); + + if (!style.equals(text.getStyle())) + { + text.append(new TextComponent(builder.toString()).withStyle(style)); + builder.setLength(0); + } + return true; + } + + public FormattedText getFormattedText() + { + text.append(new TextComponent(builder.toString()).withStyle(text.getStyle())); + return text; + } +} |