feat: Add 1.8.9 item exporter

This commit is contained in:
Linnea Gräf
2025-06-18 00:35:51 +02:00
parent 4b9e966ca7
commit 4a29d86e47
12 changed files with 4796 additions and 13 deletions

View File

@@ -0,0 +1,103 @@
package moe.nea.firmament.util
import kotlinx.serialization.json.JsonPrimitive
import net.minecraft.nbt.AbstractNbtList
import net.minecraft.nbt.NbtByte
import net.minecraft.nbt.NbtCompound
import net.minecraft.nbt.NbtDouble
import net.minecraft.nbt.NbtElement
import net.minecraft.nbt.NbtEnd
import net.minecraft.nbt.NbtFloat
import net.minecraft.nbt.NbtInt
import net.minecraft.nbt.NbtLong
import net.minecraft.nbt.NbtShort
import net.minecraft.nbt.NbtString
import moe.nea.firmament.util.mc.SNbtFormatter.Companion.SIMPLE_NAME
class LegacyTagWriter(val compact: Boolean) {
companion object {
fun stringify(nbt: NbtElement, compact: Boolean): String {
return LegacyTagWriter(compact).also { it.writeElement(nbt) }
.stringWriter.toString()
}
fun NbtElement.toLegacyString(pretty: Boolean = false): String {
return stringify(this, !pretty)
}
}
val stringWriter = StringBuilder()
var indent = 0
fun newLine() {
if (compact) return
stringWriter.append('\n')
repeat(indent) {
stringWriter.append(" ")
}
}
fun writeElement(nbt: NbtElement) {
when (nbt) {
is NbtInt -> stringWriter.append(nbt.value.toString())
is NbtString -> stringWriter.append(escapeString(nbt.value))
is NbtFloat -> stringWriter.append(nbt.value).append('F')
is NbtDouble -> stringWriter.append(nbt.value).append('D')
is NbtByte -> stringWriter.append(nbt.value).append('B')
is NbtLong -> stringWriter.append(nbt.value).append('L')
is NbtShort -> stringWriter.append(nbt.value).append('S')
is NbtCompound -> writeCompound(nbt)
is NbtEnd -> {}
is AbstractNbtList -> writeArray(nbt)
}
}
fun writeArray(nbt: AbstractNbtList) {
stringWriter.append('[')
indent++
newLine()
nbt.forEachIndexed { index, element ->
writeName(index.toString())
writeElement(element)
if (index != nbt.size() - 1) {
stringWriter.append(',')
newLine()
}
}
indent--
if (nbt.size() != 0)
newLine()
stringWriter.append(']')
}
fun writeCompound(nbt: NbtCompound) {
stringWriter.append('{')
indent++
newLine()
val entries = nbt.entrySet().sortedBy { it.key }
entries.forEachIndexed { index, it ->
writeName(it.key)
writeElement(it.value)
if (index != entries.lastIndex) {
stringWriter.append(',')
newLine()
}
}
indent--
if (nbt.size != 0)
newLine()
stringWriter.append('}')
}
fun escapeString(string: String): String {
return JsonPrimitive(string).toString()
}
fun escapeName(key: String): String =
if (key.matches(SIMPLE_NAME)) key else escapeString(key)
fun writeName(key: String) {
stringWriter.append(escapeName(key))
stringWriter.append(':')
if (!compact) stringWriter.append(' ')
}
}

View File

