魔兽世界私服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

相关文章
相关标签/搜索