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

80 lines
3.6 KiB
Java
Raw Normal View History

2021-07-13 16:15:03 +02:00
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;
2021-11-14 15:37:01 +01:00
import io.gitlab.jfronny.respackopts.model.enums.PackCapability;
2021-09-15 16:45:54 +02:00
import io.gitlab.jfronny.respackopts.filters.util.FileExclusionProvider;
import io.gitlab.jfronny.respackopts.filters.util.FileExpansionProvider;
import io.gitlab.jfronny.respackopts.filters.util.FileFallbackProvider;
2021-07-13 16:15:03 +02:00
import net.minecraft.resource.AbstractFileResourcePack;
import net.minecraft.resource.ResourcePack;
2021-07-13 16:15:03 +02:00
import net.minecraft.util.Identifier;
2021-10-21 21:20:20 +02:00
import java.util.HashMap;
import java.util.Map;
2021-07-13 16:15:03 +02:00
2021-09-15 16:45:54 +02:00
public class FileFilterEventImpl {
2021-10-21 21:20:20 +02:00
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);
}
2021-07-13 16:15:03 +02:00
public static void init() {
UserResourceEvents.OPEN.register((type, id, previous, pack) -> {
if (skip(pack)) return previous;
2021-08-24 17:42:46 +02:00
String name = new ResourcePath(type, id).getName();
if (pack.contains(type, id)) {
2021-10-21 21:20:20 +02:00
return containsFileWasFallback()
? FileFallbackProvider.getReplacement(pack, name)
: FileExpansionProvider.replace(previous, pack, name);
2021-07-13 16:15:03 +02:00
}
2021-10-21 21:20:20 +02:00
else return null;
2021-07-13 16:15:03 +02:00
});
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!
2021-07-13 16:15:03 +02:00
if (skip(pack)) return previous;
previous.removeIf(s -> {
String fileName = type.getDirectory() + "/" + s.getNamespace() + "/" + s.getPath();
2021-10-21 21:20:20 +02:00
return FileExclusionProvider.fileHidden(pack, fileName) && !FileFallbackProvider.fileHasFallback(pack, fileName);
});
// Completion of the path is handled separately here
2021-09-15 16:45:54 +02:00
FileFallbackProvider.addFallbackResources(pack, previous, namespace, type);
2021-07-13 16:15:03 +02:00
return previous;
});
UserResourceEvents.CONTAINS.register((type, id, previous, pack) -> {
if (skip(pack)) return previous;
2021-10-21 21:20:20 +02:00
containsFileWasFallback(false);
2021-07-13 16:15:03 +02:00
String name = new ResourcePath(type, id).getName();
if (previous) {
2021-09-15 16:45:54 +02:00
if (FileExclusionProvider.fileHidden(pack, name)) {
2021-10-21 21:20:20 +02:00
if (FileFallbackProvider.fileHasFallback(pack, name)) {
containsFileWasFallback(true);
2021-07-13 16:15:03 +02:00
} else {
return false;
}
}
return true;
}
else {
2021-10-21 21:20:20 +02:00
if (UserResourceEvents.disable(() -> pack.contains(type, new Identifier(id.getNamespace(), id.getPath() + ".rpo"))) && FileFallbackProvider.fileHasFallback(pack, name)) {
containsFileWasFallback(true);
2021-07-13 16:15:03 +02:00
return true;
}
return false;
}
});
}
private static boolean skip(ResourcePack pack) {
return !(pack instanceof AbstractFileResourcePack) || !MetaCache.hasCapability(pack, PackCapability.FileFilter);
2021-07-13 16:15:03 +02:00
}
}