add clickable links

This commit is contained in:
1e99 2024-12-15 22:53:33 +01:00
parent 506566601d
commit 7ed8a3c7e3
2 changed files with 109 additions and 1 deletions

View file

@ -6,7 +6,8 @@
"defaultRequire": 1
},
"client": [
"BossBarHudMixin",
"ChatScreenMixin",
"BossBarHudMixin"
"ChatHudMixin"
]
}

View file

@ -0,0 +1,107 @@
package eu.e99.pixelchat.fabric.mixin;
import net.minecraft.client.gui.hud.ChatHud;
import net.minecraft.text.*;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
@Mixin(ChatHud.class)
public class ChatHudMixin {
@ModifyVariable(
method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V",
at = @At("HEAD"),
index = 1,
argsOnly = true
)
private Text pixelchat$modifyText(Text text) {
TextContent content = text.getContent();
List<Text> siblings = text.getSiblings().stream()
.map(this::pixelchat$modifyText)
.toList();
Style style = text.getStyle();
return switch (content) {
case PlainTextContent plain -> {
String string = plain.string();
MutableText newText = newTextWithLinks(string);
for (Text sibling : siblings) {
newText = newText.append(sibling);
}
newText = newText.setStyle(style);
yield newText;
}
case TranslatableTextContent translatable -> {
Object[] args = translatable.getArgs();
for (int i = 0; i < args.length; i++) {
args[i] = switch (args[i]) {
case Text arg -> pixelchat$modifyText(arg);
case String string -> newTextWithLinks(string);
default -> args;
};
}
yield newText(
new TranslatableTextContent(
translatable.getKey(),
translatable.getFallback(),
args
),
siblings,
style
);
}
default -> text;
};
}
@Unique
private MutableText newText(TextContent content, List<Text> siblings, Style style) {
MutableText text = MutableText.of(content);
for (Text sibling : siblings) {
text = text.append(sibling);
}
text = text.setStyle(style);
return text;
}
@Unique
private MutableText newTextWithLinks(String string) {
// TODO: Does this cover all cases? Probably not, but it's good enough for now
MutableText result = Text.empty();
String[] split = string.split(" ");
for (int i = 0; i < split.length; i++) {
String segment = split[i];
MutableText text = Text.literal(segment);
try {
URI uri = new URI(segment);
ClickEvent event = new ClickEvent(
ClickEvent.Action.OPEN_URL,
uri.toString()
);
text = text.styled(style -> {
style = style.withClickEvent(event);
return style;
});
} catch (URISyntaxException ignored) {
}
result.append(text);
if (i < split.length - 1) result.append(" ");
}
return result;
}
}