From 685fe0900e84313bceb75a1c5d143e6c1aa5457c Mon Sep 17 00:00:00 2001 From: JFronny <33260128+jfronny@users.noreply.github.com> Date: Mon, 15 Feb 2021 11:44:59 +0100 Subject: [PATCH] Add .fbt fallback textures --- README.md | 10 ++- build.gradle | 9 ++- gradle.properties | 9 +-- .../lumi/assets/minecraft/lang/en_us.json.fbt | 3 + .../assets/minecraft/lang/en_us_joke.json | 9 +++ .../assets/minecraft/lang/en_us_joke.json.rpo | 5 ++ .../lumi/assets/respackopts/conf.json | 3 +- .../jfronny/respackopts/Respackopts.java | 3 +- .../abstractions/FileOpenProvider.java | 8 +++ .../respackopts/filters/FilterProvider.java | 59 +++++++++++++++ .../conditions/AndCondition.java | 2 +- .../{ => filters}/conditions/Condition.java | 2 +- .../conditions/ConditionEvaluator.java | 2 +- .../conditions/EqualityCondition.java | 2 +- .../conditions/NorCondition.java | 2 +- .../{ => filters}/conditions/OrCondition.java | 2 +- .../conditions/ResourcePackFilter.java | 10 +-- .../{ => filters}/conditions/SyntaxError.java | 2 +- .../conditions/XorCondition.java | 2 +- .../filters/fallback/FallbackFilter.java | 71 +++++++++++++++++++ .../respackopts/integration/LibCDCompat.java | 3 +- .../integration/ModMenuCompat.java | 4 +- .../DirectoryResourcePackMixin.java | 26 ++----- .../conditions/ZipResourcePackMixin.java | 29 +++----- 24 files changed, 206 insertions(+), 71 deletions(-) create mode 100644 run/resourcepacks/lumi/assets/minecraft/lang/en_us.json.fbt create mode 100644 run/resourcepacks/lumi/assets/minecraft/lang/en_us_joke.json create mode 100644 run/resourcepacks/lumi/assets/minecraft/lang/en_us_joke.json.rpo create mode 100644 src/main/java/io/gitlab/jfronny/respackopts/abstractions/FileOpenProvider.java create mode 100644 src/main/java/io/gitlab/jfronny/respackopts/filters/FilterProvider.java rename src/main/java/io/gitlab/jfronny/respackopts/{ => filters}/conditions/AndCondition.java (93%) rename src/main/java/io/gitlab/jfronny/respackopts/{ => filters}/conditions/Condition.java (75%) rename src/main/java/io/gitlab/jfronny/respackopts/{ => filters}/conditions/ConditionEvaluator.java (97%) rename src/main/java/io/gitlab/jfronny/respackopts/{ => filters}/conditions/EqualityCondition.java (94%) rename src/main/java/io/gitlab/jfronny/respackopts/{ => filters}/conditions/NorCondition.java (92%) rename src/main/java/io/gitlab/jfronny/respackopts/{ => filters}/conditions/OrCondition.java (92%) rename src/main/java/io/gitlab/jfronny/respackopts/{ => filters}/conditions/ResourcePackFilter.java (72%) rename src/main/java/io/gitlab/jfronny/respackopts/{ => filters}/conditions/SyntaxError.java (67%) rename src/main/java/io/gitlab/jfronny/respackopts/{ => filters}/conditions/XorCondition.java (92%) create mode 100644 src/main/java/io/gitlab/jfronny/respackopts/filters/fallback/FallbackFilter.java diff --git a/README.md b/README.md index c7a36c7..9b63a62 100644 --- a/README.md +++ b/README.md @@ -46,8 +46,14 @@ There have been issues with LibCD in development, so it might be smart not to us Respackopts allows creating conditional resources by creating a file named `{targetFile}.rpo`.\ This file is a json file that contains an array named "conditions". The resource will be ignored if any of the conditions are not met.\ This allows (for example) overrides for textures to only be loaded if the user enables them through the config.\ -It also allows the following operations: `and`, `equal`, `nor`/`not`, `or`, `xor` -As an example can be seen [here](https://gitlab.com/JFronny/respackopts/-/tree/master/run/resourcepacks/lumi/assets/minecraft/lang) +It also allows the following operations: `and`, `equal`, `nor`/`not`, `or`, `xor`.\ +An example can be seen [here](https://gitlab.com/JFronny/respackopts/-/tree/master/run/resourcepacks/lumi/assets/minecraft/lang) +### Fallback resources +Respackopts allows creating fallbacks for resources if they are unavailable/disabled.\ +To do this, create a file named `{targetFile}.fbt`.\ +This file should contain a simple json array where each element is a reference to a possible fallback file.\ +Use this in conjunction with the conditional resources feature in order to create multiple options for a single texture.\ +An example can be seen [here](https://gitlab.com/JFronny/respackopts/-/tree/master/run/resourcepacks/lumi/assets/minecraft/lang) ## Mod developers All data is available in static HashMaps in `io.gitlab.jfronny.respackopts.Respackopts`.\ To save information, call `Respackopts.save()`, `Respackopts.load()` to load. diff --git a/build.gradle b/build.gradle index eb078f2..c5e72a8 100644 --- a/build.gradle +++ b/build.gradle @@ -26,19 +26,22 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" // Fabric API. This is technically optional, but you probably want it anyway. - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + modImplementation "net.fabricmc.fabric-api:fabric-api:0.30.3+1.16" // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs. // You may need to force-disable transitiveness on them. - modCompile("com.terraformersmc:modmenu:1.14.15") + modCompile("com.terraformersmc:modmenu:1.16.7") include modApi("me.shedaniel.cloth:config-2:4.8.3") { exclude(group: "net.fabricmc.fabric-api") + exclude(group: "io.github.prospector") } modApi "io.github.cottonmc:LibCD:3.0.3+1.16.3" modCompile "grondag:frex-mc116:4.0+" - modCompile "grondag:canvas-mc116:1.0.+" + modCompile("grondag:canvas-mc116:1.0.+") { + exclude(group: "io.github.prospector") + } } processResources { diff --git a/gradle.properties b/gradle.properties index 4cfab72..1c8136f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,12 +3,9 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://modmuss50.me/fabric.html minecraft_version=1.16.5 -yarn_mappings=1.16.5+build.3 +yarn_mappings=1.16.5+build.4 loader_version=0.11.1 # Mod Properties -mod_version=1.3.1 +mod_version=1.4.0 maven_group=io.gitlab.jfronny -archives_base_name=respackopts -# Dependencies -# check this on https://modmuss50.me/fabric.html -fabric_version=0.29.4+1.16 +archives_base_name=respackopts \ No newline at end of file diff --git a/run/resourcepacks/lumi/assets/minecraft/lang/en_us.json.fbt b/run/resourcepacks/lumi/assets/minecraft/lang/en_us.json.fbt new file mode 100644 index 0000000..6d1a471 --- /dev/null +++ b/run/resourcepacks/lumi/assets/minecraft/lang/en_us.json.fbt @@ -0,0 +1,3 @@ +[ + "assets/minecraft/lang/en_us_joke.json" +] \ No newline at end of file diff --git a/run/resourcepacks/lumi/assets/minecraft/lang/en_us_joke.json b/run/resourcepacks/lumi/assets/minecraft/lang/en_us_joke.json new file mode 100644 index 0000000..3595689 --- /dev/null +++ b/run/resourcepacks/lumi/assets/minecraft/lang/en_us_joke.json @@ -0,0 +1,9 @@ +{ + "respackopts.title.lumi": "Not Lumi Lights", + "respackopts.field.lumi.tonemap": "Not Tonemap mode", + "respackopts.tooltip.lumi.tonemap": "Not Tooltip test", + "respackopts.field.lumi.pbr": "Not Enable PBR", + "respackopts.field.lumi.debugMode": "Not Debug Mode", + "respackopts.field.lumi.waterVertexWavy": "Not Wavy water model", + "respackopts.tooltip.lumi.subcategoryTest.sliderTest": "Not Yayyy" +} \ No newline at end of file diff --git a/run/resourcepacks/lumi/assets/minecraft/lang/en_us_joke.json.rpo b/run/resourcepacks/lumi/assets/minecraft/lang/en_us_joke.json.rpo new file mode 100644 index 0000000..db32235 --- /dev/null +++ b/run/resourcepacks/lumi/assets/minecraft/lang/en_us_joke.json.rpo @@ -0,0 +1,5 @@ +{ + "conditions": [ + "lumi:subcategoryTest.enableLangJokeFallback" + ] +} \ No newline at end of file diff --git a/run/resourcepacks/lumi/assets/respackopts/conf.json b/run/resourcepacks/lumi/assets/respackopts/conf.json index e7e4106..0b4acda 100644 --- a/run/resourcepacks/lumi/assets/respackopts/conf.json +++ b/run/resourcepacks/lumi/assets/respackopts/conf.json @@ -32,7 +32,8 @@ "max": 20 }, "enableLang": true, - "enableLangForceDisable": false + "enableLangForceDisable": false, + "enableLangJokeFallback": true } } } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java b/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java index b2d6703..642afeb 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java @@ -2,7 +2,6 @@ package io.gitlab.jfronny.respackopts; import com.google.gson.Gson; import com.google.gson.JsonObject; -import io.gitlab.jfronny.respackopts.conditions.SyntaxError; import io.gitlab.jfronny.respackopts.data.Config; import io.gitlab.jfronny.respackopts.data.Respackmeta; import net.fabricmc.api.ClientModInitializer; @@ -16,7 +15,6 @@ import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; @Environment(EnvType.CLIENT) public class Respackopts implements ClientModInitializer { @@ -32,6 +30,7 @@ public class Respackopts implements ClientModInitializer { static final Path p = FabricLoader.getInstance().getConfigDir().resolve("respackopts"); public static final Set saveActions = new HashSet<>(); public static final String fileExtension = ".rpo"; + public static final String fallbackTextureExtension = ".fbt"; public static boolean forceRespackReload = false; public static final Logger logger = LogManager.getFormatterLogger(ID); @Override diff --git a/src/main/java/io/gitlab/jfronny/respackopts/abstractions/FileOpenProvider.java b/src/main/java/io/gitlab/jfronny/respackopts/abstractions/FileOpenProvider.java new file mode 100644 index 0000000..93a4265 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/respackopts/abstractions/FileOpenProvider.java @@ -0,0 +1,8 @@ +package io.gitlab.jfronny.respackopts.abstractions; + +import java.io.IOException; +import java.io.InputStream; + +public interface FileOpenProvider { + InputStream open(String file) throws IOException; +} diff --git a/src/main/java/io/gitlab/jfronny/respackopts/filters/FilterProvider.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/FilterProvider.java new file mode 100644 index 0000000..ed5672b --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/FilterProvider.java @@ -0,0 +1,59 @@ +package io.gitlab.jfronny.respackopts.filters; + +import io.gitlab.jfronny.respackopts.Respackopts; +import io.gitlab.jfronny.respackopts.abstractions.FileOpenProvider; +import io.gitlab.jfronny.respackopts.filters.conditions.ResourcePackFilter; +import io.gitlab.jfronny.respackopts.filters.fallback.FallbackFilter; +import net.minecraft.resource.ResourceNotFoundException; +import net.minecraft.resource.ResourceType; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collection; +import java.util.function.Predicate; + +public class FilterProvider { + ResourcePackFilter rpo; + FallbackFilter fbt; + Predicate containsFileBase; + boolean containsFileWasFallback = false; + public FilterProvider(Predicate containsFileBase, FileOpenProvider openFileBase) { + this.containsFileBase = containsFileBase; + rpo = new ResourcePackFilter(containsFileBase, openFileBase); + fbt = new FallbackFilter(containsFileBase, openFileBase); + } + + public void openFile(String name, File base, CallbackInfoReturnable info) throws IOException { + if (containsFileBase.test(name) && containsFileWasFallback) { + info.setReturnValue(fbt.getReplacement(name, new ResourceNotFoundException(base, name))); + } + } + + public void containsFile(String name, CallbackInfoReturnable info) { + containsFileWasFallback = false; + if (info.getReturnValueZ()) { + if (!rpo.fileVisible(name)) { + if (fbt.fileVisible(name)) { + containsFileWasFallback = true; + } else { + info.setReturnValue(false); + } + } + } + else { + if (!name.endsWith(Respackopts.fallbackTextureExtension) && fbt.fileVisible(name)) { + containsFileWasFallback = true; + info.setReturnValue(true); + } + } + } + + public void findResources(ResourceType type, String namespace, String prefix, int maxDepth, Predicate pathFilter, CallbackInfoReturnable> info) { + Collection ret = info.getReturnValue(); + ret.removeIf(s -> !rpo.fileVisible(s.getPath()) && !fbt.fileVisible(namespace)); + fbt.addFallbackResources(ret, namespace); + } +} diff --git a/src/main/java/io/gitlab/jfronny/respackopts/conditions/AndCondition.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/AndCondition.java similarity index 93% rename from src/main/java/io/gitlab/jfronny/respackopts/conditions/AndCondition.java rename to src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/AndCondition.java index 196ddb7..06912b8 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/conditions/AndCondition.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/AndCondition.java @@ -1,4 +1,4 @@ -package io.gitlab.jfronny.respackopts.conditions; +package io.gitlab.jfronny.respackopts.filters.conditions; import com.google.gson.JsonElement; diff --git a/src/main/java/io/gitlab/jfronny/respackopts/conditions/Condition.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/Condition.java similarity index 75% rename from src/main/java/io/gitlab/jfronny/respackopts/conditions/Condition.java rename to src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/Condition.java index 92c0819..675b612 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/conditions/Condition.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/Condition.java @@ -1,4 +1,4 @@ -package io.gitlab.jfronny.respackopts.conditions; +package io.gitlab.jfronny.respackopts.filters.conditions; import com.google.gson.JsonElement; diff --git a/src/main/java/io/gitlab/jfronny/respackopts/conditions/ConditionEvaluator.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/ConditionEvaluator.java similarity index 97% rename from src/main/java/io/gitlab/jfronny/respackopts/conditions/ConditionEvaluator.java rename to src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/ConditionEvaluator.java index 0b9baf4..477fad1 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/conditions/ConditionEvaluator.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/ConditionEvaluator.java @@ -1,4 +1,4 @@ -package io.gitlab.jfronny.respackopts.conditions; +package io.gitlab.jfronny.respackopts.filters.conditions; import com.google.gson.JsonElement; import io.gitlab.jfronny.respackopts.Respackopts; diff --git a/src/main/java/io/gitlab/jfronny/respackopts/conditions/EqualityCondition.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/EqualityCondition.java similarity index 94% rename from src/main/java/io/gitlab/jfronny/respackopts/conditions/EqualityCondition.java rename to src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/EqualityCondition.java index 30f5e60..d307a79 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/conditions/EqualityCondition.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/EqualityCondition.java @@ -1,4 +1,4 @@ -package io.gitlab.jfronny.respackopts.conditions; +package io.gitlab.jfronny.respackopts.filters.conditions; import com.google.gson.JsonElement; diff --git a/src/main/java/io/gitlab/jfronny/respackopts/conditions/NorCondition.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/NorCondition.java similarity index 92% rename from src/main/java/io/gitlab/jfronny/respackopts/conditions/NorCondition.java rename to src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/NorCondition.java index 4011eaa..b673522 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/conditions/NorCondition.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/NorCondition.java @@ -1,4 +1,4 @@ -package io.gitlab.jfronny.respackopts.conditions; +package io.gitlab.jfronny.respackopts.filters.conditions; import com.google.gson.JsonElement; diff --git a/src/main/java/io/gitlab/jfronny/respackopts/conditions/OrCondition.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/OrCondition.java similarity index 92% rename from src/main/java/io/gitlab/jfronny/respackopts/conditions/OrCondition.java rename to src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/OrCondition.java index f3e575e..62ba94d 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/conditions/OrCondition.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/OrCondition.java @@ -1,4 +1,4 @@ -package io.gitlab.jfronny.respackopts.conditions; +package io.gitlab.jfronny.respackopts.filters.conditions; import com.google.gson.JsonElement; diff --git a/src/main/java/io/gitlab/jfronny/respackopts/conditions/ResourcePackFilter.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/ResourcePackFilter.java similarity index 72% rename from src/main/java/io/gitlab/jfronny/respackopts/conditions/ResourcePackFilter.java rename to src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/ResourcePackFilter.java index 673e124..918617e 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/conditions/ResourcePackFilter.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/ResourcePackFilter.java @@ -1,18 +1,18 @@ -package io.gitlab.jfronny.respackopts.conditions; +package io.gitlab.jfronny.respackopts.filters.conditions; import com.google.gson.JsonElement; import io.gitlab.jfronny.respackopts.Respackopts; +import io.gitlab.jfronny.respackopts.abstractions.FileOpenProvider; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; -import java.util.function.Function; import java.util.function.Predicate; public class ResourcePackFilter { Predicate containsFileBase; - Function openFileBase; - public ResourcePackFilter(Predicate containsFileBase, Function openFileBase) { + FileOpenProvider openFileBase; + public ResourcePackFilter(Predicate containsFileBase, FileOpenProvider openFileBase) { this.containsFileBase = containsFileBase; this.openFileBase = openFileBase; } @@ -22,7 +22,7 @@ public class ResourcePackFilter { return true; if (!containsFileBase.test(name + Respackopts.fileExtension)) return true; - try (InputStream stream = openFileBase.apply(name + Respackopts.fileExtension); Reader w = new InputStreamReader(stream)) { + try (InputStream stream = openFileBase.open(name + Respackopts.fileExtension); Reader w = new InputStreamReader(stream)) { return ConditionEvaluator.evaluate(Respackopts.g.fromJson(w, JsonElement.class)); } catch (Throwable e) { diff --git a/src/main/java/io/gitlab/jfronny/respackopts/conditions/SyntaxError.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/SyntaxError.java similarity index 67% rename from src/main/java/io/gitlab/jfronny/respackopts/conditions/SyntaxError.java rename to src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/SyntaxError.java index dcc52fd..b31a599 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/conditions/SyntaxError.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/SyntaxError.java @@ -1,4 +1,4 @@ -package io.gitlab.jfronny.respackopts.conditions; +package io.gitlab.jfronny.respackopts.filters.conditions; public class SyntaxError extends Exception { public SyntaxError(String message) { diff --git a/src/main/java/io/gitlab/jfronny/respackopts/conditions/XorCondition.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/XorCondition.java similarity index 92% rename from src/main/java/io/gitlab/jfronny/respackopts/conditions/XorCondition.java rename to src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/XorCondition.java index 254b960..dab5d82 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/conditions/XorCondition.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/conditions/XorCondition.java @@ -1,4 +1,4 @@ -package io.gitlab.jfronny.respackopts.conditions; +package io.gitlab.jfronny.respackopts.filters.conditions; import com.google.gson.JsonElement; diff --git a/src/main/java/io/gitlab/jfronny/respackopts/filters/fallback/FallbackFilter.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/fallback/FallbackFilter.java new file mode 100644 index 0000000..a16299b --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/fallback/FallbackFilter.java @@ -0,0 +1,71 @@ +package io.gitlab.jfronny.respackopts.filters.fallback; + +import com.google.gson.reflect.TypeToken; +import io.gitlab.jfronny.respackopts.Respackopts; +import io.gitlab.jfronny.respackopts.abstractions.FileOpenProvider; +import net.minecraft.resource.ResourceNotFoundException; +import net.minecraft.util.Identifier; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.Collection; +import java.util.Set; +import java.util.function.Predicate; + +public class FallbackFilter { + Predicate containsFileBase; + FileOpenProvider openFileBase; + public FallbackFilter(Predicate containsFileBase, FileOpenProvider openFileBase) { + this.containsFileBase = containsFileBase; + this.openFileBase = openFileBase; + } + + public boolean fileVisible(String name) { + String fbt = name + Respackopts.fallbackTextureExtension; + if (containsFileBase.test(fbt)) { + System.out.println(fbt); + try (InputStream stream = openFileBase.open(fbt); Reader w = new InputStreamReader(stream)) { + Set arr = Respackopts.g.fromJson(w, new TypeToken>(){}.getType()); + for (String s : arr) { + if (containsFileBase.test(s)) + return true; + } + } + catch (IOException e) { + e.printStackTrace(); + } + } + return false; + } + + public InputStream getReplacement(String name, ResourceNotFoundException ex) throws ResourceNotFoundException { + String fbt = name + Respackopts.fallbackTextureExtension; + try (InputStream stream = openFileBase.open(fbt); Reader w = new InputStreamReader(stream)) { + Set arr = Respackopts.g.fromJson(w, new TypeToken>(){}.getType()); + for (String s : arr) { + if (containsFileBase.test(s)) + return openFileBase.open(s); + } + } + catch (IOException e) { + e.printStackTrace(); + } + throw ex; + } + + public void addFallbackResources(Collection ret, String namespace) { + for (Identifier identifier : ret) { + String path = identifier.getPath(); + if (path.endsWith(Respackopts.fallbackTextureExtension)) { + String expectedTarget = path.substring(0, path.length() - Respackopts.fallbackTextureExtension.length()); + System.out.println(expectedTarget); + if (ret.stream().noneMatch(s -> s.getPath().equals(expectedTarget)) && fileVisible(expectedTarget)) { + ret.add(new Identifier(namespace, expectedTarget)); + System.out.println("Added fallback"); + } + } + } + } +} diff --git a/src/main/java/io/gitlab/jfronny/respackopts/integration/LibCDCompat.java b/src/main/java/io/gitlab/jfronny/respackopts/integration/LibCDCompat.java index 9d4a00d..c3cd746 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/integration/LibCDCompat.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/integration/LibCDCompat.java @@ -5,8 +5,7 @@ import io.github.cottonmc.libcd.api.CDSyntaxError; import io.github.cottonmc.libcd.api.condition.ConditionManager; import io.github.cottonmc.libcd.api.init.ConditionInitializer; import io.gitlab.jfronny.respackopts.Respackopts; -import io.gitlab.jfronny.respackopts.conditions.ConditionEvaluator; -import io.gitlab.jfronny.respackopts.conditions.SyntaxError; +import io.gitlab.jfronny.respackopts.filters.conditions.ConditionEvaluator; import net.minecraft.util.Identifier; public class LibCDCompat implements ConditionInitializer { diff --git a/src/main/java/io/gitlab/jfronny/respackopts/integration/ModMenuCompat.java b/src/main/java/io/gitlab/jfronny/respackopts/integration/ModMenuCompat.java index d4a608d..615f8e9 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/integration/ModMenuCompat.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/integration/ModMenuCompat.java @@ -1,7 +1,7 @@ package io.gitlab.jfronny.respackopts.integration; -import io.github.prospector.modmenu.api.ConfigScreenFactory; -import io.github.prospector.modmenu.api.ModMenuApi; +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; import io.gitlab.jfronny.respackopts.Respackopts; import io.gitlab.jfronny.respackopts.abstractions.JfConfigCategoryPrimary; import me.shedaniel.clothconfig2.api.ConfigBuilder; diff --git a/src/main/java/io/gitlab/jfronny/respackopts/mixin/conditions/DirectoryResourcePackMixin.java b/src/main/java/io/gitlab/jfronny/respackopts/mixin/conditions/DirectoryResourcePackMixin.java index 7bc6ce6..2d9611c 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/mixin/conditions/DirectoryResourcePackMixin.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/mixin/conditions/DirectoryResourcePackMixin.java @@ -1,21 +1,17 @@ package io.gitlab.jfronny.respackopts.mixin.conditions; -import io.gitlab.jfronny.respackopts.conditions.ResourcePackFilter; +import io.gitlab.jfronny.respackopts.filters.FilterProvider; import net.minecraft.resource.AbstractFileResourcePack; import net.minecraft.resource.DirectoryResourcePack; -import net.minecraft.resource.ResourceNotFoundException; import net.minecraft.resource.ResourceType; import net.minecraft.util.Identifier; -import org.apache.commons.io.input.NullInputStream; 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.io.IOException; -import java.io.InputStream; +import java.io.*; import java.util.Collection; import java.util.Set; import java.util.function.Predicate; @@ -32,28 +28,20 @@ public abstract class DirectoryResourcePackMixin extends AbstractFileResourcePac @Shadow protected abstract InputStream openFile(String name) throws IOException; - ResourcePackFilter filter = new ResourcePackFilter(this::containsFile, (s) -> { - try { - return openFile(s); - } catch (IOException e) { - e.printStackTrace(); - return new NullInputStream(0); - } - }); + FilterProvider filter = new FilterProvider(this::containsFile, this::openFile); + @Inject(at = @At("HEAD"), method = "openFile(Ljava/lang/String;)Ljava/io/InputStream;", cancellable = true) protected void openFile(String name, CallbackInfoReturnable info) throws IOException { - if (!filter.fileVisible(name)) { - throw new ResourceNotFoundException(this.base, name); - } + filter.openFile(name, base, info); } @Inject(at = @At("TAIL"), method = "containsFile(Ljava/lang/String;)Z", cancellable = true) protected void containsFile(String name, CallbackInfoReturnable info) { - info.setReturnValue(info.getReturnValueZ() && filter.fileVisible(name)); + filter.containsFile(name, info); } @Inject(at = @At("TAIL"), method = "findResources(Lnet/minecraft/resource/ResourceType;Ljava/lang/String;Ljava/lang/String;ILjava/util/function/Predicate;)Ljava/util/Collection;") private void findResources(ResourceType type, String namespace, String prefix, int maxDepth, Predicate pathFilter, CallbackInfoReturnable> info) { - info.getReturnValue().removeIf(s -> !filter.fileVisible(s.getPath())); + filter.findResources(type, namespace, prefix, maxDepth, pathFilter, info); } } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/mixin/conditions/ZipResourcePackMixin.java b/src/main/java/io/gitlab/jfronny/respackopts/mixin/conditions/ZipResourcePackMixin.java index 55f15a0..5e1515d 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/mixin/conditions/ZipResourcePackMixin.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/mixin/conditions/ZipResourcePackMixin.java @@ -1,21 +1,17 @@ package io.gitlab.jfronny.respackopts.mixin.conditions; -import io.gitlab.jfronny.respackopts.conditions.ResourcePackFilter; +import io.gitlab.jfronny.respackopts.filters.FilterProvider; import net.minecraft.resource.AbstractFileResourcePack; -import net.minecraft.resource.ResourceNotFoundException; import net.minecraft.resource.ResourceType; import net.minecraft.resource.ZipResourcePack; import net.minecraft.util.Identifier; -import org.apache.commons.io.input.NullInputStream; 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.io.IOException; -import java.io.InputStream; +import java.io.*; import java.util.Collection; import java.util.Set; import java.util.function.Predicate; @@ -26,35 +22,26 @@ public abstract class ZipResourcePackMixin extends AbstractFileResourcePack { super(base); } - @Shadow - protected abstract boolean containsFile(String name); + @Shadow public abstract boolean containsFile(String name); @Shadow public abstract Set getNamespaces(ResourceType type); @Shadow protected abstract InputStream openFile(String name) throws IOException; - ResourcePackFilter filter = new ResourcePackFilter(this::containsFile, (s) -> { - try { - return openFile(s); - } catch (IOException e) { - e.printStackTrace(); - return new NullInputStream(0); - } - }); + FilterProvider filter = new FilterProvider(this::containsFile, this::openFile); + @Inject(at = @At("HEAD"), method = "openFile(Ljava/lang/String;)Ljava/io/InputStream;", cancellable = true) protected void openFile(String name, CallbackInfoReturnable info) throws IOException { - if (!filter.fileVisible(name)) { - throw new ResourceNotFoundException(this.base, name); - } + filter.openFile(name, base, info); } @Inject(at = @At("TAIL"), method = "containsFile(Ljava/lang/String;)Z", cancellable = true) protected void containsFile(String name, CallbackInfoReturnable info) { - info.setReturnValue(info.getReturnValueZ() && filter.fileVisible(name)); + filter.containsFile(name, info); } @Inject(at = @At("TAIL"), method = "findResources(Lnet/minecraft/resource/ResourceType;Ljava/lang/String;Ljava/lang/String;ILjava/util/function/Predicate;)Ljava/util/Collection;") private void findResources(ResourceType type, String namespace, String prefix, int maxDepth, Predicate pathFilter, CallbackInfoReturnable> info) { - info.getReturnValue().removeIf(s -> !filter.fileVisible(s.getPath())); + filter.findResources(type, namespace, prefix, maxDepth, pathFilter, info); } }