From b47115f94e766818670852b9d533d2afc42554c1 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Tue, 18 Oct 2022 21:55:22 +0200 Subject: [PATCH] trim message types, fix for < 1.19 --- .../generators/MessageTypeGenerator.kt | 52 ++++++++++++++++--- .../kotlin/de/bixilon/pixlyzer/util/Util.kt | 4 +- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MessageTypeGenerator.kt b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MessageTypeGenerator.kt index 5e4fa59..0217b7c 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MessageTypeGenerator.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/generator/generators/MessageTypeGenerator.kt @@ -1,37 +1,59 @@ package de.bixilon.pixlyzer.generator.generators import de.bixilon.pixlyzer.generator.Generator +import de.bixilon.pixlyzer.util.ReflectionUtil.getClass +import de.bixilon.pixlyzer.util.ReflectionUtil.getField import de.bixilon.pixlyzer.util.Util import de.bixilon.pixlyzer.util.Util.JSON_MAP_TYPE import de.bixilon.pixlyzer.util.Util.compound +import de.bixilon.pixlyzer.util.Util.nullCast import net.minecraft.text.Decoration import net.minecraft.text.Decoration.Parameter -import net.minecraft.util.registry.BuiltinRegistries +import net.minecraft.text.Style +import net.minecraft.util.registry.Registry +import java.util.* object MessageTypeGenerator : Generator( - "message_types" + "message_types", + allowedFail = true, + allowEmpty = true, ) { + private val DEFAULT_FONT = Util.MAPPER.convertValue>(Style.DEFAULT_FONT_ID, JSON_MAP_TYPE) + + + val registry = getField(getClass("net.minecraft.util.registry.BuiltinRegistries"), "MESSAGE_TYPE")?.get(null) as Registry? + val messageTypeClass = getClass("net.minecraft.network.message.MessageType") override fun generate() { - val registry = BuiltinRegistries.MESSAGE_TYPE + if (registry == null) { + return + } + for (type in registry) { val identifier = registry.getId(type) val json = compound() json["id"] = registry.getRawId(type) - json["chat"] = type.chat.serialize() - json["narration"] = type.narration.serialize() + getField(messageTypeClass, "chat")?.get(type)?.serializeChat()?.let { json["chat"] = it } + getField(messageTypeClass, "narration")?.get(type)?.nullCast()?.serialize()?.let { json["narration"] = it } this.data[identifier.toString()] = json } } + private fun Any.serializeChat(): Map? { + if (this is Decoration) { + return this.serialize() + } + return getField(this::class.java, "decoration")?.nullCast>()?.get()?.serialize() + } + fun Decoration.serialize(): Map { return mapOf( "translation_key" to translationKey, "parameters" to parameters.serialize(), - "style" to Util.MAPPER.convertValue(style, JSON_MAP_TYPE), + "style" to Util.MAPPER.convertValue>(style, JSON_MAP_TYPE).trimStyle(), ) } @@ -44,4 +66,22 @@ object MessageTypeGenerator : Generator( return output } + + fun MutableMap.trimStyle(): Map { + removeIf("empty") { it == true } + removeIf("underlined") { it == false } + removeIf("strikethrough") { it == false } + removeIf("bold") { it == false } + removeIf("italic") { it == false } + removeIf("obfuscated") { it == false } + removeIf("font") { it == DEFAULT_FONT } + + return this + } + + fun MutableMap.removeIf(key: K, check: (V?) -> Boolean) { + if (check(this[key])) { + remove(key) + } + } } diff --git a/src/main/kotlin/de/bixilon/pixlyzer/util/Util.kt b/src/main/kotlin/de/bixilon/pixlyzer/util/Util.kt index fe06074..f3951a7 100644 --- a/src/main/kotlin/de/bixilon/pixlyzer/util/Util.kt +++ b/src/main/kotlin/de/bixilon/pixlyzer/util/Util.kt @@ -1,5 +1,6 @@ package de.bixilon.pixlyzer.util +import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.type.MapType import net.minecraft.client.MinecraftClient @@ -9,6 +10,7 @@ import java.security.MessageDigest object Util { val MAPPER = ObjectMapper() + .setSerializationInclusion(JsonInclude.Include.NON_NULL) init { MAPPER.setDefaultPrettyPrinter(PrettyPrinter()) @@ -121,7 +123,7 @@ object Util { } fileInputStream.close() - val hash: String = Util.byteArrayToHexString(crypt.digest()) + val hash: String = byteArrayToHexString(crypt.digest()) val outputFile = File(outputPath.replace("\${shortHash}", hash.substring(0, 2)).replace("\${hash}", hash)) outputFile.parentFile.mkdirs()