Hook OPEN_ROOT in FileFilterEventImpl

This commit is contained in:
Johannes Frohnmeyer 2022-01-22 22:55:51 +01:00
parent 35de01da38
commit 3126d060a1
Signed by: Johannes
GPG Key ID: E76429612C2929F4
3 changed files with 60 additions and 26 deletions

View File

@ -111,7 +111,7 @@ public class DirFilterEventImpl {
} }
ResourcePath rp; ResourcePath rp;
try { try {
rp = new ResourcePath(name + "/.rpo"); rp = new ResourcePath(name + "/" + Respackopts.FILE_EXTENSION);
} }
catch (Exception e) { catch (Exception e) {
return null; return null;

View File

@ -2,6 +2,7 @@ package io.gitlab.jfronny.respackopts.filters;
import io.gitlab.jfronny.libjf.ResourcePath; import io.gitlab.jfronny.libjf.ResourcePath;
import io.gitlab.jfronny.libjf.data.manipulation.api.UserResourceEvents; 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.util.MetaCache;
import io.gitlab.jfronny.respackopts.model.enums.PackCapability; import io.gitlab.jfronny.respackopts.model.enums.PackCapability;
import io.gitlab.jfronny.respackopts.filters.util.FileExclusionProvider; 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.resource.ResourcePack;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -54,25 +57,50 @@ public class FileFilterEventImpl {
UserResourceEvents.CONTAINS.register((type, id, previous, pack) -> { UserResourceEvents.CONTAINS.register((type, id, previous, pack) -> {
if (skip(pack)) return previous.get(); if (skip(pack)) return previous.get();
containsFileWasFallback(false); containsFileWasFallback(false);
String name = new ResourcePath(type, id).getName(); return containsHook(previous.get(), pack, new ResourcePath(type, id).getName());
if (previous.get()) { });
if (FileExclusionProvider.fileHidden(pack, name)) { UserResourceEvents.OPEN_ROOT.register((fileName, previous, pack) -> {
if (FileFallbackProvider.fileHasFallback(pack, name)) { if (skip(pack)) return previous.get();
containsFileWasFallback(true); InputStream is = previous.get();
} else { if (containsHook(is != null, pack, fileName)) {
return false; 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; return true;
} }
else { return false;
if (UserResourceEvents.disable(() -> pack.contains(type, new Identifier(id.getNamespace(), id.getPath() + ".rpo"))) && FileFallbackProvider.fileHasFallback(pack, name)) { }
containsFileWasFallback(true);
return true;
}
return false;
}
});
} }
private static boolean skip(ResourcePack pack) { private static boolean skip(ResourcePack pack) {

View File

@ -4,8 +4,10 @@ import io.gitlab.jfronny.libjf.ResourcePath;
import io.gitlab.jfronny.respackopts.Respackopts; import io.gitlab.jfronny.respackopts.Respackopts;
import io.gitlab.jfronny.respackopts.model.FileRpo; import io.gitlab.jfronny.respackopts.model.FileRpo;
import io.gitlab.jfronny.respackopts.util.MetaCache; import io.gitlab.jfronny.respackopts.util.MetaCache;
import net.minecraft.resource.ResourceNotFoundException;
import net.minecraft.resource.ResourcePack; import net.minecraft.resource.ResourcePack;
import java.io.FileNotFoundException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.Reader; import java.io.Reader;
@ -23,23 +25,27 @@ public class FileRpoSearchProvider {
String rpPathName = fileName + Respackopts.FILE_EXTENSION; String rpPathName = fileName + Respackopts.FILE_EXTENSION;
if (frpReg.containsKey(rpPathName)) if (frpReg.containsKey(rpPathName))
return getModified.getModified(frpReg.get(rpPathName)); return getModified.getModified(frpReg.get(rpPathName));
ResourcePath rpoPath; ResourcePath rpoPath = null;
try { if (fileName.contains("/")) {
rpoPath = new ResourcePath(rpPathName); try {
if (!pack.contains(rpoPath.getType(), rpoPath.getId())) 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; 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); FileRpo frp = Respackopts.GSON.fromJson(w, FileRpo.class);
frp.path = rpPathName; frp.path = rpPathName;
frpReg.put(rpPathName, frp); frpReg.put(rpPathName, frp);
return getModified.getModified(frp); return getModified.getModified(frp);
} }
catch (Exception e) { 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; return defaultValue;
} }
} }