Scan fallback resource managers as well as main resource manager

For buggy mods such as https://github.com/FoundationGames/EnhancedBlockEntities/issues/162
This commit is contained in:
embeddedt 2023-07-09 13:27:18 -04:00
parent bb0c4fdf54
commit d987c1227b
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
2 changed files with 25 additions and 1 deletions

View File

@ -8,6 +8,8 @@ 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;
@ -16,6 +18,7 @@ import net.minecraft.server.packs.PackType;
import net.minecraft.server.packs.resources.FallbackResourceManager;
import net.minecraft.server.packs.resources.Resource;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.server.packs.resources.SimpleReloadableResourceManager;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
@ -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(SimpleReloadableResourceManager manager, List<PackResources> resourcePackList) {
ReferenceSet<PackResources> knownPacks = new ReferenceOpenHashSet<>(resourcePackList);
Map<String, FallbackResourceManager> namespacedMap = manager.namespacedPacks;
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<PackResources> isTrustedPack,
Set<Material> materialSet, Set<ResourceLocation> blockStateFiles,
Set<ResourceLocation> modelFiles, UnbakedModel missingModel,
@ -95,6 +115,9 @@ public class ModelBakeryHelpers {
* scanning most packs a lot.
*/
List<PackResources> allPackResources = new ArrayList<>(manager.listPacks().collect(Collectors.toList()));
if(manager instanceof SimpleReloadableResourceManager) {
checkFallbacks((SimpleReloadableResourceManager)manager, allPackResources);
}
Collections.reverse(allPackResources);
ObjectOpenHashSet<ResourceLocation> allAvailableModels = new ObjectOpenHashSet<>(), allAvailableStates = new ObjectOpenHashSet<>();
/* try to fix CME in some runtime packs by forcing generation */

View File

@ -28,4 +28,5 @@ accessible method net/minecraft/client/renderer/texture/TextureAtlasSprite <init
accessible field net/minecraft/client/renderer/block/model/BlockModel GSON Lcom/google/gson/Gson;
accessible field net/minecraft/server/MinecraftServer resources Lnet/minecraft/server/ServerResources;
accessible field net/minecraft/client/renderer/RenderStateShard name Ljava/lang/String;
accessible method net/minecraft/client/gui/screens/Screen addButton (Lnet/minecraft/client/gui/components/AbstractWidget;)Lnet/minecraft/client/gui/components/AbstractWidget;
accessible method net/minecraft/client/gui/screens/Screen addButton (Lnet/minecraft/client/gui/components/AbstractWidget;)Lnet/minecraft/client/gui/components/AbstractWidget;
accessible field net/minecraft/server/packs/resources/SimpleReloadableResourceManager namespacedPacks Ljava/util/Map;