首页 > 抖音笔记内容详情

TrinityCore,应用、学习 与 实践 2022-11-25 08:29:36 350

 王权没有永恒, WOW也是如此。自从部落与联盟并肩作战,共同抵抗燃烧军团的入侵已经过去了4  21 年,尽管成功的挽救了艾泽拉斯大陆,但网易与暴雪间脆弱的协议却早已荡然无存,如今,震天的战鼓再也无法响起。

11月16日暴雪娱乐发布声明称,由于同网易的现有授权协议将在2023年1月23日到期,将暂停在中国大陆市场的大部分暴雪游戏服务,包括《魔兽世界》《炉石传说》《守望先锋》《星际争霸》《魔兽争霸III:重置版》《暗黑破坏神III》和《风暴英雄》。《暗黑破坏神:不朽》的共同开发和发行则涉及两家公司另外的单独协议。

 

声明指出,双方没有达成符合暴雪运营原则和对玩家及员工承诺的续约协议,这些协议将于2023年1月到期。

暴雪

虽然有些遗憾,但与艾泽拉斯的告别也只是时间的问题。作为从九城时代一路走来的老玩家,从最初需要购买CDKey开始,到转为月卡计费方式为止,不知不觉已经过去了二十年有余。除了感叹国服玩家与WLK无缘之外,也让我切身感受到了时间的飞逝——C键的辉煌掩盖不了O键的暗淡,很多头像已经很多年没有亮起来过了。

虽然我们很可能再也无法通过战网进入到那个熟悉而又陌生的世界,那会不会存在其他手段帮我们与朋友们一同回忆起闷星星、羊大饼、冰方块、打骷髅的光辉岁月?

声明:本文及本文所有相关内容均为个人对 TrinityCore 的学习、测试使用,目的为分享一个运行 TrinityCore 项目的全过程,并非用于任何商业目的。同时本文也并非推广 TrinityCore 项目,本文作者与 TrinityCore 也不存在任何关联关系,也从未对项目代码有提交或者发起 ISSUE 或 PR。本文的全部内容,无论是标题、内容或是排版等,如被插入广告,均为微信的行为,如果因此收益并非作者出于商业目的所致。本文如设置打赏入口,也仅是针对项目的学习分享,而非借助其他个人或组织的品牌、知识产权等有形或无形资产谋取商业利益。如有侵权,请与告知,本文会及时删除。

01

TrinityCore

经过社区推荐,我们找到了一个开源项目,据项目介绍是一款大型 MMORPG 的游戏框架,可支持账号、角色、游戏等内容的运行托管。项目地址为:

https://github.com/TrinityCore/TrinityCore

我们先来看下来自一个开源项目的介绍。

TrinityCore is a MMORPG Framework based mostly in C++.

 

It is derived from MaNGOS, the Massive Network Game Object Server, and is based on the code of that project with extensive changes over time to optimize, improve and cleanup the codebase at the same time as improving the in-game mechanics and functionality.

https://github.com/TrinityCore/TrinityCore

本文假设读者具备基础的编程技巧,至少能够对 docker、linux 有初步的认知与操作能力。对于不会使用 docker 的研发小伙伴,强烈建议你去花半小时学一下,在应用运维的领域,你从零基础到大师级,中间仅仅只差这一个工具。

项目有两个主要的分支,一个为 master、一个为 3.3.5。后者对应的是某个大型MMORPG游戏比较稳定、热门的版本,本文也将以 3.3.5 这个分支为例,讲述一下完整的启动流程。

项目运行的最终形态为两个容器,其一是负责权限相关的 authserver,另一个是负责本体大部分功能的 worldserver。由于为了规避可能出现的法律风险,很多关键的过程在项目的 github 文档中并没有写的很明确,而本文会帮你补全这部分知识。

02

数据库

