魔兽世界MPQ加载顺序
=====================================================================
未經(jīng)本人許可 任何網(wǎng)站、團體、個人不得以任何方式轉(zhuǎn)載本文 Author:G1NurX (Jeffrey Zhuang)
=====================================================================
本人原本準(zhǔn)備發(fā)表一篇關(guān)于魔獸世界反和諧原理的文章,由于某些特殊原因決定存在草稿箱中,這也是為了玩家好。 本文只限討論魔獸世界的MPQ加載過程相關(guān)的問題。 適用讀者:對WOW加載MPQ的過程感到好奇;想要研究找不到門路; 不適用讀者:企圖在這里找到直接的反和諧方法或代碼; 1)首先簡單介紹一下MPQ,MPQ是暴雪使用的歸檔類型,內(nèi)部不存儲文件名,也不存在目錄結(jié)構(gòu)。listfile是文件名的列表,其實是可有可無, 它的存在與否和歸檔能否使用沒有聯(lián)系。沒有l(wèi)istfile,MPQ也是合法的。文件的查找是通過搜索Hash表完成的,每個文件用它的完整“路徑” Hash過后存在Hash table中,例如:Character/BLOODELF/FEMALE/BLOODELFFEMALEFACELOWER00_00.BLP 這個字串經(jīng)過Hash, 最終通過Hash結(jié)果索引歸檔內(nèi)的文件。 2)在MPQ的實際應(yīng)用過程中,游戲內(nèi)部并沒有指定那個貼圖在哪個歸檔中,需要的貼圖路徑來源于DBC,當(dāng)然DBC存在MPQ中,DBC 的位置,客戶端是知道的。客戶端在讀取了DBC后就知道那個Entry使用哪個模型,這個模型的骨架文件時哪個,貼圖文件是哪個。DBC 中確定的路徑是內(nèi)部路徑,是一個虛擬的路徑,這個虛擬路徑的根是base,下面會多次提到,根據(jù)這個路徑查找若干MPQ直到找到。 這個路徑中不指定在哪個MPQ中,最后確定使用哪個MPQ是由優(yōu)先級決定的。 暴雪在更新客戶端的時候通常不是修改一些原始的MPQ,而是修改或增加Patch類的MPQ,Patch中和原始文件同名(包含路徑)時,通常 會使用Patch中的,正如上面這是由優(yōu)先級決定的。這么做的原因應(yīng)該是考慮到部分游戲是光盤版的,游戲的基礎(chǔ)文件是在光盤上的,沒法修改, 游戲更新就通過補丁類的MPQ實現(xiàn)。 3)使用MPQ文件和正常的文件讀寫操作類似,首先需要打開歸檔,函數(shù)為SFileOpenArchive,函數(shù)原型如下: bool SFileOpenArchive(char *lpFileName,DWORD dwPriority, DWORD dwFlags, HMPQ hMPQ) 第一個參數(shù)是歸檔文件的路徑,第二個參數(shù)是優(yōu)先級,第三個參數(shù)是搜索的域,最后一個參數(shù)是返回的MPQ句柄。 當(dāng)同時打開多個歸檔是,先搜索優(yōu)先級高的歸檔。因此Patch類的MPQ優(yōu)先級高。客戶端中存在一張表,有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 | 
和網(wǎng)上流傳的說法是有出入的,但是基本一致。common和common-2與網(wǎng)友猜測的數(shù)值越大是相反的。
第二請看最后4條,首先loacle文件夾下的第一個Patch優(yōu)先級是Patch中最低的,然后是base下Patch,locale剩下的Patch是優(yōu)先級相對最高的。
這也和網(wǎng)上流傳的先加載locale下的,然后是base下的,數(shù)字越大優(yōu)先級越高,其實不然。
?
4)可能有人做過實驗想要說我說的不對,明明locale下的優(yōu)先級比base下的高。到這,其實還只解釋了一半,因為前面的結(jié)果是標(biāo)準(zhǔn)版的WOW,
閹割和諧版的還有后文,表現(xiàn)出來的是假象,真相如下。
?? ?凡是魔獸世界的MPQ有過點研究的都應(yīng)該知道WOW China Client的MPQ與世界文明國家運營的WOW不太一樣。某哥一番講話,眾多小弟為
給某哥留下一個好印象,為能青云直上,對某哥的講話進行深入研究,研究表明WOW這款在全世界運營良好的游戲不符合天朝的國情,于是艾澤拉斯大陸
遭受了核諧打擊,從此之后patch下多了一個“文件夾”,名為alternate,前面說過MPQ中不含文件夾,MPQ內(nèi)部是“平坦”的。自從TBC后,base下多了一個
叫做alternate.MPQ的歸檔文件文件。這個歸檔內(nèi)的alternate或alternate.MPQ使得艾澤拉斯大陸骸骨變僵尸,骸骨變墳堆,一出鬧劇,至今仍在上演。
這樣的修改有兩個表現(xiàn)現(xiàn)象:
(1)alternate.MPQ在第一張表中第一項就是。在實際運行中獲得的優(yōu)先級數(shù)值為0x44,比表二中任何一個都要高。
(2)凡是包含alternate“文件夾”的Patch文件要比沒有Patch的高。假設(shè)一下:現(xiàn)在有兩個文件DATA/Patch.MPQ與DATA/Patch-2.MPQ,當(dāng)Patch-2.MPQ
包含了alternate“文件夾”,這個文件夾中剛好有一個文件和Patch.MPQ中的某個文件同名(包含路徑,去alternate),那么Patch-2.MPQ中alternate文件夾
中的文件會被優(yōu)先加載。于是就產(chǎn)生了一些優(yōu)先級解釋的假象。而且,包含alternate的patch類MPQ優(yōu)先級比alternate.MPQ更高!如果哪位想改模型,
而且喜歡鉆牛角尖,要讓自己的模型獲得最高優(yōu)先級,好吧,那就在Data/locale文件夾/patch-locale-X.MPQ,X取相對最大,把模型文件放alternate下。
好吧,這是你的模型文件優(yōu)先級已經(jīng)無敵了。當(dāng)然,還有一個signature文件會校驗每個歸檔文件的合法性。如果能制作出一個signature放在自己的patch中,
并獲得相對較高優(yōu)先級,就算不用改客戶端也能過自檢了。好像有點跑題了- -!
?
?
5)MPQ的加載過程:
?
(1)加載補丁類歸檔,賦予相對較高優(yōu)先級
(2)加載定制歸檔賦予相對較高優(yōu)先級
(3)加載基礎(chǔ)歸檔和擴展歸檔,賦予相對較低優(yōu)先級
(4)包含定制文件夾的補丁類歸檔賦予一個更(最)高的優(yōu)先級再次打開。
?
(完)
?
2/24/2010 19:55
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的魔兽世界MPQ加载顺序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 备份数据 宝塔linux_宝塔面板教程大
- 下一篇: c语言 PTA2020总决赛 L1-4
