Skip to content

Commit ab7e6c8

Browse files
author
Suli
committed
Add logic and assets to be able to switch to 2001 version
1 parent 520645e commit ab7e6c8

16 files changed

+257
-127
lines changed

Diff for: README.md

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
# WinRune
2-
An simulated rune client from Runescape 1 era, using the mudclient177-deob.
2+
An simulated rune client from Runescape 1 era, using the mudclient177-deob and mudclient38-deob.
33

44
## Usage:
5-
`java -jar ./rune.jar members=<members> address=<ip address> port=<port> rsaExponent=<RSA Exponent> rsaModulus=<RSA Modulus>`
5+
`java -jar ./rune.jar members=<members> address=<ip address> port=<port> version=<version> rsaExponent=<RSA Exponent> rsaModulus=<RSA Modulus>`
66

77
* `<members>`
88
* pass true to tell client to load members config or false to load free config
99
* `<ip address>`
10-
* an IPv4 address where the RSC177 compatible server is hosted
10+
* an IPv4 address where the RSC177 or RSC38 compatible server is hosted
1111
* `<port>`
1212
* network port number (e.g. 43594)
13+
* `<version>`
14+
* pass 2001 to load May 2001 RSC Client (i.e. RSC38), any other value or argument non specified will load the Oct 2003 RSC Client (RSC177)
1315
* `<RSA Exponent>`
1416
* `<RSA Modulus>`
1517
* These two are used together to encrypt password, unique to each server
1618

1719
## Changes from original:
1820
1. Original client loaded an html page containing the applet, which since 2015 is no longer supported
19-
2. A static background image is set to style 2003, where the top banner is fixed
21+
2. A static background image is set to default style 2003, where the top banner is fixed
2022
3. Command line arguments to help facilitate changing the client's endpoint

Diff for: assets/winclient_bg2001.png

8.23 KB
Loading

Diff for: cache/config17.jag

17.3 KB
Binary file not shown.

Diff for: cache/entity3.jag

265 KB
Binary file not shown.

Diff for: cache/maps14.jag

118 KB
Binary file not shown.

Diff for: cache/media12.jag

42 KB
Binary file not shown.

Diff for: cache/models6.jag

77.1 KB
Binary file not shown.

Diff for: cache/mudclient177-deob.jar

12 Bytes
Binary file not shown.

Diff for: cache/mudclient38-deob.jar

98.7 KB
Binary file not shown.

Diff for: cache/textures5.jag

63.2 KB
Binary file not shown.

Diff for: rune.jar

-3.26 KB
Binary file not shown.

Diff for: src/Game/Reflection.java

+97-52
Original file line numberDiff line numberDiff line change
@@ -22,35 +22,45 @@
2222
import java.lang.reflect.Method;
2323
import java.util.ArrayList;
2424
import java.util.Arrays;
25+
import java.util.concurrent.atomic.AtomicReference;
2526

2627
import com.projectjava.winrune.JClassLoader;
2728
import com.projectjava.winrune.WinRune;
2829

