diff --git a/README.md b/README.md index 026186a..b9886e4 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ Also check [The Fugue Plane](https://forgottenrealms.fandom.com/wiki/Fugue_Plane * Shoulder Surfing Reloaded * SplashAnimation * Logistics Pipes +* OpenDisks +* OpenSecurity ## 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 a6acaf5..b1ec8a0 100644 --- a/src/main/java/com/cleanroommc/FugueLoadingPlugin.java +++ b/src/main/java/com/cleanroommc/FugueLoadingPlugin.java @@ -9,6 +9,9 @@ import javax.annotation.Nullable; import java.lang.reflect.Array; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Paths; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; @@ -29,7 +32,9 @@ public class FugueLoadingPlugin implements IFMLLoadingPlugin, IEarlyMixinLoader "com.cleanroommc.transformer.EntityPlayerRayTraceTransformer", "com.cleanroommc.transformer.SplashProgressTransformerTransformer", "com.cleanroommc.transformer.InitializerTransformer", - "com.cleanroommc.transformer.ClassBlockMultipartContainerHandlerTransformer" + "com.cleanroommc.transformer.ClassBlockMultipartContainerHandlerTransformer", + "com.cleanroommc.transformer.OpenDisksUnpackTransformer", + "com.cleanroommc.transformer.SoundUnpackTransformer" ); for(String str : transformers) { diff --git a/src/main/java/com/cleanroommc/helper/HookHelper.java b/src/main/java/com/cleanroommc/helper/HookHelper.java index 261c505..442c2a7 100644 --- a/src/main/java/com/cleanroommc/helper/HookHelper.java +++ b/src/main/java/com/cleanroommc/helper/HookHelper.java @@ -2,8 +2,32 @@ import scala.tools.asm.Opcodes; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; + public class HookHelper { public static boolean isInterface (int opcode) { return opcode == Opcodes.INVOKEINTERFACE; } + + @SuppressWarnings("deprecation") + public static String byGetResource() { + Class clazz = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).getCallerClass(); + URL classResource = clazz.getResource(clazz.getSimpleName() + ".class"); + if (classResource == null) { + throw new RuntimeException("class resource is null"); + } + String url = classResource.toString(); + if (url.startsWith("jar:file:")) { + // extract 'file:......jarName.jar' part from the url string + String path = url.replaceAll("^jar:(file:.*[.]jar)!/.*", "$1"); + try { + return Paths.get(new URL(path).toURI()).toString(); + } catch (Exception e) { + throw new RuntimeException("Invalid Jar File URL String"); + } + } + throw new RuntimeException("Invalid Jar File URL String"); + } } diff --git a/src/main/java/com/cleanroommc/transformer/OpenDisksUnpackTransformer.java b/src/main/java/com/cleanroommc/transformer/OpenDisksUnpackTransformer.java new file mode 100644 index 0000000..c119231 --- /dev/null +++ b/src/main/java/com/cleanroommc/transformer/OpenDisksUnpackTransformer.java @@ -0,0 +1,67 @@ +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 OpenDisksUnpackTransformer implements IClassTransformer { + public OpenDisksUnpackTransformer() { + FugueLoadingPlugin.registerToKnownTransformer("openlights", this); + } + @Override + public byte[] transform(String s, String s1, byte[] bytes) { + if (bytes == null) + { + return null; + } + + if (!s1.equals("pcl.opendisks.OpenDisksUnpack")) + { + return bytes; + } + + + ClassNode classNode = new ClassNode(); + ClassReader classReader = new ClassReader(bytes); + classReader.accept(classNode, 0); + boolean modified = false; + AbstractInsnNode prevLine = null; + if (classNode.methods != null) + { + for (MethodNode methodNode : classNode.methods) + { + if (methodNode.name.equals("load")) { + InsnList instructions = methodNode.instructions; + if (instructions != null) + { + for (AbstractInsnNode insnNode : instructions) + { + if (insnNode.getOpcode() == Opcodes.INVOKEVIRTUAL && insnNode instanceof MethodInsnNode methodInsnNode) + { + if (methodInsnNode.name.equals("getPath") && methodInsnNode.owner.equals("java/net/URI")) + { + instructions.insert(methodInsnNode, new MethodInsnNode(Opcodes.INVOKESTATIC, "com/cleanroommc/helper/HookHelper", "byGetResource", "()Ljava/lang/String;", false)); + instructions.insert(methodInsnNode, new InsnNode(Opcodes.POP)); + 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/SoundUnpackTransformer.java b/src/main/java/com/cleanroommc/transformer/SoundUnpackTransformer.java new file mode 100644 index 0000000..23eec9c --- /dev/null +++ b/src/main/java/com/cleanroommc/transformer/SoundUnpackTransformer.java @@ -0,0 +1,67 @@ +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 SoundUnpackTransformer implements IClassTransformer { + public SoundUnpackTransformer() { + FugueLoadingPlugin.registerToKnownTransformer("opensecurity", this); + } + @Override + public byte[] transform(String s, String s1, byte[] bytes) { + if (bytes == null) + { + return null; + } + + if (!s1.equals("pcl.opensecurity.util.SoundUnpack")) + { + return bytes; + } + + + ClassNode classNode = new ClassNode(); + ClassReader classReader = new ClassReader(bytes); + classReader.accept(classNode, 0); + boolean modified = false; + AbstractInsnNode prevLine = null; + if (classNode.methods != null) + { + for (MethodNode methodNode : classNode.methods) + { + if (methodNode.name.equals("load")) { + InsnList instructions = methodNode.instructions; + if (instructions != null) + { + for (AbstractInsnNode insnNode : instructions) + { + if (insnNode.getOpcode() == Opcodes.INVOKEVIRTUAL && insnNode instanceof MethodInsnNode methodInsnNode) + { + if (methodInsnNode.name.equals("getPath") && methodInsnNode.owner.equals("java/net/URI")) + { + instructions.insert(methodInsnNode, new MethodInsnNode(Opcodes.INVOKESTATIC, "com/cleanroommc/helper/HookHelper", "byGetResource", "()Ljava/lang/String;", false)); + instructions.insert(methodInsnNode, new InsnNode(Opcodes.POP)); + modified = true; + } + } + } + } + } + } + } + if (modified) + { + Launch.classLoader.unRegisterSuperTransformer(this); + ClassWriter classWriter = new ClassWriter(0); + + classNode.accept(classWriter); + return classWriter.toByteArray(); + } + return bytes; + } +}