Respackopts/src/main/java/io/gitlab/jfronny/respackopts/filters/FileFilterEventImpl.java

80 lines
3.6 KiB
Java

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.util.MetaCache;
import io.gitlab.jfronny.respackopts.model.enums.PackCapability;
import io.gitlab.jfronny.respackopts.filters.util.FileExclusionProvider;
import io.gitlab.jfronny.respackopts.filters.util.FileExpansionProvider;
import io.gitlab.jfronny.respackopts.filters.util.FileFallbackProvider;
import net.minecraft.resource.AbstractFileResourcePack;
import net.minecraft.resource.ResourcePack;
import net.minecraft.util.Identifier;
import java.util.HashMap;
import java.util.Map;
public class FileFilterEventImpl {
private static final Map<Long, Boolean> containsFileWasFallback = new HashMap<>();
private static boolean containsFileWasFallback() {
boolean v = FileFilterEventImpl.containsFileWasFallback.getOrDefault(Thread.currentThread().getId(), false);
containsFileWasFallback(false);
return v;
}
private static void containsFileWasFallback(boolean value) {
FileFilterEventImpl.containsFileWasFallback.put(Thread.currentThread().getId(), value);
}
public static void init() {
UserResourceEvents.OPEN.register((type, id, previous, pack) -> {
if (skip(pack)) return previous;
String name = new ResourcePath(type, id).getName();
if (pack.contains(type, id)) {
return containsFileWasFallback()
? FileFallbackProvider.getReplacement(pack, name)
: FileExpansionProvider.replace(previous, pack, name);
}
else return null;
});
UserResourceEvents.FIND_RESOURCE.register((type, namespace, prefix, maxDepth, pathFilter, previous, pack) -> {
// Warning: the Identifiers here DON'T CONTAIN THE TYPE!
// Therefore, it needs to be added when calling a method that generates a ResourcePath!
if (skip(pack)) return previous;
previous.removeIf(s -> {
String fileName = type.getDirectory() + "/" + s.getNamespace() + "/" + s.getPath();
return FileExclusionProvider.fileHidden(pack, fileName) && !FileFallbackProvider.fileHasFallback(pack, fileName);
});
// Completion of the path is handled separately here
FileFallbackProvider.addFallbackResources(pack, previous, namespace, type);
return previous;
});
UserResourceEvents.CONTAINS.register((type, id, previous, pack) -> {
if (skip(pack)) return previous;
containsFileWasFallback(false);
String name = new ResourcePath(type, id).getName();
if (previous) {
if (FileExclusionProvider.fileHidden(pack, name)) {
if (FileFallbackProvider.fileHasFallback(pack, name)) {
containsFileWasFallback(true);
} else {
return false;
}
}
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;
}
});
}
private static boolean skip(ResourcePack pack) {
return !(pack instanceof AbstractFileResourcePack) || !MetaCache.hasCapability(pack, PackCapability.FileFilter);
}
}