2930
public class Reflection {
3031

32+
private static final AtomicReference<String> GAME_SHELL = new AtomicReference<String>();
33+
3134
// Method descriptions
32-
private static final String MOUSE_MOVE =
33-
"public synchronized boolean a.a.GameShell.mouseMove(java.awt.Event,int,int)";
34-
private static final String MOUSE_DRAG =
35-
"public synchronized boolean a.a.GameShell.mouseDrag(java.awt.Event,int,int)";
36-
private static final String MOUSE_UP =
37-
"public synchronized boolean a.a.GameShell.mouseUp(java.awt.Event,int,int)";
38-
private static final String MOUSE_DOWN =
39-
"public synchronized boolean a.a.GameShell.mouseDown(java.awt.Event,int,int)";
35+
private static final AtomicReference<String> MOUSE_MOVE = new AtomicReference<String>();
36+
//"public synchronized boolean a.a.GameShell.mouseMove(java.awt.Event,int,int)";
37+
private static final AtomicReference<String> MOUSE_DRAG = new AtomicReference<String>();
38+
//"public synchronized boolean a.a.GameShell.mouseDrag(java.awt.Event,int,int)";
39+
private static final AtomicReference<String> MOUSE_UP = new AtomicReference<String>();
40+
//"public synchronized boolean a.a.GameShell.mouseUp(java.awt.Event,int,int)";
41+
private static final AtomicReference<String> MOUSE_DOWN = new AtomicReference<String>();
42+
//"public synchronized boolean a.a.GameShell.mouseDown(java.awt.Event,int,int)";
4043

41-
private static final String KEY_UP =
42-
"public synchronized boolean a.a.GameShell.keyUp(java.awt.Event,int)";
43-
private static final String KEY_DOWN =
44-
"public synchronized boolean a.a.GameShell.keyDown(java.awt.Event,int)";
44+
private static final AtomicReference<String> KEY_UP = new AtomicReference<String>();
45+
//"public synchronized boolean a.a.GameShell.keyUp(java.awt.Event,int)";
46+
private static final AtomicReference<String> KEY_DOWN = new AtomicReference<String>();
47+
//"public synchronized boolean a.a.GameShell.keyDown(java.awt.Event,int)";
4548

46-
private static final String MEMBERS = "members";
47-
private static final String ADDRESS = "address";
48-
private static final String PORT = "port";
49-
private static final String RSAEXPONENT = "rsaExponent";
50-
private static final String RSAMODULUS = "rsaModulus";
51-
private static final String SOMEBOOLEAN = "field_8";
49+
private static final AtomicReference<String> MEMBERS = new AtomicReference<String>();
50+
//"members";
51+
private static final AtomicReference<String> ADDRESS = new AtomicReference<String>();
52+
//"address";
53+
private static final AtomicReference<String> PORT = new AtomicReference<String>();
54+
//"port";
55+
private static final AtomicReference<String> RSAEXPONENT = new AtomicReference<String>();
56+
//"rsaExponent";
57+
private static final AtomicReference<String> RSAMODULUS = new AtomicReference<String>();
58+
//"rsaModulus";
59+
private static final AtomicReference<String> SOMEBOOLEAN = new AtomicReference<String>();
60+
//"field_8";
5261

53-
private static final String GAME_FRAME = "public java.awt.Frame jagex.client.k.ij()";
62+
private static final AtomicReference<String> GAME_FRAME = new AtomicReference<String>();
63+
//"public java.awt.Frame jagex.client.k.ij()";
5464

5565
public static Method mouseMove = null;
5666
public static Method mouseDrag = null;
@@ -66,89 +76,124 @@ public class Reflection {
6676
public static Field rsaExponent = null;
6777
public static Field rsaModulus = null;
6878
public static Field someBoolean = null;
79+
80+
public static void setConstants(int version) {
81+
switch(version) {
82+
case 2001:
83+
GAME_SHELL.set("jagex.client.k");
84+
MOUSE_MOVE.set("public synchronized boolean jagex.client.k.mouseMove(java.awt.Event,int,int)");
85+
MOUSE_DRAG.set("public synchronized boolean jagex.client.k.mouseDrag(java.awt.Event,int,int)");
86+
MOUSE_UP.set("public synchronized boolean jagex.client.k.mouseUp(java.awt.Event,int,int)");
87+
MOUSE_DOWN.set("public synchronized boolean jagex.client.k.mouseDown(java.awt.Event,int,int)");
88+
KEY_UP.set("public synchronized boolean jagex.client.k.keyUp(java.awt.Event,int)");
89+
KEY_DOWN.set("public synchronized boolean jagex.client.k.keyDown(java.awt.Event,int)");
90+
MEMBERS.set("members");
91+
ADDRESS.set("yc");
92+
PORT.set("ad");
93+
SOMEBOOLEAN.set("op");
94+
break;
95+
default:
96+
GAME_SHELL.set("a.a.GameShell");
97+
MOUSE_MOVE.set("public synchronized boolean a.a.GameShell.mouseMove(java.awt.Event,int,int)");
98+
MOUSE_DRAG.set("public synchronized boolean a.a.GameShell.mouseDrag(java.awt.Event,int,int)");
99+
MOUSE_UP.set("public synchronized boolean a.a.GameShell.mouseUp(java.awt.Event,int,int)");
100+
MOUSE_DOWN.set("public synchronized boolean a.a.GameShell.mouseDown(java.awt.Event,int,int)");
101+
KEY_UP.set("public synchronized boolean a.a.GameShell.keyUp(java.awt.Event,int)");
102+
KEY_DOWN.set("public synchronized boolean a.a.GameShell.keyDown(java.awt.Event,int)");
103+
MEMBERS.set("members");
104+
ADDRESS.set("address");
105+
PORT.set("port");
106+
RSAEXPONENT.set("rsaExponent");
107+
RSAMODULUS.set("rsaModulus");
108+
SOMEBOOLEAN.set("field_8");
109+
break;
110+
}
111+
}
69112

70-
public static void Load() {
113+
public static void Load(int version) {
71114
try {
72115
JClassLoader classLoader = WinRune.getInstance().loader;
73116
ArrayList leftFields =
74117
new ArrayList(); // expected virtual methods to find in given class
118+
119+
setConstants(version);
75120

76-
Class c = classLoader.loadClass("a.a.GameShell");
121+
Class c = classLoader.loadClass(GAME_SHELL.get());
77122
Method[] methods = c.getDeclaredMethods();
78123
Method method;
79124
for (int i = 0; i < methods.length; i++) {
80125
method = methods[i];
81-
if (methods[i].toGenericString().equals(MOUSE_MOVE)) {
126+
if (methods[i].toGenericString().equals(MOUSE_MOVE.get())) {
82127
mouseMove = method;
83-
} else if (method.toGenericString().equals(MOUSE_DRAG)) {
128+
} else if (method.toGenericString().equals(MOUSE_DRAG.get())) {
84129
mouseDrag = method;
85-
} else if (method.toGenericString().equals(MOUSE_UP)) {
130+
} else if (method.toGenericString().equals(MOUSE_UP.get())) {
86131
mouseUp = method;
87-
} else if (method.toGenericString().equals(MOUSE_DOWN)) {
132+
} else if (method.toGenericString().equals(MOUSE_DOWN.get())) {
88133
mouseDown = method;
89-
} else if (method.toGenericString().equals(KEY_UP)) {
134+
} else if (method.toGenericString().equals(KEY_UP.get())) {
90135
keyUp = method;
91-
} else if (method.toGenericString().equals(KEY_DOWN)) {
136+
} else if (method.toGenericString().equals(KEY_DOWN.get())) {
92137
keyDown = method;
93-
} else if (method.toGenericString().equals(GAME_FRAME)) {
138+
} else if (method.toGenericString().equals(GAME_FRAME.get())) {
94139
gameFrame = method;
95140
}
96141
}
97142

98143
c = classLoader.loadClass("mudclient");
99144
leftFields.addAll(
100145
Arrays.asList(new String[]{
101-
MEMBERS,
102-
ADDRESS,
103-
PORT,
104-
RSAEXPONENT,
105-
RSAMODULUS,
106-
SOMEBOOLEAN}));
146+
MEMBERS.get(),
147+
ADDRESS.get(),
148+
PORT.get(),
149+
RSAEXPONENT.get(),
150+
RSAMODULUS.get(),
151+
SOMEBOOLEAN.get()}));
107152
while (c != null && leftFields.size() > 0) {
108153
Field[] fields = c.getDeclaredFields();
109154
Field field;
110155
for (int i = 0; i < fields.length; i++) {
111156
field = fields[i];
112-
if (leftFields.contains(MEMBERS)
113-
&& field.getName().equals(MEMBERS)) {
157+
if (leftFields.contains(MEMBERS.get())
158+
&& field.getName().equals(MEMBERS.get())) {
114159
members = field;
115160
System.out.println("Found members");
116-
leftFields.remove(MEMBERS);
161+
leftFields.remove(MEMBERS.get());
117162
continue;
118163
}
119-
if (leftFields.contains(ADDRESS)
120-
&& field.getName().equals(ADDRESS)) {
164+
if (leftFields.contains(ADDRESS.get())
165+
&& field.getName().equals(ADDRESS.get())) {
121166
address = field;
122167
System.out.println("Found address");
123-
leftFields.remove(ADDRESS);
168+
leftFields.remove(ADDRESS.get());
124169
continue;
125170
}
126-
if (leftFields.contains(PORT)
127-
&& field.getName().equals(PORT)) {
171+
if (leftFields.contains(PORT.get())
172+
&& field.getName().equals(PORT.get())) {
128173
port = field;
129174
System.out.println("Found port");
130-
leftFields.remove(PORT);
175+
leftFields.remove(PORT.get());
131176
continue;
132177
}
133-
if (leftFields.contains(RSAEXPONENT)
134-
&& field.getName().equals(RSAEXPONENT)) {
178+
if (leftFields.contains(RSAEXPONENT.get())
179+
&& field.getName().equals(RSAEXPONENT.get())) {
135180
rsaExponent = field;
136181
System.out.println("Found rsaExponent");
137-
leftFields.remove(RSAEXPONENT);
182+
leftFields.remove(RSAEXPONENT.get());
138183
continue;
139184
}
140-
if (leftFields.contains(RSAMODULUS)
141-
&& field.getName().equals(RSAMODULUS)) {
185+
if (leftFields.contains(RSAMODULUS.get())
186+
&& field.getName().equals(RSAMODULUS.get())) {
142187
rsaModulus = field;
143188
System.out.println("Found rsaModulus");
144-
leftFields.remove(RSAMODULUS);
189+
leftFields.remove(RSAMODULUS.get());
145190
continue;
146191
}
147-
if (leftFields.contains(SOMEBOOLEAN)
148-
&& field.getName().equals(SOMEBOOLEAN)) {
192+
if (leftFields.contains(SOMEBOOLEAN.get())
193+
&& field.getName().equals(SOMEBOOLEAN.get())) {
149194
someBoolean = field;
150195
System.out.println("Found someBoolean");
151-
leftFields.remove(SOMEBOOLEAN);
196+
leftFields.remove(SOMEBOOLEAN.get());
152197
continue;
153198
}
154199
}

Diff for: src/com/projectjava/winrune/Constants.java

+39-7
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,24 @@
1818
*/
1919
package com.projectjava.winrune;
2020

21+
import java.util.concurrent.atomic.AtomicReference;
22+
2123
public class Constants {
2224

23-
public static final int CLIENT_WIDTH = 662;
24-
public static final int CLIENT_HEIGHT = 702;
25+
public static final AtomicReference<Integer> CLIENT_WIDTH = new AtomicReference<Integer>(); //554;//662;
26+
public static final AtomicReference<Integer> CLIENT_HEIGHT = new AtomicReference<Integer>(); //515;//702;
2527

2628
public static final int EDITOR_WIDTH = 400;
2729
public static final int EDITOR_HEIGHT = 500;
2830

2931
public static final int MUD_WIDTH = 512;
30-
public static final int MUD_HEIGHT = 409; //346 from game + 63 of banner
32+
public static final AtomicReference<Integer> MUD_HEIGHT = new AtomicReference<Integer>(); //409; //346 from game + 63 of banner
3133

32-
public static final int BG_IMAGE_WIDTH = 658;
33-
public static final int BG_IMAGE_HEIGHT = 674;
34+
public static final AtomicReference<Integer> BG_IMAGE_WIDTH = new AtomicReference<Integer>(); //550;//658;
35+
public static final AtomicReference<Integer> BG_IMAGE_HEIGHT = new AtomicReference<Integer>(); //487;//674;
3436

35-
public static final int BG_CONTAINER_WIDTH = 646;
36-
public static final int BG_CONTAINER_HEIGHT = 640;
37+
public static final AtomicReference<Integer> BG_CONTAINER_WIDTH = new AtomicReference<Integer>(); //538;//646;
38+
public static final AtomicReference<Integer> BG_CONTAINER_HEIGHT = new AtomicReference<Integer>(); //453;//640;
3739

3840
public static final int JAGEX_BANNER_WIDTH = 373;
3941

@@ -50,4 +52,34 @@ public class Constants {
5052
public static final int BANNER_LOCATION_OFFSET_X = -64;
5153
public static final int BANNER_LOCATION_OFFSET_Y = 341;
5254

55+
public static final AtomicReference<String> MUD_JAR = new AtomicReference<String>();
56+
public static final AtomicReference<String> CODE_BASE = new AtomicReference<String>();
57+
58+
public static void initialize(int version) {
59+
switch(version) {
60+
case 2001:
61+
CLIENT_WIDTH.set(554);
62+
CLIENT_HEIGHT.set(515);
63+
BG_IMAGE_WIDTH.set(550);
64+
BG_IMAGE_HEIGHT.set(487);
65+
BG_CONTAINER_WIDTH.set(538);
66+
BG_CONTAINER_HEIGHT.set(453);
67+
MUD_HEIGHT.set(357);
68+
MUD_JAR.set("mudclient38-deob.jar");
69+
CODE_BASE.set("http://penguin.local/");
70+
break;
71+
default:
72+
CLIENT_WIDTH.set(662);
73+
CLIENT_HEIGHT.set(702);
74+
BG_IMAGE_WIDTH.set(658);
75+
BG_IMAGE_HEIGHT.set(674);
76+
BG_CONTAINER_WIDTH.set(646);
77+
BG_CONTAINER_HEIGHT.set(640);
78+
MUD_HEIGHT.set(409);
79+
MUD_JAR.set("mudclient177-deob.jar");
80+
CODE_BASE.set("http://puffin/");
81+
break;
82+
}
83+
}
84+
5385
}

Diff for: src/com/projectjava/winrune/JAppletStub.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public AppletContext getAppletContext() {
3333

3434
public URL getCodeBase() {
3535
try {
36-
return new URL("http://puffin/");
36+
return new URL(Constants.CODE_BASE.get());
3737
} catch (MalformedURLException e) {
3838
// TODO Auto-generated catch block
3939
e.printStackTrace();

Diff for: src/com/projectjava/winrune/JCustPanel.java

+33-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
import java.awt.Color;
44
import java.awt.Dimension;
5+
import java.awt.GradientPaint;
56
import java.awt.Graphics;
7+
import java.awt.Graphics2D;
8+
import java.awt.RenderingHints;
69
import java.awt.image.BufferedImage;
710
import java.io.File;
811
import java.io.IOException;
@@ -19,26 +22,47 @@ public class JCustPanel extends JPanel {
1922
*/
2023
private static final long serialVersionUID = 7873358586692244218L;
2124

22-
private int minWidth = Constants.BG_CONTAINER_WIDTH;
23-
private int minHeight = Constants.BG_CONTAINER_HEIGHT;
25+
private int minWidth;
26+
private int minHeight;
27+
private int gameVersion;
2428

2529
private BufferedImage image;
2630

27-
public JCustPanel() {
31+
public JCustPanel(int version) {
2832
super.setBackground(Color.BLACK);
29-
try {
30-
image = ImageIO.read(new File(Utility.findAssetDir() + "winclient_bg.png"));
31-
} catch (IOException ex) {
32-
// handle exception...
33-
}
33+
minWidth = Constants.BG_CONTAINER_WIDTH.get();
34+
minHeight = Constants.BG_CONTAINER_HEIGHT.get();
35+
gameVersion = version;
36+
try {
37+
if (gameVersion != 2001) {
38+
image = ImageIO.read(new File(Utility.findAssetDir() + "winclient_bg.png"));
39+
} else {
40+
image = ImageIO.read(new File(Utility.findAssetDir() + "winclient_bg2001.png"));
41+
}
42+
} catch (IOException ex) {
43+
// handle exception...
44+
}
3445
}
3546

3647
protected void paintComponent(Graphics g) {
3748
super.paintComponent(g);
3849
Dimension size = this.getSize();
3950
int startX = Math.max(0, (size.width - minWidth) / 2);
4051
int startY = Math.max(0, (size.height - minHeight) / 2);
41-
g.drawImage(image, startX, startY, this); // see javadoc for more info on the parameters
52+
if (gameVersion != 2001) {
53+
54+
} else {
55+
Graphics2D g2d = (Graphics2D) g;
56+
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
57+
int w = getWidth();
58+
int h = getHeight();
59+
Color color1 = Color.BLACK;
60+
Color color2 = Color.GRAY;
61+
GradientPaint gp = new GradientPaint(0, 0, color1, w, 0, color2);
62+
g2d.setPaint(gp);
63+
g2d.fillRect(0, 0, w, h);
64+
}
65+
g.drawImage(image, startX, startY, this); // see javadoc for more info on the parameters
4266
}
4367

4468
}

0 commit comments

Comments
 (0)