From 9a8c68d2e9dbc6555fdaa042f7a4d09073a7b892 Mon Sep 17 00:00:00 2001 From: kappa_maintainer Date: Sun, 21 Jan 2024 14:15:26 +0800 Subject: [PATCH] Enchantments Control --- README.md | 1 + .../com/cleanroommc/FugueLoadingPlugin.java | 3 +- .../EnumInputClassTransformer.java | 71 +++++++++++++++++++ .../SplashProgressTransformerTransformer.java | 5 -- 4 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/cleanroommc/transformer/EnumInputClassTransformer.java diff --git a/README.md b/README.md index b9886e4..9e867a7 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ Also check [The Fugue Plane](https://forgottenrealms.fandom.com/wiki/Fugue_Plane * Logistics Pipes * OpenDisks * OpenSecurity +* Enchantments Control ## Note Add ! to start of the file name to fix Lag Goggles. \ No newline at end of file diff --git a/src/main/java/com/cleanroommc/FugueLoadingPlugin.java b/src/main/java/com/cleanroommc/FugueLoadingPlugin.java index b1ec8a0..52ba1de 100644 --- a/src/main/java/com/cleanroommc/FugueLoadingPlugin.java +++ b/src/main/java/com/cleanroommc/FugueLoadingPlugin.java @@ -34,7 +34,8 @@ public class FugueLoadingPlugin implements IFMLLoadingPlugin, IEarlyMixinLoader "com.cleanroommc.transformer.InitializerTransformer", "com.cleanroommc.transformer.ClassBlockMultipartContainerHandlerTransformer", "com.cleanroommc.transformer.OpenDisksUnpackTransformer", - "com.cleanroommc.transformer.SoundUnpackTransformer" + "com.cleanroommc.transformer.SoundUnpackTransformer", + "com.cleanroommc.transformer.EnumInputClassTransformer" ); for(String str : transformers) { diff --git a/src/main/java/com/cleanroommc/transformer/EnumInputClassTransformer.java b/src/main/java/com/cleanroommc/transformer/EnumInputClassTransformer.java new file mode 100644 index 0000000..91781b5 --- /dev/null +++ b/src/main/java/com/cleanroommc/transformer/EnumInputClassTransformer.java @@ -0,0 +1,71 @@ +package com.cleanroommc.transformer; + +import com.cleanroommc.FugueLoadingPlugin; +import net.minecraft.launchwrapper.IClassTransformer; +import net.minecraft.launchwrapper.Launch; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.*; + +public class EnumInputClassTransformer implements IClassTransformer { + public EnumInputClassTransformer() { + FugueLoadingPlugin.registerToKnownTransformer("enchcontrol", this); + } + @Override + public byte[] transform(String s, String s1, byte[] bytes) { + if (bytes == null) + { + return null; + } + + if (!s1.equals("austeretony.enchcontrol.common.core.EnumInputClass")) + { + return bytes; + } + + ClassNode classNode = new ClassNode(); + ClassReader classReader = new ClassReader(bytes); + classReader.accept(classNode, 0); + boolean firstPatched = false; + boolean modified = false; + if (classNode.methods != null) + { + for (MethodNode methodNode : classNode.methods) + { + if (methodNode.name.equals("pathcMCLocale")) { + InsnList instructions = methodNode.instructions; + if (instructions != null) + { + for (AbstractInsnNode insnNode : instructions) + { + if (insnNode.getOpcode() == Opcodes.SIPUSH && insnNode instanceof IntInsnNode intInsnNode) + { + if (intInsnNode.operand == Opcodes.INVOKESPECIAL) + { + intInsnNode.operand = Opcodes.INVOKEVIRTUAL; + firstPatched = true; + } + } + if (firstPatched && insnNode.getOpcode() == Opcodes.ICONST_3 && insnNode instanceof InsnNode insnNode1) + { + instructions.insert(insnNode1, new InsnNode(Opcodes.ICONST_2)); + instructions.remove(insnNode1); + modified = true; + } + } + } + } + } + } + if (modified) + { + Launch.classLoader.unRegisterSuperTransformer(this); + ClassWriter classWriter = new ClassWriter(0); + + classNode.accept(classWriter); + return classWriter.toByteArray(); + } + return bytes; + } +} diff --git a/src/main/java/com/cleanroommc/transformer/SplashProgressTransformerTransformer.java b/src/main/java/com/cleanroommc/transformer/SplashProgressTransformerTransformer.java index 28f18b4..32f808e 100644 --- a/src/main/java/com/cleanroommc/transformer/SplashProgressTransformerTransformer.java +++ b/src/main/java/com/cleanroommc/transformer/SplashProgressTransformerTransformer.java @@ -26,8 +26,6 @@ public byte[] transform(String s, String s1, byte[] bytes) { return bytes; } - Fugue.LOGGER.info("GOTCHA"); - ClassNode classNode = new ClassNode(); ClassReader classReader = new ClassReader(bytes); classReader.accept(classNode, 0); @@ -37,7 +35,6 @@ public byte[] transform(String s, String s1, byte[] bytes) { for (MethodNode methodNode : classNode.methods) { if (methodNode.name.equals("patch")) { - Fugue.LOGGER.info("GOTCHA2"); InsnList instructions = methodNode.instructions; if (instructions != null) { @@ -45,7 +42,6 @@ public byte[] transform(String s, String s1, byte[] bytes) { { if (insnNode.getOpcode() == Opcodes.SIPUSH && insnNode instanceof IntInsnNode intInsnNode) { - Fugue.LOGGER.info("NODE OPERAND" + intInsnNode.operand); if (intInsnNode.operand == Opcodes.INVOKESPECIAL) { intInsnNode.operand = Opcodes.INVOKEVIRTUAL; @@ -59,7 +55,6 @@ public byte[] transform(String s, String s1, byte[] bytes) { } if (modified) { - Fugue.LOGGER.info("CHANGED"); Launch.classLoader.unRegisterSuperTransformer(this); ClassWriter classWriter = new ClassWriter(0);