Skip to content

Commit

Permalink
Experimental grs patch
Browse files Browse the repository at this point in the history
  • Loading branch information
kappa-maintainer committed Apr 22, 2024
1 parent a470e56 commit 9e2ba21
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 5 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ repositories {
}

dependencies {
minecraft "com.cleanroommc:cleanroom:15.24.0.3034"
minecraft "com.cleanroommc:cleanroom:15.24.0.3038"

//Charset Lib
compileOnly(fg.deobf("curse.maven:charset-284523:3656492"))
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ mappings_version=39-1.12
mod_id=fugue
mod_name=Fugue
mod_main_class=Fugue
mod_version=0.14.2-beta
mod_version=0.14.3-beta
mod_base_package=com.cleanroommc.fugue
mod_authors=kappa_maintainer
mod_description=A mod that patch dead mods for Cleanroom
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.cleanroommc.fugue.config.FugueConfig;
import com.cleanroommc.fugue.transformer.*;
import com.cleanroommc.fugue.transformer.groovyscript.GroovyClassLoaderTransformer;
import com.cleanroommc.fugue.transformer.logisticpipes.LogisticPipesTransformer;
import com.cleanroommc.fugue.transformer.logisticpipes.LogisticsClassTransformerTransformer;
import com.cleanroommc.fugue.transformer.logisticpipes.LogisticsPipesClassInjectorTransformer;
Expand Down Expand Up @@ -103,6 +104,9 @@ public class FugueLoadingPlugin implements IFMLLoadingPlugin {
TransformerDelegate.registerExplicitTransformerByInstance(new BufferBuilderTransformer(), "net.minecraft.client.renderer.BufferBuilder");
TransformerDelegate.registerExplicitTransformerByInstance(new FreeSectorManagerTransformer(), "meldexun.nothirium.util.FreeSectorManager$AVL", "meldexun.nothirium.util.FreeSectorManager$RB");
}
if (FugueConfig.modPatchConfig.enableGroovyScript) {
TransformerDelegate.registerExplicitTransformerByInstance(new GroovyClassLoaderTransformer(), "groovy.lang.GroovyClassLoader$ClassCollector");
}
if (FugueConfig.getCodeSourcePatchTargets.length > 0) {
TransformerDelegate.registerExplicitTransformerByInstance(new ITweakerTransformer(), FugueConfig.getCodeSourcePatchTargets);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,6 @@ public class ModPatchConfig {
public boolean enableSubaquatic = true;
@Config.Name("Enable Nothirium Patch")
public boolean enableNothirium = true;
@Config.Name("Enable GroovyScript Patch")
public boolean enableGroovyScript = true;
}
14 changes: 11 additions & 3 deletions src/main/java/com/cleanroommc/fugue/helper/HookHelper.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.cleanroommc.fugue.helper;

import com.cleanroommc.fugue.common.Fugue;
import net.minecraft.launchwrapper.IClassTransformer;
import net.minecraft.launchwrapper.Launch;
import net.minecraft.launchwrapper.LaunchClassLoader;
Expand All @@ -14,16 +15,16 @@
import java.lang.reflect.Field;
import java.net.*;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.security.CodeSource;
import java.util.*;

public class HookHelper {
public static boolean isInterface(int opcode) {
return opcode == Opcodes.INVOKEINTERFACE;
}

public static List<IClassTransformer> transformers;
private static final Map<String, Class<?>> grsMap = new HashMap<>();

@SuppressWarnings("deprecation")
private static String byGetResource() {
Expand Down Expand Up @@ -79,6 +80,13 @@ public static Field getField(Class<?> clazz, String name) throws NoSuchFieldExce
}
}

public static Class<?> defineClass(String name, byte[] bytes, int off, int len, CodeSource codeSource) {
if (grsMap.containsKey(name)) {
return grsMap.get(name);
} else {
return grsMap.computeIfAbsent(name, k -> Launch.classLoader.defineClass(k, bytes, codeSource));
}
}

public static byte[] redirectGetClassByte(LaunchClassLoader instance, String s) throws IOException {
byte[] bytes = null;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.cleanroommc.fugue.transformer.groovyscript;

import com.cleanroommc.fugue.common.Fugue;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.expr.ExprEditor;
import javassist.expr.MethodCall;
import net.minecraft.launchwrapper.Launch;
import top.outlands.foundation.IExplicitTransformer;

import java.io.ByteArrayInputStream;

public class GroovyClassLoaderTransformer implements IExplicitTransformer {
@Override
public byte[] transform(byte[] bytes) {
try {
CtClass cc = ClassPool.getDefault().makeClass(new ByteArrayInputStream(bytes));
cc.getDeclaredMethod("createClass").instrument(new ExprEditor(){
@Override
public void edit(MethodCall m) throws CannotCompileException {
//Fugue.LOGGER.info("Transforming Groovy class method: {}", m.getMethodName());
if (m.getMethodName().equals("access$400")) {
m.replace("$_ = com.cleanroommc.fugue.helper.HookHelper#defineClass($2, $3, $4, $5, $6);");
}
}
});
bytes = cc.toBytecode();
} catch (Throwable t) {
Fugue.LOGGER.error(t);
}
return bytes;
}
}

0 comments on commit 9e2ba21

Please sign in to comment.