什么是封包,以及封包版本(也叫客户端版本)

服务端只能完美的支持部分客户端版本,你在制作客户端的时候,也需要找到正确的客户端版本才能够让一切顺顺利利,否则就会出问题。

下面我们通过举例,由浅入深的讲解什么是封包,什么是封包版本(也叫客户端版本),以及一些相关知识。

我们先来举一个例子,比如小明和小东是同桌,在考试之前,小明和小东约定好一套抄答案的暗号:如果小明敲2下桌子,就表示需要小东给第二道选择题得档案,这时候小东敲1下桌子表示答案是A,敲2下桌子表示答案是B,敲3下桌子表示答案是C!

为什么要举这个例子呢,是为了让大家能够明白,服务器和客户端是怎么通讯的。其实服务端和客户端通讯,就像上面的例子一样。

在上面这个例子中,小明和小东之间的约定,我们称之为是他们之间的一套协议!小明敲的2下,小东敲的1下2下3下,可以称之为这套协议里面的封包,封包里面包含的基本的一个动作指令,以及附加信息。

如果把上面的例子,换做服务端和客户端也是一样的道理,只不过是一般情况下动作对应的是一个类似0x11的十六进制数字。

通过上面的这个例子,希望大家已经能知道,所谓的封包就是客户端和服务端约定好的一些动作信号。并不是什么高深莫测的东西。

接下来我会介绍什么是封包版本(也叫客户端版本)!

我们都知道,游戏都是在持续不断更新的,比如以前没有收购商店功能,然后忽然在2012年10月24日就开始支持这个功能了(这里的日期只是举个例子,为了后面讲解方便使用)。

类似这种功能,一般只有客户端支持是不够的,也需要服务端支持,那么这种情况下,如果我拿着一个能开收购商店的客户端,配合一个不支持收购商店的服务端一起使用,会发生什么事情呢?

没错,收购商店功能就无法正常使用啦,因为服务端根本不认识这个功能的封包,也自然无法将用户要收购的内容存起来通知给其他路过的玩家。

那么问题来了,我们要如何避免这种错误呢?答案是引入封包版本的概念,版本号就是客户端的日期,比如上面的例子中,20121024就是一个版本号,从这个版本开始,客户端支持开收购商店。

注意:这个日期不是随便取的,而是韩服对玩家发布这个游戏客户端exe的日期,比如在2012年10月24日韩服对玩家发布了一个更新,这个更新包括这个游戏客户端exe(一般是指Ragexe.exe文件)。

然后,你也需要知道,服务端也有他们支持的封包版本发范围,一个服务端可以支持多个封包版本,如下图所示:

但是,在编译rAthena的时候,同一时间rAthena只能最好的支持1个客户端版本,这个版本号会被写在src\common\mmo.h文件中的#define PACKETVER上,如下图所示(rAthena默认支持版本号为20130807的客户端):

那么大家可能会问,如果我要改变这个版本号可以吗?我是不是能够随便改变版本号呢?答案是:不能随意改,要改的话,这个版本号必须在db\packet_db.txt文件中有记录,比如看下图:

可以发现rAthena官方是支持2013-12-23Ragexe这个版本的封包的,那么你就可以将PACKETVER改成20131223

如果这个日期没出现在packet_db.txt中的话,那么说明这个版本是不被支持的。当你改好PACKETVER之后,需要重新编译服务端才能生效。

这是制作客户端一个非常基础的知识,大家一定要掌握。