Runescape Client

Deobfuscation...

Both the client and cache are original duplicates of the client and cache downloaded from Jagex in July 2012. In attempts to reverse engineer the game, players/developers decompiled the Jar file back into Java code. However, Jagex mutated the code by renaming functions, classes, randomizing the positions of functions and static variables in a process called "obfuscation".

For us to have a functional and completely source available client, this decompiled jar code had to also be deobfuscated. Even with that it is impossible for us to get the original function and class names original coded in Java by Jagex. Instead we get something like this...

package com.jagex;

public class Class29 {
  NewsItemFetcher aClass30_354;
  Index aClass317_352;
  Index aClass317_353;

  public Class29(Index index_1, Index index_2) {
      aClass317_352 = index_1;
      aClass317_353 = index_2;
  }  

  public Interface2 method781(Interface3 interface3_1) {
      if (interface3_1 == null) {
          return null;
      } else {
          Class60 class60_3 = interface3_1.method24();
          return class60_3 == Class60.aClass60_609 ? new Class46((Class366) interface3_1) : (class60_3 == Class60.aClass60_605 ? new Class28(method782(), (Class365) interface3_1) : (class60_3 == Class60.aClass60_606 ? new Class42(aClass317_352, (Class357) interface3_1) : (class60_3 == Class60.aClass60_607 ? new Class42_Sub1(aClass317_352, (Class357_Sub1) interface3_1) : (class60_3 == Class60.aClass60_602 ? new Class52_Sub3(aClass317_352, aClass317_353, (Class350_Sub2) interface3_1) : (class60_3 == Class60.aClass60_603 ? new Class52_Sub1(aClass317_352, aClass317_353, (Class350_Sub1) interface3_1) : (class60_3 == Class60.aClass60_608 ? new Class52_Sub2(aClass317_352, aClass317_353, (Class350_Sub3) interface3_1) : (class60_3 == Class60.aClass60_604 ? new Class51(aClass317_352, aClass317_353, (Class62) interface3_1) : (class60_3 == Class60.aClass60_601 ? new Class43(aClass317_352, (Class351) interface3_1) : (class60_3 == Class60.aClass60_610 ? new Class52_Sub2_Sub1(aClass317_352, aClass317_353, (Class350_Sub3_Sub1) interface3_1) : null)))))))));
      }
  }

  NewsItemFetcher method782() {
      if (aClass30_354 == null) {
          aClass30_354 = new NewsItemFetcher();
      }
      return aClass30_354;
	}
}

Take note this is after de-obfuscation algorithms and hand written refactoring to improve the client...

And with this we shall create the world...

From here on we can use the client to interpret the cache, live, while the server gives us instructions as to what changes the client should make for the player. The rendering engine, sound system, Swing GUI Settings, interfaces and cache interpreter are all on the client, changing dynamically.