Respackopts/src/main/java/io/gitlab/jfronny/respackopts/filters/IEvents.java
JFronny 9b9fbf844a
All checks were successful
ci/woodpecker/push/docs Pipeline was successful
ci/woodpecker/push/jfmod Pipeline was successful
feat: introduce validation layer to detect early resource loads and infinite recursion
2024-05-04 19:42:32 +02:00

46 lines
1.8 KiB
Java

package io.gitlab.jfronny.respackopts.filters;
import io.gitlab.jfronny.libjf.ResourcePath;
import io.gitlab.jfronny.libjf.data.manipulation.api.UserResourceEvents;
import net.minecraft.resource.InputSupplier;
import net.minecraft.resource.ResourcePack;
import net.minecraft.resource.ResourceType;
import net.minecraft.util.Identifier;
import java.io.InputStream;
public interface IEvents extends UserResourceEvents.OpenRoot, UserResourceEvents.Open, UserResourceEvents.FindResource {
default void register() {
UserResourceEvents.OPEN_ROOT.register(this);
UserResourceEvents.OPEN.register(this);
UserResourceEvents.FIND_RESOURCE.register(this);
}
@Override
default InputSupplier<InputStream> openRoot(String[] fileName, InputSupplier<InputStream> previous, ResourcePack pack) {
if (skip(pack)) return previous;
return open(previous, pack, String.join("/", fileName));
}
@Override
default InputSupplier<InputStream> open(ResourceType type, Identifier id, InputSupplier<InputStream> previous, ResourcePack pack) {
if (skip(pack)) return previous;
return open(previous, pack, new ResourcePath(type, id).getName());
}
@Override
default ResourcePack.ResultConsumer findResources(ResourceType type, String namespace, String prefix, ResourcePack.ResultConsumer previous, ResourcePack pack) {
if (skip(pack)) return previous;
return (identifier, value) -> {
String path = new ResourcePath(type, identifier).getName();
previous.accept(identifier, open(value, pack, path));
};
}
InputSupplier<InputStream> open(InputSupplier<InputStream> previous, ResourcePack pack, String name);
default boolean skip(ResourcePack pack) {
return false;
}
}