From 613364ce917ea51faa348da99880301eeba3856c Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 19 Feb 2023 22:40:59 -0500 Subject: [PATCH] Further KubeJS optimization --- .../mixin/perf/kubejs/RecipeEventJSMixin.java | 32 +++++++++++++++++++ .../mixin/perf/kubejs/RecipeJSMixin.java | 22 +++++++++++++ src/main/resources/modernfix.mixins.json | 4 ++- 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/perf/kubejs/RecipeEventJSMixin.java create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/perf/kubejs/RecipeJSMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/kubejs/RecipeEventJSMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/kubejs/RecipeEventJSMixin.java new file mode 100644 index 00000000..30ebd578 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/kubejs/RecipeEventJSMixin.java @@ -0,0 +1,32 @@ +package org.embeddedt.modernfix.mixin.perf.kubejs; + +import dev.latvian.kubejs.recipe.RecipeEventJS; +import dev.latvian.kubejs.recipe.RecipeJS; +import dev.latvian.kubejs.recipe.filter.RecipeFilter; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.List; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +@Mixin(RecipeEventJS.class) +public class RecipeEventJSMixin { + @Shadow @Final private List originalRecipes; + + /** + * @author embeddedt + * @reason parallelize filtering, then run the consumer on one thread + */ + @Overwrite(remap = false) + public void forEachRecipe(RecipeFilter filter, Consumer consumer) { + if (filter == RecipeFilter.ALWAYS_TRUE) { + this.originalRecipes.forEach(consumer); + } else if (filter != RecipeFilter.ALWAYS_FALSE) { + List filtered = this.originalRecipes.parallelStream().filter(filter).collect(Collectors.toList()); + filtered.forEach(consumer); + } + } +} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/kubejs/RecipeJSMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/kubejs/RecipeJSMixin.java new file mode 100644 index 00000000..9b04fa90 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/kubejs/RecipeJSMixin.java @@ -0,0 +1,22 @@ +package org.embeddedt.modernfix.mixin.perf.kubejs; + +import dev.latvian.kubejs.recipe.RecipeJS; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(RecipeJS.class) +public class RecipeJSMixin { + /** + * @author embeddedt + * @reason some mods seem to not like this being called concurrently, not sure why this doesn't crash in other scripts + */ + @Redirect(method = "hasOutput", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/crafting/Recipe;getResultItem()Lnet/minecraft/world/item/ItemStack;")) + private ItemStack syncResultItem(Recipe recipe) { + synchronized (RecipeJS.class) { + return recipe.getResultItem(); + } + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index f0df6b32..eb6d129c 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -43,7 +43,9 @@ "feature.measure_time.SimpleReloadableResourceManagerMixin", "feature.measure_time.ProfiledReloadInstanceMixin", "perf.kubejs.TagIngredientJSMixin", - "perf.kubejs.TagWrapperMixin" + "perf.kubejs.TagWrapperMixin", + "perf.kubejs.RecipeEventJSMixin", + "perf.kubejs.RecipeJSMixin" ], "client": [ "feature.measure_time.MinecraftMixin",