feat: Add *base64 and *json nbt path matchers

This commit is contained in:
Linnea Gräf
2025-05-04 14:18:24 +02:00
parent afa128e8c6
commit 3743ae88d9
3 changed files with 80 additions and 3 deletions

View File

@@ -1,7 +1,14 @@
package moe.nea.firmament.util
import java.util.Base64
object Base64Util {
fun decodeString(str: String): String {
return Base64.getDecoder().decode(str.padToValidBase64())
.decodeToString()
}
fun String.padToValidBase64(): String {
val align = this.length % 4
if (align == 0) return this

View File

@@ -1,10 +1,12 @@
package moe.nea.firmament.features.texturepack.predicates
import com.google.gson.Gson
import com.google.gson.JsonArray
import com.google.gson.JsonElement
import com.google.gson.JsonObject
import com.google.gson.JsonPrimitive
import com.mojang.serialization.JsonOps
import kotlin.jvm.optionals.getOrDefault
import moe.nea.firmament.features.texturepack.FirmamentModelPredicate
import moe.nea.firmament.features.texturepack.FirmamentModelPredicateParser
import moe.nea.firmament.features.texturepack.StringMatcher
@@ -17,8 +19,10 @@ import net.minecraft.nbt.NbtFloat
import net.minecraft.nbt.NbtInt
import net.minecraft.nbt.NbtList
import net.minecraft.nbt.NbtLong
import net.minecraft.nbt.NbtOps
import net.minecraft.nbt.NbtShort
import net.minecraft.nbt.NbtString
import moe.nea.firmament.util.Base64Util
import moe.nea.firmament.util.extraAttributes
fun interface NbtMatcher {
@@ -261,6 +265,20 @@ class NbtPrism(val path: List<String>) {
var switch = mutableListOf<NbtElement>()
for (pathSegment in path) {
if (pathSegment == ".") continue
if (pathSegment != "*" && pathSegment.startsWith("*")) {
if (pathSegment == "*json") {
for (element in rootSet) {
val eString = element.asString() ?: continue
val element = Gson().fromJson(eString, JsonElement::class.java)
switch.add(JsonOps.INSTANCE.convertTo(NbtOps.INSTANCE, element))
}
} else if (pathSegment == "*base64") {
for (element in rootSet) {
val string = element.asString() ?: continue
switch.add(NbtString.of(Base64Util.decodeString(string)))
}
}
}
for (element in rootSet) {
if (element is NbtList) {
if (pathSegment == "*")