aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/config/BrokenPaths.java5
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/config/CITResewnMixinConfiguration.java2
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/AbstractFileResourcePackMixin.java49
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/IdentifierMixin.java24
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/ReloadableResourceManagerImplMixin.java33
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/ResourcePackCompatibilityMixin.java26
-rw-r--r--src/main/resources/citresewn.mixins.json1
7 files changed, 139 insertions, 1 deletions
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/config/BrokenPaths.java b/src/main/java/shcm/shsupercm/fabric/citresewn/config/BrokenPaths.java
new file mode 100644
index 0000000..c89e3cb
--- /dev/null
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/config/BrokenPaths.java
@@ -0,0 +1,5 @@
+package shcm.shsupercm.fabric.citresewn.config;
+
+public class BrokenPaths {
+ public static boolean processingBrokenPaths = false;
+}
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/config/CITResewnMixinConfiguration.java b/src/main/java/shcm/shsupercm/fabric/citresewn/config/CITResewnMixinConfiguration.java
index 4247494..29f64e9 100644
--- a/src/main/java/shcm/shsupercm/fabric/citresewn/config/CITResewnMixinConfiguration.java
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/config/CITResewnMixinConfiguration.java
@@ -29,7 +29,7 @@ public class CITResewnMixinConfiguration implements IMixinConfigPlugin {
if (mixinClassName.startsWith("broken_paths"))
return broken_paths;
- if (mixinClassName.equals("core.GroupResourcePackAccessor"))
+ if (mixinClassName.equals("GroupResourcePackAccessor"))
return FabricLoader.getInstance().isModLoaded("fabric-resource-loader-v0");
return true;
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/AbstractFileResourcePackMixin.java b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/AbstractFileResourcePackMixin.java
new file mode 100644
index 0000000..9ad7992
--- /dev/null
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/AbstractFileResourcePackMixin.java
@@ -0,0 +1,49 @@
+package shcm.shsupercm.fabric.citresewn.mixin.broken_paths;
+
+import net.minecraft.resource.AbstractFileResourcePack;
+import net.minecraft.resource.DirectoryResourcePack;
+import net.minecraft.resource.ResourcePack;
+import net.minecraft.resource.ZipResourcePack;
+import net.minecraft.resource.metadata.PackResourceMetadata;
+import net.minecraft.resource.metadata.ResourceMetadataReader;
+import net.minecraft.util.Identifier;
+import net.minecraft.util.InvalidIdentifierException;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.zip.ZipFile;
+
+@Mixin(AbstractFileResourcePack.class)
+public abstract class AbstractFileResourcePackMixin implements ResourcePack {
+ @Shadow @Final protected File base;
+
+ @SuppressWarnings({"unchecked", "ConstantConditions", "EqualsBetweenInconvertibleTypes"})
+ @Inject(method = "parseMetadata(Lnet/minecraft/resource/metadata/ResourceMetadataReader;)Ljava/lang/Object;", cancellable = true, at = @At("RETURN"))
+ public <T extends PackResourceMetadata> void parseMetadata(ResourceMetadataReader<T> metaReader, CallbackInfoReturnable<T> cir) {
+ if (cir.getReturnValue() != null)
+ try {
+ if (this.getClass().equals(ZipResourcePack.class)) {
+ try (ZipFile zipFile = new ZipFile(base)) {
+ zipFile.stream()
+ .forEach(entry -> {
+ if (entry.getName().startsWith("assets"))
+ new Identifier("minecraft", entry.getName());
+ });
+ }
+ } else if (this.getClass().equals(DirectoryResourcePack.class)) {
+ final Path assets = new File(base, "assets").toPath();
+ Files.walk(assets)
+ .forEach(path -> new Identifier("minecraft", assets.relativize(path).toString().replace('\\', '/')));
+ }
+ } catch (InvalidIdentifierException e) {
+ cir.setReturnValue((T) new PackResourceMetadata(cir.getReturnValue().getDescription(), Integer.MAX_VALUE - 53));
+ } catch (Exception ignored) {}
+ }
+}
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/IdentifierMixin.java b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/IdentifierMixin.java
new file mode 100644
index 0000000..0be08f9
--- /dev/null
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/IdentifierMixin.java
@@ -0,0 +1,24 @@
+package shcm.shsupercm.fabric.citresewn.mixin.broken_paths;
+
+import net.minecraft.util.Identifier;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+import shcm.shsupercm.fabric.citresewn.CITResewn;
+
+import static shcm.shsupercm.fabric.citresewn.config.BrokenPaths.processingBrokenPaths;
+
+@Mixin(Identifier.class)
+public class IdentifierMixin {
+ @Inject(method = "isPathValid", cancellable = true, at = @At("RETURN"))
+ private static void processBrokenPaths(String path, CallbackInfoReturnable<Boolean> cir) {
+ if (!processingBrokenPaths)
+ return;
+
+ if (!cir.getReturnValue()) {
+ CITResewn.logWarnLoading("Warning: Encountered broken path: \"" + path + "\"");
+ cir.setReturnValue(true);
+ }
+ }
+}
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/ReloadableResourceManagerImplMixin.java b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/ReloadableResourceManagerImplMixin.java
new file mode 100644
index 0000000..3f54be3
--- /dev/null
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/ReloadableResourceManagerImplMixin.java
@@ -0,0 +1,33 @@
+package shcm.shsupercm.fabric.citresewn.mixin.broken_paths;
+
+import net.minecraft.resource.ReloadableResourceManagerImpl;
+import net.minecraft.resource.ResourcePack;
+import net.minecraft.resource.ResourceReload;
+import net.minecraft.resource.ResourceType;
+import net.minecraft.util.Unit;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+import shcm.shsupercm.fabric.citresewn.CITResewn;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
+
+import static shcm.shsupercm.fabric.citresewn.config.BrokenPaths.processingBrokenPaths;
+
+@Mixin(ReloadableResourceManagerImpl.class)
+public class ReloadableResourceManagerImplMixin {
+ @Shadow @Final private ResourceType type;
+
+ @Inject(method = "reload", at = @At("RETURN"))
+ public void onReload(Executor prepareExecutor, Executor applyExecutor, CompletableFuture<Unit> initialStage, List<ResourcePack> packs, CallbackInfoReturnable<ResourceReload> cir) {
+ if (processingBrokenPaths = this.type == ResourceType.CLIENT_RESOURCES) {
+ CITResewn.LOG.error("[citresewn] Caution! Broken paths is enabled!");
+ cir.getReturnValue().whenComplete().thenRun(() -> processingBrokenPaths = false);
+ }
+ }
+}
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/ResourcePackCompatibilityMixin.java b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/ResourcePackCompatibilityMixin.java
new file mode 100644
index 0000000..f187a56
--- /dev/null
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/broken_paths/ResourcePackCompatibilityMixin.java
@@ -0,0 +1,26 @@
+package shcm.shsupercm.fabric.citresewn.mixin.broken_paths;
+
+import net.minecraft.resource.ResourcePackCompatibility;
+import net.minecraft.resource.ResourceType;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Invoker;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+@Mixin(ResourcePackCompatibility.class)
+public abstract class ResourcePackCompatibilityMixin {
+ private static final ResourcePackCompatibility BROKEN_PATHS = ResourcePackCompatibility("BROKEN_PATHS", -1, "broken_paths");
+
+ @SuppressWarnings("InvokerTarget")
+ @Invoker("<init>")
+ public static ResourcePackCompatibility ResourcePackCompatibility(String internalName, int internalId, String translationSuffix) {
+ throw new AssertionError();
+ }
+
+ @Inject(method = "from(ILnet/minecraft/resource/ResourceType;)Lnet/minecraft/resource/ResourcePackCompatibility;", cancellable = true, at = @At("HEAD"))
+ private static void redirectBrokenPathsCompatibility(int packVersion, ResourceType type, CallbackInfoReturnable<ResourcePackCompatibility> cir) {
+ if (packVersion == Integer.MAX_VALUE - 53)
+ cir.setReturnValue(BROKEN_PATHS);
+ }
+}
diff --git a/src/main/resources/citresewn.mixins.json b/src/main/resources/citresewn.mixins.json
index 394941e..31b8216 100644
--- a/src/main/resources/citresewn.mixins.json
+++ b/src/main/resources/citresewn.mixins.json
@@ -2,6 +2,7 @@
"required": true,
"minVersion": "0.8",
"package": "shcm.shsupercm.fabric.citresewn.mixin",
+ "plugin": "shcm.shsupercm.fabric.citresewn.config.CITResewnMixinConfiguration",
"compatibilityLevel": "JAVA_17",
"injectors": {
"defaultRequire": 1