1. 程式人生 > >魔獸世界私服Trinity,從原始碼開始

魔獸世界私服Trinity,從原始碼開始

緣起因由

在一個無所事事的週末下午,突然想起魔獸世界,官方的賬號很久沒有上了,裡面的大小號現在連滿級都不是。以前曾經搭過傳奇和星際爭霸戰網的私服自娛自樂,也聽說過魔獸世界有開源的服務端模擬,既然興致來了就小小的研究一下。

目前魔獸世界的私服比較流行的是MaNGOS和Trinity,二者都是模擬魔獸世界服務端。MaNGOS“號稱”是一個研究型專案,目的是為了學習大規模的C++專案開發,有道理,不過我不信。Trinity是基於MaNGOS的程式碼開發的,以前主要是為了合併使用者提交的補丁程式碼而設立的一個專案,不過現在已經單獨獨立出來了,主要開發成員包括以前MaNGOS的一些老人,現在的主要工作包括清理程式碼、優化、提供一個更好的服務端核心。

二者現在的程式碼提交和更新都很頻繁,但是具體是否會合並對方的程式碼就不清楚了。總而言之,也就是說,我感覺Trinity大概也許應該是目前最好的一個魔獸世界服務端模擬了。作為一個程式設計師來說,玩遊戲還在其次,看看程式碼才是件有意思的事情。整個過程記錄在案 http://log4think.com/setup_wow_private_server,以便事後查詢。

現在嘗試一下從原始碼開始搭個魔獸世界的伺服器,從原始碼開始主要還是想順便看看程式碼的情況,基於Trinity來做。至於客戶端的情況,截止到2011年6月12日,中國國服魔獸世界最新的版本是3.3.5 13930-巫妖王之怒。

安裝基本工具

安裝之前,需要準備幾個要使用到的工具軟體,用來下載、編譯等等。

**版本控制工具 Git ** 由於 MaNGOS 和 Trinity 都是託管在 GitHub 上,所以得用 Git 才能下到原始碼:

編譯工具和庫

執行環境:

  • MySQL,安裝後也包含編譯需要的標頭檔案和庫。

以下二者按需選擇其一

以下非必需

生成專案檔案

各個工具都下載、安裝完畢(具體細節可Google之,不贅述了),準備工作做完之後,開始下程式碼編譯。

  1. 建一個目錄,譬如 D:\workspace\trinity

  2. 進入這個目錄,右鍵 Git Clone... ,Url那裡填入https://github.com/TrinityCore/TrinityCore.git, 點OK。不喜歡圖形化工具的可以直接進到新建的目錄裡面,命令列上執行 git clone https://github.com/TrinityCore/TrinityCore.git 。 會自動建立一個名為 TrinityCore 的原始碼目錄,然後就是等著程式碼下完。

  3. 在 D:\workspace\trinity 下建一個目錄是Build等下放編譯結果檔案
  4. 執行CMake的圖形化工具(開始選單裡 CMake 下的 CMake (cmake-gui))
  5. 點 Browse Source... , 選 D:\workspace\trinity\TrinityCore
  6. Browse Build... ,選 D:\workspace\trinity\Build
  7. 點 Configure ,出一個對話方塊
  8. 確保勾選了 Use default native compilers,下拉框裡面選 Visual Studio 10,至於是32位還是64位版本的,根據自己的情況選
  9. 點Finish,CMake 工具會搜尋原始碼配置,分析出一些編譯選項來。確保 cmake-gui 下面的資訊提示裡面沒有 ERROR 字樣,否則根據具體錯誤修正後重來。
    1. 在 cmake-gui 上面的編譯選項裡面選中 SCRIPTS、SERVERS、TOOLS、USE_COREPCH、USE_SCRIPTPCH ,不要選 USE_MYSQL_SOURCES 。
    2. 最後點 Generate , CMake 會在 D:\workspace\trinity\Build 下面生成 Visual Stdio 2010 的專案檔案。

配置完成後,我的是這樣:

enter image description here

可能出現的問題: 1. 第10步裡面_GIT_EXEC應該是msysgit中git的絕對路徑,如果沒有則是msysgit安裝的時候沒有把自己加到系統路徑裡面去 2. 如果下面出現紅色的ERROR提示,類似於

Could not copy from: D:/dev/cmake/share/cmake-2.8/Templates/CMakeVSMacros2.vsmacros to: C:/Documents and Settings/Administrator/ÎÒµÄÎĵµ/Visual Studio 2010/Projects/VSMacros80/CMakeMacros/CMakeVSMacros2.vsmacros

