8

ouster开发笔记(四)

 3 years ago
source link: https://www.zenlife.tk/ouster-dev4.md
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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
  • 地图文件的解析

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK