Hook OPEN_ROOT in FileFilterEventImpl
This commit is contained in:
parent
35de01da38
commit
3126d060a1
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user