Skip to content

Commit 18e8e35

Browse files
committed
fix: make copy chat properly use captureClickableText
Fixes #388
1 parent 74bfee5 commit 18e8e35

File tree

2 files changed

+76
-13
lines changed

2 files changed

+76
-13
lines changed

src/main/java/moe/nea/firmament/mixins/CopyChatPatch.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,45 @@
33
import moe.nea.firmament.features.chat.CopyChat;
44
import moe.nea.firmament.mixins.accessor.AccessorChatHud;
55
import moe.nea.firmament.util.ClipboardUtils;
6+
import moe.nea.firmament.util.MC;
67
import net.minecraft.client.Minecraft;
8+
import net.minecraft.client.gui.ActiveTextCollector;
9+
import net.minecraft.client.gui.TextAlignment;
10+
import net.minecraft.client.gui.render.state.GuiTextRenderState;
711
import net.minecraft.client.input.MouseButtonEvent;
812
import net.minecraft.client.gui.components.ChatComponent;
913
import net.minecraft.client.GuiMessage;
1014
import net.minecraft.client.gui.screens.ChatScreen;
1115
import net.minecraft.network.chat.Component;
1216
import net.minecraft.ChatFormatting;
17+
import net.minecraft.util.ARGB;
18+
import net.minecraft.util.FormattedCharSequence;
1319
import net.minecraft.util.Mth;
20+
import org.joml.Matrix3x2f;
1421
import org.spongepowered.asm.mixin.Mixin;
1522
import org.spongepowered.asm.mixin.Unique;
1623
import org.spongepowered.asm.mixin.injection.At;
1724
import org.spongepowered.asm.mixin.injection.Inject;
1825
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1926

2027
import java.util.List;
28+
import java.util.Objects;
2129

2230
@Mixin(ChatScreen.class)
2331
public class CopyChatPatch {
2432
@Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true)
25-
private void onRightClick(MouseButtonEvent click, boolean doubled, CallbackInfoReturnable<Boolean> cir) throws NoSuchFieldException, IllegalAccessException {
33+
private void onRightClick(MouseButtonEvent click, boolean doubled, CallbackInfoReturnable<Boolean> cir) {
2634
if (click.button() != 1 || !CopyChat.TConfig.INSTANCE.getCopyChat()) return;
2735
Minecraft client = Minecraft.getInstance();
2836
ChatComponent chatHud = client.gui.getChat();
29-
int lineIndex = getChatLineIndex(chatHud, click.y());
30-
if (lineIndex < 0) return;
31-
// TODO!!! use the new visitor for this (cc: image links)
32-
List<GuiMessage.Line> visible = ((AccessorChatHud) chatHud).getVisibleMessages_firmament();
33-
if (lineIndex >= visible.size()) return;
34-
GuiMessage.Line line = visible.get(lineIndex);
35-
String text = CopyChat.INSTANCE.orderedTextToString(line.content());
37+
var collector = new CopyChat.HoveredTextLineCollector((int) click.x(), (int) click.y());
38+
chatHud.captureClickableText(collector,
39+
MC.INSTANCE.getWindow().getGuiScaledHeight(), MC.INSTANCE.getInstance().gui.getGuiTicks(), true);
40+
if (collector.getResult() == null) return;
41+
String text = CopyChat.INSTANCE.orderedTextToString(collector.getResult());
3642
ClipboardUtils.INSTANCE.setTextContent(text);
3743
chatHud.addMessage(Component.literal("Copied: ").append(text).withStyle(ChatFormatting.GRAY));
3844
cir.setReturnValue(true);
3945
cir.cancel();
4046
}
41-
42-
@Unique
43-
private int getChatLineIndex(ChatComponent chatHud, double mouseY) {
44-
return 0; /// TODO!!!!
45-
}
4647
}

src/main/kotlin/features/chat/CopyChat.kt

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
package moe.nea.firmament.features.chat
22

3+
import org.joml.Matrix3x2f
4+
import net.minecraft.client.gui.ActiveTextCollector
5+
import net.minecraft.client.gui.TextAlignment
6+
import net.minecraft.client.gui.render.state.GuiTextRenderState
7+
import net.minecraft.network.chat.Component
8+
import net.minecraft.util.ARGB
39
import net.minecraft.util.FormattedCharSequence
10+
import moe.nea.firmament.util.MC.font
411
import moe.nea.firmament.util.data.Config
512
import moe.nea.firmament.util.data.ManagedConfig
613
import moe.nea.firmament.util.reconstitute
@@ -15,6 +22,61 @@ object CopyChat {
1522
val copyChat by toggle("copy-chat") { false }
1623
}
1724

25+
class HoveredTextLineCollector(val testX: Int, val testY: Int) : ActiveTextCollector {
26+
var parameters: ActiveTextCollector.Parameters = ActiveTextCollector.Parameters(Matrix3x2f())
27+
28+
override fun defaultParameters(): ActiveTextCollector.Parameters {
29+
return parameters
30+
}
31+
32+
override fun defaultParameters(parameters: ActiveTextCollector.Parameters) {
33+
this.parameters = parameters
34+
}
35+
36+
override fun accept(
37+
textAlignment: TextAlignment,
38+
i: Int,
39+
j: Int,
40+
parameters: ActiveTextCollector.Parameters,
41+
formattedCharSequence: FormattedCharSequence
42+
) {
43+
val k = textAlignment.calculateLeft(i, font, formattedCharSequence)
44+
if (GuiTextRenderState(
45+
font,
46+
formattedCharSequence,
47+
parameters.pose(),
48+
k,
49+
j,
50+
ARGB.white(parameters.opacity()),
51+
0,
52+
true,
53+
true,
54+
parameters.scissor()
55+
)
56+
.bounds()!!
57+
.containsPoint(testX, testY)
58+
) {
59+
this.result = formattedCharSequence
60+
}
61+
}
62+
63+
var result: FormattedCharSequence? = null
64+
65+
override fun acceptScrolling(
66+
component: Component,
67+
i: Int,
68+
j: Int,
69+
k: Int,
70+
l: Int,
71+
m: Int,
72+
parameters: ActiveTextCollector.Parameters
73+
) {
74+
val n = font.width(component)
75+
val o = 9
76+
this.defaultScrollingHelper(component, i, j, k, l, m, n, o, parameters)
77+
}
78+
}
79+
1880
fun orderedTextToString(orderedText: FormattedCharSequence): String {
1981
return orderedText.reconstitute().string
2082
}

0 commit comments

Comments
 (0)