魔兽世界私服trinitycore2的架构(3)地图数据

来源:互联网 发布:个人域名转让给企业 编辑:程序博客网 时间:2024/04/29 08:19

地图数据在MMO中占据重要的位置,不但数据量大,还具有基础性地位。在魔兽世界中,地图数据分布于几个mpq文件中,一般说来,他存在于mpq内部目录/world/maps/下,而maps也会被划分成多个目录,比如东部王国和卡里姆多。每个地图中,都会有一个wdt和多个adt文件构成,实际上,还有一个wdl文件,只是tc2中没有提到,估计是文件列表。

每个wdt文件被划分成64×64个格子(GRID),每个格子被划分成16×16个单元(CELL),每个CELL的长度为8个点。总共算来应该2^26个点。每个点都有2个高度,一个估计是CELL本身的高度,另外一个是自定义的高度,点的实际高度是这2个高度的和。

每个CELL除了这种空间数据外,还有一个是液体的数据,液体的类型包括水、海洋、岩浆、稀泥,由此看来,液体实际上种特殊的地图数据。在adt文件还包括矢量点、蒙皮等数据,当在服务端提取出来的时候,似乎都被忽略掉,这是正常的,TrinityCore2在运行之前必须从客户端的mpq文件中,提取出地图数据,这些地图数据是被简化过的,然后保存在*.map文件中。

我在【投影世界】【动态分区】中,也同样表达了这种观点。首先,将整个地图将整个切割成多个分区,我的观点和暴雪有所不同的是,我建议以蜂巢模式进行切割,而暴雪是以矩形进行切割。虽然理论上,我的观点比较先进,但是实现上,我也倾向于矩形,毕竟矩形是最简单的地图切割方案。不过,我还是希望能找到一种高效的方式,能够对地图进行蜂巢切割。在服务器端,提取出地形数据,而摒弃那些外观数据,这也是我在投影世界中所表达的那样。

当我越来越深入研究tc2,发现很多思想跟我在《单一世界架构》表述的,惊人吻合。实际上我在研究tc2的代码时,在地图方面遇到很多麻烦的事情,最后我从tc2提供的地图提取工具中,找到了线索,在system.cpp的ConvertADT函数中,了解到*.map中的数据情况。