用开源软件TrinityCore在Debian 10上搭建魔兽世界8.3.0.34220的服务器
TrinityCore是魔兽世界(World of Warcraft)的开源的服务端。目前支持魔兽的3.3.5.12340版本(开源代码的3.3.5分支)、8.3.0.34220版本(开源代码的master分支)。其中对3.3.5的支持比较稳定;而对8.3.0版本的支持还很不完善,这个版本我搭完后进去逛了一下,测试了一下副本,结论基本上是:适合逛地图看风景,以及体验一下新坐骑。理由在后面。
官网有指南教如何安装3.3.5版本、8.3.0版本的服务端,但留下了少数几个坑。网上能搜到的也主要是如何编译安装3.3.5版本的服务端。本文主要把用master分支的TC搭建8.3.0版本服务端的注意事项列出来(重点是服务端的简体中文语言设置、第三方登录器),供踩坑时参考。具体的部署详细操作步骤可以参考官方文档,以及其他同好写的3.3.5的文档,如下:
平台选择
操作系统:Debian 10
官方指南中推荐用Debian 9,但官方论坛中明确写了预编译的二进制最低只支持Debian 10,而且根据网友“极光飞羽@CCF”的经验,Debian 9上有问题。所以我选择用Debian 10来搭建。
至于Ubuntu 20.04,官方指南中用sudo apt要安装的软件包和Debian略有差异,我的经验是:Ubuntu 20.04上mysql的dev库和mariadb的dev库有冲突,不要安装mariadb的dev库,而只安装mysql的dev库即可。其他和Debian基本一样。
Debian 10从哪里来?自己的虚拟机、真机,或者云上的虚拟机都可以,看是否要跨广域网和小伙伴一起玩。
内存大小
我试过1核1G内存的阿里云虚拟机是跑不了的,内存不足,进程被kill。所以最少要2G内存,推荐2核4G内存。我用的是2核8G的谷歌云,白piao的,晚上会有掉线情况。
硬盘剩余空间
硬盘的话,由于需要从魔兽客户端提取地图数据放到服务器上,所以有两种办法:
一种是在魔兽的客户端所在机器上提取好数据,压缩后上传到服务器。简体中文版客户端提取的全部数据是15G,压缩后是6G,加起来已经21G了,所以服务器最好有25G以上的剩余硬盘空间。
另一种是把魔兽的客户端传到服务器上,在服务器上直接提取。简体中文版客户端本身有50多G,加上提取出来的15G数据,最好有70G以上的剩余硬盘空间。
3.3.5.12340版本提取的数据压缩后是1个多G,比32440的要小很多。
由于这个地图数据很大,要做成docker的话,需要搞到一个下载服务器才行,因为要存放这些数据来提供给docker下载。
数据库:MariaDB或者MySQL 5.7
至于数据库,官方要求用mysql,但其SQL脚本实际上只兼容mysql 5,在mysql 8上会报错。MariaDB是从mysql 5分支出来的,所以也是可以的。我用的就是mariadb。
魔兽客户端:简体中文版8.3.0.34220
用简体中文的,自然是为了看文字舒服了。另外,台服的繁体中文版的版本号也不一样,要改一下realmlist数据表的字段。自行安装网易的官方客户端即可,安装完后,备份一下,因为有可能一不小心给升级到后续发布的更新的版本了。
8.3.0.34220版本和3.3.5版本部署的差异点
此处假定你已经仔细阅读过上面列出的参考文档的步骤了。所以这里不列出详细的操作步骤(其实是因为懒),而是只描述需要注意的点。
认证程序
34220版本的帐号认证程序是bnetserver,不是authserver。bnetserver用默认配置就行。官方文档有说。
数据库脚本
截至2020-05-20,34220版本的最新SQL脚本是TDB_full_820.19071_2019_07_15.7z。这个脚本解压后放到主程序worldserver的目录下,会被自动加载。
客户端地图数据提取
34220版本和3.3.5版本提取出来的地图数据略有不同,官方文档有说。这个提取步骤极为耗时,其中最耗时的vmaps、mmaps这两步实际上是可选的,我全部提取花了十多个小时。所以提取时尽可能不要用虚拟机、共享目录,而且CPU和硬盘越快越好。提取完之后可以备份一下,免得下次又要重新提取,除非提取程序后续进行了严重的bug修正。
服务器程序的语言设置
34220版本需要修改worldserver.conf中的DBC.Locale为4,即简体中文,不然worldserver程序跑不起来,报的错误是一堆*.db2地图文件找不到。这个坑是我搜了论坛,外加看代码搞定的。
用台服繁体客户端的,值改成5。
防火墙需要开放的端口
34220版本防火墙开放的端口为1119, 8081, 8085, 8086。官方文档有说,有些同好的经验帖子中没说,所以此处提一下。
设置帐号为GM权限
34220版本设置某个帐号为GM时,帐号的id需要从数据库auth的account表查询出来,比如全服第一个帐号的ID一般是1#1,设置其为GM的命令是:account set gmlevel 1#1 3 -1。官方文档有写。
汉化
服务端有数据需要汉化,比如任务描述,但由于master分支的版本基本上没人玩,所以有些任务描述没汉化。要搞汉化的话,需要处理world数据库中那些后缀名为_locale的数据表。
3.3.5版本倒是有人汉化,但理论上应该无法直接用到34220版本上。
魔兽客户端的登录器
34220版本需要用自定义的客户端登录器,有些人可能会卡在这一步。下载地址在这里。
下载8.3.x的,解压"Arctium WoW Client Launcher.exe"到网易官方魔兽客户端的"World of Warcraft Launcher.exe"所在目录下,
然后修改"World of Warcraft\_retail_\WTF\Config.wtf"这个文件中的SET portal "CN"为SET portal "xxx.xxx.xxx.xxx",其中xxx.xxx.xxx.xxx就是你的服务器外网IP。
如果"World of Warcraft\_retail_\WTF\Config.wtf"这个文件不存在,先运行一下网易官方的登录器就会生成这个文件。
最后运行"Arctium WoW Client Launcher.exe"可以登录服务器。
这个登录器最好也备份一下,免得回头下载不到了。
用screen避免SSH会话结束时worldserver、bnetserver进程被杀
screen是一个Linux工具,可以避免SSH会话结束时worldserver、bnetserver进程被杀,只要启动两个不同的screen会话,在这两个会话中分别运行worldserver、bnetserver进程即可。
用screen的目的,主要是为了保留worldserver的命令行GM操作界面、日志打印(当然也可以重定向到文件)。
screen相关的命令最好在相同的用户权限下执行,因为普通用户看不到root用户的screen会话。操作screen会话可以用其名称,也可以用给其自动分配的数字id。
安装screen:
sudo apt-get install screen
创建一个名为wow的screen新会话:
screen -dmS wow
列出全部的screen会话:
screen -ls
附加到已经存在的名为wow的screen会话:
screen -r wow
销毁名为wow的screen会话:
screen -XS wow quit
8.3.0.34220版本的成熟度评估
部署好服务器后,登录进去测试了一下,稳定性倒还可以,但是很多功能存在问题。具体来说如下:
- 同盟种族的角色无法创建,前提条件不满足。
- 副本里怪的触发和仇恨链接有问题,需要靠很近才能触发其攻击(也可能是网速或者服务器太慢),而且攻击其中一个,同组的其他怪不会触发仇恨。
- 大灾变、暮光审判这两个版本的部分地图和副本有怪物和NPC,但是不完整或者有bug。应该是从熊猫人之谜或者之后的某个版本开始的NPC、怪物、任务、副本数据都没加。熊猫人新手村有NPC,但无法交互,所以熊猫人做不了任务。
- 副本门的动态旋涡效果不明显,导致不熟悉的副本门不好找。
- 巫妖王副本中,和绿龙战斗时进入梦境门后看到不绿龙,无法加血,所以绿龙和后面的boss无法打。
- 火焰之地副本中没怪。
- 风神王座的风不能把人传到对岸,打不了。
- 红玉圣殿即使接了进门的任务也进不去副本。黑曜石圣殿没问题。
- 破碎群岛没NPC,做不了起飞的任务,只能用命令.gm fly on来直接打开飞行。
- 阿古斯要做任务才能进去,所以也进不去,估计只能用gm的指定坐标的命令强行去。
- 永恒之井说等级不达标,不让进。可能对装备等级有要求。但是法师的符文之缚套装的属性低得可怜。实际上高等级装备的等级都不对。
- 法师传送到暴风城有bug,会无限坠落然后死掉。当然,用.gm on命令可以免死。
- 黑石塔新团本进门后左手边没boss,右手边3个石头人有bug,所以整个本打不了。
- 有些装备用.add创建不了,比如装等很高的装备。
- 新手教程要在设置中关掉,要不一直在屏幕上不消失。
所以说master分支对应的这个版本还很不完善,只能玩玩其中包含的低版本的内容(那可能还不如部署个3.3.5版本玩),外带逛一下新版本的地图,骑一下新版本的坐骑。
用.gm fly on打开飞行,再用.modify speed fly 25修改飞行速度为25倍,就可以满世界看了。推荐用法师,因为开传送门方便,还有羽毛可以从山上飘下来。
GM命令
GM命令可以在主程序worldserver的窗口中输入执行。也可以在具有GM权限的玩家角色的聊天窗口中输入执行(特别是需要先选中目标再执行的命令)。
提一下:执行GM命令并不需要先执行.gm on,这个.gm on只是打开GM模式,也就是免死,让怪物不会攻击你、疲倦时不会掉无尽之海里挂掉,很多帖子对这个命令有误解。总之,帐号有GM权限就能随便执行GM命令,而无需先执行.gm on。
GM命令怎么获取:
一、可以在数据库world的command数据表中获得全部。
执行如下命令以root身份连接数据库:
sudo mysql
然后查表即可:
use world;
select * from command;
二、也可以看代码获得。
实现代码在src/server/scripts/Commands这目录下。
三、谷歌、百度搜索获得。
直接搜索常用的命令、技能、法术、物品,但搜到的相应id有可能在34220版本改过了,用34220版本提供的.lookup命令查询出新的id即可。此时体现出用简体中文客户端的好处了,不然你用繁体中文、英文搜搜试试。
当然,有些名字的翻译可能和服务端的不一致,就得自己谷歌解决有没其他的翻译文案了,比如去某些统计魔兽世界物品掉落的网站看看对应的boss掉落的那件装备的中文名字是什么。
有些坐骑不能直接用.lookup item命令按名字搜到。举个例子,坐骑“纯血火鹰”,上这里查一下,发现对应的触发物品实际上是“米拉盖佐尔的灼热之卵”,执行GM命令“.lookup item 灼热之卵”,得到id为69224,再执行“.add 69224”,背包里就有卵了。