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

緣原由由

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

目前魔獸世界的私服比較流行的是MaNGOS和Trinity,兩者都是模擬魔獸世界服務端。MaNGOS「號稱」是一個研究型項目,目的是爲了學習大規模的C++項目開發,有道理,不過我不信。Trinity是基於MaNGOS的代碼開發的,之前主要是爲了合併用戶提交的補丁代碼而設立的一個項目,不過如今已經單獨獨立出來了,主要開發成員包括之前MaNGOS的一些老人,如今的主要工做包括清理代碼、優化、提供一個更好的服務端內核。html

兩者如今的代碼提交和更新都很頻繁,可是具體是否會合並對方的代碼就不清楚了。總而言之,也就是說,我感受Trinity大概也許應該是目前最好的一個魔獸世界服務端模擬了。做爲一個程序員來講,玩遊戲還在其次,看看代碼纔是件有意思的事情。整個過程記錄在案 http://log4think.com/setup_wow_private_server,以便過後查詢。mysql

如今嘗試一下從源碼開始搭個魔獸世界的服務器,從源碼開始主要仍是想順便看看代碼的狀況,基於Trinity來作。至於客戶端的狀況,截止到2011年6月12日,中國國服魔獸世界最新的版本是3.3.5 13930-巫妖王之怒。git

安裝基本工具

安裝以前,須要準備幾個要使用到的工具軟件,用來下載、編譯等等。程序員

**版本控制工具 Git ** 因爲 MaNGOS 和 Trinity 都是託管在 GitHub 上,因此得用 Git 才能下到源碼:github

編譯工具和庫:web

運行環境:sql

如下兩者按需選擇其一數據庫

如下非必需express

生成項目文件

各個工具都下載、安裝完畢(具體細節可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文件,內容爲

     
    1.  
      vmap3extractor.exe
    2.  
      md vmaps
    3.  
      vmap3assembler.exe Buildings vmaps
    4.  
       
    5.  
      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 ,配置遊戲服務器

     
    1.  
      LoginDatabaseInfo = "127.0.0.1;3306;root;trinity;auth"
    2.  
      WorldDatabaseInfo = "127.0.0.1;3306;root;trinity;world"
    3.  
      CharacterDatabaseInfo = "127.0.0.1;3306;root;trinity;characters"

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

    以前生成了 vmap 文件,這個是地圖的相關數據,服務器能夠根據這個來判斷怪物和玩家之間是否可見(是否有牆,是否在建築物的同一層上)。沒有這個的話,怪物會穿牆打你,或者從樓下直接漂上來打你... 服務器配置這裏默認狀況下是開啓 vmap 數據檢測的。若是不想開啓 vmap 檢測,則將下面這些配置的值改爲0

     
    1.  
      vmap.enableLOS = 1
    2.  
      vmap.enableHeight = 1
    3.  
      vmap.petLOS = 1
    4.  
      vmap.enableIndoorCheck = 1
    5.  
      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 文件。該文件原來的內容是

 
  1.  
    set realmList cn.logon.warcraftchina.com
  2.  
    set patchlist cn.version.warcraftchina.com
  3.  
    set realmlistbn ""
  4.  
    set portal cn

將其內容改爲

 
  1.  
    SET realmlist "127.0.0.1"
  2.  
    SET patchlist "127.0.0.1"

註冊用戶帳號

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

  1. 第一種方法是經過SQL語句直接在數據庫裏面加

     
    1.  
      INSERT INTO account
    2.  
      (username, sha_pass_hash, email)
    3.  
      VALUES
    4.  
      ('用戶名',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

相關文章
相關標籤/搜索