feat: Add 1.8.9 item exporter
This commit is contained in:
103
src/main/kotlin/util/LegacyTagWriter.kt
Normal file
103
src/main/kotlin/util/LegacyTagWriter.kt
Normal 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(' ')
|
||||
}
|
||||
}
|
||||
@@ -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?
|
||||
|
||||
11
src/main/kotlin/util/json/KJsonUtils.kt
Normal file
11
src/main/kotlin/util/json/KJsonUtils.kt
Normal 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()
|
||||
10
src/main/kotlin/util/mc/NbtUtil.kt
Normal file
10
src/main/kotlin/util/mc/NbtUtil.kt
Normal 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)
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user