=====================================================================

未经本人许可 任何网站、团体、个人不得以任何方式转载本文 Author:G1NurX (Jeffrey Zhuang)

=====================================================================

本人原本准备发表一篇关于魔兽世界反和谐原理的文章,由于某些特殊原因决定存在草稿箱中,这也是为了玩家好。
本文只限讨论魔兽世界的MPQ加载过程相关的问题。
适用读者:对WOW加载MPQ的过程感到好奇;想要研究找不到门路;
不适用读者:企图在这里找到直接的反和谐方法或代码;
1)首先简单介绍一下MPQ,MPQ是暴雪使用的归档类型,内部不存储文件名,也不存在目录结构。listfile是文件名的列表,其实是可有可无,
它的存在与否和归档能否使用没有联系。没有listfile,MPQ也是合法的。文件的查找是通过搜索Hash表完成的,每个文件用它的完整“路径”
Hash过后存在Hash table中,例如:Character/BLOODELF/FEMALE/BLOODELFFEMALEFACELOWER00_00.BLP 这个字串经过Hash,
最终通过Hash结果索引归档内的文件。
2)在MPQ的实际应用过程中,游戏内部并没有指定那个贴图在哪个归档中,需要的贴图路径来源于DBC,当然DBC存在MPQ中,DBC
的位置,客户端是知道的。客户端在读取了DBC后就知道那个Entry使用哪个模型,这个模型的骨架文件时哪个,贴图文件是哪个。DBC
中确定的路径是内部路径,是一个虚拟的路径,这个虚拟路径的根是base,下面会多次提到,根据这个路径查找若干MPQ直到找到。
这个路径中不指定在哪个MPQ中,最后确定使用哪个MPQ是由优先级决定的。
    暴雪在更新客户端的时候通常不是修改一些原始的MPQ,而是修改或增加Patch类的MPQ,Patch中和原始文件同名(包含路径)时,通常
会使用Patch中的,正如上面这是由优先级决定的。这么做的原因应该是考虑到部分游戏是光盘版的,游戏的基础文件是在光盘上的,没法修改,
游戏更新就通过补丁类的MPQ实现。
3)使用MPQ文件和正常的文件读写操作类似,首先需要打开归档,函数为SFileOpenArchive,函数原型如下:
bool SFileOpenArchive(char *lpFileName,DWORD dwPriority, DWORD dwFlags, HMPQ hMPQ) 
第一个参数是归档文件的路径,第二个参数是优先级,第三个参数是搜索的域,最后一个参数是返回的MPQ句柄。
当同时打开多个归档是,先搜索优先级高的归档。因此Patch类的MPQ优先级高。客户端中存在一张表,有4个字段
分别是:归档名;Flag1;Flag2;HMPQ
=========================================
归档名                               Flag1   Flag2

alternate.MPQ 3 3
interface.MPQ 1 1
misc.MPQ 1 1
model.MPQ 1 1
texture.MPQ 1 1
terrain.MPQ 1 1
wmo.MPQ 1 1
sound.MPQ 1 1
fonts.MPQ 1 1
dbc.MPQ 1 1
lichkingspeech.MPQ 2 1
expansion.MPQ 2 3
expansionloc.MPQ 2 1
lichking.MPQ 2 3
lichkingloc.MPQ 2 1
common.MPQ 1 2
common-2.MPQ 2 2
****//locale-****.MPQ 1 2
****//expansion-locale-****.MPQ 2 2
****//lichking-locale-****.MPQ 2 2
****//speech-****.MPQ 1 2
****//expansion-speech-****.MPQ 2 2
****//lichking-speech-****.MPQ 2 2
development.MPQ 2 1

=========================================

