From 3126d060a1c29f300ce59d365f70fb75015bf6e1 Mon Sep 17 00:00:00 2001 From: JFronny Date: Sat, 22 Jan 2022 22:55:51 +0100 Subject: [PATCH] Hook OPEN_ROOT in FileFilterEventImpl --- .../filters/DirFilterEventImpl.java | 2 +- .../filters/FileFilterEventImpl.java | 60 ++++++++++++++----- .../filters/util/FileRpoSearchProvider.java | 24 +++++--- 3 files changed, 60 insertions(+), 26 deletions(-) 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 9c886df..5d61b3b 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/filters/DirFilterEventImpl.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/DirFilterEventImpl.java @@ -111,7 +111,7 @@ public class DirFilterEventImpl { } ResourcePath rp; try { - rp = new ResourcePath(name + "/.rpo"); + rp = new ResourcePath(name + "/" + Respackopts.FILE_EXTENSION); } catch (Exception e) { return null; 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 3238bde..2c13d1b 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/filters/FileFilterEventImpl.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/FileFilterEventImpl.java @@ -2,6 +2,7 @@ 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.Respackopts; import io.gitlab.jfronny.respackopts.util.MetaCache; import io.gitlab.jfronny.respackopts.model.enums.PackCapability; import io.gitlab.jfronny.respackopts.filters.util.FileExclusionProvider; @@ -11,6 +12,8 @@ import net.minecraft.resource.AbstractFileResourcePack; import net.minecraft.resource.ResourcePack; import net.minecraft.util.Identifier; +import java.io.IOException; +import java.io.InputStream; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -54,25 +57,50 @@ public class FileFilterEventImpl { UserResourceEvents.CONTAINS.register((type, id, previous, pack) -> { if (skip(pack)) return previous.get(); containsFileWasFallback(false); - String name = new ResourcePath(type, id).getName(); - if (previous.get()) { - if (FileExclusionProvider.fileHidden(pack, name)) { - if (FileFallbackProvider.fileHasFallback(pack, name)) { - containsFileWasFallback(true); - } else { - return false; - } + return containsHook(previous.get(), pack, new ResourcePath(type, id).getName()); + }); + UserResourceEvents.OPEN_ROOT.register((fileName, previous, pack) -> { + if (skip(pack)) return previous.get(); + InputStream is = previous.get(); + if (containsHook(is != null, pack, fileName)) { + return containsFileWasFallback() + ? FileFallbackProvider.getReplacement(pack, fileName) + : FileExpansionProvider.replace(previous.get(), pack, fileName); + } + else return null; + }); + } + + private static boolean containsHook(boolean previous, ResourcePack pack, String name) { + if (previous) { + if (FileExclusionProvider.fileHidden(pack, name)) { + if (FileFallbackProvider.fileHasFallback(pack, name)) { + containsFileWasFallback(true); + } else { + return false; } + } + return true; + } + else { + boolean hasRpo; + try { + hasRpo = UserResourceEvents.disable(() -> { + if (name.contains("/")) { + ResourcePath rp = new ResourcePath(name + Respackopts.FILE_EXTENSION); + return pack.contains(rp.getType(), rp.getId()); + } + return pack.openRoot(name + Respackopts.FILE_EXTENSION) != null; + }); + } catch (IOException e) { + hasRpo = false; + } + if (hasRpo && FileFallbackProvider.fileHasFallback(pack, name)) { + containsFileWasFallback(true); return true; } - else { - if (UserResourceEvents.disable(() -> pack.contains(type, new Identifier(id.getNamespace(), id.getPath() + ".rpo"))) && FileFallbackProvider.fileHasFallback(pack, name)) { - containsFileWasFallback(true); - return true; - } - return false; - } - }); + return false; + } } private static boolean skip(ResourcePack pack) { diff --git a/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileRpoSearchProvider.java b/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileRpoSearchProvider.java index a7856a1..2a51225 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileRpoSearchProvider.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/filters/util/FileRpoSearchProvider.java @@ -4,8 +4,10 @@ import io.gitlab.jfronny.libjf.ResourcePath; import io.gitlab.jfronny.respackopts.Respackopts; import io.gitlab.jfronny.respackopts.model.FileRpo; import io.gitlab.jfronny.respackopts.util.MetaCache; +import net.minecraft.resource.ResourceNotFoundException; import net.minecraft.resource.ResourcePack; +import java.io.FileNotFoundException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; @@ -23,23 +25,27 @@ public class FileRpoSearchProvider { String rpPathName = fileName + Respackopts.FILE_EXTENSION; if (frpReg.containsKey(rpPathName)) return getModified.getModified(frpReg.get(rpPathName)); - ResourcePath rpoPath; - try { - rpoPath = new ResourcePath(rpPathName); - if (!pack.contains(rpoPath.getType(), rpoPath.getId())) + ResourcePath rpoPath = null; + if (fileName.contains("/")) { + try { + rpoPath = new ResourcePath(rpPathName); + if (!pack.contains(rpoPath.getType(), rpoPath.getId())) + return defaultValue; + } catch (Throwable e) { + Respackopts.LOGGER.error("Could not check file filter status", e); return defaultValue; - } catch (Throwable e) { - Respackopts.LOGGER.error("Could not check file filter status", e); - return defaultValue; + } } - try (InputStream stream = pack.open(rpoPath.getType(), rpoPath.getId()); Reader w = new InputStreamReader(stream)) { + try (InputStream stream = rpoPath == null ? pack.openRoot(rpPathName) : pack.open(rpoPath.getType(), rpoPath.getId()); + Reader w = stream == null ? null : new InputStreamReader(stream)) { + if (w == null) throw new FileNotFoundException("Could not find file: " + fileName); FileRpo frp = Respackopts.GSON.fromJson(w, FileRpo.class); frp.path = rpPathName; frpReg.put(rpPathName, frp); return getModified.getModified(frp); } catch (Exception e) { - Respackopts.LOGGER.error("Could not generate replacement for " + rpoPath.getName() + " in " + pack.getName(), e); + if (!(e instanceof ResourceNotFoundException)) Respackopts.LOGGER.error("Could not generate replacement for " + (rpoPath == null ? fileName : rpoPath.getName()) + " in " + pack.getName(), e); return defaultValue; } }