diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelBakeryHelpers.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelBakeryHelpers.java index 799b92d2..d6b1b691 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelBakeryHelpers.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelBakeryHelpers.java @@ -8,12 +8,15 @@ import com.google.gson.*; import com.mojang.datafixers.util.Pair; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; +import it.unimi.dsi.fastutil.objects.ReferenceSet; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.*; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.PackResources; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.resources.FallbackResourceManager; +import net.minecraft.server.packs.resources.MultiPackResourceManager; import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.world.level.block.Block; @@ -83,6 +86,23 @@ public class ModelBakeryHelpers { ModernFix.LOGGER.error("Error reading {} {}: {}", type, location, e); } + /** + * Some mods (cough, EBE) inject their custom resource pack into the namespaced resource managers, but not into the + * main list contained inside the parent resource manager, so we need to scan each of the namespaced managers as + * well. + */ + private static void checkFallbacks(MultiPackResourceManager manager, List resourcePackList) { + ReferenceSet knownPacks = new ReferenceOpenHashSet<>(resourcePackList); + Map namespacedMap = manager.namespacedManagers; + namespacedMap.values().stream().flatMap(FallbackResourceManager::listPacks).forEach(pack -> { + if(knownPacks.add(pack)) { + /* the pack was not previously known, add to our list */ + ModernFix.LOGGER.debug("Injecting unlisted pack '{}': {}", pack.getName(), pack.getClass().getName()); + resourcePackList.add(pack); + } + }); + } + public static void gatherModelMaterials(ResourceManager manager, Predicate isTrustedPack, Set materialSet, Set blockStateFiles, Set modelFiles, UnbakedModel missingModel, @@ -95,6 +115,9 @@ public class ModelBakeryHelpers { * scanning most packs a lot. */ List allPackResources = new ArrayList<>(manager.listPacks().collect(Collectors.toList())); + if(manager instanceof MultiPackResourceManager) { + checkFallbacks((MultiPackResourceManager)manager, allPackResources); + } Collections.reverse(allPackResources); ObjectOpenHashSet allAvailableModels = new ObjectOpenHashSet<>(), allAvailableStates = new ObjectOpenHashSet<>(); /* try to fix CME in some runtime packs by forcing generation */ diff --git a/common/src/main/resources/modernfix.accesswidener b/common/src/main/resources/modernfix.accesswidener index 6f44fc25..bccdbe43 100644 --- a/common/src/main/resources/modernfix.accesswidener +++ b/common/src/main/resources/modernfix.accesswidener @@ -29,4 +29,5 @@ accessible class net/minecraft/world/level/chunk/PalettedContainer$Data accessible field net/minecraft/server/MinecraftServer resources Lnet/minecraft/server/MinecraftServer$ReloadableResources; accessible class net/minecraft/server/MinecraftServer$ReloadableResources accessible method net/minecraft/client/gui/screens/Screen addRenderableWidget (Lnet/minecraft/client/gui/components/events/GuiEventListener;)Lnet/minecraft/client/gui/components/events/GuiEventListener; -accessible field net/minecraft/client/KeyMapping ALL Ljava/util/Map; \ No newline at end of file +accessible field net/minecraft/client/KeyMapping ALL Ljava/util/Map; +accessible field net/minecraft/server/packs/resources/MultiPackResourceManager namespacedManagers Ljava/util/Map; \ No newline at end of file