根据本人猜测,Flag1代表了归档的类型,1=基础包(标准版WOW);2=扩展包(用于资料片);3=定制包(根据不同国家的客户端)。
Flag2到目前为止还无法解释,根据经验应该和搜索域有关。
概括起来讲,Flag1一定程度上确定了优先级,Flag2确定了读取的范围,换句话说,有些文件允许直接使用客户端文件夹下的文件,
例如Interface,这个特性本人猜测和Flag2指定的数值有关。
*(如果哪位朋友有新的发现请与本人联系)
3)下面是标准魔兽世界(没有被和谐的情况)实际加载过程中指定的优先级。数值在不同机器上可能不一样,但是一样版本的应该客户端应该一样。
=======================================
归档名                                    优先级
DATA/zhCN/lichking-speech-zhCN.MPQ         0x28
DATA/zhCN/expansion-speech-zhCN.MPQ        0x29
DATA/zhCN/lichking-locale-zhCN.MPQ         0x2A
DATA/zhCN/expansion-locale-zhCN.MPQ            0x2B
DATA/zhCN/speech-zhCN.MPQ                  0x2C
DATA/zhCN/locale-zhCN.MPQ                  0x2D
DATA/common-2.MPQ                      0x2E
DATA/common.MPQ                            0x2F
DATA/lichking.MPQ                          0x30
DATA/expansion.MPQ                     0x31
DATA/zhCN/patch-zhCN.MPQ                   0x40
DATA/Patch.MPQ                         0x41
DATA/Patch-2.MPQ                           0x42
DATA/zhCN/patch-zhCN-2.MPQ                0x43
=======================================
*数值越大优先级越高,

和网上流传的说法是有出入的,但是基本一致。common和common-2与网友猜测的数值越大是相反的。

第二请看最后4条,首先loacle文件夹下的第一个Patch优先级是Patch中最低的,然后是base下Patch,locale剩下的Patch是优先级相对最高的。

这也和网上流传的先加载locale下的,然后是base下的,数字越大优先级越高,其实不然。

4)可能有人做过实验想要说我说的不对,明明locale下的优先级比base下的高。到这,其实还只解释了一半,因为前面的结果是标准版的WOW,

阉割和谐版的还有后文,表现出来的是假象,真相如下。

凡是魔兽世界的MPQ有过点研究的都应该知道WOW China Client的MPQ与世界文明国家运营的WOW不太一样。某哥一番讲话,众多小弟为

给某哥留下一个好印象,为能青云直上,对某哥的讲话进行深入研究,研究表明WOW这款在全世界运营良好的游戏不符合天朝的国情,于是艾泽拉斯大陆

遭受了核谐打击,从此之后patch下多了一个“文件夹”,名为alternate,前面说过MPQ中不含文件夹,MPQ内部是“平坦”的。自从TBC后,base下多了一个

叫做alternate.MPQ的归档文件文件。这个归档内的alternate或alternate.MPQ使得艾泽拉斯大陆骸骨变僵尸,骸骨变坟堆,一出闹剧,至今仍在上演。

这样的修改有两个表现现象:

(1)alternate.MPQ在第一张表中第一项就是。在实际运行中获得的优先级数值为0x44,比表二中任何一个都要高。

(2)凡是包含alternate“文件夹”的Patch文件要比没有Patch的高。假设一下:现在有两个文件DATA/Patch.MPQ与DATA/Patch-2.MPQ,当Patch-2.MPQ

包含了alternate“文件夹”,这个文件夹中刚好有一个文件和Patch.MPQ中的某个文件同名(包含路径,去alternate),那么Patch-2.MPQ中alternate文件夹

中的文件会被优先加载。于是就产生了一些优先级解释的假象。而且,包含alternate的patch类MPQ优先级比alternate.MPQ更高!如果哪位想改模型,

而且喜欢钻牛角尖,要让自己的模型获得最高优先级,好吧,那就在Data/locale文件夹/patch-locale-X.MPQ,X取相对最大,把模型文件放alternate下。

好吧,这是你的模型文件优先级已经无敌了。当然,还有一个signature文件会校验每个归档文件的合法性。如果能制作出一个signature放在自己的patch中,

并获得相对较高优先级,就算不用改客户端也能过自检了。好像有点跑题了- -!

5)MPQ的加载过程:

(1)加载补丁类归档,赋予相对较高优先级

(2)加载定制归档赋予相对较高优先级

(3)加载基础归档和扩展归档,赋予相对较低优先级

(4)包含定制文件夹的补丁类归档赋予一个更(最)高的优先级再次打开。

(完)

2/24/2010 19:55

