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