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/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 dfe3126..9033eaf 100644 --- a/src/main/resources/sarcio.mixins.json +++ b/src/main/resources/sarcio.mixins.json @@ -132,6 +132,8 @@ "resourcepacks.CustomResourcePackMixin", "resourcepacks.BuiltInResourcePackMixin", "resourcepacks.AssetIndexMixin", + "resourcepacks.CustomResourcePackMetadataMixin", + "resourcepacks.JsonResourceMetadataMixin", "textures.TextureManagerMixin", "textures.TextureUtilMixin", "textures.HttpTextureMixin",