From a6d924535ef81414d4ade510f6f1ca9773e5cfe6 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 9 Apr 2023 12:29:47 -0400 Subject: [PATCH] Fix KubeJS resources not being scanned for textures --- .../dynamicresources/ResourcePackHandler.java | 55 +++++++++++++++++++ .../dynamic_resources/ModelBakeryMixin.java | 5 +- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/embeddedt/modernfix/dynamicresources/ResourcePackHandler.java diff --git a/src/main/java/org/embeddedt/modernfix/dynamicresources/ResourcePackHandler.java b/src/main/java/org/embeddedt/modernfix/dynamicresources/ResourcePackHandler.java new file mode 100644 index 00000000..ee6c5fca --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/dynamicresources/ResourcePackHandler.java @@ -0,0 +1,55 @@ +package org.embeddedt.modernfix.dynamicresources; + +import dev.latvian.kubejs.script.data.KubeJSResourcePack; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackResources; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraftforge.fml.ModList; +import org.embeddedt.modernfix.util.FileUtil; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class ResourcePackHandler { + private static final List packHandlers = new ArrayList<>(); + public static Collection getExtraResources(ResourceManager manager, String path, Predicate matchPredicate) { + final String normalizedPath = FileUtil.normalize(path); + return manager.listPacks().flatMap(pack -> packHandlers.stream().flatMap(handler -> { + if(handler.shouldHandle(pack)) { + return handler.getExtraResources(pack, normalizedPath, matchPredicate); + } else + return Stream.of(); + })).collect(Collectors.toList()); + } + + interface PackHandler { + Stream getExtraResources(PackResources pack, String path, Predicate matchPredicate); + boolean shouldHandle(PackResources pack); + } + + static class KubeJSPackHandler implements PackHandler { + + @Override + public Stream getExtraResources(PackResources pack, String path, Predicate matchPredicate) { + KubeJSResourcePack p = (KubeJSResourcePack)pack; + return p.getCachedResources().keySet().stream() + .filter(l -> l.getPath().startsWith(path)) + .filter(l -> matchPredicate.test(l.getPath())); + } + + @Override + public boolean shouldHandle(PackResources pack) { + return pack instanceof KubeJSResourcePack; + } + } + + static { + if(ModList.get().isLoaded("kubejs")) { + packHandlers.add(new KubeJSPackHandler()); + } + } +} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java index 6d993288..66aaeba5 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -35,6 +35,7 @@ import org.apache.logging.log4j.Logger; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.dynamicresources.DynamicBakedModelProvider; import org.embeddedt.modernfix.dynamicresources.ModelLocationCache; +import org.embeddedt.modernfix.dynamicresources.ResourcePackHandler; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -159,7 +160,9 @@ public abstract class ModelBakeryMixin { */ private void gatherModelMaterials(Set materialSet) { Stopwatch stopwatch = Stopwatch.createStarted(); - Collection allModels = this.resourceManager.listResources("models", path -> path.endsWith(".json")); + List allModels = new ArrayList<>(this.resourceManager.listResources("models", path -> path.endsWith(".json"))); + // for KubeJS, etc. + allModels.addAll(ResourcePackHandler.getExtraResources(this.resourceManager, "models", path -> path.endsWith(".json"))); List>> modelBytes = new ArrayList<>(); for(ResourceLocation fileLocation : allModels) { modelBytes.add(CompletableFuture.supplyAsync(() -> {