From 5e4b08a8f5da2225d338a19d2f3971bb5fa02c2e Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 11 May 2023 14:14:56 -0400 Subject: [PATCH 01/17] Add support for Fabric datagen from runClient --- fabric/build.gradle | 1 + .../modernfix/ModernFixClientFabric.java | 5 +++ .../fabric/datagen/RuntimeDatagen.java | 40 +++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 fabric/src/main/java/org/embeddedt/modernfix/fabric/datagen/RuntimeDatagen.java diff --git a/fabric/build.gradle b/fabric/build.gradle index a68aea14..37d7d169 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -35,6 +35,7 @@ dependencies { modIncludeImplementation(fabricApi.module("fabric-command-api-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modIncludeImplementation(fabricApi.module("fabric-models-v0", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modImplementation(fabricApi.module("fabric-resource-loader-v0", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } + modImplementation(fabricApi.module("fabric-data-generation-api-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modCompileOnly("com.terraformersmc:modmenu:${rootProject.modmenu_version}") { transitive false } // Remove the next line if you don't want to depend on the API // modApi "me.shedaniel:architectury-fabric:${rootProject.architectury_version}" diff --git a/fabric/src/main/java/org/embeddedt/modernfix/ModernFixClientFabric.java b/fabric/src/main/java/org/embeddedt/modernfix/ModernFixClientFabric.java index b7f8db62..7fd97b77 100644 --- a/fabric/src/main/java/org/embeddedt/modernfix/ModernFixClientFabric.java +++ b/fabric/src/main/java/org/embeddedt/modernfix/ModernFixClientFabric.java @@ -4,7 +4,9 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; +import org.embeddedt.modernfix.fabric.datagen.RuntimeDatagen; import java.util.concurrent.atomic.AtomicBoolean; @@ -29,5 +31,8 @@ public class ModernFixClientFabric implements ClientModInitializer { ServerLifecycleEvents.SERVER_STARTED.register(server -> { commonMod.onServerStarted(server); }); + if(FabricLoader.getInstance().isModLoaded("fabric-data-generation-api-v1")) { + RuntimeDatagen.init(); + } } } diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/datagen/RuntimeDatagen.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/datagen/RuntimeDatagen.java new file mode 100644 index 00000000..91e13676 --- /dev/null +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/datagen/RuntimeDatagen.java @@ -0,0 +1,40 @@ +package org.embeddedt.modernfix.fabric.datagen; + +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +import net.fabricmc.fabric.impl.datagen.FabricDataGenHelper; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.network.chat.TextComponent; +import org.embeddedt.modernfix.ModernFix; + +import java.lang.reflect.Method; + +public class RuntimeDatagen { + private static final boolean SHOULD_RUNTIME_DATAGEN = System.getProperty("fabric-api.datagen.output-dir") != null; + + private static void runRuntimeDatagen() { + // call runInternal directly to avoid exiting immediately + try { + System.setProperty("fabric-api.datagen", "true"); + Method method = FabricDataGenHelper.class.getDeclaredMethod("runInternal"); + method.setAccessible(true); + method.invoke(null); + } catch(Throwable e) { + ModernFix.LOGGER.error("Error running datagen", e); + } finally { + System.clearProperty("fabric-api.datagen"); + } + } + + public static void init() { + if(!SHOULD_RUNTIME_DATAGEN) + return; + ScreenEvents.AFTER_INIT.register(((client, s, scaledWidth, scaledHeight) -> { + if(s instanceof TitleScreen screen) { + screen.addRenderableWidget(new Button(screen.width / 2 - 100 - 50, screen.height / 4 + 48, 50, 20, new TextComponent("DG"), (arg) -> { + runRuntimeDatagen(); + })); + } + })); + } +} From a1f50a0c4f32038862c839846eea400b4ef84ed1 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 12 May 2023 10:52:18 -0400 Subject: [PATCH 02/17] Fix missing model flag not being cleared at times --- .../mixin/perf/dynamic_resources/ModelBakerImplMixin.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakerImplMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakerImplMixin.java index 0639d6c1..f6441b48 100644 --- a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakerImplMixin.java +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakerImplMixin.java @@ -88,7 +88,8 @@ public abstract class ModelBakerImplMixin { if(arg != ModelBakery.MISSING_MODEL_LOCATION && debugDynamicModelLoading) ModernFix.LOGGER.warn("Model {} not present", arg); wasMissingModel = true; - } + } else + wasMissingModel = false; /* sometimes this runs more than once e.g. for recursive model baking */ cir.getReturnValue().resolveParents(this.field_40571::getModel); } From 45d308c6a47035843d165c06f21e083cfcd7ce25 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 13 May 2023 09:36:34 -0400 Subject: [PATCH 03/17] Fix incorrect logic in packet leak patch Related: #97 --- .../ClientPlayNetHandlerMixin.java | 33 ------------------- .../SCustomPayloadPlayPacketMixin.java | 12 ++----- .../modernfix/duck/IClientNetHandler.java | 7 ---- 3 files changed, 3 insertions(+), 49 deletions(-) delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/ClientPlayNetHandlerMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/duck/IClientNetHandler.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/ClientPlayNetHandlerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/ClientPlayNetHandlerMixin.java deleted file mode 100644 index 630007a8..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/ClientPlayNetHandlerMixin.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.bugfix.packet_leak; - -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket; -import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -import org.embeddedt.modernfix.duck.IClientNetHandler; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(ClientPacketListener.class) -@ClientOnlyMixin -public class ClientPlayNetHandlerMixin implements IClientNetHandler { - private FriendlyByteBuf savedCopy = null; - /** - * @author embeddedt - * @reason Release the packet buffer at the end. Needed in f - */ - @Redirect(method = "handleCustomPayload", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/game/ClientboundCustomPayloadPacket;getData()Lnet/minecraft/network/FriendlyByteBuf;")) - private FriendlyByteBuf saveCopyForRelease(ClientboundCustomPayloadPacket instance) { - FriendlyByteBuf copy = instance.getData(); - savedCopy = copy; - return copy; - } - - @Override - public FriendlyByteBuf getCopiedCustomBuffer() { - FriendlyByteBuf copy = savedCopy; - savedCopy = null; - return copy; - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/SCustomPayloadPlayPacketMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/SCustomPayloadPlayPacketMixin.java index 083f0c0f..2862becd 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/SCustomPayloadPlayPacketMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/SCustomPayloadPlayPacketMixin.java @@ -5,7 +5,6 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket; import net.minecraft.resources.ResourceLocation; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -import org.embeddedt.modernfix.duck.IClientNetHandler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -32,14 +31,9 @@ public class SCustomPayloadPlayPacketMixin { @Redirect(method = "handle(Lnet/minecraft/network/protocol/game/ClientGamePacketListener;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/game/ClientGamePacketListener;handleCustomPayload(Lnet/minecraft/network/protocol/game/ClientboundCustomPayloadPacket;)V")) private void handleAndFree(ClientGamePacketListener instance, ClientboundCustomPayloadPacket sCustomPayloadPlayPacket) { - try { - instance.handleCustomPayload(sCustomPayloadPlayPacket); - } finally { - FriendlyByteBuf copied = ((IClientNetHandler)instance).getCopiedCustomBuffer(); - if(copied != null) - copied.release(); - } + /* in 1.16, this method creates a copy inside it, but handles freeing correctly */ + instance.handleCustomPayload(sCustomPayloadPlayPacket); if(this.needsRelease) - this.data.release(); + this.data.release(); /* free our own copy of the data if needed */ } } diff --git a/common/src/main/java/org/embeddedt/modernfix/duck/IClientNetHandler.java b/common/src/main/java/org/embeddedt/modernfix/duck/IClientNetHandler.java deleted file mode 100644 index 71b1a0a6..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/duck/IClientNetHandler.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.embeddedt.modernfix.duck; - -import net.minecraft.network.FriendlyByteBuf; - -public interface IClientNetHandler { - FriendlyByteBuf getCopiedCustomBuffer(); -} From eb925bc3bafa513897a7c39143ed98073cd6f03d Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 14 May 2023 19:23:36 -0400 Subject: [PATCH 04/17] Fix performance issue when loading large NBT maps Array map was not being changed to hash map until AFTER the insertions, which is bad --- .../org/embeddedt/modernfix/util/CanonizingStringMap.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/util/CanonizingStringMap.java b/common/src/main/java/org/embeddedt/modernfix/util/CanonizingStringMap.java index e5bb2f2d..05bd219b 100644 --- a/common/src/main/java/org/embeddedt/modernfix/util/CanonizingStringMap.java +++ b/common/src/main/java/org/embeddedt/modernfix/util/CanonizingStringMap.java @@ -77,11 +77,15 @@ public class CanonizingStringMap implements Map { public void putAll(@NotNull Map map) { if(map.size() == 0) return; + // grow early if we know there are enough non-overlapping keys + if((map.size() - backingMap.size()) > GROWTH_THRESHOLD && !(backingMap instanceof Object2ObjectOpenHashMap)) { + backingMap = new Object2ObjectOpenHashMap<>(backingMap); + } map.forEach((String key, T val) -> { key = KEY_INTERNER.intern(key); backingMap.put(key, val); }); - // if it's too big to be an array, grow it + // if it's still an array, and now too big, grow it if(backingMap.size() > GROWTH_THRESHOLD && !(backingMap instanceof Object2ObjectOpenHashMap)) { backingMap = new Object2ObjectOpenHashMap<>(backingMap); } From 0f2764b79d4d458f8af6f28d4292737db023654c Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 14 May 2023 19:48:57 -0400 Subject: [PATCH 05/17] Revert "Fix incorrect logic in packet leak patch" This reverts commit 45d308c6a47035843d165c06f21e083cfcd7ce25. --- .../ClientPlayNetHandlerMixin.java | 33 +++++++++++++++++++ .../SCustomPayloadPlayPacketMixin.java | 12 +++++-- .../modernfix/duck/IClientNetHandler.java | 7 ++++ 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/ClientPlayNetHandlerMixin.java create mode 100644 common/src/main/java/org/embeddedt/modernfix/duck/IClientNetHandler.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/ClientPlayNetHandlerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/ClientPlayNetHandlerMixin.java new file mode 100644 index 00000000..630007a8 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/ClientPlayNetHandlerMixin.java @@ -0,0 +1,33 @@ +package org.embeddedt.modernfix.common.mixin.bugfix.packet_leak; + +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.duck.IClientNetHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ClientPacketListener.class) +@ClientOnlyMixin +public class ClientPlayNetHandlerMixin implements IClientNetHandler { + private FriendlyByteBuf savedCopy = null; + /** + * @author embeddedt + * @reason Release the packet buffer at the end. Needed in f + */ + @Redirect(method = "handleCustomPayload", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/game/ClientboundCustomPayloadPacket;getData()Lnet/minecraft/network/FriendlyByteBuf;")) + private FriendlyByteBuf saveCopyForRelease(ClientboundCustomPayloadPacket instance) { + FriendlyByteBuf copy = instance.getData(); + savedCopy = copy; + return copy; + } + + @Override + public FriendlyByteBuf getCopiedCustomBuffer() { + FriendlyByteBuf copy = savedCopy; + savedCopy = null; + return copy; + } +} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/SCustomPayloadPlayPacketMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/SCustomPayloadPlayPacketMixin.java index 2862becd..083f0c0f 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/SCustomPayloadPlayPacketMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/SCustomPayloadPlayPacketMixin.java @@ -5,6 +5,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket; import net.minecraft.resources.ResourceLocation; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.duck.IClientNetHandler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -31,9 +32,14 @@ public class SCustomPayloadPlayPacketMixin { @Redirect(method = "handle(Lnet/minecraft/network/protocol/game/ClientGamePacketListener;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/game/ClientGamePacketListener;handleCustomPayload(Lnet/minecraft/network/protocol/game/ClientboundCustomPayloadPacket;)V")) private void handleAndFree(ClientGamePacketListener instance, ClientboundCustomPayloadPacket sCustomPayloadPlayPacket) { - /* in 1.16, this method creates a copy inside it, but handles freeing correctly */ - instance.handleCustomPayload(sCustomPayloadPlayPacket); + try { + instance.handleCustomPayload(sCustomPayloadPlayPacket); + } finally { + FriendlyByteBuf copied = ((IClientNetHandler)instance).getCopiedCustomBuffer(); + if(copied != null) + copied.release(); + } if(this.needsRelease) - this.data.release(); /* free our own copy of the data if needed */ + this.data.release(); } } diff --git a/common/src/main/java/org/embeddedt/modernfix/duck/IClientNetHandler.java b/common/src/main/java/org/embeddedt/modernfix/duck/IClientNetHandler.java new file mode 100644 index 00000000..71b1a0a6 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/duck/IClientNetHandler.java @@ -0,0 +1,7 @@ +package org.embeddedt.modernfix.duck; + +import net.minecraft.network.FriendlyByteBuf; + +public interface IClientNetHandler { + FriendlyByteBuf getCopiedCustomBuffer(); +} From b21ee9a7e721f92aa0a8a1a44d79f871fdb1131e Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 14 May 2023 19:59:39 -0400 Subject: [PATCH 06/17] Hopefully more stable version of the original packet fix --- .../ClientPlayNetHandlerMixin.java | 16 +++---------- .../SCustomPayloadPlayPacketMixin.java | 23 +++++++++++++++---- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/ClientPlayNetHandlerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/ClientPlayNetHandlerMixin.java index 630007a8..cfc92448 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/ClientPlayNetHandlerMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/ClientPlayNetHandlerMixin.java @@ -11,23 +11,13 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(ClientPacketListener.class) @ClientOnlyMixin -public class ClientPlayNetHandlerMixin implements IClientNetHandler { - private FriendlyByteBuf savedCopy = null; +public class ClientPlayNetHandlerMixin { /** * @author embeddedt - * @reason Release the packet buffer at the end. Needed in f + * @reason allow the other function to track use of the buffer */ @Redirect(method = "handleCustomPayload", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/game/ClientboundCustomPayloadPacket;getData()Lnet/minecraft/network/FriendlyByteBuf;")) private FriendlyByteBuf saveCopyForRelease(ClientboundCustomPayloadPacket instance) { - FriendlyByteBuf copy = instance.getData(); - savedCopy = copy; - return copy; - } - - @Override - public FriendlyByteBuf getCopiedCustomBuffer() { - FriendlyByteBuf copy = savedCopy; - savedCopy = null; - return copy; + return ((IClientNetHandler)instance).getCopiedCustomBuffer(); } } diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/SCustomPayloadPlayPacketMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/SCustomPayloadPlayPacketMixin.java index 083f0c0f..8b0a8f37 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/SCustomPayloadPlayPacketMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/packet_leak/SCustomPayloadPlayPacketMixin.java @@ -15,9 +15,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ClientboundCustomPayloadPacket.class) @ClientOnlyMixin -public class SCustomPayloadPlayPacketMixin { +public abstract class SCustomPayloadPlayPacketMixin implements IClientNetHandler { @Shadow private FriendlyByteBuf data; + @Shadow public abstract FriendlyByteBuf getData(); + + private FriendlyByteBuf usedByteBuf = null; + private boolean needsRelease; @Inject(method = "(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/network/FriendlyByteBuf;)V", at = @At("RETURN")) @@ -30,16 +34,25 @@ public class SCustomPayloadPlayPacketMixin { this.needsRelease = true; } + @Override + public FriendlyByteBuf getCopiedCustomBuffer() { + FriendlyByteBuf buf = this.getData(); + usedByteBuf = buf; + return buf; + } + @Redirect(method = "handle(Lnet/minecraft/network/protocol/game/ClientGamePacketListener;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/game/ClientGamePacketListener;handleCustomPayload(Lnet/minecraft/network/protocol/game/ClientboundCustomPayloadPacket;)V")) private void handleAndFree(ClientGamePacketListener instance, ClientboundCustomPayloadPacket sCustomPayloadPlayPacket) { + usedByteBuf = null; try { instance.handleCustomPayload(sCustomPayloadPlayPacket); } finally { - FriendlyByteBuf copied = ((IClientNetHandler)instance).getCopiedCustomBuffer(); - if(copied != null) - copied.release(); + FriendlyByteBuf buf = usedByteBuf; + if(buf != null && buf.refCnt() > 0) { + buf.release(); + } } - if(this.needsRelease) + if(this.needsRelease && this.data.refCnt() > 0) this.data.release(); } } From c1c9c02ff4e20dba3e2caf191c287b4cf000d3e9 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 14 May 2023 20:25:36 -0400 Subject: [PATCH 07/17] Remove blockstate compression --- .../BlockBehaviourMixin.java | 14 --- .../BlockStateBaseMixin.java | 102 ------------------ .../main/resources/modernfix.accesswidener | 10 -- .../forge/ModernFixPlatformHooksImpl.java | 49 ++------- 4 files changed, 8 insertions(+), 167 deletions(-) delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockBehaviourMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockStateBaseMixin.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockBehaviourMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockBehaviourMixin.java deleted file mode 100644 index 08bb7a52..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockBehaviourMixin.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.perf.compress_blockstate; - -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.BlockState; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; - -@Mixin(BlockBehaviour.class) -public class BlockBehaviourMixin { - @Overwrite - protected boolean isAir(BlockState state) { - return state.getBlock().properties.isAir; - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockStateBaseMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockStateBaseMixin.java deleted file mode 100644 index 630c0234..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockStateBaseMixin.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.perf.compress_blockstate; - -import com.google.common.collect.ImmutableMap; -import com.mojang.serialization.MapCodec; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateHolder; -import net.minecraft.world.level.block.state.properties.Property; -import net.minecraft.world.level.material.Material; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(BlockBehaviour.BlockStateBase.class) -public abstract class BlockStateBaseMixin extends StateHolder { - protected BlockStateBaseMixin(Block object, ImmutableMap, Comparable> immutableMap, MapCodec mapCodec) { - super(object, immutableMap, mapCodec); - } - - @Redirect(method = "*", at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "Lnet/minecraft/world/level/block/state/BlockBehaviour$BlockStateBase;material:Lnet/minecraft/world/level/material/Material;" - )) - private Material getMaterial(BlockBehaviour.BlockStateBase base) { - return this.owner.properties.material; - } - - @Redirect(method = "*", at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "Lnet/minecraft/world/level/block/state/BlockBehaviour$BlockStateBase;destroySpeed:F" - )) - private float getDestroyTime(BlockBehaviour.BlockStateBase base) { - return this.owner.properties.destroyTime; - } - - @Redirect(method = "*", at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "Lnet/minecraft/world/level/block/state/BlockBehaviour$BlockStateBase;requiresCorrectToolForDrops:Z" - )) - private boolean getRequiresTool(BlockBehaviour.BlockStateBase base) { - return this.owner.properties.requiresCorrectToolForDrops; - } - - @Redirect(method = "*", at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "Lnet/minecraft/world/level/block/state/BlockBehaviour$BlockStateBase;canOcclude:Z" - )) - private boolean getCanOcclude(BlockBehaviour.BlockStateBase base) { - return this.owner.properties.canOcclude; - } - - @Redirect(method = "*", at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "Lnet/minecraft/world/level/block/state/BlockBehaviour$BlockStateBase;isRedstoneConductor:Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate;" - )) - private BlockBehaviour.StatePredicate getRedstoneConductor(BlockBehaviour.BlockStateBase base) { - return this.owner.properties.isRedstoneConductor; - } - - @Redirect(method = "*", at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "Lnet/minecraft/world/level/block/state/BlockBehaviour$BlockStateBase;isSuffocating:Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate;" - )) - private BlockBehaviour.StatePredicate getSuffocating(BlockBehaviour.BlockStateBase base) { - return this.owner.properties.isSuffocating; - } - - @Redirect(method = "*", at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "Lnet/minecraft/world/level/block/state/BlockBehaviour$BlockStateBase;isViewBlocking:Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate;" - )) - private BlockBehaviour.StatePredicate getViewBlocking(BlockBehaviour.BlockStateBase base) { - return this.owner.properties.isViewBlocking; - } - - @Redirect(method = "*", at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "Lnet/minecraft/world/level/block/state/BlockBehaviour$BlockStateBase;hasPostProcess:Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate;" - )) - private BlockBehaviour.StatePredicate getPostProcess(BlockBehaviour.BlockStateBase base) { - return this.owner.properties.hasPostProcess; - } - - @Redirect(method = "*", at = @At( - value = "FIELD", - opcode = Opcodes.GETFIELD, - target = "Lnet/minecraft/world/level/block/state/BlockBehaviour$BlockStateBase;emissiveRendering:Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate;" - )) - private BlockBehaviour.StatePredicate getEmissiveRendering(BlockBehaviour.BlockStateBase base) { - return this.owner.properties.emissiveRendering; - } -} diff --git a/common/src/main/resources/modernfix.accesswidener b/common/src/main/resources/modernfix.accesswidener index 4f571127..bc312130 100644 --- a/common/src/main/resources/modernfix.accesswidener +++ b/common/src/main/resources/modernfix.accesswidener @@ -14,16 +14,6 @@ accessible field net/minecraft/client/renderer/texture/Stitcher$Holder width I accessible field net/minecraft/client/renderer/texture/Stitcher$Holder height I accessible field net/minecraft/network/syncher/EntityDataAccessor id I mutable field net/minecraft/network/syncher/EntityDataAccessor id I -accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties isAir Z -accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties material Lnet/minecraft/world/level/material/Material; -accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties destroyTime F -accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties requiresCorrectToolForDrops Z -accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties canOcclude Z -accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties isRedstoneConductor Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate; -accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties isSuffocating Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate; -accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties isViewBlocking Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate; -accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties hasPostProcess Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate; -accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties emissiveRendering Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate; accessible class net/minecraft/client/resources/model/ModelBakery$BlockStateDefinitionException accessible field net/minecraft/network/syncher/SynchedEntityData itemsById Ljava/util/Map; accessible field net/minecraft/network/syncher/SynchedEntityData ENTITY_ID_POOL Ljava/util/Map; diff --git a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java index f8eb19e6..4cc7fac1 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java +++ b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java @@ -4,7 +4,6 @@ import com.google.common.io.Resources; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.brigadier.CommandDispatcher; import cpw.mods.modlauncher.*; -import cpw.mods.modlauncher.api.INameMappingService; import cpw.mods.modlauncher.api.LamdbaExceptionUtils; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -18,20 +17,21 @@ import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.fml.ModLoader; -import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.fml.loading.FMLPaths; import net.minecraftforge.fml.loading.LoadingModList; import net.minecraftforge.fml.loading.moddiscovery.ExplodedDirectoryLocator; import net.minecraftforge.fml.network.PacketDistributor; import net.minecraftforge.fml.server.ServerLifecycleHooks; +import org.embeddedt.modernfix.core.ModernFixMixinPlugin; import org.embeddedt.modernfix.forge.classloading.FastAccessTransformerList; import org.embeddedt.modernfix.forge.classloading.ModernFixResourceFinder; -import org.embeddedt.modernfix.core.ModernFixMixinPlugin; import org.embeddedt.modernfix.forge.packet.PacketHandler; import org.embeddedt.modernfix.util.DummyList; import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.*; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.InsnNode; +import org.objectweb.asm.tree.MethodNode; import org.spongepowered.asm.mixin.injection.struct.InjectorGroupInfo; import java.io.IOException; @@ -43,11 +43,11 @@ import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.nio.file.Path; -import java.util.*; +import java.util.Enumeration; +import java.util.Map; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; public class ModernFixPlatformHooksImpl { public static boolean isClient() { @@ -206,40 +206,7 @@ public class ModernFixPlatformHooksImpl { } public static void applyASMTransformers(String mixinClassName, ClassNode targetClass) { - if(mixinClassName.equals("org.embeddedt.modernfix.common.compress_blockstate.perf.mixin.BlockStateBaseMixin")) { - // Delete unused fields off BlockStateBase - Set fieldsToDelete = Stream.of( - "field_235702_f_", // isAir - "field_235703_g_", // material - "field_235705_i_", // destroySpeed - "field_235706_j_", // requiresCorrectToolForDrops - "field_235707_k_", // canOcclude - "field_235708_l_", // isRedstoneConductor - "field_235709_m_", // isSuffocating - "field_235710_n_", // isViewBlocking - "field_235711_o_", // hasPostProcess - "field_235712_p_" // emissiveRendering - ).map(name -> ObfuscationReflectionHelper.remapName(INameMappingService.Domain.FIELD, name)).collect(Collectors.toSet()); - targetClass.fields.removeIf(field -> { - if(fieldsToDelete.contains(field.name)) { - return true; - } - return false; - }); - for(MethodNode m : targetClass.methods) { - if(m.name.equals("")) { - ListIterator iter = m.instructions.iterator(); - while(iter.hasNext()) { - AbstractInsnNode node = iter.next(); - if(node.getOpcode() == Opcodes.PUTFIELD) { - if(fieldsToDelete.contains(((FieldInsnNode)node).name)) { - iter.remove(); - } - } - } - } - } - } else if(mixinClassName.equals("org.embeddedt.modernfix.forge.valhesia.chunk_deadlock.bugfix.mixin.BlockStateBaseMixin")) { + if(mixinClassName.equals("org.embeddedt.modernfix.forge.valhesia.chunk_deadlock.bugfix.mixin.BlockStateBaseMixin")) { // We need to destroy Valhelsia's callback so it can never run getBlockState for(MethodNode m : targetClass.methods) { if(m.name.contains("valhelsia_placeDousedTorch")) { From fc69d55314f41d62fa351aa7108132d21dd53ca3 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 11:11:09 -0400 Subject: [PATCH 08/17] Fix compile error --- .../embeddedt/modernfix/fabric/datagen/RuntimeDatagen.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/datagen/RuntimeDatagen.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/datagen/RuntimeDatagen.java index 91e13676..6dfa4959 100644 --- a/fabric/src/main/java/org/embeddedt/modernfix/fabric/datagen/RuntimeDatagen.java +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/datagen/RuntimeDatagen.java @@ -4,7 +4,7 @@ import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.fabricmc.fabric.impl.datagen.FabricDataGenHelper; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.TitleScreen; -import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.Component; import org.embeddedt.modernfix.ModernFix; import java.lang.reflect.Method; @@ -31,7 +31,7 @@ public class RuntimeDatagen { return; ScreenEvents.AFTER_INIT.register(((client, s, scaledWidth, scaledHeight) -> { if(s instanceof TitleScreen screen) { - screen.addRenderableWidget(new Button(screen.width / 2 - 100 - 50, screen.height / 4 + 48, 50, 20, new TextComponent("DG"), (arg) -> { + screen.addRenderableWidget(new Button(screen.width / 2 - 100 - 50, screen.height / 4 + 48, 50, 20, Component.literal("DG"), (arg) -> { runRuntimeDatagen(); })); } From 04c89a26edad7dd92e5adcb856191661102301ff Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 13:28:40 -0400 Subject: [PATCH 09/17] Workaround for Forge issue #9505 --- .../modernfix/forge/mixin/core/BootstrapMixin.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java index 428145b7..89709891 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java @@ -1,6 +1,7 @@ package org.embeddedt.modernfix.forge.mixin.core; import net.minecraft.server.Bootstrap; +import net.minecraftforge.network.NetworkConstants; import org.slf4j.Logger; import org.embeddedt.modernfix.forge.load.ModWorkManagerQueue; import org.spongepowered.asm.mixin.Final; @@ -23,4 +24,11 @@ public class BootstrapMixin { ModWorkManagerQueue.replace(); } } + + /* for https://github.com/MinecraftForge/MinecraftForge/issues/9505 */ + @Inject(method = "bootStrap", at = @At("RETURN")) + private static void doClassloadHack(CallbackInfo ci) { + NetworkConstants.init(); + LOGGER.info("Worked around Forge issue #9505"); + } } From d2d5f81782d0b1aef06e3edb4665ec4442a196ea Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 19:43:31 -0400 Subject: [PATCH 10/17] Bump required Forge version, drop datapack reload patch https://github.com/MinecraftForge/MinecraftForge/pull/9454 has been merged upstream --- forge/build.gradle | 2 +- .../CreateWorldScreenMixin.java | 36 ------------------- forge/src/main/resources/META-INF/mods.toml | 2 +- gradle.properties | 2 +- 4 files changed, 3 insertions(+), 39 deletions(-) delete mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java diff --git a/forge/build.gradle b/forge/build.gradle index c2332fca..9f4e09f4 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -44,7 +44,7 @@ dependencies { modCompileOnly("mezz.jei:jei-${minecraft_version}-forge:${jei_version}") modCompileOnly("curse.maven:jeresources-240630:3951643") - modCompileOnly "me.shedaniel:RoughlyEnoughItems-forge:${rei_version}" + modCompileOnly("me.shedaniel:RoughlyEnoughItems-forge:${rei_version}") { transitive false } modCompileOnly("dev.latvian.mods:kubejs-forge:${kubejs_version}") modRuntimeOnly("curse.maven:ferritecore-429235:4441949") modCompileOnly("team.chisel.ctm:CTM:${ctm_version}") diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java deleted file mode 100644 index 5655dc2e..00000000 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.embeddedt.modernfix.forge.mixin.perf.skip_first_datapack_reload; - -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.worldselection.CreateWorldScreen; -import net.minecraft.client.gui.screens.worldselection.WorldCreationContext; -import net.minecraft.network.chat.Component; -import net.minecraft.server.packs.repository.PackRepository; -import net.minecraft.world.level.WorldDataConfiguration; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.function.Consumer; - -@Mixin(CreateWorldScreen.class) -public abstract class CreateWorldScreenMixin extends Screen { - protected CreateWorldScreenMixin(Component arg) { - super(arg); - } - // TODO: incorporate https://github.com/MinecraftForge/MinecraftForge/pull/9454 - @ModifyArg(method = "openFresh", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/worldselection/CreateWorldScreen;createDefaultLoadConfig(Lnet/minecraft/server/packs/repository/PackRepository;Lnet/minecraft/world/level/WorldDataConfiguration;)Lnet/minecraft/server/WorldLoader$InitConfig;"), index = 1) - private static WorldDataConfiguration useDefaultConfiguration(WorldDataConfiguration config) { - return WorldDataConfiguration.DEFAULT; - } - - @Redirect(method = "openFresh", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/worldselection/WorldCreationContext;withDataConfiguration(Lnet/minecraft/world/level/WorldDataConfiguration;)Lnet/minecraft/client/gui/screens/worldselection/WorldCreationContext;")) - private static WorldCreationContext sameDataConfiguration(WorldCreationContext context, WorldDataConfiguration config) { - return context; - } - - @Redirect(method = "openFresh", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/worldselection/CreateWorldScreen;tryApplyNewDataPacks(Lnet/minecraft/server/packs/repository/PackRepository;ZLjava/util/function/Consumer;)V")) - private static void skipReapply(CreateWorldScreen screen, PackRepository repository, boolean bl, Consumer consumer) { - /* no-op */ - } -} diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 5dc798cb..29a2c07a 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -40,7 +40,7 @@ modId = "forge" #mandatory # Does this dependency have to exist - if not, ordering below must be specified mandatory = true #mandatory # The version range of the dependency -versionRange = "[45,)" #mandatory +versionRange = "[45.0.63,)" #mandatory # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory ordering = "NONE" # Side this dependency is applied on - BOTH, CLIENT or SERVER diff --git a/gradle.properties b/gradle.properties index a5b11c62..418bceda 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.jvmargs=-Xmx2G mod_id=modernfix minecraft_version=1.19.4 enabled_platforms=fabric,forge -forge_version=1.19.4-45.0.22 +forge_version=1.19.4-45.0.63 parchment_version=2023.03.12 refined_storage_version=4392788 jei_version=13.1.0.2 From 32c1baf8879fd184c62d76c0d1046bca6a5d4061 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 20:23:37 -0400 Subject: [PATCH 11/17] Move search tree replacement to common, support both modloaders --- .../blast_search_trees/MinecraftMixin.java | 30 +++++++++++ .../modernfix/searchtree/DummySearchTree.java | 19 +++++++ .../SearchTreeProviderRegistry.java | 30 +++++++++++ .../forge/init/ModernFixClientForge.java | 3 ++ .../blast_search_trees/MinecraftMixin.java | 50 ------------------- .../forge/searchtree/JEIBackedSearchTree.java | 20 ++++++++ 6 files changed, 102 insertions(+), 50 deletions(-) create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java create mode 100644 common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java delete mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java new file mode 100644 index 00000000..4b9d7c05 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java @@ -0,0 +1,30 @@ +package org.embeddedt.modernfix.common.mixin.perf.blast_search_trees; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.searchtree.SearchRegistry; +import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.searchtree.DummySearchTree; +import org.embeddedt.modernfix.searchtree.SearchTreeProviderRegistry; +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.CallbackInfo; + +@Mixin(Minecraft.class) +@ClientOnlyMixin +public class MinecraftMixin { + @Shadow @Final private SearchRegistry searchRegistry; + + @Inject(method = "createSearchTrees", at = @At("HEAD"), cancellable = true) + private void replaceSearchTrees(CallbackInfo ci) { + SearchTreeProviderRegistry.Provider provider = SearchTreeProviderRegistry.getSearchTreeProvider(); + ModernFix.LOGGER.info("Replacing search trees with '{}' provider", provider.getName()); + this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, provider.getSearchTree(false)); + this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, provider.getSearchTree(true)); + this.searchRegistry.register(SearchRegistry.RECIPE_COLLECTIONS, new DummySearchTree<>()); + ci.cancel(); + } +} diff --git a/common/src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java index ff337dc0..87818a2f 100644 --- a/common/src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java @@ -2,6 +2,7 @@ package org.embeddedt.modernfix.searchtree; import net.minecraft.client.searchtree.MutableSearchTree; import net.minecraft.client.searchtree.ReloadableIdSearchTree; +import net.minecraft.world.item.ItemStack; import java.util.Collections; import java.util.List; @@ -34,4 +35,22 @@ public class DummySearchTree extends ReloadableIdSearchTree implements Mut public List search(String pSearchText) { return Collections.emptyList(); } + + static final SearchTreeProviderRegistry.Provider PROVIDER = new SearchTreeProviderRegistry.Provider() { + + @Override + public ReloadableIdSearchTree getSearchTree(boolean tag) { + return new DummySearchTree<>(); + } + + @Override + public boolean canUse() { + return true; + } + + @Override + public String getName() { + return "Dummy"; + } + }; } diff --git a/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java new file mode 100644 index 00000000..4dc5706b --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java @@ -0,0 +1,30 @@ +package org.embeddedt.modernfix.searchtree; + +import net.minecraft.client.searchtree.ReloadableIdSearchTree; +import net.minecraft.world.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class SearchTreeProviderRegistry { + private static final List searchTreeProviders = new ArrayList<>(); + + public static synchronized Provider getSearchTreeProvider() { + for(Provider p : searchTreeProviders) { + if(p.canUse()) + return p; + } + return DummySearchTree.PROVIDER; + } + + public static synchronized void register(Provider p) { + if(p.canUse()) + searchTreeProviders.add(p); + } + + public interface Provider { + ReloadableIdSearchTree getSearchTree(boolean tag); + boolean canUse(); + String getName(); + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java index 7db520f5..5f519d06 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java @@ -22,7 +22,9 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.util.ObfuscationReflectionHelper; import org.embeddedt.modernfix.ModernFixClient; +import org.embeddedt.modernfix.forge.searchtree.JEIBackedSearchTree; import org.embeddedt.modernfix.screen.ModernFixConfigScreen; +import org.embeddedt.modernfix.searchtree.SearchTreeProviderRegistry; public class ModernFixClientForge { private static ModernFixClient commonMod; @@ -34,6 +36,7 @@ public class ModernFixClientForge { ConfigGuiHandler.ConfigGuiFactory.class, () -> new ConfigGuiHandler.ConfigGuiFactory((mc, screen) -> new ModernFixConfigScreen(screen)) ); + SearchTreeProviderRegistry.register(JEIBackedSearchTree.PROVIDER); } private KeyMapping configKey; diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java deleted file mode 100644 index 4d5c5b75..00000000 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.embeddedt.modernfix.forge.mixin.perf.blast_search_trees; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.searchtree.SearchRegistry; -import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.ModList; -import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -import org.embeddedt.modernfix.searchtree.DummySearchTree; -import org.embeddedt.modernfix.searchtree.REIBackedSearchTree; -import org.embeddedt.modernfix.forge.searchtree.JEIBackedSearchTree; -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.CallbackInfo; - -import java.util.Optional; - -@Mixin(Minecraft.class) -@ClientOnlyMixin -public class MinecraftMixin { - @Shadow @Final private SearchRegistry searchRegistry; - - @Inject(method = "createSearchTrees", at = @At("HEAD"), cancellable = true) - private void replaceSearchTrees(CallbackInfo ci) { - Optional jeiContainer = ModList.get().getModContainerById("jei"); - if(ModList.get().isLoaded("roughlyenoughitems")) { - ModernFix.LOGGER.info("Replaced creative search logic with REI"); - this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new REIBackedSearchTree(false)); - this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new REIBackedSearchTree(true)); - } else if(jeiContainer.isPresent()) { - /* ugly hack since getMajorVersion() returns 0 */ - if(jeiContainer.get().getModInfo().getVersion().toString().startsWith("9.")) { - ModernFix.LOGGER.warn("Not disabling creative search as JEI 9 is in use"); - return; - } - ModernFix.LOGGER.info("Replaced creative search logic with JEI"); - this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new JEIBackedSearchTree(false)); - this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new JEIBackedSearchTree(true)); - } else { - ModernFix.LOGGER.info("Completely removed creative search logic"); - this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, new DummySearchTree<>()); - this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, new DummySearchTree<>()); - } - this.searchRegistry.register(SearchRegistry.RECIPE_COLLECTIONS, new DummySearchTree<>()); - ci.cancel(); - } -} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java b/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java index 7346062e..b9593da9 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java @@ -5,10 +5,13 @@ import mezz.jei.common.Internal; import mezz.jei.common.ingredients.IngredientFilter; import mezz.jei.common.ingredients.IngredientFilterApi; import mezz.jei.common.runtime.JeiRuntime; +import net.minecraft.client.searchtree.ReloadableIdSearchTree; import net.minecraft.world.item.ItemStack; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.forge.mixin.perf.blast_search_trees.IngredientFilterInvoker; +import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; import org.embeddedt.modernfix.searchtree.DummySearchTree; +import org.embeddedt.modernfix.searchtree.SearchTreeProviderRegistry; import java.lang.reflect.Field; import java.util.ArrayList; @@ -65,4 +68,21 @@ public class JEIBackedSearchTree extends DummySearchTree { } return listCache; } + + public static final SearchTreeProviderRegistry.Provider PROVIDER = new SearchTreeProviderRegistry.Provider() { + @Override + public ReloadableIdSearchTree getSearchTree(boolean tag) { + return new JEIBackedSearchTree(tag); + } + + @Override + public boolean canUse() { + return ModernFixPlatformHooks.modPresent("jei"); + } + + @Override + public String getName() { + return "JEI"; + } + }; } From 4a0b6339706318b5e571851ac6b5b9c73f1dad2e Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 21:04:01 -0400 Subject: [PATCH 12/17] Fix workaround message printing twice --- .../modernfix/forge/mixin/core/BootstrapMixin.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java index 89709891..f41ccb15 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java @@ -28,7 +28,9 @@ public class BootstrapMixin { /* for https://github.com/MinecraftForge/MinecraftForge/issues/9505 */ @Inject(method = "bootStrap", at = @At("RETURN")) private static void doClassloadHack(CallbackInfo ci) { - NetworkConstants.init(); - LOGGER.info("Worked around Forge issue #9505"); + if(!isBootstrapped) { + NetworkConstants.init(); + LOGGER.info("Worked around Forge issue #9505"); + } } } From 6f8815200ea3d3013cd8b42ad987065d2aed2fa2 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 21:05:01 -0400 Subject: [PATCH 13/17] Move search tree replacement to common module --- common/build.gradle | 2 + .../embeddedt/modernfix/ModernFixClient.java | 5 +++ .../blast_search_trees/MinecraftMixin.java | 2 + .../core/config/ModernFixEarlyConfig.java | 6 --- .../searchtree/JEIBackedSearchTree.java | 44 ++++++++++++++----- .../searchtree/REIBackedSearchTree.java | 19 ++++++++ .../SearchTreeProviderRegistry.java | 6 ++- forge/build.gradle | 3 -- .../forge/init/ModernFixClientForge.java | 3 -- .../IngredientFilterInvoker.java | 14 ------ 10 files changed, 66 insertions(+), 38 deletions(-) rename {forge/src/main/java/org/embeddedt/modernfix/forge => common/src/main/java/org/embeddedt/modernfix}/searchtree/JEIBackedSearchTree.java (63%) delete mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/IngredientFilterInvoker.java diff --git a/common/build.gradle b/common/build.gradle index 9ed3b9ae..f047ba1d 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -23,6 +23,8 @@ dependencies { modCompileOnly("me.shedaniel:RoughlyEnoughItems-fabric:${rei_version}") { transitive = false } + // compile against the JEI API but do not include it at runtime + modCompileOnly("mezz.jei:jei-${minecraft_version}-common:${jei_version}") // Remove the next line if you don't want to depend on the API // modApi "me.shedaniel:architectury:${rootProject.architectury_version}" } diff --git a/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java b/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java index c65a5ff8..7a020414 100644 --- a/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java +++ b/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java @@ -14,6 +14,9 @@ import net.minecraft.world.entity.Entity; import org.embeddedt.modernfix.core.ModernFixMixinPlugin; import org.embeddedt.modernfix.packet.EntityIDSyncPacket; import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; +import org.embeddedt.modernfix.searchtree.JEIBackedSearchTree; +import org.embeddedt.modernfix.searchtree.REIBackedSearchTree; +import org.embeddedt.modernfix.searchtree.SearchTreeProviderRegistry; import org.embeddedt.modernfix.world.IntegratedWatchdog; import java.lang.management.ManagementFactory; @@ -36,6 +39,8 @@ public class ModernFixClient { if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.branding.F3Screen")) { brandingString = "ModernFix " + ModernFixPlatformHooks.getVersionString(); } + SearchTreeProviderRegistry.register(JEIBackedSearchTree.PROVIDER); + SearchTreeProviderRegistry.register(REIBackedSearchTree.PROVIDER); } public void resetWorldLoadStateMachine() { diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java index 4b9d7c05..d28c2fc0 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/blast_search_trees/MinecraftMixin.java @@ -21,6 +21,8 @@ public class MinecraftMixin { @Inject(method = "createSearchTrees", at = @At("HEAD"), cancellable = true) private void replaceSearchTrees(CallbackInfo ci) { SearchTreeProviderRegistry.Provider provider = SearchTreeProviderRegistry.getSearchTreeProvider(); + if(provider == null) + return; ModernFix.LOGGER.info("Replacing search trees with '{}' provider", provider.getName()); this.searchRegistry.register(SearchRegistry.CREATIVE_NAMES, provider.getSearchTree(false)); this.searchRegistry.register(SearchRegistry.CREATIVE_TAGS, provider.getSearchTree(true)); diff --git a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 1e49dcff..1d072c10 100644 --- a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -130,13 +130,8 @@ public class ModernFixEarlyConfig { } } - private static final boolean shouldReplaceSearchTrees; private static final boolean isDevEnv = ModernFixPlatformHooks.isDevEnv(); - static { - shouldReplaceSearchTrees = modPresent("jei"); - } - private static final ImmutableMap DEFAULT_SETTING_OVERRIDES = ImmutableMap.builder() .put("mixin.perf.dynamic_resources", false) .put("mixin.feature.direct_stack_trace", false) @@ -148,7 +143,6 @@ public class ModernFixEarlyConfig { .put("mixin.perf.dynamic_entity_renderers", false) .put("mixin.feature.integrated_server_watchdog", true) .put("mixin.perf.faster_item_rendering", false) - .put("mixin.perf.blast_search_trees", shouldReplaceSearchTrees) .put("mixin.devenv", isDevEnv) .put("mixin.perf.remove_spawn_chunks", isDevEnv) .build(); diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/JEIBackedSearchTree.java similarity index 63% rename from forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java rename to common/src/main/java/org/embeddedt/modernfix/searchtree/JEIBackedSearchTree.java index b9593da9..57a8ff25 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/JEIBackedSearchTree.java @@ -1,5 +1,6 @@ -package org.embeddedt.modernfix.forge.searchtree; +package org.embeddedt.modernfix.searchtree; +import com.google.common.collect.ImmutableList; import mezz.jei.api.ingredients.ITypedIngredient; import mezz.jei.common.Internal; import mezz.jei.common.ingredients.IngredientFilter; @@ -8,12 +9,12 @@ import mezz.jei.common.runtime.JeiRuntime; import net.minecraft.client.searchtree.ReloadableIdSearchTree; import net.minecraft.world.item.ItemStack; import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.forge.mixin.perf.blast_search_trees.IngredientFilterInvoker; import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; -import org.embeddedt.modernfix.searchtree.DummySearchTree; -import org.embeddedt.modernfix.searchtree.SearchTreeProviderRegistry; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -27,7 +28,25 @@ public class JEIBackedSearchTree extends DummySearchTree { private String lastSearchText = ""; private final List listCache = new ArrayList<>(); - private static Field filterField = null; + private static final Field filterField; + private static final MethodHandle getIngredientListUncached; + + static { + MethodHandle m; + Field f; + try { + Method jeiMethod = IngredientFilter.class.getDeclaredMethod("getIngredientListUncached", String.class); + jeiMethod.setAccessible(true); + m = MethodHandles.lookup().unreflect(jeiMethod); + f = IngredientFilterApi.class.getDeclaredField("ingredientFilter"); + f.setAccessible(true); + } catch(ReflectiveOperationException | RuntimeException | NoClassDefFoundError e) { + m = null; + f = null; + } + getIngredientListUncached = m; + filterField = f; + } public JEIBackedSearchTree(boolean filteringByTag) { this.filteringByTag = filteringByTag; @@ -39,10 +58,6 @@ public class JEIBackedSearchTree extends DummySearchTree { IngredientFilterApi iFilterApi = (IngredientFilterApi)runtime.get().getIngredientFilter(); IngredientFilter filter; try { - if(filterField == null) { - filterField = IngredientFilterApi.class.getDeclaredField("ingredientFilter"); - filterField.setAccessible(true); - } filter = (IngredientFilter)filterField.get(iFilterApi); } catch(ReflectiveOperationException e) { ModernFix.LOGGER.error(e); @@ -58,7 +73,14 @@ public class JEIBackedSearchTree extends DummySearchTree { private List searchJEI(IngredientFilter filter, String pSearchText) { if(!pSearchText.equals(lastSearchText)) { listCache.clear(); - List> ingredients = ((IngredientFilterInvoker)filter).invokeGetIngredientListUncached(filteringByTag ? ("$" + pSearchText) : pSearchText); + List> ingredients; + String finalSearchTerm = filteringByTag ? ("$" + pSearchText) : pSearchText; + try { + ingredients = (List>)getIngredientListUncached.invokeExact(filter, finalSearchTerm); + } catch(Throwable e) { + ModernFix.LOGGER.error("Error searching", e); + ingredients = ImmutableList.of(); + } for(ITypedIngredient ingredient : ingredients) { if(ingredient.getIngredient() instanceof ItemStack) { listCache.add((ItemStack)ingredient.getIngredient()); @@ -77,7 +99,7 @@ public class JEIBackedSearchTree extends DummySearchTree { @Override public boolean canUse() { - return ModernFixPlatformHooks.modPresent("jei"); + return ModernFixPlatformHooks.modPresent("jei") && getIngredientListUncached != null && filterField != null; } @Override 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 7bb9f954..da92a2d0 100644 --- a/common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java @@ -4,8 +4,10 @@ import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.impl.client.search.AsyncSearchManager; +import net.minecraft.client.searchtree.ReloadableIdSearchTree; import net.minecraft.world.item.ItemStack; import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; import java.util.ArrayList; import java.util.Collections; @@ -53,4 +55,21 @@ public class REIBackedSearchTree extends DummySearchTree { } return listCache; } + + public static final SearchTreeProviderRegistry.Provider PROVIDER = new SearchTreeProviderRegistry.Provider() { + @Override + public ReloadableIdSearchTree getSearchTree(boolean tag) { + return new REIBackedSearchTree(tag); + } + + @Override + public boolean canUse() { + return ModernFixPlatformHooks.modPresent("roughlyenoughitems"); + } + + @Override + public String getName() { + return "REI"; + } + }; } diff --git a/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java index 4dc5706b..7b335c3d 100644 --- a/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java @@ -2,6 +2,7 @@ package org.embeddedt.modernfix.searchtree; import net.minecraft.client.searchtree.ReloadableIdSearchTree; import net.minecraft.world.item.ItemStack; +import org.embeddedt.modernfix.core.ModernFixMixinPlugin; import java.util.ArrayList; import java.util.List; @@ -14,7 +15,10 @@ public class SearchTreeProviderRegistry { if(p.canUse()) return p; } - return DummySearchTree.PROVIDER; + if(ModernFixMixinPlugin.instance.config.getEffectiveOptionForMixin("mixin.perf.blast_search_trees.Registry").isOverridden()) + return DummySearchTree.PROVIDER; + else + return null; } public static synchronized void register(Provider p) { diff --git a/forge/build.gradle b/forge/build.gradle index 1000783f..287be48b 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -38,9 +38,6 @@ dependencies { modCompileOnly("curse.maven:refinedstorage-243076:${refined_storage_version}") - // compile against the JEI API but do not include it at runtime - modCompileOnly("mezz.jei:jei-${minecraft_version}-forge:${jei_version}") - modCompileOnly("curse.maven:jeresources-240630:3831559") modCompileOnly "me.shedaniel:RoughlyEnoughItems-forge:${rei_version}" modCompileOnly("dev.latvian.mods:kubejs-forge:${kubejs_version}") diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java index 5f519d06..7db520f5 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java @@ -22,9 +22,7 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.util.ObfuscationReflectionHelper; import org.embeddedt.modernfix.ModernFixClient; -import org.embeddedt.modernfix.forge.searchtree.JEIBackedSearchTree; import org.embeddedt.modernfix.screen.ModernFixConfigScreen; -import org.embeddedt.modernfix.searchtree.SearchTreeProviderRegistry; public class ModernFixClientForge { private static ModernFixClient commonMod; @@ -36,7 +34,6 @@ public class ModernFixClientForge { ConfigGuiHandler.ConfigGuiFactory.class, () -> new ConfigGuiHandler.ConfigGuiFactory((mc, screen) -> new ModernFixConfigScreen(screen)) ); - SearchTreeProviderRegistry.register(JEIBackedSearchTree.PROVIDER); } private KeyMapping configKey; diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/IngredientFilterInvoker.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/IngredientFilterInvoker.java deleted file mode 100644 index 813d55e3..00000000 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/IngredientFilterInvoker.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.embeddedt.modernfix.forge.mixin.perf.blast_search_trees; - -import mezz.jei.api.ingredients.ITypedIngredient; -import mezz.jei.common.ingredients.IngredientFilter; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.util.List; - -@Mixin(IngredientFilter.class) -public interface IngredientFilterInvoker { - @Invoker(remap = false) - List> invokeGetIngredientListUncached(String filterText); -} From 8ee985928e19687473afb2576ae4377ee62de40f Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 21:27:05 -0400 Subject: [PATCH 14/17] Add JEI plugin to fabric.mod.json --- fabric/src/main/resources/fabric.mod.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 7b3901e5..598db739 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -22,7 +22,8 @@ "client": [ "org.embeddedt.modernfix.ModernFixClientFabric" ], - "modmenu": [ "org.embeddedt.modernfix.fabric.modmenu.ModernFixModMenuApiImpl" ] + "modmenu": [ "org.embeddedt.modernfix.fabric.modmenu.ModernFixModMenuApiImpl" ], + "jei_mod_plugin": [ "org.embeddedt.modernfix.searchtree.JEIRuntimeCapturer"] }, "mixins": [ "modernfix-fabric.mixins.json", From f22dbf5df1b3a6fb92cfc6e08e1e8cc18c55d75f Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 15 May 2023 22:19:54 -0400 Subject: [PATCH 15/17] Use less invasive mixin on Blocks.rebuildCache() Related: #99 --- .../BlocksMixin.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java index c72bd661..08b7c307 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java @@ -4,14 +4,15 @@ import net.minecraft.world.level.block.Blocks; import org.embeddedt.modernfix.blockstate.BlockStateCacheHandler; 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.CallbackInfo; +import org.spongepowered.asm.mixin.injection.ModifyArg; -@Mixin(Blocks.class) +import java.util.function.Consumer; + +@Mixin(value = Blocks.class, priority = 1100) public class BlocksMixin { - @Inject(method = "rebuildCache", at = @At("HEAD"), cancellable = true) - private static void rebuildParallel(CallbackInfo ci) { - ci.cancel(); + @ModifyArg(method = "rebuildCache", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/IdMapper;forEach(Ljava/util/function/Consumer;)V"), index = 0) + private static Consumer getEmptyConsumer(Consumer original) { BlockStateCacheHandler.rebuildParallel(true); + return o -> {}; } } From b25234e431795eaf031394b8c0cf7e53f218e1c0 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 16 May 2023 10:16:32 -0400 Subject: [PATCH 16/17] Fix search tree provider crash --- .../modernfix/searchtree/SearchTreeProviderRegistry.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java index 7b335c3d..f051e48c 100644 --- a/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java +++ b/common/src/main/java/org/embeddedt/modernfix/searchtree/SearchTreeProviderRegistry.java @@ -3,6 +3,7 @@ package org.embeddedt.modernfix.searchtree; import net.minecraft.client.searchtree.ReloadableIdSearchTree; import net.minecraft.world.item.ItemStack; import org.embeddedt.modernfix.core.ModernFixMixinPlugin; +import org.embeddedt.modernfix.core.config.Option; import java.util.ArrayList; import java.util.List; @@ -15,7 +16,8 @@ public class SearchTreeProviderRegistry { if(p.canUse()) return p; } - if(ModernFixMixinPlugin.instance.config.getEffectiveOptionForMixin("mixin.perf.blast_search_trees.Registry").isOverridden()) + Option option = ModernFixMixinPlugin.instance.config.getEffectiveOptionForMixin("perf.blast_search_trees.Registry"); + if(option != null && option.isOverridden()) return DummySearchTree.PROVIDER; else return null; From dba6e1210ee08e22d1e3d92db807ff045786d95a Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 16 May 2023 10:17:12 -0400 Subject: [PATCH 17/17] Fix classloading hack not working anymore --- .../embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java index f41ccb15..af3c25bd 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java @@ -28,9 +28,6 @@ public class BootstrapMixin { /* for https://github.com/MinecraftForge/MinecraftForge/issues/9505 */ @Inject(method = "bootStrap", at = @At("RETURN")) private static void doClassloadHack(CallbackInfo ci) { - if(!isBootstrapped) { - NetworkConstants.init(); - LOGGER.info("Worked around Forge issue #9505"); - } + NetworkConstants.init(); } }