Skip to content

Commit

Permalink
Add patch for open disks and open security
Browse files Browse the repository at this point in the history
  • Loading branch information
kappa-maintainer committed Jan 21, 2024
1 parent f9e620f commit 960d94e
Show file tree
Hide file tree
Showing 5 changed files with 166 additions and 1 deletion.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
7 changes: 6 additions & 1 deletion src/main/java/com/cleanroommc/FugueLoadingPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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) {
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/com/cleanroommc/helper/HookHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}

0 comments on commit 960d94e

Please sign in to comment.