与大部分项目一样,TrinityCore 的运行也是依赖数据库的。但与大部分项目不一样的是,TrinityCore 会挑 MySQL 的版本,至少需要 5.7 以上才可以。而很多个人项目为了规避版权问题通常会使用的 MariaDB,很不幸的是会在版本检查时会被提示版本过低(5.5),即便是使用最新的 MariaDB 10.10.2 也是如此。考虑到项目会在数据库中建立 3 张表 —— auth、world、characters,如果你倾向使用的是 master 分支运行的话,还会额外需要一张 hotfixes。为了避免与我们自己的业务数据库掺杂,我们可以新建一个 MySQL 5.7 数据库实例

当然,使用 docker 仍然是最简单的方式。

# 请注意,下方配置均可任意更换,保证连接可达即可。
# 容器名称(db_trinity)
#  数据库目录(/var/trinity/db)
# 账号(trinity)、密码(trinity)、数据库ROOT密码(rO0t_P@ssw0rd)
#  开放端口号(33306)
docker run \  --detach \  
--name db_trinity \  
--volume /var/trinity/db:/var/lib/mysql \  
--env MYSQL_USER=trinity \  
--env MYSQL_PASSWORD=trinity \  
--env MYSQL_ROOT_PASSWORD=rO0t_P@ssw0rd \  
-p 33306:3306 \  mysql:5.7

关于 MySQL 镜像的相关配置,也可参考 dockerhub 中的说明。

在数据库安装完成后,可以以root身份远程登陆进去,校验连接是否可达,并创建数据库以及为账号授权

在 github 仓库中,创建数据库及账号授权都有指定的语句,读者可根据自己数据库的配置情况调整对应的SQL语句,这里只把默认的配置放出来。

源文件地址如下:

https://github.com/TrinityCore/TrinityCore/blob/3.3.5/sql/create/create_mysql.sql

CREATE USER 'trinity'@'localhost' IDENTIFIED BY 'trinity' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0;
GRANT USAGE ON * . * TO 'trinity'@'localhost';
CREATE DATABASE `world` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `characters` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `auth` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON `world` . * TO 'trinity'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `characters` . * TO 'trinity'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `auth` . * TO 'trinity'@'localhost' WITH GRANT OPTION;

如果读者是使用上述 docker 的方式创建的数据库,那么用户已经被提前创建了,所以无需再次创建,仅需更新语句中的账号信息后(即——将 'trinity'@'localhost' 改为 'trinity'@'%'),执行 CREATE DATABASE 及 GRANT 语句即可。如果愿意的话,这些操作也可以通过其他手段——如在数据库客户端界面中完成。

在数据库创建后,我们还需要导入项目初始的数据,但是这一步操作我强烈建议通过 worldserver 容器启动脚本自动完成,具体的步骤将会在后续给出,请读者记得这个事情,后面操作即可,但可以提前下载好数据文件。数据文件的地址为:

https://github.com/TrinityCore/TrinityCore/releases

对 github 有一定了解的小伙伴肯定知道,这是 releases / tags 目录,但需要注意的是,这里并不是无脑下载最上面,也就是最新的那个 Assets,务必要看准分支,正比如本文使用的都是 3.3.5 分支的内容,那么你在下载的时候,也要找 3.3.5 版本下最新的资源。截至目前,3.3.5 最新的 release 为:TDB 335.22101,要下载的文件名为:

TDB_full_world_335.22101_2022_10_17.7z,如果对 github 不熟悉的读者在未来下载时文件名变化了也没关系,记住这个规律即可。即使下载错了也不怕,worldserver 启动的时候会报错告诉你找不到这个文件,你再到 releases 页面找到对应的版本及文件下载即可。

03

地图数据

不知道是不是为了规避风险,这一点是 TrinityCore 项目中完全没提到该怎么操作的关键步骤,而且事实上这一步也是我们等待时间最久的一步。

我们需要先下载好与我们项目代码对应的客户端版本的游戏,如本文例子的话就是 3.3.5 (12340),由于可能涉及到的版权问题,而且能把文章看到这里的肯定也都是老司机,所以就不给出下载链接了。如果实在找不到的话,可以尝试百度,但强烈建议下载简体中文的官方原版,或者是“原汁原味”版本,经历过盒子世界前的老玩家应该明白我说的“原汁原味”是什么。

