From ff957c5af42248d61dc05e02b74f8250d6bcaadd Mon Sep 17 00:00:00 2001 From: belle Date: Thu, 8 Oct 2026 19:07:17 +0000 Subject: [PATCH 1/3] Create PackMetadataMixin.java --- .../resourcepacks/PackMetadataMixin.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/dev/rdh/sarcio/mixin/resourcepacks/PackMetadataMixin.java diff --git a/src/main/java/dev/rdh/sarcio/mixin/resourcepacks/PackMetadataMixin.java b/src/main/java/dev/rdh/sarcio/mixin/resourcepacks/PackMetadataMixin.java new file mode 100644 index 0000000..d7e30c9 --- /dev/null +++ b/src/main/java/dev/rdh/sarcio/mixin/resourcepacks/PackMetadataMixin.java @@ -0,0 +1,29 @@ +package dev.rdh.sarcio; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import net.minecraft.client.resource.pack.CustomResourcePack; +import net.ornithemc.osl.resource.loader.impl.resource.JsonResourceMetadata; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin({CustomResourcePack.class, JsonResourceMetadata.class}) +public abstract class PackMetadataMixin { + @ModifyVariable( + method = { + "getMetadataSection", + "fromInputStream(Ljava/io/InputStream;)Lnet/ornithemc/osl/resource/loader/impl/resource/JsonResourceMetadata;" + }, + at = @At("HEAD"), + argsOnly = true + ) + private static InputStream sarcio$dropUnknownEscapes(InputStream in) throws IOException { + try (InputStream stream = in) { + String json = new String(stream.readAllBytes(), StandardCharsets.UTF_8); + return new ByteArrayInputStream(json.replaceAll("(\\\\[\"\\\\/bfnrtu'\\n])|\\\\", "$1").getBytes(StandardCharsets.UTF_8)); + } + } +} From 97e8aaa8dd90f5f261b271da79215a5af8d70c59 Mon Sep 17 00:00:00 2001 From: belle Date: Thu, 8 Oct 2026 19:07:46 +0000 Subject: [PATCH 2/3] Update sarcio.mixins.json --- src/main/resources/sarcio.mixins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/sarcio.mixins.json b/src/main/resources/sarcio.mixins.json index dfe3126..556184c 100644 --- a/src/main/resources/sarcio.mixins.json +++ b/src/main/resources/sarcio.mixins.json @@ -132,6 +132,7 @@ "resourcepacks.CustomResourcePackMixin", "resourcepacks.BuiltInResourcePackMixin", "resourcepacks.AssetIndexMixin", + "resourcepacks.PackMetadataMixin", "textures.TextureManagerMixin", "textures.TextureUtilMixin", "textures.HttpTextureMixin", From 8fb97c1ccc777b757ad848d48c54b4db4410744d Mon Sep 17 00:00:00 2001 From: awruff Date: Thu, 8 Oct 2026 19:18:40 +0000 Subject: [PATCH 3/3] refactor(resourcepacks): split PackMetadataMixin into one mixin per target --- .../CustomResourcePackMetadataMixin.java | 23 +++++++++++++++ .../JsonResourceMetadataMixin.java | 23 +++++++++++++++ .../resourcepacks/PackMetadataMixin.java | 29 ------------------- .../java/dev/rdh/sarcio/util/LenientJson.java | 20 +++++++++++++ src/main/resources/sarcio.mixins.json | 3 +- 5 files changed, 68 insertions(+), 30 deletions(-) create mode 100644 src/main/java/dev/rdh/sarcio/mixin/resourcepacks/CustomResourcePackMetadataMixin.java create mode 100644 src/main/java/dev/rdh/sarcio/mixin/resourcepacks/JsonResourceMetadataMixin.java delete mode 100644 src/main/java/dev/rdh/sarcio/mixin/resourcepacks/PackMetadataMixin.java create mode 100644 src/main/java/dev/rdh/sarcio/util/LenientJson.java diff --git a/src/main/java/dev/rdh/sarcio/mixin/resourcepacks/CustomResourcePackMetadataMixin.java b/src/main/java/dev/rdh/sarcio/mixin/resourcepacks/CustomResourcePackMetadataMixin.java new file mode 100644 index 0000000..df9b661 --- /dev/null +++ b/src/main/java/dev/rdh/sarcio/mixin/resourcepacks/CustomResourcePackMetadataMixin.java @@ -0,0 +1,23 @@ +package dev.rdh.sarcio.mixin.resourcepacks; + +import dev.rdh.sarcio.util.LenientJson; + +import net.minecraft.client.resource.pack.CustomResourcePack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import java.io.IOException; +import java.io.InputStream; + +@Mixin(CustomResourcePack.class) +abstract class CustomResourcePackMetadataMixin { + @ModifyVariable( + method = "getMetadataSection(Lnet/minecraft/client/resource/metadata/ResourceMetadataSerializers;Ljava/io/InputStream;Ljava/lang/String;)Lnet/minecraft/client/resource/metadata/ResourceMetadataSection;", + at = @At("HEAD"), + argsOnly = true + ) + private static InputStream sarcio$dropUnknownEscapes(InputStream in) throws IOException { + return LenientJson.dropUnknownEscapes(in); + } +} diff --git a/src/main/java/dev/rdh/sarcio/mixin/resourcepacks/JsonResourceMetadataMixin.java b/src/main/java/dev/rdh/sarcio/mixin/resourcepacks/JsonResourceMetadataMixin.java new file mode 100644 index 0000000..32a8944 --- /dev/null +++ b/src/main/java/dev/rdh/sarcio/mixin/resourcepacks/JsonResourceMetadataMixin.java @@ -0,0 +1,23 @@ +package dev.rdh.sarcio.mixin.resourcepacks; + +import dev.rdh.sarcio.util.LenientJson; + +import net.ornithemc.osl.resource.loader.impl.resource.JsonResourceMetadata; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import java.io.IOException; +import java.io.InputStream; + +@Mixin(JsonResourceMetadata.class) +abstract class JsonResourceMetadataMixin { + @ModifyVariable( + method = "fromInputStream(Ljava/io/InputStream;)Lnet/ornithemc/osl/resource/loader/impl/resource/JsonResourceMetadata;", + at = @At("HEAD"), + argsOnly = true + ) + private static InputStream sarcio$dropUnknownEscapes(InputStream is) throws IOException { + return LenientJson.dropUnknownEscapes(is); + } +} diff --git a/src/main/java/dev/rdh/sarcio/mixin/resourcepacks/PackMetadataMixin.java b/src/main/java/dev/rdh/sarcio/mixin/resourcepacks/PackMetadataMixin.java deleted file mode 100644 index d7e30c9..0000000 --- a/src/main/java/dev/rdh/sarcio/mixin/resourcepacks/PackMetadataMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package dev.rdh.sarcio; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import net.minecraft.client.resource.pack.CustomResourcePack; -import net.ornithemc.osl.resource.loader.impl.resource.JsonResourceMetadata; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - -@Mixin({CustomResourcePack.class, JsonResourceMetadata.class}) -public abstract class PackMetadataMixin { - @ModifyVariable( - method = { - "getMetadataSection", - "fromInputStream(Ljava/io/InputStream;)Lnet/ornithemc/osl/resource/loader/impl/resource/JsonResourceMetadata;" - }, - at = @At("HEAD"), - argsOnly = true - ) - private static InputStream sarcio$dropUnknownEscapes(InputStream in) throws IOException { - try (InputStream stream = in) { - String json = new String(stream.readAllBytes(), StandardCharsets.UTF_8); - return new ByteArrayInputStream(json.replaceAll("(\\\\[\"\\\\/bfnrtu'\\n])|\\\\", "$1").getBytes(StandardCharsets.UTF_8)); - } - } -} diff --git a/src/main/java/dev/rdh/sarcio/util/LenientJson.java b/src/main/java/dev/rdh/sarcio/util/LenientJson.java new file mode 100644 index 0000000..709f4e6 --- /dev/null +++ b/src/main/java/dev/rdh/sarcio/util/LenientJson.java @@ -0,0 +1,20 @@ +package dev.rdh.sarcio.util; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.regex.Pattern; + +public class LenientJson { + private static final Pattern VALID_ESCAPE_OR_STRAY_BACKSLASH = Pattern.compile("(\\\\[\"\\\\/bfnrtu'\\n])|\\\\"); + private static final String KEEP_VALID_ESCAPE = "$1"; + + public static InputStream dropUnknownEscapes(InputStream in) throws IOException { + try (InputStream stream = in) { + String json = new String(stream.readAllBytes(), StandardCharsets.UTF_8); + String cleaned = VALID_ESCAPE_OR_STRAY_BACKSLASH.matcher(json).replaceAll(KEEP_VALID_ESCAPE); + return new ByteArrayInputStream(cleaned.getBytes(StandardCharsets.UTF_8)); + } + } +} diff --git a/src/main/resources/sarcio.mixins.json b/src/main/resources/sarcio.mixins.json index 556184c..9033eaf 100644 --- a/src/main/resources/sarcio.mixins.json +++ b/src/main/resources/sarcio.mixins.json @@ -132,7 +132,8 @@ "resourcepacks.CustomResourcePackMixin", "resourcepacks.BuiltInResourcePackMixin", "resourcepacks.AssetIndexMixin", - "resourcepacks.PackMetadataMixin", + "resourcepacks.CustomResourcePackMetadataMixin", + "resourcepacks.JsonResourceMetadataMixin", "textures.TextureManagerMixin", "textures.TextureUtilMixin", "textures.HttpTextureMixin",