魔兽世界MPQ加载顺序相关推荐

  1. web.xml 配置 加载顺序

    web.xml 的加载顺序是:context-param -> listener -> filter -> servlet . 过滤器执行顺序是根据filter-mapping ,不 ...

  2. S2JH经验分享:控制jdbc:initialize-database与其他bean加载顺序

    为什么80%的码农都做不了架构师?>>>    为了便于干净的初始化部署运行S2JH框架,采用了jdbc:initialize-database来从SQL脚本中初始化框架基础数据,其 ...

  3. web.xml 里context-param 、listener、 filter、servlet 加载顺序

    1.web.xml中context-param .listener. filter.servlet 加载顺序与其位置无关,不是listener在context-param 前面就先加载listener ...

  4. 动态参数 名称空间 作用域 作用域链 加载顺序 函数的嵌套 global nonlocal 等的用法总结...

    03,动态参数 *args,**kwargs # 用户传入到函数中的实参数量不定时,或者是为了以后拓展,# 此时要用到动态参数*args,**kwargs(万能参数.)# *args接收的是所有的位置 ...

  5. 类的加载顺序和对象的实例化

    直接就在JDK8中用代码来验证吧. import lombok.extern.slf4j.Slf4j;@Slf4j public class Printer {private String s;pub ...

  6. java静态方法加载顺序_java中类以及方法的加载顺序

    先看下面的代码: public class Test { public static int a =0 ; static { a = 10; System.out.println("静态代码 ...

  7. 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)

    1.外部配置加载顺序 SpringBoot也可以从以下位置加载配置: 优先级从高到低 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置  1.命令行参数 所有的配置都可以在命令行上进行指定 ...

  8. 【原】HTML页面元素加载顺序研究报告(2)----背景图片

    2.接下来考察背景图片的加载: 一般来说,添加背景图片有三种办法: 直接写在标签的style里面,如: <div style="background-image:url('images ...

  9. iptables加载顺序问题及优化方法

    iptables加载顺序问题及优化方法 1. iptables加载顺序问题及优化方法 1.1. 1. 问题背景 1.2. 2. 问题排查 1.3. 3. 根因分析 1.4. 4. 附带影响 1.5. ...

  10. JAVA Web.xml 加载顺序

    web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> ...

最新文章

  1. 基于机器学习的文本分类!
  2. 7张图了解2018物联网产业发展新趋势
  3. JavaScript获取DOM元素位置和尺寸大小
  4. Java虚拟机详解(八)------虚拟机监控和分析工具(2)——可视化
  5. Javascript 笔记(1)----函数
  6. ACM-ICPC 2019 山东省省赛 A Calandar
  7. 功放音量调节原理_玩汽车音响,功放和喇叭,应该如何做好匹配?
  8. ref与out之间的区别
  9. 解决eclipse报PermGen space内存溢出异常的问题
  10. 深度召回算法在字节跳动推荐系统的应用实践
  11. java加载阶段内存分配_Java核心:类加载和JVM内存的分配
  12. Win7从VHD中启动 如何扩充虚拟磁盘
  13. yii2 中 controller 向layout 传值
  14. css中背景图像移动_深入了解:在CSS中使用编码图像(背景图像)
  15. 程序员的一天:程序员每天工作是怎样的?带你看看!!
  16. cv::subtract
  17. 视频教程-微信公众平台开发入门-微信开发
  18. 中央电大 c语言程序设计a 试题,中央电大开放本科计算机科学与技术专业C语言程序设计(A)试题_1007...
  19. 自动驾驶中激光雷达如何检测障碍物
  20. Axure长页面滚动拖动制作

热门文章

  1. 《数据分析思维手册》和《数据分析师的职场真相》全集整理好啦,下载保存!...
  2. mdl文件是c语言,mdl文件扩展名,mdl文件怎么打开?
  3. 神泣服务器维护公告,《神泣》官方网站—创天互娱
  4. 蓝牙音乐之AVRCP
  5. vue导出excel表格(详细教程)
  6. vue 导出excel
  7. protel99se的封装库
  8. linux vim删除单个字符串,LINUX vim替换字符串指令
  9. NV12转化为BMP函数
  10. itext-asian-5.2.0