在一個無所事事的週末下午,忽然想起魔獸世界,官方的帳號好久沒有上了,裏面的大小號如今連滿級都不是。之前曾經搭過傳奇和星際爭霸戰網的私服自娛自樂,也據說過魔獸世界有開源的服務端模擬,既然興致來了就小小的研究一下。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之,不贅述了),準備工做作完以後,開始下代碼編譯。
建一個目錄,譬如 D:\workspace\trinity
進入這個目錄,右鍵 Git Clone... ,Url那裏填入https://github.com/TrinityCore/TrinityCore.git
, 點OK。不喜歡圖形化工具的能夠直接進到新建的目錄裏面,命令行上運行 git clone https://github.com/TrinityCore/TrinityCore.git
。 會自動創建一個名爲 TrinityCore 的源碼目錄,而後就是等着代碼下完。
配置完成後,個人是這樣:
可能出現的問題: 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/ 。
注意如下幾點:
簡短截說:
用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 三個數據庫。
在D:\Build\bin\Debug下面建一個makevmaps3_simple.bat文件,內容爲
vmap3extractor.exe
md vmaps
vmap3assembler.exe Buildings vmaps
pause
保存運行,會從魔獸世界的客戶端目錄裏面解壓縮服務端須要的地圖出來。根據機器速度不一樣,大概須要20分鐘到一個小時的時間。運行結束的時候會給個提示"Press any key...",按任意鍵結束。生成 vmaps 和 buildings 目錄, buildings 目錄無用能夠刪除。
假設魔獸世界的客戶端目錄在 D:\WOW 下面,在 D:\Build\bin\Debug 下運行
mapextractor.exe -i "d:\WOW"
這樣會生成 maps 和 dbc 目錄。這個工具會根據客戶端的雨中在 dbc 目錄下生成不一樣的 dbc 語言版本。若是是中文的客戶端,會提取出中文的 dbc 數據。
複製一份 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
複製一份 authserver.conf.dist 並更名爲 authserver.conf ,配置認證服務器
LoginDatabaseInfo = "127.0.0.1;3306;root;trinity;auth"
一樣,把 trinity 改爲 MySQL 的 root 密碼。
檢查數據庫 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"
客戶端後登陸會發現沒有帳號可用,註冊帳號的辦法有兩種:
第一種方法是經過SQL語句直接在數據庫裏面加
INSERT INTO account
(username, sha_pass_hash, email)
VALUES
('用戶名',SHA1(CONCAT(UPPER('用戶名'),':',UPPER('密碼'))), '郵件地址')
替換命令中的 用戶名、密碼、郵件地址 便可。
第二種方法最簡單,後面啓動遊戲服務器worldserver以後,在這個命令窗口能夠輸入GM命令:
create account 用戶名 密碼
若是運氣好的話... 反正我運氣不錯...
相關的可能還須要一些配置和改動,不過目前個人這個版本可以正常運行,其它的將來再寫吧。在此以前,至少能夠先研究下源代碼...
若是想配個私服和朋友一塊兒玩,那麼須要一個公網 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. 啓動編譯好的程序,開 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