這個好像是因為 CMake 無法識別中文路徑,把“我的文件”的位置改一下吧,改成路徑不帶中文的。或者直接自己把提示中的 CMak>eVSMacros2.vsmacros 拷到“我的文件”下的 Visual Studio 2010/Projects/VSMacros80/CMakeMacros/ 。

編譯原始碼

注意以下幾點:

  1. 如果你的魔獸世界客戶端是3.3.5 13930,那麼記得給程式碼打個認證補丁以支援13930,具體請參考另一篇文章 wow_3-3-5_13930_auth_patch
  2. 在 Visual Studio 裡面開啟 D:\workspace\trinity\Build\TrinityCore.sln ,先Build -> Clean Solution,然後Build -> Build Solution
  3. 預設是生成 Debug ,結果在 D:\Build\bin\Debug下面,從 MySQL 的安裝目錄下的Lib目錄裡面拷一個 libmySQL.dll 到這個目錄下, libeay32.dll 和 ssleay32.dll 是 OpenSSL 的,應該預設加到系統路徑下了,如果後面提示找不到就從 OpenSSL 的安裝目錄裡面拷過來。

安裝資料庫

簡短截說:

  1. 從 https://github.com/TrinityCore/TrinityCore/downloads 下載最新的(或者符合你的客戶端版本號的)魔獸世界資料檔案,
  2. 用MySQL圖形化工具,匯入 D:\workspace\trinity\TrinityCore\sql\create\create_mysql.sql 執行建立三個資料庫

    auth 資料庫中匯入 D:\workspace\trinity\TrinityCore\sql\base\auth_database.sql 執行, characte 資料庫中匯入 D:\workspace\trinity\TrinityCore\sql\base\character_database.sql 執行, world 資料庫中匯入第一步中下載的 TDB_full_???.sql 檔案執行, 最終建立 auth、character、world 三個資料庫。

生成地圖檔案

  1. 在D:\Build\bin\Debug下面建一個makevmaps3_simple.bat檔案,內容為

    vmap3extractor.exe
    md vmaps
    vmap3assembler.exe Buildings vmaps
    
    pause
    

    儲存執行,會從魔獸世界的客戶端目錄裡面解壓縮服務端需要的地圖出來。根據機器速度不同,大概需要20分鐘到一個小時的時間。執行結束的時候會給個提示"Press any key...",按任意鍵結束。生成 vmaps 和 buildings 目錄, buildings 目錄無用可以刪除。

  2. 假設魔獸世界的客戶端目錄在 D:\WOW 下面,在 D:\Build\bin\Debug 下執行

    mapextractor.exe -i "d:\WOW"
    

    這樣會生成 maps 和 dbc 目錄。這個工具會根據客戶端的雨中在 dbc 目錄下生成不同的 dbc 語言版本。如果是中文的客戶端,會提取出中文的 dbc 資料。

配置伺服器

  1. 在 D:\Build\bin\Debug 下有 worldserver.conf.dist 和 authserver.conf.dist 兩個檔案,分別是遊戲伺服器和認證伺服器的配置模板檔案。
  2. 複製一份 worldserver.conf.dist 並改名為 worldserver.conf ,配置遊戲伺服器

    LoginDatabaseInfo = "127.0.0.1;3306;root;trinity;auth"
    WorldDatabaseInfo = "127.0.0.1;3306;root;trinity;world"
    CharacterDatabaseInfo = "127.0.0.1;3306;root;trinity;characters"
    

    分別是認證資料庫、世界資料庫、玩家角色資料庫的地址, root 後面的 trinity 是 MySQL 中 root 的密碼,改成你在安裝 MySQL 時設定 root 密碼。

    之前生成了 vmap 檔案,這個是地圖的相關資料,伺服器可以根據這個來判斷怪物和玩家之間是否可見(是否有牆,是否在建築物的同一層上)。沒有這個的話,怪物會穿牆打你,或者從樓下直接漂上來打你... 伺服器配置這裡預設情況下是開啟 vmap 資料檢測的。如果不想開啟 vmap 檢測,則將下面這些配置的值改成0

    vmap.enableLOS = 1
    vmap.enableHeight = 1
    vmap.petLOS = 1
    vmap.enableIndoorCheck = 1
    DetectPosCollision = 1
    
  3. 複製一份 authserver.conf.dist 並改名為 authserver.conf ,配置認證伺服器

    LoginDatabaseInfo = "127.0.0.1;3306;root;trinity;auth"
    

    同樣,把 trinity 改成 MySQL 的 root 密碼。

  4. 檢查資料庫 auth 裡面 realmlist 表裡面的記錄,記錄中 port 的值應該和 worldserver.conf 裡面的 WorldServerPort = 8085 這一項的值一樣(這裡是8085)。同時, gamebuild 的值應該和你客戶端的版本號是一致的(登陸介面右下角,當前最新的是 13930)。如果realmlist裡面沒有記錄,則應該加一條。

