aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/kotlin/util/json/CodecSerializer.kt26
-rw-r--r--src/texturePacks/java/moe/nea/firmament/features/texturepack/TreeishTextReplacer.kt40
2 files changed, 42 insertions, 24 deletions
diff --git a/src/main/kotlin/util/json/CodecSerializer.kt b/src/main/kotlin/util/json/CodecSerializer.kt
new file mode 100644
index 0000000..9ea08ad
--- /dev/null
+++ b/src/main/kotlin/util/json/CodecSerializer.kt
@@ -0,0 +1,26 @@
+package util.json
+
+import com.mojang.serialization.Codec
+import kotlinx.serialization.KSerializer
+import kotlinx.serialization.descriptors.SerialDescriptor
+import kotlinx.serialization.encoding.Decoder
+import kotlinx.serialization.encoding.Encoder
+import kotlinx.serialization.json.JsonElement
+import moe.nea.firmament.util.json.KJsonOps
+
+abstract class CodecSerializer<T>(val codec: Codec<T>) : KSerializer<T> {
+ override val descriptor: SerialDescriptor
+ get() = JsonElement.serializer().descriptor
+
+ override fun serialize(encoder: Encoder, value: T) {
+ encoder.encodeSerializableValue(
+ JsonElement.serializer(),
+ codec.encodeStart(KJsonOps.INSTANCE, value).orThrow
+ )
+ }
+
+ override fun deserialize(decoder: Decoder): T {
+ return codec.decode(KJsonOps.INSTANCE, decoder.decodeSerializableValue(JsonElement.serializer()))
+ .orThrow.first
+ }
+}
diff --git a/src/texturePacks/java/moe/nea/firmament/features/texturepack/TreeishTextReplacer.kt b/src/texturePacks/java/moe/nea/firmament/features/texturepack/TreeishTextReplacer.kt
index 0a59451..95c277c 100644
--- a/src/texturePacks/java/moe/nea/firmament/features/texturepack/TreeishTextReplacer.kt
+++ b/src/texturePacks/java/moe/nea/firmament/features/texturepack/TreeishTextReplacer.kt
@@ -1,17 +1,12 @@
package moe.nea.firmament.features.texturepack
-import java.lang.StringBuilder
import java.util.regex.Matcher
-import kotlinx.serialization.KSerializer
+import util.json.CodecSerializer
import kotlinx.serialization.Serializable
-import kotlinx.serialization.descriptors.SerialDescriptor
-import kotlinx.serialization.encoding.Decoder
-import kotlinx.serialization.encoding.Encoder
-import kotlinx.serialization.json.JsonElement
+import net.minecraft.text.Style
import net.minecraft.text.Text
import net.minecraft.text.TextCodecs
import moe.nea.firmament.util.directLiteralStringContent
-import moe.nea.firmament.util.json.KJsonOps
import moe.nea.firmament.util.transformEachRecursively
@Serializable
@@ -22,26 +17,12 @@ data class TreeishTextReplacer(
@Serializable
data class SubPartReplacement(
val match: StringMatcher,
+ val style: @Serializable(StyleSerializer::class) Style?,
val replace: @Serializable(TextSerializer::class) Text,
)
- object TextSerializer : KSerializer<Text> {
- override val descriptor: SerialDescriptor
- get() = JsonElement.serializer().descriptor
-
- override fun serialize(encoder: Encoder, value: Text) {
- encoder.encodeSerializableValue(
- JsonElement.serializer(),
- TextCodecs.CODEC.encodeStart(KJsonOps.INSTANCE, value).orThrow
- )
- }
-
- override fun deserialize(decoder: Decoder): Text {
- return TextCodecs.CODEC.decode(KJsonOps.INSTANCE, decoder.decodeSerializableValue(JsonElement.serializer()))
- .orThrow.first
- }
- }
-
+ object TextSerializer : CodecSerializer<Text>(TextCodecs.CODEC)
+ object StyleSerializer : CodecSerializer<Style>(Style.Codecs.CODEC)
companion object {
val pattern = "(?!<\\$([$]{2})*)[$]\\{(?<name>[^}])\\}".toPattern()
fun injectMatchResults(text: Text, matches: Matcher): Text {
@@ -67,6 +48,17 @@ data class TreeishTextReplacer(
var part: Text = part
for (replacement in replacements) {
val rawPartText = part.string
+ replacement.style?.let { expectedStyle ->
+ val parentStyle = part.style
+ val parented = expectedStyle.withParent(parentStyle)
+ if (parented.isStrikethrough != parentStyle.isStrikethrough
+ || parented.isObfuscated != parentStyle.isObfuscated
+ || parented.isBold != parentStyle.isBold
+ || parented.isUnderlined != parentStyle.isUnderlined
+ || parented.isItalic != parentStyle.isItalic
+ || parented.color?.rgb != parentStyle.color?.rgb)
+ continue
+ }
val matcher = replacement.match.asRegex.matcher(rawPartText)
if (!matcher.find()) continue
val p = Text.literal("")