Skip to content

Commit c3e556d

Browse files
StormyHubcapp
authored andcommitted
Enhanced support for 2004-2006 protocol versions
1 parent 6d28850 commit c3e556d

15 files changed

Lines changed: 1583 additions & 472 deletions

server/src/com/openrsc/server/model/entity/player/Player.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2473,6 +2473,16 @@ public long processIncomingPackets() {
24732473
parser = new Payload235Parser();
24742474
} else if (isUsing203CompatibleClient()) {
24752475
parser = new Payload203Parser();
2476+
} else if (isUsing202CompatibleClient()) {
2477+
parser = new Payload202Parser();
2478+
} else if (isUsing201CompatibleClient()) {
2479+
parser = new Payload201Parser();
2480+
} else if (isUsing199CompatibleClient()) {
2481+
parser = new Payload199Parser();
2482+
} else if (isUsing198CompatibleClient()) {
2483+
parser = new Payload198Parser();
2484+
} else if (isUsing196CompatibleClient()) {
2485+
parser = new Payload196Parser();
24762486
} else if (isUsing177CompatibleClient()) {
24772487
parser = new Payload177Parser();
24782488
} else if (isUsing140CompatibleClient()) {
@@ -3914,6 +3924,28 @@ public boolean isUsing177CompatibleClient() {
39143924
return this.clientVersion == 177;
39153925
}
39163926

3927+
public boolean isUsing196CompatibleClient() {
3928+
return this.clientVersion == 196;
3929+
}
3930+
3931+
public boolean isUsing198CompatibleClient() {
3932+
// 197 and 198 are identical protocol-wise.
3933+
return this.clientVersion > 196 && this.clientVersion < 199;
3934+
}
3935+
3936+
public boolean isUsing199CompatibleClient() {
3937+
return this.clientVersion == 199;
3938+
}
3939+
3940+
public boolean isUsing201CompatibleClient() {
3941+
// 200 and 201 are identical protocol-wise.
3942+
return this.clientVersion > 199 && this.clientVersion < 202;
3943+
}
3944+
3945+
public boolean isUsing202CompatibleClient() {
3946+
return this.clientVersion == 202;
3947+
}
3948+
39173949
public boolean isUsing203CompatibleClient() {
39183950
return this.clientVersion == 203;
39193951
}

server/src/com/openrsc/server/net/RSCProtocolDecoder.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
import com.openrsc.server.net.rsc.ISAACContainer;
44
import com.openrsc.server.net.rsc.ReverseOpcodeLookup;
55
import com.openrsc.server.net.rsc.enums.OpcodeIn;
6+
import com.openrsc.server.net.rsc.parsers.impl.Payload196Parser;
7+
import com.openrsc.server.net.rsc.parsers.impl.Payload198Parser;
8+
import com.openrsc.server.net.rsc.parsers.impl.Payload199Parser;
9+
import com.openrsc.server.net.rsc.parsers.impl.Payload201Parser;
10+
import com.openrsc.server.net.rsc.parsers.impl.Payload202Parser;
611
import com.openrsc.server.net.rsc.parsers.impl.Payload203Parser;
712
import com.openrsc.server.net.rsc.parsers.impl.Payload235Parser;
813
import io.netty.buffer.ByteBuf;
@@ -184,8 +189,18 @@ else if (buffer.readableBytes() < 80
184189
if (authenticClient > 204) {
185190
isPossiblyValid = Payload235Parser.isPossiblyValid(opcode, length, 235)
186191
|| Payload235Parser.isPossiblyValid(opcode, length, 175);
192+
} else if (authenticClient > 202) {
193+
isPossiblyValid = Payload203Parser.isPossiblyValid(opcode, length);
194+
} else if (authenticClient > 201) {
195+
isPossiblyValid = Payload202Parser.isPossiblyValid(opcode, length);
196+
} else if (authenticClient > 199) {
197+
isPossiblyValid = Payload201Parser.isPossiblyValid(opcode, length);
198+
} else if (authenticClient > 198) {
199+
isPossiblyValid = Payload199Parser.isPossiblyValid(opcode, length);
200+
} else if (authenticClient > 196) {
201+
isPossiblyValid = Payload198Parser.isPossiblyValid(opcode, length);
187202
} else {
188-
isPossiblyValid = Payload203Parser.isPossiblyValid(opcode, length, 203);
203+
isPossiblyValid = Payload196Parser.isPossiblyValid(opcode, length);
189204
}
190205
if (isPossiblyValid) {
191206
Packet packet = new Packet(opcode, bufferOrdered);

server/src/com/openrsc/server/net/rsc/ActionSender.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,16 @@ public static PayloadGenerator<OpcodeOut> getGenerator(Player player) {
6363
generator = new Payload235Generator();
6464
} else if (player.isUsing203CompatibleClient()) {
6565
generator = new Payload203Generator();
66+
} else if (player.isUsing202CompatibleClient()) {
67+
generator = new Payload202Generator();
68+
} else if (player.isUsing201CompatibleClient()) {
69+
generator = new Payload201Generator();
70+
} else if (player.isUsing199CompatibleClient()) {
71+
generator = new Payload199Generator();
72+
} else if (player.isUsing198CompatibleClient()) {
73+
generator = new Payload198Generator();
74+
} else if (player.isUsing196CompatibleClient()) {
75+
generator = new Payload196Generator();
6676
} else if (player.isUsing177CompatibleClient()) {
6777
generator = new Payload177Generator();
6878
} else if (player.isUsing140CompatibleClient()) {
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package com.openrsc.server.net.rsc.generators.impl;
2+
3+
import com.openrsc.server.constants.ItemId;
4+
import com.openrsc.server.external.GameObjectLoc;
5+
import com.openrsc.server.external.ItemLoc;
6+
import com.openrsc.server.model.Point;
7+
import com.openrsc.server.model.RSCString;
8+
import com.openrsc.server.model.entity.player.Player;
9+
import com.openrsc.server.net.Packet;
10+
import com.openrsc.server.net.PacketBuilder;
11+
import com.openrsc.server.net.rsc.GameNetworkException;
12+
import com.openrsc.server.net.rsc.PayloadValidator;
13+
import com.openrsc.server.net.rsc.enums.OpcodeOut;
14+
import com.openrsc.server.net.rsc.generators.PayloadGenerator;
15+
import com.openrsc.server.net.rsc.struct.AbstractStruct;
16+
import com.openrsc.server.net.rsc.struct.outgoing.*;
17+
import com.openrsc.server.util.rsc.DataConversions;
18+
import com.openrsc.server.util.rsc.MathUtil;
19+
import com.openrsc.server.util.rsc.StringUtil;
20+
21+
import java.util.HashMap;
22+
import java.util.Map;
23+
24+
/**
25+
* RSC Protocol-196 Generator for Outgoing Packets from respective Protocol Independent Structs
26+
*
27+
* mudclient196.jar was released on 2004-06-28 and was in active use for 2 months.
28+
*
29+
* It was the first client to support up to 200 friends and the first to use a
30+
* username hash to select a login server.
31+
* **/
32+
public class Payload196Generator implements PayloadGenerator<OpcodeOut> {
33+
private static final Map<OpcodeOut, Integer> opcodes = new HashMap<OpcodeOut, Integer>() {{
34+
put(OpcodeOut.SEND_SERVER_MESSAGE, 53);
35+
put(OpcodeOut.SEND_LOGOUT_REQUEST_CONFIRM, 183);
36+
put(OpcodeOut.SEND_CANT_LOGOUT, 36);
37+
put(OpcodeOut.SEND_FRIEND_LIST, 30);
38+
put(OpcodeOut.SEND_FRIEND_UPDATE, 108);
39+
put(OpcodeOut.SEND_IGNORE_LIST, 84);
40+
put(OpcodeOut.SEND_PRIVACY_SETTINGS, 50);
41+
put(OpcodeOut.SEND_PRIVATE_MESSAGE, 29);
42+
put(OpcodeOut.SEND_PLAYER_COORDS, 196);
43+
put(OpcodeOut.SEND_GROUND_ITEM_HANDLER, 180);
44+
put(OpcodeOut.SEND_SCENERY_HANDLER, 120);
45+
put(OpcodeOut.SEND_INVENTORY, 232);
46+
put(OpcodeOut.SEND_UPDATE_PLAYERS, 240);
47+
put(OpcodeOut.SEND_BOUNDARY_HANDLER, 94);
48+
put(OpcodeOut.SEND_NPC_COORDS, 135);
49+
put(OpcodeOut.SEND_UPDATE_NPC, 215);
50+
put(OpcodeOut.SEND_OPTIONS_MENU_OPEN, 80);
51+
put(OpcodeOut.SEND_OPTIONS_MENU_CLOSE, 125);
52+
put(OpcodeOut.SEND_WORLD_INFO, 79);
53+
put(OpcodeOut.SEND_STATS, 184);
54+
put(OpcodeOut.SEND_EQUIPMENT_STATS, 207);
55+
put(OpcodeOut.SEND_DEATH, 73);
56+
put(OpcodeOut.SEND_REMOVE_WORLD_ENTITY, 74);
57+
put(OpcodeOut.SEND_APPEARANCE_SCREEN, 255);
58+
put(OpcodeOut.SEND_TRADE_WINDOW, 119);
59+
put(OpcodeOut.SEND_TRADE_CLOSE, 161);
60+
put(OpcodeOut.SEND_TRADE_OTHER_ITEMS, 197);
61+
put(OpcodeOut.SEND_SHOP_OPEN, 24);
62+
put(OpcodeOut.SEND_SHOP_CLOSE, 115);
63+
put(OpcodeOut.SEND_TRADE_ACCEPTED, 21);
64+
put(OpcodeOut.SEND_GAME_SETTINGS, 51);
65+
put(OpcodeOut.SEND_PRAYERS_ACTIVE, 133);
66+
put(OpcodeOut.SEND_QUESTS, 253);
67+
put(OpcodeOut.SEND_BANK_OPEN, 6);
68+
put(OpcodeOut.SEND_BANK_CLOSE, 75);
69+
put(OpcodeOut.SEND_EXPERIENCE, 158);
70+
put(OpcodeOut.SEND_DUEL_WINDOW, 209);
71+
put(OpcodeOut.SEND_DUEL_CLOSE, 64);
72+
put(OpcodeOut.SEND_TRADE_OPEN_CONFIRM, 185);
73+
put(OpcodeOut.SEND_DUEL_OPPONENTS_ITEMS, 160);
74+
put(OpcodeOut.SEND_DUEL_SETTINGS, 228);
75+
put(OpcodeOut.SEND_BANK_UPDATE, 175);
76+
put(OpcodeOut.SEND_INVENTORY_UPDATEITEM, 28);
77+
put(OpcodeOut.SEND_INVENTORY_REMOVE_ITEM, 122);
78+
put(OpcodeOut.SEND_STAT, 128);
79+
put(OpcodeOut.SEND_DUEL_OTHER_ACCEPTED, 54);
80+
put(OpcodeOut.SEND_DUEL_ACCEPTED, 229);
81+
put(OpcodeOut.SEND_DUEL_CONFIRMWINDOW, 44);
82+
put(OpcodeOut.SEND_PLAY_SOUND, 123);
83+
put(OpcodeOut.SEND_BUBBLE, 142);
84+
put(OpcodeOut.SEND_WELCOME_INFO, 114);
85+
put(OpcodeOut.SEND_BOX2, 37);
86+
put(OpcodeOut.SEND_BOX, 152);
87+
put(OpcodeOut.SEND_FATIGUE, 82);
88+
put(OpcodeOut.SEND_SLEEPSCREEN, 155);
89+
put(OpcodeOut.SEND_SLEEP_FATIGUE, 32);
90+
put(OpcodeOut.SEND_STOPSLEEP, 138);
91+
put(OpcodeOut.SEND_SLEEPWORD_INCORRECT, 116);
92+
put(OpcodeOut.SEND_SYSTEM_UPDATE, 7);
93+
}};
94+
private final Payload202Generator gen;
95+
96+
public Payload196Generator() {
97+
gen = new Payload202Generator(opcodes);
98+
}
99+
100+
@Override
101+
public PacketBuilder fromOpcodeEnum(OpcodeOut opcode, Player player) {
102+
return gen.fromOpcodeEnum(opcode, player);
103+
}
104+
105+
@Override
106+
public Packet generate(AbstractStruct<OpcodeOut> payload, Player player) {
107+
return gen.generate(payload, player);
108+
}
109+
110+
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package com.openrsc.server.net.rsc.generators.impl;
2+
3+
import com.openrsc.server.constants.ItemId;
4+
import com.openrsc.server.external.GameObjectLoc;
5+
import com.openrsc.server.external.ItemLoc;
6+
import com.openrsc.server.model.Point;
7+
import com.openrsc.server.model.RSCString;
8+
import com.openrsc.server.model.entity.player.Player;
9+
import com.openrsc.server.net.Packet;
10+
import com.openrsc.server.net.PacketBuilder;
11+
import com.openrsc.server.net.rsc.GameNetworkException;
12+
import com.openrsc.server.net.rsc.PayloadValidator;
13+
import com.openrsc.server.net.rsc.enums.OpcodeOut;
14+
import com.openrsc.server.net.rsc.generators.PayloadGenerator;
15+
import com.openrsc.server.net.rsc.struct.AbstractStruct;
16+
import com.openrsc.server.net.rsc.struct.outgoing.*;
17+
import com.openrsc.server.util.rsc.DataConversions;
18+
import com.openrsc.server.util.rsc.MathUtil;
19+
import com.openrsc.server.util.rsc.StringUtil;
20+
21+
import java.util.HashMap;
22+
import java.util.Map;
23+
24+
/**
25+
* RSC Protocol-198 Generator for Outgoing Packets from respective Protocol Independent Structs
26+
*
27+
* mudclient198.jar was released on 2004-08-24 and was in active use for 2 months.
28+
*
29+
* Contemporary open source clients for 198 include TheLoveMachine by SeanWT and saevion.
30+
* **/
31+
public class Payload198Generator implements PayloadGenerator<OpcodeOut> {
32+
private static final Map<OpcodeOut, Integer> opcodes = new HashMap<OpcodeOut, Integer>() {{
33+
put(OpcodeOut.SEND_SERVER_MESSAGE, 202);
34+
put(OpcodeOut.SEND_LOGOUT_REQUEST_CONFIRM, 178);
35+
put(OpcodeOut.SEND_CANT_LOGOUT, 11);
36+
put(OpcodeOut.SEND_FRIEND_LIST, 174);
37+
put(OpcodeOut.SEND_FRIEND_UPDATE, 101);
38+
put(OpcodeOut.SEND_IGNORE_LIST, 144);
39+
put(OpcodeOut.SEND_PRIVACY_SETTINGS, 148);
40+
put(OpcodeOut.SEND_PRIVATE_MESSAGE, 193);
41+
put(OpcodeOut.SEND_PLAYER_COORDS, 18);
42+
put(OpcodeOut.SEND_GROUND_ITEM_HANDLER, 181);
43+
put(OpcodeOut.SEND_SCENERY_HANDLER, 238);
44+
put(OpcodeOut.SEND_INVENTORY, 171);
45+
put(OpcodeOut.SEND_UPDATE_PLAYERS, 139);
46+
put(OpcodeOut.SEND_BOUNDARY_HANDLER, 29);
47+
put(OpcodeOut.SEND_NPC_COORDS, 152);
48+
put(OpcodeOut.SEND_UPDATE_NPC, 159);
49+
put(OpcodeOut.SEND_OPTIONS_MENU_OPEN, 55);
50+
put(OpcodeOut.SEND_OPTIONS_MENU_CLOSE, 93);
51+
put(OpcodeOut.SEND_WORLD_INFO, 167);
52+
put(OpcodeOut.SEND_STATS, 205);
53+
put(OpcodeOut.SEND_EQUIPMENT_STATS, 79);
54+
put(OpcodeOut.SEND_DEATH, 72);
55+
put(OpcodeOut.SEND_REMOVE_WORLD_ENTITY, 246);
56+
put(OpcodeOut.SEND_APPEARANCE_SCREEN, 237);
57+
put(OpcodeOut.SEND_TRADE_WINDOW, 240);
58+
put(OpcodeOut.SEND_TRADE_CLOSE, 3);
59+
put(OpcodeOut.SEND_TRADE_OTHER_ITEMS, 245);
60+
put(OpcodeOut.SEND_TRADE_OTHER_ACCEPTED, 207);
61+
put(OpcodeOut.SEND_SHOP_OPEN, 153);
62+
put(OpcodeOut.SEND_SHOP_CLOSE, 243);
63+
put(OpcodeOut.SEND_TRADE_ACCEPTED, 118);
64+
put(OpcodeOut.SEND_GAME_SETTINGS, 105);
65+
put(OpcodeOut.SEND_PRAYERS_ACTIVE, 140);
66+
put(OpcodeOut.SEND_QUESTS, 164);
67+
put(OpcodeOut.SEND_BANK_OPEN, 120);
68+
put(OpcodeOut.SEND_BANK_CLOSE, 226);
69+
put(OpcodeOut.SEND_EXPERIENCE, 108);
70+
put(OpcodeOut.SEND_DUEL_WINDOW, 23);
71+
put(OpcodeOut.SEND_DUEL_CLOSE, 10);
72+
put(OpcodeOut.SEND_TRADE_OPEN_CONFIRM, 13);
73+
put(OpcodeOut.SEND_DUEL_OPPONENTS_ITEMS, 75);
74+
put(OpcodeOut.SEND_DUEL_SETTINGS, 119);
75+
put(OpcodeOut.SEND_BANK_UPDATE, 172);
76+
put(OpcodeOut.SEND_INVENTORY_UPDATEITEM, 242);
77+
put(OpcodeOut.SEND_INVENTORY_REMOVE_ITEM, 104);
78+
put(OpcodeOut.SEND_STAT, 99);
79+
put(OpcodeOut.SEND_DUEL_OTHER_ACCEPTED, 210);
80+
put(OpcodeOut.SEND_DUEL_ACCEPTED, 235);
81+
put(OpcodeOut.SEND_DUEL_CONFIRMWINDOW, 255);
82+
put(OpcodeOut.SEND_PLAY_SOUND, 250);
83+
put(OpcodeOut.SEND_BUBBLE, 252);
84+
put(OpcodeOut.SEND_WELCOME_INFO, 176);
85+
put(OpcodeOut.SEND_BOX2, 146);
86+
put(OpcodeOut.SEND_BOX, 138);
87+
put(OpcodeOut.SEND_FATIGUE, 84);
88+
put(OpcodeOut.SEND_SLEEPSCREEN, 51);
89+
put(OpcodeOut.SEND_SLEEP_FATIGUE, 21);
90+
put(OpcodeOut.SEND_STOPSLEEP, 125);
91+
put(OpcodeOut.SEND_SLEEPWORD_INCORRECT, 127);
92+
put(OpcodeOut.SEND_SYSTEM_UPDATE, 113);
93+
}};
94+
private final Payload202Generator gen;
95+
96+
public Payload198Generator() {
97+
gen = new Payload202Generator(opcodes);
98+
}
99+
100+
@Override
101+
public PacketBuilder fromOpcodeEnum(OpcodeOut opcode, Player player) {
102+
return gen.fromOpcodeEnum(opcode, player);
103+
}
104+
105+
@Override
106+
public Packet generate(AbstractStruct<OpcodeOut> payload, Player player) {
107+
return gen.generate(payload, player);
108+
}
109+
}

0 commit comments

Comments
 (0)