Skip to content

Commit 01f90f1

Browse files
committed
UTextComponent: Deprecate
Porting it to 1.21.5 while maintaining its API is difficult (actions are no longer separate from their values and those are no longer stringly typed either). As such, this commit deprecates the class as well as the closely adjacent (and also badly designed) `UMessage` class. For methods which are still generally useful, it introduces overloads which take the vanilla component. `UChat.chat` was already taking `Any`, so `String` and vanilla components can simply be passed to it directly. It also moves out the code which turns the component into a plain (formatted or unformatted) string into separate utilities because that is still very much useful (and about the only justified use-case of UTextComponent in Essential). The only significant loss is the ability of `UMessage` to edit messages which have been posted in chat. If anyone has a use-case for these, we may re-introduce this functionality as a new, better-designed API in the future.
1 parent 7d7066b commit 01f90f1

File tree

9 files changed

+173
-72
lines changed

9 files changed

+173
-72
lines changed

api/UniversalCraft.api

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,23 @@ public final class gg/essential/universal/UMouse$Scaled {
734734
public final class gg/essential/universal/UPacket {
735735
public static final field INSTANCE Lgg/essential/universal/UPacket;
736736
public static final fun sendActionBarMessage (Lgg/essential/universal/wrappers/message/UTextComponent;)V
737+
@1.8.9-forge
738+
public static final fun sendActionBarMessage (Lnet/minecraft/util/IChatComponent;)V
739+
@1.17.1-forge,1.18.1-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21-forge,1.21-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge
740+
public static final fun sendActionBarMessage (Lnet/minecraft/network/chat/Component;)V
741+
@1.16.2-fabric,1.17.1-fabric,1.18.1-fabric,1.19-fabric,1.19.1-fabric,1.19.2-fabric,1.19.3-fabric,1.19.4-fabric,1.20-fabric,1.20.1-fabric,1.20.2-fabric,1.20.4-fabric,1.20.6-fabric,1.21-fabric,1.21.3-fabric,1.21.4-fabric
742+
public static final fun sendActionBarMessage (Lnet/minecraft/text/Text;)V
743+
@1.12.2-forge,1.16.2-forge
744+
public static final fun sendActionBarMessage (Lnet/minecraft/util/text/ITextComponent;)V
737745
public static final fun sendChatMessage (Lgg/essential/universal/wrappers/message/UTextComponent;)V
746+
@1.8.9-forge
747+
public static final fun sendChatMessage (Lnet/minecraft/util/IChatComponent;)V
748+
@1.17.1-forge,1.18.1-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21-forge,1.21-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge
749+
public static final fun sendChatMessage (Lnet/minecraft/network/chat/Component;)V
750+
@1.16.2-fabric,1.17.1-fabric,1.18.1-fabric,1.19-fabric,1.19.1-fabric,1.19.2-fabric,1.19.3-fabric,1.19.4-fabric,1.20-fabric,1.20.1-fabric,1.20.2-fabric,1.20.4-fabric,1.20.6-fabric,1.21-fabric,1.21.3-fabric,1.21.4-fabric
751+
public static final fun sendChatMessage (Lnet/minecraft/text/Text;)V
752+
@1.12.2-forge,1.16.2-forge
753+
public static final fun sendChatMessage (Lnet/minecraft/util/text/ITextComponent;)V
738754
}
739755

740756
public final class gg/essential/universal/UResolution {
@@ -1181,6 +1197,25 @@ public final class gg/essential/universal/utils/ReleasedDynamicTexture : net/min
11811197
public final fun uploadTexture ()V
11821198
}
11831199

1200+
public final class gg/essential/universal/utils/TextUtilsKt {
1201+
@1.8.9-forge
1202+
public static final fun toFormattedString (Lnet/minecraft/util/IChatComponent;)Ljava/lang/String;
1203+
@1.8.9-forge
1204+
public static final fun toUnformattedString (Lnet/minecraft/util/IChatComponent;)Ljava/lang/String;
1205+
@1.17.1-forge,1.18.1-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21-forge,1.21-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge
1206+
public static final fun toFormattedString (Lnet/minecraft/network/chat/Component;)Ljava/lang/String;
1207+
@1.17.1-forge,1.18.1-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21-forge,1.21-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge
1208+
public static final fun toUnformattedString (Lnet/minecraft/network/chat/Component;)Ljava/lang/String;
1209+
@1.16.2-fabric,1.17.1-fabric,1.18.1-fabric,1.19-fabric,1.19.1-fabric,1.19.2-fabric,1.19.3-fabric,1.19.4-fabric,1.20-fabric,1.20.1-fabric,1.20.2-fabric,1.20.4-fabric,1.20.6-fabric,1.21-fabric,1.21.3-fabric,1.21.4-fabric
1210+
public static final fun toFormattedString (Lnet/minecraft/text/Text;)Ljava/lang/String;
1211+
@1.16.2-fabric,1.17.1-fabric,1.18.1-fabric,1.19-fabric,1.19.1-fabric,1.19.2-fabric,1.19.3-fabric,1.19.4-fabric,1.20-fabric,1.20.1-fabric,1.20.2-fabric,1.20.4-fabric,1.20.6-fabric,1.21-fabric,1.21.3-fabric,1.21.4-fabric
1212+
public static final fun toUnformattedString (Lnet/minecraft/text/Text;)Ljava/lang/String;
1213+
@1.12.2-forge,1.16.2-forge
1214+
public static final fun toFormattedString (Lnet/minecraft/util/text/ITextComponent;)Ljava/lang/String;
1215+
@1.12.2-forge,1.16.2-forge
1216+
public static final fun toUnformattedString (Lnet/minecraft/util/text/ITextComponent;)Ljava/lang/String;
1217+
}
1218+
11841219
public abstract interface class gg/essential/universal/vertex/UVertexConsumer {
11851220
public static final field Companion Lgg/essential/universal/vertex/UVertexConsumer$Companion;
11861221
public fun color (FFFF)Lgg/essential/universal/vertex/UVertexConsumer;
@@ -1242,6 +1277,14 @@ public final class gg/essential/universal/wrappers/UPlayer {
12421277
public static final fun getUUID ()Ljava/util/UUID;
12431278
public static final fun hasPlayer ()Z
12441279
public static final fun sendClientSideMessage (Lgg/essential/universal/wrappers/message/UTextComponent;)V
1280+
@1.8.9-forge
1281+
public static final fun sendClientSideMessage (Lnet/minecraft/util/IChatComponent;)V
1282+
@1.17.1-forge,1.18.1-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21-forge,1.21-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge
1283+
public static final fun sendClientSideMessage (Lnet/minecraft/network/chat/Component;)V
1284+
@1.16.2-fabric,1.17.1-fabric,1.18.1-fabric,1.19-fabric,1.19.1-fabric,1.19.2-fabric,1.19.3-fabric,1.19.4-fabric,1.20-fabric,1.20.1-fabric,1.20.2-fabric,1.20.4-fabric,1.20.6-fabric,1.21-fabric,1.21.3-fabric,1.21.4-fabric
1285+
public static final fun sendClientSideMessage (Lnet/minecraft/text/Text;)V
1286+
@1.12.2-forge,1.16.2-forge
1287+
public static final fun sendClientSideMessage (Lnet/minecraft/util/text/ITextComponent;)V
12451288
}
12461289

12471290
public final class gg/essential/universal/wrappers/message/UMessage {

src/main/kotlin/gg/essential/universal/UChat.kt

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package gg.essential.universal
22

33
//#if !STANDALONE
44
import gg.essential.universal.wrappers.UPlayer
5-
import gg.essential.universal.wrappers.message.UMessage
6-
import gg.essential.universal.wrappers.message.UTextComponent
5+
//#if MC>=12105
6+
//$$ import net.minecraft.text.Text
7+
//#endif
78
//#endif
89
import java.util.regex.Pattern
910

@@ -21,15 +22,19 @@ object UChat {
2122
fun chat(obj: Any) {
2223
//#if STANDALONE
2324
//$$ println(obj)
25+
//#elseif MC>=12105
26+
//$$ if (!UPlayer.hasPlayer()) return
27+
//$$ UPlayer.sendClientSideMessage(obj as? Text ?: Text.literal(obj.toString()))
2428
//#else
25-
if (obj is String || obj is UTextComponent) {
26-
UMessage(obj).chat()
29+
@Suppress("DEPRECATION")
30+
if (obj is String || obj is gg.essential.universal.wrappers.message.UTextComponent) {
31+
gg.essential.universal.wrappers.message.UMessage(obj).chat()
2732
} else {
28-
val component = UTextComponent.from(obj)
33+
val component = gg.essential.universal.wrappers.message.UTextComponent.from(obj)
2934
if (component != null) {
3035
component.chat()
3136
} else {
32-
UMessage(obj.toString()).chat()
37+
gg.essential.universal.wrappers.message.UMessage(obj.toString()).chat()
3338
}
3439
}
3540
//#endif
@@ -46,15 +51,18 @@ object UChat {
4651
fun actionBar(obj: Any) {
4752
//#if STANDALONE
4853
//$$ throw UnsupportedOperationException("actionBar($obj)")
54+
//#elseif MC>=12105
55+
//$$ UPacket.sendActionBarMessage(obj as? Text ?: Text.literal(obj.toString()))
4956
//#else
50-
if (obj is String || obj is UTextComponent) {
51-
UMessage(obj).actionBar()
57+
@Suppress("DEPRECATION")
58+
if (obj is String || obj is gg.essential.universal.wrappers.message.UTextComponent) {
59+
gg.essential.universal.wrappers.message.UMessage(obj).actionBar()
5260
} else {
53-
val component = UTextComponent.from(obj)
61+
val component = gg.essential.universal.wrappers.message.UTextComponent.from(obj)
5462
if (component != null) {
5563
component.actionBar()
5664
} else {
57-
UMessage(obj.toString()).actionBar()
65+
gg.essential.universal.wrappers.message.UMessage(obj.toString()).actionBar()
5866
}
5967
}
6068
//#endif

src/main/kotlin/gg/essential/universal/UKeyboard.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ package gg.essential.universal
99
import net.minecraft.client.settings.KeyBinding
1010

1111
//#if MC>=11600
12-
//$$ import gg.essential.universal.wrappers.message.UTextComponent
12+
//$$ import gg.essential.universal.utils.toUnformattedString
1313
//#endif
1414

1515
//#if MC>=11502
@@ -342,7 +342,7 @@ object UKeyboard {
342342
fun getKeyName(keyBinding: KeyBinding): String? {
343343
//#if MC>=11400
344344
//#if MC>=11600
345-
//$$ return UTextComponent(keyBinding.func_238171_j_()).unformattedText.let {
345+
//$$ return keyBinding.func_238171_j_().toUnformattedString().let {
346346
//#else
347347
//$$ return keyBinding.localizedName?.let {
348348
//#endif

src/main/kotlin/gg/essential/universal/UPacket.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package gg.essential.universal
22

3-
import gg.essential.universal.wrappers.message.UTextComponent
43
import net.minecraft.network.play.server.S02PacketChat
4+
import net.minecraft.util.IChatComponent
55

66
//#if MC>=11602
77
//$$ import gg.essential.universal.wrappers.UPlayer
@@ -35,8 +35,13 @@ private object ChatType {
3535
//#endif
3636

3737
object UPacket {
38+
//#if MC<12105
39+
@Suppress("DEPRECATION")
3840
@JvmStatic
39-
fun sendChatMessage(message: UTextComponent) {
41+
fun sendChatMessage(message: gg.essential.universal.wrappers.message.UTextComponent) = sendChatMessage(message as IChatComponent)
42+
//#endif
43+
@JvmStatic
44+
fun sendChatMessage(message: IChatComponent) {
4045
UMinecraft.getNetHandler()!!.handleChat(S02PacketChat(
4146
message,
4247
//#if MC>=11901
@@ -49,9 +54,14 @@ object UPacket {
4954
//#endif
5055
))
5156
}
52-
57+
58+
//#if MC<12105
59+
@Suppress("DEPRECATION")
60+
@JvmStatic
61+
fun sendActionBarMessage(message: gg.essential.universal.wrappers.message.UTextComponent) = sendActionBarMessage(message as IChatComponent)
62+
//#endif
5363
@JvmStatic
54-
fun sendActionBarMessage(message: UTextComponent) {
64+
fun sendActionBarMessage(message: IChatComponent) {
5565
UMinecraft.getNetHandler()!!.handleChat(S02PacketChat(
5666
message,
5767
//#if MC>=11901
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package gg.essential.universal.utils
2+
3+
import net.minecraft.util.IChatComponent
4+
5+
//#if MC>=11600
6+
//$$ import net.minecraft.util.ICharacterConsumer
7+
//$$ import net.minecraft.util.text.Color
8+
//$$ import net.minecraft.util.text.Style
9+
//$$ import net.minecraft.util.text.TextFormatting
10+
//#endif
11+
12+
//#if MC>=11602
13+
//$$ private class TextBuilder(private val isFormatted: Boolean) : ICharacterConsumer {
14+
//$$ private val builder = StringBuilder()
15+
//$$ private var cachedStyle: Style? = null
16+
//$$
17+
//$$ override fun accept(index: Int, style: Style, codePoint: Int): Boolean {
18+
//$$ if (isFormatted && style != cachedStyle) {
19+
//$$ cachedStyle = style
20+
//$$ builder.append(formatString(style))
21+
//$$ }
22+
//$$
23+
//$$ builder.append(codePoint.toChar())
24+
//$$ return true
25+
//$$ }
26+
//$$
27+
//$$ fun getString() = builder.toString()
28+
//$$
29+
//$$ private fun formatString(style: Style): String {
30+
//$$ val builder = StringBuilder("§r")
31+
//$$
32+
//$$ when {
33+
//$$ style.bold -> builder.append("§l")
34+
//$$ style.italic -> builder.append("§o")
35+
//$$ style.underlined -> builder.append("§n")
36+
//$$ style.strikethrough -> builder.append("§m")
37+
//$$ style.obfuscated -> builder.append("§k")
38+
//$$ }
39+
//$$
40+
//$$ style.color?.let(colorToFormatChar::get)?.let {
41+
//$$ builder.append(it)
42+
//$$ }
43+
//$$ return builder.toString()
44+
//$$ }
45+
//$$
46+
//$$ companion object {
47+
//$$ private val colorToFormatChar = TextFormatting.values().mapNotNull { format ->
48+
//$$ Color.fromTextFormatting(format)?.let { it to format }
49+
//$$ }.toMap()
50+
//$$ }
51+
//$$ }
52+
//#endif
53+
54+
fun IChatComponent.toUnformattedString(): String {
55+
//#if MC>=11600
56+
//$$ val builder = TextBuilder(false)
57+
//$$ func_241878_f().accept(builder)
58+
//$$ return builder.getString()
59+
//#else
60+
return unformattedText
61+
//#endif
62+
}
63+
64+
fun IChatComponent.toFormattedString(): String {
65+
//#if MC>=11600
66+
//$$ val builder = TextBuilder(true)
67+
//$$ func_241878_f().accept(builder)
68+
//$$ return builder.getString()
69+
//#else
70+
return formattedText
71+
//#endif
72+
}

src/main/kotlin/gg/essential/universal/wrappers/UPlayer.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package gg.essential.universal.wrappers
22

33
import gg.essential.universal.UMinecraft
4-
import gg.essential.universal.wrappers.message.UTextComponent
54
import net.minecraft.client.entity.EntityPlayerSP
5+
import net.minecraft.util.IChatComponent
66
import java.util.*
77

88
object UPlayer {
@@ -14,8 +14,14 @@ object UPlayer {
1414
@JvmStatic
1515
fun hasPlayer() = getPlayer() != null
1616

17+
//#if MC<12105
18+
@Suppress("DEPRECATION")
1719
@JvmStatic
18-
fun sendClientSideMessage(message: UTextComponent) {
20+
fun sendClientSideMessage(message: gg.essential.universal.wrappers.message.UTextComponent) = sendClientSideMessage(message as IChatComponent)
21+
//#endif
22+
23+
@JvmStatic
24+
fun sendClientSideMessage(message: IChatComponent) {
1925
//#if MC>=12102
2026
//$$ getPlayer()!!.sendMessage(message, false)
2127
//#elseif MC>=11900

src/main/kotlin/gg/essential/universal/wrappers/message/UMessage.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//#if MC<12105
2+
@file:Suppress("DEPRECATION")
13
package gg.essential.universal.wrappers.message
24

35
import gg.essential.universal.UMinecraft
@@ -13,6 +15,7 @@ import java.util.concurrent.ThreadLocalRandom
1315
//$$ import net.minecraft.util.text.IFormattableTextComponent
1416
//#endif
1517

18+
@Deprecated("No longer exists as of 1.21.5, unmaintained even on versions before that. Use UChat instead.")
1619
class UMessage {
1720
private lateinit var _chatMessage: UTextComponent
1821
val messageParts: MutableList<UTextComponent> = mutableListOf()
@@ -145,4 +148,5 @@ internal fun printChatMessageWithOptionalDeletion(textComponent: UTextComponent,
145148
// The `apply` wrapper appears to be necessary when using the IR compiler backend for it to generate the return type
146149
// as `V`, otherwise it'll infer `Ljava/lang/Object;` which does not match our target method.
147150
printChatMessageWithOptionalDeletion?.apply { invokeExact(UMinecraft.getChatGUI(), textComponent as MCITextComponent, lineID) }
148-
}
151+
}
152+
//#endif

0 commit comments

Comments
 (0)