RS is obfusicated, you rely on client patterns and functions to tell you what to do. Here's an example I'm using from the recent reflection update at this thread:
http://villavu.com/forum/showthread.php?p=781959#post781959Scroll down and find Class Animable. As you can see, they found that the obfusicated class from the RS client that has Animable functions was "vs.class". So download a fresh copy of the RS client, you can get one here:
http://world169.runescape.com/runescape.jarAlright, then use WinRar to extract all of the classes to a folder. If you decompile the vs class, it should look something like this:

From the other thread, you can also see that they found the method "int p" was actually the method "int pixelX". So you write up a hook interface for that method.
public interface Animable {
public int pixelX();
}
Then you write up a BCEL injector to inject the accessor method into vs.class and return the value of the field "p". You also want vs to implement your hook.
import org.apache.*;
import org.apache.bcel.*;
import org.apache.bcel.classfile.*;
import org.apache.bcel.generic.*;
import org.apache.bcel.util.*;
import org.apache.bcel.verifier.*;
import org.apache.bcel.verifier.exc.*;
import org.apache.bcel.verifier.statics.*;
import org.apache.bcel.verifier.structurals.*;
import java.io.IOException;
/**
*
* BCEL Injector
* @author: Echo_
*
*/
public class Injector {
private ClassGen cGen;
public Injector() {
loadClass();
modify();
dumpClass();
}
private void loadClass() {
try {
cGen = new ClassGen(new ClassParser("vs.class").parse());
} catch (ClassFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void modify() {
cGen.addInterface("Animable");
for(Method m : cGen.getMethods()) {
if(m.getName().equals("p")) {
System.out.println("Method p found!");
break;
}
}
InstructionList methodIList = new InstructionList();
ConstantPoolGen theCPool = cGen.getConstantPool();
MethodGen pixelXMethod = new MethodGen(Constants.ACC_PUBLIC,Type.INT,Type.NO_ARGS,new String[]{},"pixelX",cGen.getClassName(),methodIList,theCPool);
InstructionFactory iFactory = new InstructionFactory(cGen,theCPool);
Instruction pushThis = new ALOAD(0);
Instruction pixelXField = iFactory.createFieldAccess(cGen.getClassName(),"p",Type.INT,Constants.GETSTATIC);
Instruction returnPixelX = InstructionFactory.createReturn(Type.INT);
methodIList.append(pushThis);
methodIList.append(pixelXField);
methodIList.append(returnPixelX);
pixelXMethod.setMaxStack();
pixelXMethod.setMaxLocals();
cGen.addMethod(pixelXMethod.getMethod());
}
public void dumpClass() {
try {
cGen.getJavaClass().dump("vs.class");
}
catch(IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
new Injector();
}
}
So with this file, you inject the accessor method into the class and implement your hook interface "Animable". Decompile the vs class and it now looks like this:

And you should see this towards the bottom of the file as well:

And that's how you make bots with the obfusicated client :) This is just a little example, because from there you would have to find out how to use these accessors to return the data you need to automate a task. I think most injectors these days dynamically find the methods in the client and edit them, that way you wouldn't have to edit your injector every time the client updates.
Credits: yakman, the bank
There tutorials are what got me into injection and hacking the RS2 client :)