在一个无所事事的周末下午,忽然想起魔兽世界,官方的帐号好久没有上了,里面的大小号如今连满级都不是。之前曾经搭过传奇和星际争霸战网的私服自娱自乐,也据说过魔兽世界有开源的服务端模拟,既然兴致来了就小小的研究一下。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