From e9bfd96dd9b997a5a9c468d9e164b4d144cfec12 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 28 May 2026 22:33:03 -0400 Subject: [PATCH] Fix Forge pack finder being injected multiple times into pack repository --- .../resourcepacks/MinecraftServerMixin.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/main/java/org/embeddedt/modernfix/common/mixin/perf/resourcepacks/MinecraftServerMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/common/mixin/perf/resourcepacks/MinecraftServerMixin.java b/src/main/java/org/embeddedt/modernfix/common/mixin/perf/resourcepacks/MinecraftServerMixin.java new file mode 100644 index 00000000..d78e8221 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/common/mixin/perf/resourcepacks/MinecraftServerMixin.java @@ -0,0 +1,30 @@ +package org.embeddedt.modernfix.common.mixin.perf.resourcepacks; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.packs.repository.PackRepository; +import net.minecraft.server.packs.repository.RepositorySource; +import net.minecraftforge.forgespi.locating.IModFile; +import net.minecraftforge.resource.PathPackResources; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.WeakHashMap; +import java.util.function.Function; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin { + private static final Set MFIX$INJECTED_REPOSITORIES = Collections.synchronizedSet(Collections.newSetFromMap(new WeakHashMap<>())); + + /** + * @author embeddedt + * @reason we do not want to inject the Forge pack finder more than once to any given repository + */ + @WrapWithCondition(method = "configurePackRepository", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/resource/ResourcePackLoader;loadResourcePacks(Lnet/minecraft/server/packs/repository/PackRepository;Ljava/util/function/Function;)V")) + private static boolean skipInjectIfAlreadyInjected(PackRepository resourcePacks, Function, ? extends RepositorySource> packFinder) { + return MFIX$INJECTED_REPOSITORIES.add(resourcePacks); + } +}