From c15b95e2be8467306e03f12d1638e840d10a6726 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 13 Apr 2024 22:26:23 -0400 Subject: [PATCH 1/2] Fix mixin.perf.resourcepacks overwriting Fusion patches Related: #392 --- .../perf/resourcepacks/ForgePathPackResourcesMixin.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/ForgePathPackResourcesMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/ForgePathPackResourcesMixin.java index ddb9184c..89655e5b 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/ForgePathPackResourcesMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/ForgePathPackResourcesMixin.java @@ -27,7 +27,7 @@ import java.util.Collection; import java.util.Objects; import java.util.Set; -@Mixin(PathPackResources.class) +@Mixin(value = PathPackResources.class, priority = 1100) public abstract class ForgePathPackResourcesMixin implements ICachingResourcePack { @Shadow(remap = false) protected abstract Path resolve(String... paths); @@ -75,14 +75,15 @@ public abstract class ForgePathPackResourcesMixin implements ICachingResourcePac this.cacheEngine = null; } - @Inject(method = "getNamespaces", at = @At("HEAD"), cancellable = true) - private void useCacheForNamespaces(PackType type, CallbackInfoReturnable> cir) { + @Redirect(method = "getNamespaces", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/resource/PathPackResources;getNamespacesFromDisk(Lnet/minecraft/server/packs/PackType;)Ljava/util/Set;")) + private Set useCacheForNamespaces(PathPackResources instance, PackType type) { PackResourcesCacheEngine engine = cacheEngine; if(engine != null) { Set namespaces = engine.getNamespaces(type); if(namespaces != null) - cir.setReturnValue(namespaces); + return namespaces; } + return this.getNamespacesFromDisk(type); } @Redirect(method = "getRootResource", at = @At(value = "INVOKE", target = "Ljava/nio/file/Files;exists(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z")) From 2f4836b045e0ec6cbb79f746c43eca3c8fade369 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 Apr 2024 21:22:06 -0400 Subject: [PATCH 2/2] Support new REI version --- .../searchtree/REIBackedSearchTree.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java index b88232c6..be453ec2 100644 --- a/common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java @@ -14,10 +14,13 @@ import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; import java.util.function.Supplier; import java.util.function.UnaryOperator; @@ -107,9 +110,22 @@ public class REIBackedSearchTree extends DummySearchTree { throw new RuntimeException(e); } }; - return new AsyncSearchManager(stackListSupplier, () -> { + Supplier> shouldShowStack = () -> { return Predicates.alwaysTrue(); - }, normalizeOperator); + }; + try { + try { + // Old constructor taking Supplier as first arg + MethodHandle cn = MethodHandles.publicLookup().findConstructor(AsyncSearchManager.class, MethodType.methodType(void.class, Supplier.class, Supplier.class, UnaryOperator.class)); + return (AsyncSearchManager)cn.invoke(stackListSupplier, shouldShowStack, normalizeOperator); + } catch(NoSuchMethodException e) { + // New constructor taking Function as first arg + MethodHandle cn = MethodHandles.publicLookup().findConstructor(AsyncSearchManager.class, MethodType.methodType(void.class, Function.class, Supplier.class, UnaryOperator.class)); + return (AsyncSearchManager)cn.invoke((Function)o -> stackListSupplier.get(), shouldShowStack, normalizeOperator); + } + } catch(Throwable mhThrowable) { + throw new ReflectiveOperationException(mhThrowable); + } } catch(ReflectiveOperationException e) { throw new RuntimeException(e); }