最近,网上开始流传利用商店BUG进行野外购物的辅助工具,也就是说,利用野外购物工具,可以在本服务器内的任意线的非副本的游戏地图内随意打开显示商店信息和进行购物操作,现将其原理简述一下。
系统默认的商店查询入口有2个,一是直接到开店人面前打开商店查,二是通过商店系统公告板的列表查询,无论哪种情况,发送给服务器的指令都是一样的:查询指令+商店数字代号,数字代号是一个4字节的整数,每次维护都重新开始,所以一般只有前2个字节有用。服务器收到指令后,给客户端回商店的具体信息数据,客户端收到后以图形格子的形式显示出来。
如果在设计上只允许城镇内的2个位置购物,服务器应该在收到查询指令后检查当前的角色位置(线,地图,坐标),如果符合游戏设定,回正确的数据,否则直接回错误提示,现在的BUG就是服务器端只检查了是否在副本中,没有继续检查不在副本时的这些信息,也许在设计上允许这样的操作,所以说是BUG也有些勉强。
在副本中,服务器端似乎做了处理,它知道或在设计上不允许当前的角色查询商店信息和购买商店物品,一旦做查询操作,服务器总是回“商店系统发生未知错误”,所以,要实现在副本中显示商店信息,需要下功夫通过其它BUG来绕开检查或直接在客户端偷梁换柱,但无论哪个方法,都不会象现在的野外这样简单,甚至不能实现。
了解了这些,野外购物的联机实现也就简单了:首先获得商店列表和每个商店的数字代号,用户一旦想查看,立即模拟客户端发查询指令,收到的结果,客户端会自己处理,也就是和正常在城镇中的显示一样,后续的购物由于服务器也没有检查(客户端的检查是没有意义的),所以就和正常的操作一样了。
封掉这个BUG,也非常容易,只需要在服务器上把判断的逻辑修改一下就可以了,当然,购买/出售时也应该要检查角色的位置信息,否则,还会有其它的BUG流传。
顺便提一句,商店的BUG不只这一个,比如,可以在任何地图中打开商店列表,当然,如果该地图(野外或城镇)内无人开店,列表是空的,这个BUG最大用处是你不用站在人山人海的告示前,在市场线的市场城镇的任意位置,比如一个无人打扰的角落,你都可以自由自在的浏览商店。