From 5167f81f1fd58382ec687e02db1079b280c1039a Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 19 Mar 2023 14:12:01 -0400 Subject: [PATCH] Cache JEResources villagers --- .../core/config/ModernFixEarlyConfig.java | 1 + .../VillagerEntryMixin.java | 35 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 1 + 3 files changed, 37 insertions(+) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/perf/jeresources_startup/VillagerEntryMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 760db6ae..707ff38f 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -23,6 +23,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("feature.direct_stack_trace", false); this.addMixinRule("perf.fast_registry_validation", true); this.addMixinRule("perf.use_integrated_resources", true); + this.addMixinRule("perf.jeresources_startup", true); this.addMixinRule("perf.remove_biome_temperature_cache", true); this.addMixinRule("perf.resourcepacks", true); this.addMixinRule("perf.reduce_blockstate_cache_rebuilds", true); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/jeresources_startup/VillagerEntryMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/jeresources_startup/VillagerEntryMixin.java new file mode 100644 index 00000000..7b630c0e --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/jeresources_startup/VillagerEntryMixin.java @@ -0,0 +1,35 @@ +package org.embeddedt.modernfix.mixin.perf.jeresources_startup; + +import jeresources.entry.VillagerEntry; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.npc.Villager; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.lang.ref.WeakReference; + +/* Cache the created villager instead of reconstructing it every time */ +@Mixin(VillagerEntry.class) +public class VillagerEntryMixin { + private WeakReference cachedVillager = new WeakReference<>(null); + + @Inject(method = "getVillagerEntity", at = @At("HEAD"), cancellable = true) + private void useCachedVillager(CallbackInfoReturnable cir) { + Villager v = cachedVillager.get(); + if(v != null) { + // Ensure we don't hold on to an old client world unnecessarily + Level cLevel = Minecraft.getInstance().level; + if(cLevel != null && v.getLevel() != cLevel) + v.setLevel(cLevel); + cir.setReturnValue(v); + } + } + + @Inject(method = "getVillagerEntity", at = @At("RETURN")) + private void storeCachedVillager(CallbackInfoReturnable cir) { + cachedVillager = new WeakReference<>(cir.getReturnValue()); + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index d6a7f953..f90ed5ce 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -97,6 +97,7 @@ "perf.reuse_datapacks.MinecraftServerMixin", "perf.use_integrated_resources.LootTableHelperMixin", "perf.use_integrated_resources.PiglinBarteringRecipeBuilderMixin", + "perf.jeresources_startup.VillagerEntryMixin", "bugfix.mc218112.SynchedEntityDataMixin_Client", "perf.faster_singleplayer_load.MinecraftServerMixin" ],