修改客戶端配置

客戶端預設是去登陸官方伺服器,需要修改一下地址改成讓客戶端登陸我們自己架設的遊戲伺服器。假設魔獸世界客戶端安裝在 D:\WOW 下面,到 D:\WOW\Data\zhCN 下面,備份 realmlist.wtf 檔案。該檔案原來的內容是

    set realmList cn.logon.warcraftchina.com
    set patchlist cn.version.warcraftchina.com
    set realmlistbn ""
    set portal cn

將其內容改成

    SET realmlist "127.0.0.1"
    SET patchlist "127.0.0.1"

註冊使用者賬號

客戶端後登入會發現沒有賬號可用,註冊賬號的辦法有兩種:

  1. 第一種方法是通過SQL語句直接在資料庫裡面加

    INSERT INTO account
    (username, sha_pass_hash, email)
    VALUES
    ('使用者名稱',SHA1(CONCAT(UPPER('使用者名稱'),':',UPPER('密碼'))), '郵件地址')
    

    替換命令中的 使用者名稱、密碼、郵件地址 即可。

  2. 第二種方法最簡單,後面啟動遊戲伺服器worldserver之後,在這個命令視窗可以輸入GM命令:

    create account 使用者名稱 密碼
    

啟動遊戲

  1. 執行D:\Build\bin\Debug\authserver.exe
  2. 執行D:\Build\bin\Debug\worldserver.exe
  3. 執行客戶端wow.exe

如果運氣好的話... 反正我運氣不錯...

相關的可能還需要一些配置和改動,不過目前我的這個版本能夠正常執行,其它的未來再寫吧。在此之前,至少可以先研究下原始碼...

如何和朋友一起玩

如果想配個私服和朋友一起玩,那麼需要一個公網 IP 地址。機房裡面沒有伺服器沒有關係,可以搭在自己家裡的伺服器上,然後去 ip138 上查到自己的IP地址,把 127.0.0.1 相關的地址都改成自己的IP地址就可以了。如果是通過ADSL路由上的網,去ADSL路由配置裡面把自己的內外IP地址設定為DMZ主機地址開放給外網即可。

此外,如果是跑服務端的伺服器有花生殼的動態域名或者自己的域名(比如我的 http://log4think.com),可以將 127.0.0.1 改成自己的域名。前面在 wowserver 和 authserver 中的地址中配置的 127.0.0.1 都要改,因為服務端要提供這個地址給客戶端。 MySQL 相關的 127.0.0.1 地址不用改。非要改也可以,不過就是還得去配MySQL的外網訪問的相關安全設定。

同時,如果是要搭在公網上對外提供服務,建議單獨找個機器做 auth 伺服器(配置不用太好),不同的遊戲區跑在不同的伺服器上(這個配置要好一點),每個伺服器上都要跑worldserver。把伺服器列表加到 auth 資料庫裡面的 realmlist 表裡就是。

友情提示:提供公網服務小心被告。

相關的幾個小問題:

  1. 連線伺服器斷開的話,到這裡下個補丁覆蓋安裝。
  2. 登入後沒有伺服器列表的話,看看客戶端的版本號(登陸介面的右下角),然後把auth資料庫realmlist表裡面的記錄最後一項gamebuild改為看到的版本號(比如13930) 。

開發除錯

既然是從原始碼編譯的,因此如果中間出了任何問題都是可以通過除錯的方式去解決的。除錯方法很簡單,幾個簡單的手段 1. 抓包,分析資料記錄 2. 啟動編譯好的程式,開 Visual Studio ,附加到該程序上,下斷點跟蹤 3. 進入遊戲,進行操作,Visual Studio 中如果下了正確的斷點,就會在相關的位置停下

退而求其次

如果你覺得以上太複雜搞不定,如果只是想自己隨便玩一下而已,那麼可以下個別人做好的包,比如 TCCN-3.3.5-Trinity8400.exe ,安裝好啟動 web 伺服器和 wow 伺服器,註冊個賬號就可以進去玩了,簡單的無需解釋了。不過這個有人數限制,具體限制多少人我也不清楚,總之做公網服務是沒戲的。

參考資料

二者的一些相關網站列舉如下:

本站後續相關文章可以在 http://log4think.com/category/practice/fun/wow-trinity/ 找到

本文全文參考Trinity官方文件 http://www.trinitycore.info/How-to:Win