From 69eb9407649ddfdcc53a44b81695a06c58ee5a22 Mon Sep 17 00:00:00 2001 From: LexManos Date: Fri, 9 Dec 2022 12:29:23 -0800 Subject: [PATCH] Fix merged mod resource pack not returning all resources with the same name when asked. Closes #9194 --- .../FallbackResourceManager.java.patch | 24 +++++++++++++++++++ .../extensions/IForgePackResources.java | 15 ++++++++++++ .../resource/DelegatingPackResources.java | 7 ++++++ 3 files changed, 46 insertions(+) create mode 100644 patches/minecraft/net/minecraft/server/packs/resources/FallbackResourceManager.java.patch diff --git a/patches/minecraft/net/minecraft/server/packs/resources/FallbackResourceManager.java.patch b/patches/minecraft/net/minecraft/server/packs/resources/FallbackResourceManager.java.patch new file mode 100644 index 0000000000..b79d0bffd4 --- /dev/null +++ b/patches/minecraft/net/minecraft/server/packs/resources/FallbackResourceManager.java.patch @@ -0,0 +1,24 @@ +--- a/net/minecraft/server/packs/resources/FallbackResourceManager.java ++++ b/net/minecraft/server/packs/resources/FallbackResourceManager.java +@@ -98,8 +_,11 @@ + + for(int i = this.f_10599_.size() - 1; i >= 0; --i) { + FallbackResourceManager.PackEntry fallbackresourcemanager$packentry = this.f_10599_.get(i); +- PackResources packresources = fallbackresourcemanager$packentry.f_215433_; +- if (packresources != null) { ++ PackResources pack = fallbackresourcemanager$packentry.f_215433_; ++ if (pack != null) { ++ var children = pack.getChildren(); ++ var packs = children == null ? List.of(pack) : children; ++ for (final PackResources packresources : packs) { + IoSupplier iosupplier = packresources.m_214146_(this.f_10601_, p_215367_); + if (iosupplier != null) { + IoSupplier iosupplier1; +@@ -113,6 +_,7 @@ + } + + list.add(new Resource(packresources, iosupplier, iosupplier1)); ++ } + } + } + diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgePackResources.java b/src/main/java/net/minecraftforge/common/extensions/IForgePackResources.java index a42e324125..eccf3465f5 100644 --- a/src/main/java/net/minecraftforge/common/extensions/IForgePackResources.java +++ b/src/main/java/net/minecraftforge/common/extensions/IForgePackResources.java @@ -5,7 +5,12 @@ package net.minecraftforge.common.extensions; +import java.util.Collection; +import org.jetbrains.annotations.Nullable; +import net.minecraft.server.packs.PackResources; import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraftforge.resource.DelegatingPackResources; public interface IForgePackResources { @@ -20,4 +25,14 @@ public interface IForgePackResources default void initForNamespace(final String nameSpace) {} default void init(final PackType packType) {} + + /** + * Gets a collection of {@code PackResource} instances nested inside this pack. + * Used to merge several packs into one entry in the resource pack selection UI without + * losing the ability for each pack to return a resource in + * {@link ResourceManager#getResourceStack(ResourceLocation)} + * @return Collection of nested {@code PackResource}, or null if this pack has no children + * @see DelegatingPackResources + */ + @Nullable default Collection getChildren() { return null; } } diff --git a/src/main/java/net/minecraftforge/resource/DelegatingPackResources.java b/src/main/java/net/minecraftforge/resource/DelegatingPackResources.java index 57d8e1e2c9..07436ed80a 100644 --- a/src/main/java/net/minecraftforge/resource/DelegatingPackResources.java +++ b/src/main/java/net/minecraftforge/resource/DelegatingPackResources.java @@ -10,6 +10,7 @@ import com.google.common.collect.ImmutableMap; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -123,6 +124,12 @@ public class DelegatingPackResources extends AbstractPackResources return null; } + @Nullable + public Collection getChildren() + { + return delegates; + } + private List getCandidatePacks(PackType type, ResourceLocation location) { Map> map = type == PackType.CLIENT_RESOURCES ? namespacesAssets : namespacesData;