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;
try {
rp = new ResourcePath(name + "/.rpo");
rp = new ResourcePath(name + "/" + Respackopts.FILE_EXTENSION);
}
catch (Exception e) {
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.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) {

View File

@ -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;
}
}