Make injected rscanvas turn around and call another class which will actually reside in the client, have a fake stub here for it to compile. Fix inject to inject getters on static fields in classes that arent Implemented, fixed signature of injected getters, this seems to work.
This commit is contained in:
@@ -95,6 +95,31 @@ public class Inject
|
|||||||
sig.addArg(toObType(t));
|
sig.addArg(toObType(t));
|
||||||
return sig;
|
return sig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Type toApiType(Type t)
|
||||||
|
{
|
||||||
|
// t = vanilla type
|
||||||
|
|
||||||
|
if (t.isPrimitive())
|
||||||
|
return t;
|
||||||
|
|
||||||
|
String type = t.getType();
|
||||||
|
type = type.substring(1, type.length() - 1);
|
||||||
|
|
||||||
|
ClassFile cf = vanilla.findClass(type);
|
||||||
|
if (cf == null)
|
||||||
|
return t;
|
||||||
|
|
||||||
|
for (Class c : cf.getInterfaces().getInterfaces())
|
||||||
|
{
|
||||||
|
if (c.getName().startsWith(API_PACKAGE_BASE.replace('.', '/')))
|
||||||
|
{
|
||||||
|
return new Type("L" + c.getName() + ";", t.getArrayDims());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
@@ -114,8 +139,8 @@ public class Inject
|
|||||||
assert other != null;
|
assert other != null;
|
||||||
|
|
||||||
java.lang.Class implementingClass = injectInterface(cf, other);
|
java.lang.Class implementingClass = injectInterface(cf, other);
|
||||||
if (implementingClass == null)
|
// it can not implement an interface but still have exported static fields, which are
|
||||||
continue;
|
// moved to client
|
||||||
|
|
||||||
InjectReplace ij = new InjectReplace(cf, other);
|
InjectReplace ij = new InjectReplace(cf, other);
|
||||||
try
|
try
|
||||||
@@ -132,7 +157,7 @@ public class Inject
|
|||||||
{
|
{
|
||||||
an = f.getAttributes().getAnnotations();
|
an = f.getAttributes().getAnnotations();
|
||||||
|
|
||||||
if (an.find(EXPORT) == null)
|
if (an == null || an.find(EXPORT) == null)
|
||||||
continue; // not an exported field
|
continue; // not an exported field
|
||||||
|
|
||||||
String exportedName = an.find(EXPORT).getElement().getString();
|
String exportedName = an.find(EXPORT).getElement().getString();
|
||||||
@@ -153,12 +178,16 @@ public class Inject
|
|||||||
|
|
||||||
ClassFile targetClass = f.isStatic() ? vanilla.findClass("client") : other; // target class for getter
|
ClassFile targetClass = f.isStatic() ? vanilla.findClass("client") : other; // target class for getter
|
||||||
java.lang.Class targetApiClass = f.isStatic() ? clientClass : implementingClass; // target api class for getter
|
java.lang.Class targetApiClass = f.isStatic() ? clientClass : implementingClass; // target api class for getter
|
||||||
|
assert targetApiClass != null;
|
||||||
|
|
||||||
java.lang.reflect.Method apiMethod = findImportMethodOnApi(targetApiClass, exportedName);
|
java.lang.reflect.Method apiMethod = findImportMethodOnApi(targetApiClass, exportedName);
|
||||||
assert apiMethod != null;
|
assert apiMethod != null;
|
||||||
|
|
||||||
injectGetter(targetClass, apiMethod, otherf, getter);
|
injectGetter(targetClass, apiMethod, otherf, getter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (implementingClass == null)
|
||||||
|
continue; // can't export methods from non implementing class
|
||||||
|
|
||||||
for (Method m : cf.getMethods().getMethods())
|
for (Method m : cf.getMethods().getMethods())
|
||||||
{
|
{
|
||||||
@@ -271,7 +300,7 @@ public class Inject
|
|||||||
assert field.isStatic() || field.getFields().getClassFile() == clazz;
|
assert field.isStatic() || field.getFields().getClassFile() == clazz;
|
||||||
|
|
||||||
Signature sig = new Signature();
|
Signature sig = new Signature();
|
||||||
sig.setTypeOfReturnValue(field.getType());
|
sig.setTypeOfReturnValue(toApiType(field.getType()));
|
||||||
Method getterMethod = new Method(clazz.getMethods(), method.getName(), sig);
|
Method getterMethod = new Method(clazz.getMethods(), method.getName(), sig);
|
||||||
getterMethod.setAccessFlags(Method.ACC_PUBLIC);
|
getterMethod.setAccessFlags(Method.ACC_PUBLIC);
|
||||||
|
|
||||||
|
|||||||
@@ -2,26 +2,16 @@ package net.runelite.inject;
|
|||||||
|
|
||||||
import java.awt.Canvas;
|
import java.awt.Canvas;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.image.BufferedImage;
|
import net.runelite.inject.callbacks.RSCanvasCallback;
|
||||||
|
|
||||||
public abstract class RSCanvas extends Canvas
|
public abstract class RSCanvas extends Canvas
|
||||||
{
|
{
|
||||||
private final BufferedImage clientBuffer = new BufferedImage(756, 503, BufferedImage.TYPE_INT_RGB);
|
private RSCanvasCallback callback = new RSCanvasCallback();
|
||||||
private final BufferedImage gameBuffer = new BufferedImage(756, 503, BufferedImage.TYPE_INT_RGB);
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Graphics getGraphics()
|
public Graphics getGraphics()
|
||||||
{
|
{
|
||||||
Graphics clientGraphics = clientBuffer.getGraphics();
|
|
||||||
clientGraphics.drawImage(gameBuffer, 0, 0, null);
|
|
||||||
//clientGraphics.dispose();
|
|
||||||
|
|
||||||
//clientGraphics = clientBuffer.getGraphics();
|
|
||||||
clientGraphics.drawString("something, something", 42, 42);
|
|
||||||
|
|
||||||
Graphics superGraphics = super.getGraphics();
|
Graphics superGraphics = super.getGraphics();
|
||||||
superGraphics.drawImage(clientBuffer, 0, 0, null);
|
return callback.getGraphics(this, superGraphics);
|
||||||
|
|
||||||
return gameBuffer.getGraphics();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package net.runelite.inject.callbacks;
|
||||||
|
|
||||||
|
import java.awt.Canvas;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
|
||||||
|
public class RSCanvasCallback
|
||||||
|
{
|
||||||
|
public Graphics getGraphics(Canvas canvas, Graphics graphics)
|
||||||
|
{
|
||||||
|
return graphics;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@ import org.junit.Test;
|
|||||||
|
|
||||||
public class InjectTest
|
public class InjectTest
|
||||||
{
|
{
|
||||||
private static final File DEOBFUSCATED = new File("d:/rs/07/gamepack_v21_mapped.jar");//C:\\Users\\Adam\\.m2\\repository\\net\\runelite\\rs\\rs-client\\1.0-SNAPSHOT\\rs-client-1.0-SNAPSHOT.jar");
|
private static final File DEOBFUSCATED = new File("C:\\Users\\Adam\\.m2\\repository\\net\\runelite\\rs\\rs-client\\1.0-SNAPSHOT\\rs-client-1.0-SNAPSHOT.jar");
|
||||||
private static final File VANILLA = new File(InjectTest.class.getResource("/gamepack_v21.jar").getFile());
|
private static final File VANILLA = new File(InjectTest.class.getResource("/gamepack_v21.jar").getFile());
|
||||||
private static final File OUT = new File("d:/rs/07/adamout.jar");
|
private static final File OUT = new File("d:/rs/07/adamout.jar");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user