Rusted Warfare诞生于 8 年前。设计灵感来自于《命令与征服》和《横扫千军》.

引用于https://zh.wikipedia.org/wiki/铁锈战争

RW-Server的构想提出

早在2018年的时候,在游戏的过程中发现,官方的Server处于US/非CN 的地区。导致游戏延迟感动中国。
这种时候 我就在想,能不能有一种第三方的服务器,可以在CN内进行Play game。

RW游戏的逆向

在版本中, 逆向出了数据包, 但当时技术有限,无法进行Custom Server

RW-HPS的实现

2020的一天,列表出现了一台名字为 Rukkit 的Server,在这种时候, 也就想起了以前对Custom Server的构想
而通过研究游戏的源码以及对Rukkit的实现做了研究, 我重新开了一条Rukkit的分支(都是Miku太懒不更新),这条分支在后面改为 RW-HPS 并延伸成一个团队

  • 游戏的包结构是
    1
    2
    3
    4
    5
    6
     1  2  3  4  5 6 7 8  ...
    +-+-+-+-+-+-+-+-+---------------+
    |0 |0 |0 |0 |0|0|0|0| Data|
    +-+-+-+-+-+-+-+-+---------------+
    |Data length| Type | Data
    +---------------+---------------+

通过这个我们可以发现 Luke 对于游戏单个 Packet 的定义是 长度+类型+数据
那么我们就可以开始写一个解析器了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 这是Java8的新语法
try (Socket socket = new Socket()){
// 创建一个 Socket 连接
socket.connect(new InetSocketAddress(InetAddress.getByName("IP"),PORT),TIMEOUT);
DataInputStream in = new DataInputStream(socket.getInputStream());
// 首先读取长度
int size = in.readInt();
// 再读取类型
Packet packet = new Packet(in.readInt());
while (bytesRead < size) {
int readIn = in.read(packet.bytes, bytesRead, size - bytesRead);
if (readIn == -1) {
break;
}
bytesRead += readIn;
}
}

通过解析单个 Packet 我们就知道客户端要做什么