From b98587980915118fe60666129c18841a8729c095 Mon Sep 17 00:00:00 2001 From: JFronny Date: Thu, 25 Nov 2021 19:15:50 +0100 Subject: [PATCH] rc1, work around a known bug with fabulous shaders --- gradle.properties | 9 ++++----- .../filters/DirFilterEventImpl.java | 17 ++++++++-------- .../filters/FileFilterEventImpl.java | 18 +++++++++-------- .../mixin/GLImportProcessorMixin.java | 3 ++- .../mixin/ResourcePackManagerMixin.java | 12 ++++++++++- .../jfronny/respackopts/util/MetaCache.java | 20 +++++++++++-------- 6 files changed, 48 insertions(+), 31 deletions(-) diff --git a/gradle.properties b/gradle.properties index 25a97f6..fc97e31 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,16 +2,15 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/versions.html -minecraft_version=1.18-pre4 -yarn_mappings=build.9 +minecraft_version=1.18-rc1 +yarn_mappings=build.1 loader_version=0.12.5 # Mod Properties -mod_version=2.8.3 maven_group=io.gitlab.jfronny archives_base_name=respackopts # Dependencies -fabric_version=0.42.7+1.18 -jfapi_version=2.1.4-412595557 +fabric_version=0.43.1+1.18 +jfapi_version=2.1.3-416552327 modrinth_id=TiF5QWZY modrinth_required_dependencies=3CD6YUw1 diff --git a/src/main/java/io/gitlab/jfronny/respackopts/filters/DirFilterEventImpl.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/DirFilterEventImpl.java index 6095a9f..86f3bb5 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/filters/DirFilterEventImpl.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/DirFilterEventImpl.java @@ -2,10 +2,10 @@ package io.gitlab.jfronny.respackopts.filters; import io.gitlab.jfronny.libjf.ResourcePath; import io.gitlab.jfronny.libjf.data.manipulation.api.UserResourceEvents; -import io.gitlab.jfronny.respackopts.util.MetaCache; import io.gitlab.jfronny.respackopts.Respackopts; import io.gitlab.jfronny.respackopts.model.DirRpo; import io.gitlab.jfronny.respackopts.model.enums.PackCapability; +import io.gitlab.jfronny.respackopts.util.MetaCache; import io.gitlab.jfronny.respackopts.util.RpoFormatException; import net.minecraft.resource.ResourcePack; import net.minecraft.util.Identifier; @@ -19,7 +19,7 @@ public class DirFilterEventImpl { public static void init() { UserResourceEvents.OPEN.register((type, id, previous, pack) -> { if (!MetaCache.hasCapability(pack, PackCapability.DirFilter)) - return previous; + return previous.get(); String path = new ResourcePath(type, id).getName(); DirRpo rpo = findDirRpo(pack, path); if (rpo != null && dirHidden(rpo, MetaCache.getId(pack))) { @@ -28,16 +28,17 @@ public class DirFilterEventImpl { ResourcePath rp = new ResourcePath(path); return pack.open(rp.getType(), rp.getId()); } - return previous; + return previous.get(); }); UserResourceEvents.FIND_RESOURCE.register((type, namespace, prefix, maxDepth, pathFilter, previous, pack) -> { // Warning: the Identifiers here DON'T CONTAIN THE TYPE! // Therefore, it needs to be added when calling a method that generates a ResourcePath! + Collection prevVals = previous.get(); if (!MetaCache.hasCapability(pack, PackCapability.DirFilter)) - return previous; - Collection nextRes = new LinkedHashSet<>(previous); + return prevVals; + Collection nextRes = new LinkedHashSet<>(prevVals); boolean dirFilterAdditive = MetaCache.hasCapability(pack, PackCapability.DirFilterAdditive); - for (Identifier identifier : previous) { + for (Identifier identifier : prevVals) { String path = type.getDirectory() + "/" + identifier.getNamespace() + "/" + identifier.getPath(); DirRpo rpo = findDirRpo(pack, path); if (rpo != null) { @@ -66,7 +67,7 @@ public class DirFilterEventImpl { }); UserResourceEvents.CONTAINS.register((type, id, previous, pack) -> { if (!MetaCache.hasCapability(pack, PackCapability.DirFilter)) - return previous; + return previous.get(); String path = new ResourcePath(type, id).getName(); DirRpo rpo = findDirRpo(pack, path); if (rpo != null && dirHidden(rpo, MetaCache.getId(pack))) { @@ -76,7 +77,7 @@ public class DirFilterEventImpl { ResourcePath rp = new ResourcePath(path); return pack.contains(rp.getType(), rp.getId()); } - return previous; + return previous.get(); }); } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/filters/FileFilterEventImpl.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/FileFilterEventImpl.java index e512fbb..3238bde 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/filters/FileFilterEventImpl.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/FileFilterEventImpl.java @@ -11,6 +11,7 @@ import net.minecraft.resource.AbstractFileResourcePack; import net.minecraft.resource.ResourcePack; import net.minecraft.util.Identifier; +import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -28,32 +29,33 @@ public class FileFilterEventImpl { public static void init() { UserResourceEvents.OPEN.register((type, id, previous, pack) -> { - if (skip(pack)) return previous; + if (skip(pack)) return previous.get(); String name = new ResourcePath(type, id).getName(); if (pack.contains(type, id)) { return containsFileWasFallback() ? FileFallbackProvider.getReplacement(pack, name) - : FileExpansionProvider.replace(previous, pack, name); + : FileExpansionProvider.replace(previous.get(), pack, name); } else return null; }); UserResourceEvents.FIND_RESOURCE.register((type, namespace, prefix, maxDepth, pathFilter, previous, pack) -> { // Warning: the Identifiers here DON'T CONTAIN THE TYPE! // Therefore, it needs to be added when calling a method that generates a ResourcePath! - if (skip(pack)) return previous; - previous.removeIf(s -> { + Collection prevVals = previous.get(); + if (skip(pack)) return prevVals; + prevVals.removeIf(s -> { String fileName = type.getDirectory() + "/" + s.getNamespace() + "/" + s.getPath(); return FileExclusionProvider.fileHidden(pack, fileName) && !FileFallbackProvider.fileHasFallback(pack, fileName); }); // Completion of the path is handled separately here - FileFallbackProvider.addFallbackResources(pack, previous, namespace, type); - return previous; + FileFallbackProvider.addFallbackResources(pack, prevVals, namespace, type); + return prevVals; }); UserResourceEvents.CONTAINS.register((type, id, previous, pack) -> { - if (skip(pack)) return previous; + if (skip(pack)) return previous.get(); containsFileWasFallback(false); String name = new ResourcePath(type, id).getName(); - if (previous) { + if (previous.get()) { if (FileExclusionProvider.fileHidden(pack, name)) { if (FileFallbackProvider.fileHasFallback(pack, name)) { containsFileWasFallback(true); diff --git a/src/main/java/io/gitlab/jfronny/respackopts/mixin/GLImportProcessorMixin.java b/src/main/java/io/gitlab/jfronny/respackopts/mixin/GLImportProcessorMixin.java index 8817bbe..f0e8b8c 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/mixin/GLImportProcessorMixin.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/mixin/GLImportProcessorMixin.java @@ -8,8 +8,9 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; @Mixin(GLImportProcessor.class) public class GLImportProcessorMixin { + private static final String respackopts$prefix = "\n//include " + Respackopts.RPO_SHADER_ID; @ModifyArg(method = "readSource(Ljava/lang/String;)Ljava/util/List;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/GLImportProcessor;parseImports(Ljava/lang/String;Lnet/minecraft/client/gl/GLImportProcessor$Context;Ljava/lang/String;)Ljava/util/List;"), index = 0) private String modify(String value) { - return value.replace("\n//include " + Respackopts.RPO_SHADER_ID, "\n" + Respackopts.getShaderImportSource()); + return value.replace(respackopts$prefix, "\n" + Respackopts.getShaderImportSource()); } } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackManagerMixin.java b/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackManagerMixin.java index 1d6e3ce..d46dfcc 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackManagerMixin.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackManagerMixin.java @@ -6,6 +6,7 @@ import io.gitlab.jfronny.respackopts.model.PackMeta; import net.minecraft.resource.*; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -13,15 +14,19 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.file.Path; +import java.util.HashSet; import java.util.Map; +import java.util.Set; @Mixin(ResourcePackManager.class) public class ResourcePackManagerMixin { @Shadow private Map profiles; + @Unique private final Set packIds = new HashSet<>(); @Inject(at = @At("TAIL"), method = "scanPacks()V") private void scanPacks(CallbackInfo info) { - MetaCache.clear(); + Set toRemove = new HashSet<>(packIds); + packIds.clear(); profiles.forEach((s, v) -> { ResourcePack rpi = v.createResourcePack(); ResourceType packConfType = null; @@ -49,11 +54,16 @@ public class ResourcePackManagerMixin { else { MetaCache.addFromScan(displayName, packName, conf, Respackopts.FALLBACK_CONF_DIR.resolve(conf.id + ".json")); } + packIds.add(conf.id); + toRemove.remove(conf.id); } catch (Throwable e) { Respackopts.LOGGER.error("Could not initialize pack meta for " + s, e); } } }); + for (String s : toRemove) { + MetaCache.remove(s); + } MetaCache.save(); } } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/util/MetaCache.java b/src/main/java/io/gitlab/jfronny/respackopts/util/MetaCache.java index 589ad54..1c0d870 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/util/MetaCache.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/util/MetaCache.java @@ -28,14 +28,14 @@ public class MetaCache { private static final Map PACK_NAME_LOOKUP = new HashMap<>(); // pack name -> pack id public static final Map> DIR_RPOS = new HashMap<>(); // pack id -> .rpo path -> parsed .rpo public static final Map> FILE_RPOS = new HashMap<>(); // pack id -> .rpo path -> parsed .rpo - public static void clear() { - CONFIG_BRANCH.clear(); - PACK_METAS.clear(); - DATA_LOCATIONS.clear(); - DISPLAY_NAME_LOOKUP.clear(); - PACK_NAME_LOOKUP.clear(); - DIR_RPOS.clear(); - FILE_RPOS.clear(); + public static void remove(String packId) { + CONFIG_BRANCH.remove(packId); + PACK_METAS.remove(packId); + DATA_LOCATIONS.remove(packId); + DISPLAY_NAME_LOOKUP.remove(packId); + //PACK_NAME_LOOKUP + DIR_RPOS.remove(packId); + FILE_RPOS.remove(packId); } public static void addFromScan(String displayName, String packName, PackMeta meta, Path dataLocation) { @@ -44,6 +44,7 @@ public class MetaCache { } meta.conf.setVersion(meta.version); if (meta.version < 5) meta.capabilities.add(PackCapability.DirFilter); + remove(meta.id); if (CONFIG_BRANCH.containsKey(meta.id)) CONFIG_BRANCH.get(meta.id).sync(meta.conf, ConfigSyncMode.RESPACK_LOAD); else @@ -128,6 +129,9 @@ public class MetaCache { public static boolean hasCapability(ResourcePack pack, PackCapability capability) { String id = getId(pack); if (id == null) return false; + if (!PACK_METAS.containsKey(id)) { + throw new NullPointerException("Could not get pack \"" + id + "\" (available: " + String.join(", ", PACK_METAS.keySet()) + ")"); + } return PACK_METAS.get(id).capabilities.contains(capability); }