经历漫长的下载后,我们可以将整个游戏文件全部完整的复制一份到服务器上,比如放在服务器的 /var/trinity/game 这个目录下,为了防止读者不知道文件夹的目录层级,我再写明确一点点——就是你将全部文件拷过来之后,意味着你会拥有以下目录:

/var/trinity/game/Data、/var/trinity/game/Interface,且 Data 目录里会有 ***.MPQ 之类的数个文件。

在文件拷贝完成后,我们就要开始运行提取的动作了,而这一步我们可以通过 docker 容器完成。我们执行以下语句启动一个 TrinityCore 官方生成的容器,并在容器内运行 bash。

docker run -it \  
--entrypoint=/bin/bash \  
--volume=/var/trinity/game:/game \  
--name extractor \  trinitycore/trinitycore:3.3.5

由于是交互模式(-it),所以我们能够直接在容器内执行命令,我们仅需要分别依次执行以下几个步骤即可在 /var/trinity/game 目录下生成 dbc、maps、mmaps、vmaps 等目录。整体耗时约在半小时~两小时左右。

# 请注意,这里的语句都是在容器内执行的。
# 进入游戏目录cd /game# 再次强调:分别、依次执行以下每行语句,不要一次性全拷贝下来。
# 尤其是最后一步执行时间很长,根据电脑配置的不同可能需要 半小时~两小时之久。mapextractorvmap4extractormkdir vmapsvmap4assembler Buildings vmapsmmaps_generator

步骤全部结束后,可以通过输入 exit 及回车退出容器,根据自己的喜好,通过手动或脚本的形式将 dbc、maps、mmaps、vmaps 这几个目录全部复制到另一个目录中,作为游戏的地图数据,如——/var/trinity/data。请注意,这个目录很重要,后续我们启动 worldsrever 时会用得到。

04

AuthServer

其实在准备好数据库后就可以启动 AuthServer 了,只是没有必要,单独一个 authserver 没有任何作用。但现在我们即将开始正式启动后端服务,那么就可以准备开始了。

AuthServer 的运行依赖一个配置文件——authserver.conf,但 TrinityCore 也还是没有写明白,其实文件在项目的路径是:src/server/authserver/authserver.conf.dist

为统一管理配置,我们将文件拷贝并改名至:/var/trinity/authserver/conf/authserver.conf

由于正式使用的时候,需要更新 MySQL 的数据库链接,所以对 vi 使用不熟悉的读者也可以先在 windows 下改好,然后再上传至上述目录。

需要改的内容是:LoginDatabaseInfo,大约位于文件的 207 行,其默认设置如下:

LoginDatabaseInfo = "127.0.0.1;3306;trinity;trinity;auth"

我们将其改为如下

# 假设读者的宿主机IP为:192.168.50.123,开放的端口号是 33306
# 账号为:trinity_acc# 密码为:trinity_pwd
# 请根据自己的实际情况变更!
LoginDatabaseInfo = "192.168.50.123;33306;trinity_acc;trinity_pwd;auth"

然后我们执行以下命令启动 docker 容器(以 -it 或者 -d 模式皆可)

docker run -d \ --entrypoint=authserver \ 
--volume=/var/trinity/authserver/conf:/home/circleci/project/bin/check_install/etc \ 
-p=3724:3724 \ --name authserver \ trinitycore/trinitycore:3.3.5

如果使用 docker logs authserver 发现有报错,请按照报错指引相应做处理,如果是报一些 xxx table not exists 之类的错误,可以先不管,在 worldserver 启动成功后,使用 docker restart authserver 重启一下即可。

05

WorldServer

这个容器相当于是我们的游戏真正的服务端,由于我们所有准备工作皆已完成,所以最重要的工作也变得没有那么难。

与 AuthServer 一样,WorldServer 也需要一个配置——worldserver.conf,按照惯例,TrinityCore 也没有写明这个文件在什么地方,不过没关系,我可以告诉你:

src/server/worldserver/worldserver.conf.dist,我们使用与 AuthServer 相似的方法将文件拷出来,并修改 110-113 行的三处数据库链接即可。

