From 583ee89038ea4c405e401519a222fe933d3e33ef Mon Sep 17 00:00:00 2001 From: Technici4n <13494793+Technici4n@users.noreply.github.com> Date: Wed, 23 Mar 2022 00:00:55 +0100 Subject: [PATCH] Fix #2091: multiple mods adding to the same tag not working --- .../resource/loader/GroupResourcePack.java | 2 +- .../loader/NamespaceResourceManagerMixin.java | 27 +++++++++++++++++-- .../fabric-resource-loader-v0.accesswidener | 2 ++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/GroupResourcePack.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/GroupResourcePack.java index b8b7036a6..6e101c269 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/GroupResourcePack.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/impl/resource/loader/GroupResourcePack.java @@ -118,7 +118,7 @@ public abstract class GroupResourcePack implements ResourcePack { return this.namespacedPacks.keySet(); } - public void appendResources(NamespaceResourceManagerAccessor manager, Identifier id, List<class_7083> resources) throws IOException { + public void appendResources(NamespaceResourceManagerAccessor manager, Identifier id, List<class_7083> resources) { List<ModResourcePack> packs = this.namespacedPacks.get(id.getNamespace()); if (packs == null) { diff --git a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resource/loader/NamespaceResourceManagerMixin.java b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resource/loader/NamespaceResourceManagerMixin.java index f2e828600..c9158abc7 100644 --- a/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resource/loader/NamespaceResourceManagerMixin.java +++ b/fabric-resource-loader-v0/src/main/java/net/fabricmc/fabric/mixin/resource/loader/NamespaceResourceManagerMixin.java @@ -16,7 +16,6 @@ package net.fabricmc.fabric.mixin.resource.loader; -import java.io.IOException; import java.util.List; import org.spongepowered.asm.mixin.Mixin; @@ -35,6 +34,9 @@ import net.minecraft.util.Identifier; import net.fabricmc.fabric.impl.resource.loader.GroupResourcePack; +/** + * Patches getAllResources and method_41265 to work with GroupResourcePack. + */ @Mixin(NamespaceResourceManager.class) public class NamespaceResourceManagerMixin { private final ThreadLocal<List<class_7083>> fabric$getAllResources$resources = new ThreadLocal<>(); @@ -58,7 +60,7 @@ public class NamespaceResourceManagerMixin { target = "Lnet/minecraft/resource/ResourcePack;contains(Lnet/minecraft/resource/ResourceType;Lnet/minecraft/util/Identifier;)Z" ) ) - private boolean onResourceAdd(ResourcePack pack, ResourceType type, Identifier id) throws IOException { + private boolean onResourceAdd(ResourcePack pack, ResourceType type, Identifier id) { if (pack instanceof GroupResourcePack) { ((GroupResourcePack) pack).appendResources((NamespaceResourceManagerAccessor) this, id, this.fabric$getAllResources$resources.get()); @@ -67,4 +69,25 @@ public class NamespaceResourceManagerMixin { return pack.contains(type, id); } + + @Redirect( + method = "method_41258", + at = @At( + value = "INVOKE", + target = "Ljava/util/List;add(Ljava/lang/Object;)Z" + ), + allow = 1 + ) + private boolean onResourceAdd(List<NamespaceResourceManager.class_7083> entries, Object entryObject) { + // Required due to type erasure of List.add + NamespaceResourceManager.class_7083 entry = (NamespaceResourceManager.class_7083) entryObject; + ResourcePack pack = entry.field_37286; + + if (pack instanceof GroupResourcePack grp) { + grp.appendResources((NamespaceResourceManagerAccessor) this, entry.field_37284, entries); + return true; + } + + return entries.add(entry); + } } diff --git a/fabric-resource-loader-v0/src/main/resources/fabric-resource-loader-v0.accesswidener b/fabric-resource-loader-v0/src/main/resources/fabric-resource-loader-v0.accesswidener index f88406eac..1aa337a2a 100644 --- a/fabric-resource-loader-v0/src/main/resources/fabric-resource-loader-v0.accesswidener +++ b/fabric-resource-loader-v0/src/main/resources/fabric-resource-loader-v0.accesswidener @@ -1,3 +1,5 @@ accessWidener v2 named accessible method net/minecraft/resource/NamespaceResourceManager$class_7083 <init> (Lnet/minecraft/resource/NamespaceResourceManager;Lnet/minecraft/util/Identifier;Lnet/minecraft/util/Identifier;Lnet/minecraft/resource/ResourcePack;)V +accessible field net/minecraft/resource/NamespaceResourceManager$class_7083 field_37284 Lnet/minecraft/util/Identifier; +accessible field net/minecraft/resource/NamespaceResourceManager$class_7083 field_37286 Lnet/minecraft/resource/ResourcePack;