Add getLegacyFormatString method

[no changelog]
This commit is contained in:
Linnea Gräf
2024-10-24 14:49:21 +02:00
parent 6100b8c9a0
commit 0357245e88
5 changed files with 223 additions and 1 deletions

View File

@@ -30,6 +30,8 @@ import moe.nea.firmament.util.SkyblockId
import moe.nea.firmament.util.accessors.messages import moe.nea.firmament.util.accessors.messages
import moe.nea.firmament.util.collections.InstanceList import moe.nea.firmament.util.collections.InstanceList
import moe.nea.firmament.util.collections.WeakCache import moe.nea.firmament.util.collections.WeakCache
import moe.nea.firmament.util.mc.SNbtFormatter
import moe.nea.firmament.util.unformattedString
fun firmamentCommand() = literal("firmament") { fun firmamentCommand() = literal("firmament") {
@@ -44,7 +46,8 @@ fun firmamentCommand() = literal("firmament") {
} }
thenArgument("property", string()) { property -> thenArgument("property", string()) { property ->
suggestsList { suggestsList {
(ManagedConfig.allManagedConfigs.getAll().find { it.name == this[config] } ?: return@suggestsList listOf()) (ManagedConfig.allManagedConfigs.getAll().find { it.name == this[config] }
?: return@suggestsList listOf())
.allOptions.entries.asSequence().filter { it.value.handler is BooleanHandler } .allOptions.entries.asSequence().filter { it.value.handler is BooleanHandler }
.map { it.key } .map { it.key }
.asIterable() .asIterable()
@@ -216,6 +219,16 @@ fun firmamentCommand() = literal("firmament") {
println(nbt) println(nbt)
} }
} }
thenArgument("search", string()) { search ->
thenExecute {
MC.inGameHud.chatHud.messages
.filter { this[search] in it.content.unformattedString }
.forEach {
val nbt = TextCodecs.CODEC.encodeStart(NbtOps.INSTANCE, it.content).orThrow
println(SNbtFormatter.prettify(nbt))
}
}
}
} }
thenLiteral("sbdata") { thenLiteral("sbdata") {
thenExecute { thenExecute {

View File

@@ -3,6 +3,7 @@ package moe.nea.firmament.util
import net.minecraft.text.MutableText import net.minecraft.text.MutableText
import net.minecraft.text.PlainTextContent import net.minecraft.text.PlainTextContent
import net.minecraft.text.Text import net.minecraft.text.Text
import net.minecraft.text.TextColor
import net.minecraft.text.TranslatableTextContent import net.minecraft.text.TranslatableTextContent
import net.minecraft.util.Formatting import net.minecraft.util.Formatting
import moe.nea.firmament.Firmament import moe.nea.firmament.Firmament
@@ -92,6 +93,30 @@ val Text.unformattedString: String
val Text.directLiteralStringContent: String? get() = (this.content as? PlainTextContent)?.string() val Text.directLiteralStringContent: String? get() = (this.content as? PlainTextContent)?.string()
fun Text.getLegacyFormatString() =
run {
val sb = StringBuilder()
for (component in iterator()) {
sb.append(component.style.color?.toChatFormatting()?.toString() ?: "§r")
sb.append(component.directLiteralStringContent)
sb.append("§r")
}
sb.toString()
}
private val textColorLUT = Formatting.entries
.mapNotNull { formatting -> formatting.colorValue?.let { it to formatting } }
.toMap()
fun TextColor.toChatFormatting(): Formatting? {
return textColorLUT[this.rgb]
}
fun Text.iterator(): Sequence<Text> {
return sequenceOf(this) + siblings.asSequence()
.flatMap { it.iterator() } // TODO: in theory we want to properly inherit styles here
}
fun Text.allSiblings(): List<Text> = listOf(this) + siblings.flatMap { it.allSiblings() } fun Text.allSiblings(): List<Text> = listOf(this) + siblings.flatMap { it.allSiblings() }
fun MutableText.withColor(formatting: Formatting) = this.styled { it.withColor(formatting).withItalic(false) } fun MutableText.withColor(formatting: Formatting) = this.styled { it.withColor(formatting).withItalic(false) }

View File

@@ -4,6 +4,8 @@ import net.minecraft.item.ItemStack
import net.minecraft.nbt.NbtCompound import net.minecraft.nbt.NbtCompound
import net.minecraft.nbt.NbtOps import net.minecraft.nbt.NbtOps
import net.minecraft.nbt.StringNbtReader import net.minecraft.nbt.StringNbtReader
import net.minecraft.text.Text
import net.minecraft.text.TextCodecs
import moe.nea.firmament.test.FirmTestBootstrap import moe.nea.firmament.test.FirmTestBootstrap
object ItemResources { object ItemResources {
@@ -22,6 +24,11 @@ object ItemResources {
return StringNbtReader.parse(loadString(path)) return StringNbtReader.parse(loadString(path))
} }
fun loadText(name: String): Text {
return TextCodecs.CODEC.parse(NbtOps.INSTANCE, loadSNbt("testdata/chat/$name.snbt"))
.getOrThrow { IllegalStateException("Could not load test chat '$name': $it") }
}
fun loadItem(name: String): ItemStack { fun loadItem(name: String): ItemStack {
// TODO: make the load work with enchantments // TODO: make the load work with enchantments
return ItemStack.CODEC.parse(NbtOps.INSTANCE, loadSNbt("testdata/items/$name.snbt")) return ItemStack.CODEC.parse(NbtOps.INSTANCE, loadSNbt("testdata/items/$name.snbt"))

View File

@@ -0,0 +1,15 @@
package moe.nea.firmament.test.util
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import moe.nea.firmament.test.testutil.ItemResources
import moe.nea.firmament.util.getLegacyFormatString
class TextUtilText {
@Test
fun testThing() {
// TODO: add more tests that are directly validated with 1.8.9 code
val text = ItemResources.loadText("all-chat")
Assertions.assertEquals("§r§r§8[§r§9302§r§8] §r§6♫ §r§b[MVP§r§d+§r§b] lrg89§r§f: test§r", text.getLegacyFormatString())
}
}

View File

@@ -0,0 +1,162 @@
{
extra: [
{
bold: 0b,
color: "#555555",
hoverEvent: {
action: "show_text",
contents: {
clickEvent: {
action: "run_command",
value: "command"
},
strikethrough: 0b,
text: "§b[MVP§d+§b] lrg89§f
§7SkyBlock Level: §8[§9302§8]
§7Skill Average: §648.1
§7Emblem: §6♫
§8Harp Master
§7§8Unlocked for All Harp Songs Perfected.
§7Perfect Completions: §b37"
}
},
italic: 0b,
obfuscated: 0b,
strikethrough: 0b,
text: "[",
underlined: 0b
},
{
bold: 0b,
color: "#5555FF",
hoverEvent: {
action: "show_text",
contents: {
clickEvent: {
action: "run_command",
value: "command"
},
strikethrough: 0b,
text: "§b[MVP§d+§b] lrg89§f
§7SkyBlock Level: §8[§9302§8]
§7Skill Average: §648.1
§7Emblem: §6♫
§8Harp Master
§7§8Unlocked for All Harp Songs Perfected.
§7Perfect Completions: §b37"
}
},
italic: 0b,
obfuscated: 0b,
strikethrough: 0b,
text: "302",
underlined: 0b
},
{
bold: 0b,
color: "#555555",
hoverEvent: {
action: "show_text",
contents: {
clickEvent: {
action: "run_command",
value: "command"
},
strikethrough: 0b,
text: "§b[MVP§d+§b] lrg89§f
§7SkyBlock Level: §8[§9302§8]
§7Skill Average: §648.1
§7Emblem: §6♫
§8Harp Master
§7§8Unlocked for All Harp Songs Perfected.
§7Perfect Completions: §b37"
}
},
italic: 0b,
obfuscated: 0b,
strikethrough: 0b,
text: "] ",
underlined: 0b
},
{
bold: 0b,
color: "#FFAA00",
hoverEvent: {
action: "show_text",
contents: {
clickEvent: {
action: "run_command",
value: "command"
},
strikethrough: 0b,
text: "§b[MVP§d+§b] lrg89§f
§7SkyBlock Level: §8[§9302§8]
§7Skill Average: §648.1
§7Emblem: §6♫
§8Harp Master
§7§8Unlocked for All Harp Songs Perfected.
§7Perfect Completions: §b37"
}
},
italic: 0b,
obfuscated: 0b,
strikethrough: 0b,
text: "♫ ",
underlined: 0b
},
{
bold: 0b,
color: "#55FFFF",
italic: 0b,
obfuscated: 0b,
strikethrough: 0b,
text: "[MVP",
underlined: 0b
},
{
bold: 0b,
color: "#FF55FF",
italic: 0b,
obfuscated: 0b,
strikethrough: 0b,
text: "+",
underlined: 0b
},
{
bold: 0b,
color: "#55FFFF",
italic: 0b,
obfuscated: 0b,
strikethrough: 0b,
text: "] lrg89",
underlined: 0b
},
{
bold: 0b,
color: "#FFFFFF",
italic: 0b,
obfuscated: 0b,
strikethrough: 0b,
text: ": test",
underlined: 0b
}
],
strikethrough: 0b,
text: ""
}