# 假设读者的宿主机IP为:192.168.50.123,开放的端口号是 33306
# 账号为:trinity_acc# 密码为:trinity_pwd
# 请根据自己的实际情况变更!
LoginDatabaseInfo = "192.168.50.123;33306;trinity_acc;trinity_pwd;auth"
WorldDatabaseInfo = "192.168.50.123;33306;trinity_acc;trinity_pwd;world"
CharacterDatabaseInfo = "192.168.50.123;33306;trinity_acc;trinity_pwd;characters"

然后我们修改好的文件放置在下述位置:

/var/trinity/worldserver/conf/worldserver.conf

请注意,如果是首次启动,你还需要准备数据库的初始数据。没错,就是第一步数据库准备那个环节下载的文件:TDB_full_world_335.22101_2022_10_17.7z,我们将文件解压到下述地址:/var/trinity/TDB_full_world_335.22101_2022_10_17.sql

如果读者下载的文件名不一致,以你实际下载的为准,并相应地修改下方的配置。

如果你不是首次启动,那么在启动代码里则可以删除关于 .sql 文件的映射,请根据自己项目的实际情况来调整服务端语句。

docker run -it \ --entrypoint=worldserver \ 
--volume=/var/trinity/worldserver/conf:/home/circleci/project/bin/check_install/etc \
--volume=/var/trinity/TDB_full_world_335.22101_2022_10_17.sql:/home/circleci/TDB_full_world_335.22101_2022_10_17.sql \  
--volume=/var/trinity/data:/trinity/data \  
-p=8085:8085 \ 
--name worldserver \  trinitycore/trinitycore:3.3.5

如果是首次启动,我建议你选择 -it 交互模式启动,因为在执行结束后的 TC 控制台,你可以使用下面语句创建用户账号。

请注意,xxx 为你想要创建的账号,而 yyy 为密码,请根据实际需要替换。

TC> account create xxx yyy

截止到这一步为止,所有的服务端准备工作均已完成,如果中间任何一步有报错,可尝试根据日志处理,或私信与我联系寻求协助。

06

游戏客户端

如果不做任何改动直接登录游戏,你肯定会登录到官方服务器中去。我们还需要在本地的游戏目录中新增一个文件。假设你当前用的是 Windows 系统,那么创建一个 Launcher.bat 文件,并在里面写入以下内容:

假设读者的服务器(宿主机)地址为 192.168.50.123,游戏文件名为 xox.exe。

请根据实际情况修改下方 IP地址 与 start 命令后的可执行文件名。

echo y | rd /s "Cache"
echo SET realmlist "192.168.50.123" > Data\zhTW\realmlist.wtf
echo SET realmlist "192.168.50.123" > Data\enTW\realmlist.wtf
echo SET realmlist "192.168.50.123" > Data\zhCN\realmlist.wtf
echo SET realmlist "192.168.50.123" > Data\enCN\realmlist.wtf
echo SET realmlist "192.168.50.123" > Data\enUS\realmlist.wtf
echo SET realmlist "192.168.50.123" > realmlist.wtfstart xox.exegoto end

短暂地等待后,迎接你的是游戏画面。

当你开心的输入账户名密码之后,会看到服务器列表中赫然出现了 Trinity,当你兴奋的反复双击时,发现每次都会让你重新选择服务器,这是为什么?

TrinityCore 不会告诉你的是,你还需要在数据库的 auth.realmlist 表里将 address 和 localAddress 改为你的宿主机地址,比如是——192.168.50.123。当你完成修改后,再次点击服务器列表中的 Trinity——

怎么,自诩正义的圣光终于来了?我是不是该丢下霜之哀伤,恳求您的宽恕呢,弗丁?

让我来亲自告诉你。当一切结束,你将跪求我的宽恕--而我会拒绝你。你痛苦的哀号将是我狂野力量的最好证明……

我会让你活着目睹这个末日,弗丁。这悲惨的世界将在我手中重铸,我不想让圣光最强大的勇士错过这一切。

  • 勘误:上述第五步(WorldServer)中,关于 worldserver.conf 需要额外修改 DataDir 的内容为:/trinity/data,微信公众号不允许修改文章内容,请读者知悉。

 本文作者来源:星空online

相关标签: 游戏部署

发布评论