ouster开发笔记(四)
2014-05-09
现在每天有半天时间在练车,效率大打折扣。加上前面有一段时间进展不怎么顺,所以几个星期没更新。
先说说遇到了什么困难吧。同时写客户端和服务端这边,精力实在有点吃不消,flare客户端那边总是出各种各样的问题,调试起来非常耗时。然后我就把客户端那边先放下了,专心先做服务端这边。但是消息显示是个问题,我至少需要看得到客户端发了什么包,服务端返回什么包这些消息流动吧。于是又写了个命令行界面的,来显示和转发消息包。
继续写着,慢慢开始涉及游戏逻辑部分了。以前觉得策划天天搞些各种蛋疼的需求,现在发现完全没有策划做起来也难搞,不知道要做成什么样子,比如该有哪些职业,玩家应该有哪些属性,相应的计算命中回避伤害等等这些数值系统的设计。
一怒之下,跑去研究了一阵子各种私服,看看能不能找到些有用的东西拿来参考。ragezone真是个神奇的地方,这个算不算调研啊?总结一下调研的结果吧。
仙境传说RO,这个是一个有开源模拟器的项目,社区也很活跃。这也是唯一一个弄到代码+编译+运行全程测试通过的。但是体验了一下,不合味口啊。总不至于去玩一个完全陌生的游戏,熟习玩法了再研究吧。扫了一下代码,一个gate服务器,一个玩家的data服务器以及游戏服务器,都是单进程架构。没有看到心跳系统,而采用了一个计时器的机制做的。
奇迹世界SUN,这个应该是一个客户端+服务端完整泄露的。项目太大,以至于我都完全没有去编译它的念头。
奇迹Mu,在那个年代奇迹3d效果是绝对震悍的。这是一个被研究得很透彻的游戏,透彻到什么地步呢?有专门公司提供和技术支持的,都产业化了。模拟器也有,但比较残不能用。然后也有版本是提供服务端文件,我没跑起来。拿到一份代码,编译通过,但是不知道怎么运行。用的是sql server,数据库那边不知道怎么弄。
天之炼狱Darkeden,很早以前鬼魅端出来的时候看过,然后有人发过一个改过的源代码,说是v2版本的,我当时测试过编译没问题,就是找不到客户端。这次碰巧找到v2的客户端了,总算可以研究了。
这么一来,我决定改变ouster的路线,研究一个自己熟习的游戏优势太明显了,于是我推倒了之前的使用flare写客户端的计划,打算直接用darkeden作为客户端。而ouster继续使用之前Go搭的核心,上层逻辑往darkeden上靠,做成一个模拟器。
封包的抓取工作,不知道为什么,我在windows下用WEP抓,会进入到更新界面。不得已,写了一个hajack。基本原理就是,hajack伪装成服务器的样子,接受client发来的包,将它发送给真正的服务器。而对于收到服务器发送过来的包,则转发给客户端。整个通信流程来往的数据全部都被hijack抓取下来,然后我拿着分析包格式。
darkeden的工作流程是先由client连接到loginserver,验证用户名密码,选择大区,选择线路,选择角色。最后loginserver会给客户端发送一个LCReconnect的包,这个包中有gameserver的IP和端口,以及Auth的Key等信息,client用这些信息去连接gameserver。于是乎,我在hijack的最后一步,会截获这个包,将其中的IP地址替换成hijack的地址,继续执行劫持。
它的封包头部格式是,uint32的PacketID,加上uint16的PacketSize,然后是一个uint8的包序号,包序号递增到255后重新回到0。都是使用小端编码的。包的内容每种具体的包都不太一样。很大一部分精力就是去研究各个包的PacketID是多少,具体格式是什么样子的。
loginserver一直点下一步进到游戏的过程的包已经全部破解,然后写了个简单的loginserver模拟发送相应的包。
gameserver的包则复杂得多,到目前为止我已经知道了其中一部分,像人物行走,添加怪物,攻击,怪物死亡,血量变化,等等。
darkeden使用的地图文件,是二进制的ssp和ssi,包含了地图Id,宽高,每个Tile的标记等信息。我希望ouster外部依赖越少越好,毕竟是demo。所以不要数据库,连数据文件都越少越好。所以在我项目中有个叫data的package,直接把ssp文件做成go的源文件,代码即数据,连load过程都省了。
好像所有的地图都是256*256大小的,并且在darkeden的原始实现中,是每个Tile都带了一个object链表,aoi是在Zone中实现的。而我在ouster中,还是保持了aoi模块的独立性,不过又单独写了一个基于格子的aoi。
地图相关的是一大块,很多游戏都是以地图为单位管理里面的对象的,像怪物的重生什么的都在里面。地图的怪物信息,像各个地图在哪些区域有哪几类怪物,各类怪物有多少只,还有像事件怪物比较boss之类的。我现在正在做这里,接下来先把怪物加进来,到少先做到可以行走,玩家可以看到怪物,可以攻击怪物。慢慢的要有一个游戏的样子了。
好吧,大概从上篇文章到目前就这些工作:
- ouster路线改变,决定做成一个darkeden的模拟器。
- hijack抓包以及格式分析相关的工作。
- loginserver模拟以及gameserver部分包的破解。
- 基于格子的aoi
- 地图文件的解析