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 44fc0865..2a974854 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -59,6 +59,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("perf.compress_blockstate", false); this.addMixinRule("bugfix.concurrency", true); this.addMixinRule("bugfix.edge_chunk_not_saved", true); + this.addMixinRule("perf.fast_forge_dummies", true); this.addMixinRule("perf.dynamic_structure_manager", true); this.addMixinRule("bugfix.chunk_deadlock", true); this.addMixinRule("perf.thread_priorities", true); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java new file mode 100644 index 00000000..d1e586a8 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java @@ -0,0 +1,46 @@ +package org.embeddedt.modernfix.mixin.perf.fast_forge_dummies; + +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.IForgeRegistryEntry; +import org.jetbrains.annotations.Nullable; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Final; +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.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Map; +import java.util.function.Function; + +@Mixin(targets = { "net/minecraftforge/registries/NamespacedHolderHelper" }) +public class NamespacedHolderHelperMixin> { + @Shadow private Map> holdersByName; + + @Shadow @Final private @Nullable Function> holderLookup; + + @Shadow private Map> holders; + + @Shadow @Final private Registry self; + + @Inject(method = "freeze", at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, target = "Lnet/minecraftforge/registries/NamespacedHolderHelper;holdersByName:Ljava/util/Map;"), cancellable = true, remap = false) + private void fastDummyCheck(CallbackInfoReturnable> cir) { + // Quickly iterate without making any streams, etc. to see if everything is fine + // Use the slow path (by returning without cancelling) when there is an error + for(Holder.Reference ref : this.holdersByName.values()) { + if(!ref.isBound()) + return; + } + if (this.holderLookup != null) { + for(Holder.Reference ref : this.holders.values()) { + if(ref.getType() == Holder.Reference.Type.INTRUSIVE && !ref.isBound()) + return; + } + } + // Skip the creation of streams + cir.setReturnValue(this.self); + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index d0cd4ebf..4f2fc6e1 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -14,6 +14,7 @@ "perf.dynamic_structure_manager.StructureManagerMixin", "bugfix.chunk_deadlock.ServerChunkCacheMixin", "perf.dedicated_reload_executor.MinecraftServerMixin", + "perf.fast_forge_dummies.NamespacedHolderHelperMixin", "perf.remove_biome_temperature_cache.BiomeMixin", "perf.reduce_blockstate_cache_rebuilds.GameDataMixin", "perf.reduce_blockstate_cache_rebuilds.BlockCallbacksMixin",