From 47be42afe75e73860f533ef56079bed1028fe06a Mon Sep 17 00:00:00 2001 From: Sam Kirby Date: Wed, 10 Jul 2019 13:12:40 +0100 Subject: [PATCH] Use IMixinConfigPlugin#postApply to substitute JEID config for mine * As there is no way within the mixin framework to alter the target method at runtime, this is the best way I have found to apply this. --- build.gradle | 2 +- .../jeidsi/core/JEIDsILoadingPlugin.java | 2 +- .../mixins/MixinPacketBiomeIDChange.java | 5 +- .../jeidsi/core/init/InitPlugin.java | 65 +++++++++++++++++++ ...MixinLoaderEarly.java => MixinLoader.java} | 2 +- .../core/init/mixins/MixinLoaderLate.java | 14 ---- src/main/resources/mixins.jeidsi.init.json | 4 +- 7 files changed, 73 insertions(+), 21 deletions(-) create mode 100644 src/main/java/uk/bobbytables/jeidsi/core/init/InitPlugin.java rename src/main/java/uk/bobbytables/jeidsi/core/init/mixins/{MixinLoaderEarly.java => MixinLoader.java} (97%) delete mode 100644 src/main/java/uk/bobbytables/jeidsi/core/init/mixins/MixinLoaderLate.java diff --git a/build.gradle b/build.gradle index b83bb3b..bb6b806 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ apply plugin: 'org.spongepowered.mixin' def buildnumber = System.getenv('TRAVIS_BUILD_NUMBER') def suffix = buildnumber != null ? ".$buildnumber" : "-SNAPSHOT" -version = "1.3.0$suffix" +version = "1.3.1$suffix" group = "uk.bobbytables.jeidsi" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "jeidsi" diff --git a/src/main/java/uk/bobbytables/jeidsi/core/JEIDsILoadingPlugin.java b/src/main/java/uk/bobbytables/jeidsi/core/JEIDsILoadingPlugin.java index 7d33901..bed48e2 100644 --- a/src/main/java/uk/bobbytables/jeidsi/core/JEIDsILoadingPlugin.java +++ b/src/main/java/uk/bobbytables/jeidsi/core/JEIDsILoadingPlugin.java @@ -17,7 +17,7 @@ public class JEIDsILoadingPlugin implements IFMLLoadingPlugin { public JEIDsILoadingPlugin() { MixinBootstrap.init(); - Mixins.addConfiguration("mixins.jeid.server.init.json"); // We NEED JEID's loader plugin on the server too + Mixins.addConfiguration("mixins.jeid.server.init.json"); // We NEED JEID's Loader plugin on the server too Mixins.addConfiguration("mixins.jeidsi.init.json"); } diff --git a/src/main/java/uk/bobbytables/jeidsi/core/compat/advancedrocketry/mixins/MixinPacketBiomeIDChange.java b/src/main/java/uk/bobbytables/jeidsi/core/compat/advancedrocketry/mixins/MixinPacketBiomeIDChange.java index da6c32c..4c8815f 100644 --- a/src/main/java/uk/bobbytables/jeidsi/core/compat/advancedrocketry/mixins/MixinPacketBiomeIDChange.java +++ b/src/main/java/uk/bobbytables/jeidsi/core/compat/advancedrocketry/mixins/MixinPacketBiomeIDChange.java @@ -4,6 +4,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import org.dimdev.jeid.INewChunk; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; @@ -15,8 +17,6 @@ import zmaster587.advancedRocketry.network.PacketBiomeIDChange; import zmaster587.libVulpes.util.HashedBlockPosition; -import static uk.bobbytables.jeidsi.JEIDsI.LOGGER; - @Mixin(PacketBiomeIDChange.class) public class MixinPacketBiomeIDChange { @Shadow @@ -73,6 +73,7 @@ public void readClient(ByteBuf in) { /** * @author sk2048 */ + @SideOnly(Side.CLIENT) @Overwrite(remap = false) public void executeClient(EntityPlayer thePlayer) { if (thePlayer.world.provider.getDimension() == worldId) { diff --git a/src/main/java/uk/bobbytables/jeidsi/core/init/InitPlugin.java b/src/main/java/uk/bobbytables/jeidsi/core/init/InitPlugin.java new file mode 100644 index 0000000..7140fc3 --- /dev/null +++ b/src/main/java/uk/bobbytables/jeidsi/core/init/InitPlugin.java @@ -0,0 +1,65 @@ +package uk.bobbytables.jeidsi.core.init; + +import org.spongepowered.asm.lib.Opcodes; +import org.spongepowered.asm.lib.tree.AbstractInsnNode; +import org.spongepowered.asm.lib.tree.ClassNode; +import org.spongepowered.asm.lib.tree.LdcInsnNode; +import org.spongepowered.asm.lib.tree.MethodNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import static uk.bobbytables.jeidsi.core.JEIDsILoadingPlugin.LOGGER; + +public class InitPlugin implements IMixinConfigPlugin { + @Override + public void onLoad(String mixinPackage) { + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + return true; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + for (MethodNode methodNode : targetClass.methods) { + Iterator insnNodeIterator = methodNode.instructions.iterator(); + while (insnNodeIterator.hasNext()) { + AbstractInsnNode abstractInsnNode = insnNodeIterator.next(); + + if (abstractInsnNode.getOpcode() != Opcodes.LDC) continue; + + LdcInsnNode ldcInsnNode = (LdcInsnNode) abstractInsnNode; + if (ldcInsnNode.cst.equals("mixins.jeid.modsupport.json")) { + LOGGER.info("JEID modsupport init method found: {}", methodNode.name); + LOGGER.info("Substituting our config at instruction {}", methodNode.instructions.indexOf(ldcInsnNode)); + ldcInsnNode.cst = "mixins.jeidsi.jeidmodsupport.json"; + return; + } + } + } + LOGGER.error("JEIDsI has not got a veto over JEID's mod support, report to JEIDsI"); + } +} diff --git a/src/main/java/uk/bobbytables/jeidsi/core/init/mixins/MixinLoaderEarly.java b/src/main/java/uk/bobbytables/jeidsi/core/init/mixins/MixinLoader.java similarity index 97% rename from src/main/java/uk/bobbytables/jeidsi/core/init/mixins/MixinLoaderEarly.java rename to src/main/java/uk/bobbytables/jeidsi/core/init/mixins/MixinLoader.java index 5ab3e29..e874d7f 100644 --- a/src/main/java/uk/bobbytables/jeidsi/core/init/mixins/MixinLoaderEarly.java +++ b/src/main/java/uk/bobbytables/jeidsi/core/init/mixins/MixinLoader.java @@ -12,7 +12,7 @@ * Inject into loadMods BEFORE JEID does, adding our configs to the mixin environment it uses */ @Mixin(value = Loader.class, priority = 500) -public class MixinLoaderEarly { +public class MixinLoader { @Inject( method = "loadMods", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/fml/common/LoadController;transition(Lnet/minecraftforge/fml/common/LoaderState;Z)V", ordinal = 1), diff --git a/src/main/java/uk/bobbytables/jeidsi/core/init/mixins/MixinLoaderLate.java b/src/main/java/uk/bobbytables/jeidsi/core/init/mixins/MixinLoaderLate.java deleted file mode 100644 index c4e5578..0000000 --- a/src/main/java/uk/bobbytables/jeidsi/core/init/mixins/MixinLoaderLate.java +++ /dev/null @@ -1,14 +0,0 @@ -package uk.bobbytables.jeidsi.core.init.mixins; - -import net.minecraftforge.fml.common.Loader; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.ModifyConstant; - -@Mixin(value = Loader.class, priority = 1500) -public class MixinLoaderLate { - @ModifyConstant(method = "handler$beforeConstructingMods$zza000", constant = @Constant(stringValue = "mixins.jeid.modsupport.json"), require = 1, remap = false) - private String getConfig(String oldConfig) { - return "mixins.jeidsi.jeidmodsupport.json"; - } -} diff --git a/src/main/resources/mixins.jeidsi.init.json b/src/main/resources/mixins.jeidsi.init.json index 6ca5f7c..281aa63 100644 --- a/src/main/resources/mixins.jeidsi.init.json +++ b/src/main/resources/mixins.jeidsi.init.json @@ -1,13 +1,13 @@ { "package": "uk.bobbytables.jeidsi.core.init", + "plugin": "uk.bobbytables.jeidsi.core.init.InitPlugin", "required": true, "refmap": "mixins.jeidsi.refmap.json", "target": "@env(INIT)", "minVersion": "0.6", "compatibilityLevel": "JAVA_8", "mixins": [ - "mixins.MixinLoaderEarly", - "mixins.MixinLoaderLate" + "mixins.MixinLoader" ], "injectors": { "maxShiftBy": 10