diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/lazy_search_tree_registry/SessionSearchTreesMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/lazy_search_tree_registry/SessionSearchTreesMixin.java new file mode 100644 index 00000000..1eb93c3d --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/lazy_search_tree_registry/SessionSearchTreesMixin.java @@ -0,0 +1,44 @@ +package org.embeddedt.modernfix.common.mixin.perf.lazy_search_tree_registry; + +import com.google.common.base.Stopwatch; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import net.minecraft.client.gui.screens.recipebook.RecipeCollection; +import net.minecraft.client.multiplayer.SessionSearchTrees; +import net.minecraft.client.searchtree.SearchTree; +import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +@Mixin(SessionSearchTrees.class) +@ClientOnlyMixin +public class SessionSearchTreesMixin { + @Shadow private CompletableFuture> recipeSearch; + private Supplier> mfix$deferredSearchTreeSupplier; + + @ModifyArg(method = { "method_60367", "lambda$updateRecipes$8" }, at = @At(value = "INVOKE", target = "Ljava/util/concurrent/CompletableFuture;supplyAsync(Ljava/util/function/Supplier;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;")) + private Supplier> mfix$deferProcessing(Supplier> supplier) { + this.mfix$deferredSearchTreeSupplier = supplier; + return SearchTree::empty; + } + + @WrapMethod(method = "recipes") + private SearchTree mfix$processDeferredBuild(Operation> original) { + synchronized (this) { + if (mfix$deferredSearchTreeSupplier != null) { + Stopwatch watch = Stopwatch.createStarted(); + this.recipeSearch = CompletableFuture.completedFuture(mfix$deferredSearchTreeSupplier.get()); + watch.stop(); + ModernFix.LOGGER.info("Building recipe book search tree took {}", watch); + mfix$deferredSearchTreeSupplier = null; + } + return original.call(); + } + } +}