@@ -104,7 +104,7 @@ data class HypixelPetInfo(
val exp: Double = 0.0,
val candyUsed: Int = 0,
val uuid: UUID? = null,
val active: Boolean = false,
val active: Boolean? = false,
val heldItem: String? = null,
) {
val skyblockId get() = SkyblockId("${type.uppercase()};${tier.ordinal}") // TODO: is this ordinal set up correctly?

View File

@@ -0,0 +1,11 @@
package moe.nea.firmament.util.json
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonPrimitive
fun <T : JsonElement> List<T>.asJsonArray(): JsonArray {
return JsonArray(this)
}
fun Iterable<String>.toJsonArray(): JsonArray = map { JsonPrimitive(it) }.asJsonArray()

View File

@@ -0,0 +1,10 @@
package moe.nea.firmament.util.mc
import net.minecraft.nbt.NbtElement
import net.minecraft.nbt.NbtList
fun Iterable<NbtElement>.toNbtList() = NbtList().also {
for(element in this) {
it.add(element)
}
}

View File

@@ -110,7 +110,7 @@ class SNbtFormatter private constructor() : NbtElementVisitor {
keys.forEachIndexed { index, key ->
writeIndent()
val element = compound[key] ?: error("Key '$key' found but not present in compound: $compound")
val escapedName = if (key.matches(SIMPLE_NAME)) key else NbtString.escape(key)
val escapedName = escapeName(key)
result.append(escapedName).append(": ")
element.accept(this)
if (keys.size != index + 1) {
@@ -134,6 +134,9 @@ class SNbtFormatter private constructor() : NbtElementVisitor {
fun NbtElement.toPrettyString() = prettify(this)
private val SIMPLE_NAME = "[A-Za-z0-9._+-]+".toRegex()
fun escapeName(key: String): String =
if (key.matches(SIMPLE_NAME)) key else NbtString.escape(key)
val SIMPLE_NAME = "[A-Za-z0-9._+-]+".toRegex()
}
}

View File

@@ -56,6 +56,7 @@ fun OrderedText.reconstitute(): MutableText {
return base
}
fun StringVisitable.reconstitute(): MutableText {
val base = Text.literal("")
base.setStyle(Style.EMPTY.withItalic(false))
@@ -82,15 +83,47 @@ val Text.unformattedString: String
val Text.directLiteralStringContent: String? get() = (this.content as? PlainTextContent)?.string()
fun Text.getLegacyFormatString() =
fun Text.getLegacyFormatString(trimmed: Boolean = false): String =
run {
var lastCode = "§r"
val sb = StringBuilder()
fun appendCode(code: String) {
if (code != lastCode || !trimmed) {
sb.append(code)
lastCode = code
}
}
for (component in iterator()) {
sb.append(component.style.color?.toChatFormatting()?.toString() ?: "§r")
if (component.directLiteralStringContent.isNullOrEmpty() && component.siblings.isEmpty()) {
continue
}
appendCode(component.style.let { style ->
var color = style.color?.toChatFormatting()?.toString() ?: "§r"
if (style.isBold)
color += LegacyFormattingCode.BOLD.formattingCode
if (style.isItalic)
color += LegacyFormattingCode.ITALIC.formattingCode
if (style.isUnderlined)
color += LegacyFormattingCode.UNDERLINE.formattingCode
if (style.isObfuscated)
color += LegacyFormattingCode.OBFUSCATED.formattingCode
if (style.isStrikethrough)
color += LegacyFormattingCode.STRIKETHROUGH.formattingCode
color
})
sb.append(component.directLiteralStringContent)
sb.append("§r")
if (!trimmed)
appendCode("§r")
}
sb.toString()
}.also {
var it = it
if (trimmed) {
it = it.removeSuffix("§r")
if (it.length == 2 && it.startsWith("§"))
it = ""
}
it
}
private val textColorLUT = Formatting.entries
@@ -127,7 +160,7 @@ fun MutableText.darkGrey() = withColor(Formatting.DARK_GRAY)
fun MutableText.red() = withColor(Formatting.RED)
fun MutableText.white() = withColor(Formatting.WHITE)
fun MutableText.bold(): MutableText = styled { it.withBold(true) }
fun MutableText.hover(text: Text): MutableText = styled {it.withHoverEvent(HoverEvent.ShowText(text))}
fun MutableText.hover(text: Text): MutableText = styled { it.withHoverEvent(HoverEvent.ShowText(text)) }
fun MutableText.clickCommand(command: String): MutableText {