从零开始编译wow私服
自从魔兽世界开始转为月卡时,老高就基本AFK了。。。直到偶然听到歌单里的灰熊丘陵、风暴群山的BGM,又一次的手痒了,不过这次我们不冲点卡,我们以学习的态度搭建一个专属自己的魔兽世界服务器!
感谢TrinityCore项目,你们懂得!
说明
本文只针对3.3.5版本,master版本请参考官方文档。
老高的运行环境是 Debian 9,当然会docker的同学可以随意选择系统。 硬件配置
- i3
- 8g
- 200G ssd
编译TrinityCore是一个比较漫长的过程,需要投入一定的时间和精力才能完成!
安装步骤基本都是参考Installation Guide - TrinityCore - TrinityCore Collaboration Platform这个页面,英文水平好的同学可以直接参考。
关于版本
在TrinityCore中我们能看到master版本和3.3.5两个版本,他们有什么不同呢?其实很简单。
- master是最新的wow服务器版本,理论上可以用当前的国服的客户端直接登陆,只需要做一些轻微的改动,但是由于比较新的缘故,bug也会很多,而基本上每次bug修复都需要重新编译整个服务器,所以官方不推荐使用master分支的代码。
- 3.3.5 官方推荐版本,虽然BUGFiX的提交也不少,但是提交的基本都是SQL,所以稳妥起见还是老老实实用这个版本吧!
关于Windows系统
由于老高多余的服务器刚好跑了OMV,基于Debian9,所以就顺势用了这个机子。win上的编译可能会麻烦一些,如果有需求,后期再上教程!
准备工作
依赖安装
apt-get update
apt-get install git clang cmake make gcc g++ libmariadbclient-dev libssl-dev libbz2-dev libreadline-dev libncurses-dev libboost-all-dev mariadb-server p7zip default-libmysqlclient-dev
update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100
update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang 100
创建用户
用户名为wow
adduser wow
su - wow
约定目录
以下是老高的建议目录
# 以wow权限执行
su - wow
# TrinityCore 目录
mkdir /home/wow/TrinityCore
# 服务器目录,最终包含etc,bin,data三个子目录
mkdir /home/wow/server355
# 客户端目录
mkdir /home/wow/client
下载工作
既然是网络游戏,那就一定需要C端和S端,即客户端和服务器端,需要注意的是:
- 必须需要下载的必须是3.3.5(12340)的版本,其他版本可能会出现
无法验证游戏版本,这可能是由于档案已经被破坏或是其他
的问题,可能需要通过改源码重新编译的手段才能完成登录!所以一定不要下错版本了! - S端优先下载,下载完后先编译
S端
# 以wow用户执行
git clone -b 3.3.5 git://github.com/TrinityCore/TrinityCore.git /home/wow/TrinityCore
C端
客户端版本:3.3.5(12340)
- 客户端下载地址1(老高使用的版本): https://pan.baidu.com/s/1o8TkZOY 密码: kqcd
- 客户端下载地址2(待验证): https://pan.baidu.com/s/13C__Fm8_rkoqB6mu7dfz_Q
百度盘下载很慢,需要自己想办法,下载解压后,需要把完成后把文件上传到Linux服务器上,用于后续步骤。
编译服务端
权限建议: wow
编译期间可以先跳过提取客户端信息
,阅读准备数据库
章节!
cd /home/wow/TrinityCore
mkdir build
cd build
cmake ../ -DCMAKE_INSTALL_PREFIX=/home/wow/server355
# 此步骤可能时间比较长,可以用nohup或者screen执行
make -j $(nproc) install
# 终于,你编译好了服务端,胜利不远了!
编译完成后,/home/wow/server355目录下会出现 etc和bin目录
# ls /home/wow/server355/bin
-rwxr-xr-x 1 wow wow 25104168 Jul 26 00:17 authserver
-rwxr-xr-x 1 wow wow 3361976 Jul 26 00:17 mapextractor
-rwxr-xr-x 1 wow wow 19130160 Jul 26 00:17 mmaps_generator
-rwxr-xr-x 1 wow wow 10167776 Jul 26 00:17 vmap4assembler
-rwxr-xr-x 1 wow wow 8489448 Jul 26 00:17 vmap4extractor
-rwxr-xr-x 1 wow wow 587311088 Jul 26 00:36 worldserver
# ls /home/wow/server355/bin
-rw-r--r-- 1 wow wow 13K Jul 25 23:42 authserver.conf.dist
drwxr-xr-x 2 wow wow 156K Jul 27 00:15 maps
drwxr-xr-x 2 wow wow 132K Jul 27 00:15 mmaps
drwxr-xr-x 2 wow wow 536K Jul 27 00:15 vmaps
-rw-r--r-- 1 wow wow 133K Jul 26 00:16 worldserver.conf.dist
我们顺手把worldserver.conf.dist和authserver.conf.dist复制一份,然后修改worldserver.conf中 DataDir = "."
为 DataDir = "../data"
,修改方法在此不赘述,可以用vi命令,也可以在win下改好放上去。
cp /home/wow/server355/bin/worldserver.conf.dist worldserver.conf
cp /home/wow/server355/bin/authserver.conf.dist authserver.conf
提取客户端信息
权限建议: wow
此步骤依赖:
- 客户端文件
- 编译好的TrinityCore
DBC and Maps files
cd /home/wow/client
/home/wow/server355/bin/mapextractor
mkdir /home/wow/server355/data
cp -r dbc maps /home/wow/server355/data
Visual Maps (aka vmaps)
cd /home/wow/client
/home/wow/server355/bin/vmap4extractor
mkdir vmaps
/home/wow/server355/bin/vmap4assembler Buildings vmaps
cp -r vmaps /home/wow/server355/data
Movement Maps (aka mmaps)
cd /home/wow/client
mkdir mmaps
/home/wow/server355/bin/mmaps_generator
cp -r mmaps /home/wow/server355/data
好了,终于胜利就在前方!
准备数据库
数据库存放了游戏的各种信息,所以在启动服务器钱,我们需要把数据库搭建好!由于在依赖处理步骤中我们已经安装了mariadb-server
,所以现在我们只需要运行它即可!
此节需要root权限
运行数据库
systemctl enable mysql
systemctl restart mysql
如果没有报错,我们接着执行初始化脚本,这里我们需要为root用户提供一个密码,这里假设为 laogaoniubi
初始化
权限建议: root
mysql_secure_installation
# Enter current password for root (enter for none):
输入回车
# Change the root password? [Y/n]
Y
# 输入两次 laogaoniubi
# Remove anonymous users? [Y/n]
Y
# Disallow root login remotely? [Y/n]
# Y表示让root用户远程登录,N表示可以远程登录,老高推荐董数据库的同学选Y,觉得自己搞不定或者搞不懂的请选N
Y
Remove test database and access to it? [Y/n]
Y
Reload privilege tables now? [Y/n]
Y
至此,我们已经成功初始化数据库,并且成功将root用户的密码设置为laogaoniubi!
导入数据
第一步是把数据库建立起来,我们需要执行以下sql,sql的路径位于源码的TrinityCore/sql/create/create_mysql.sql
GRANT USAGE ON * . * TO 'trinity'@'localhost' IDENTIFIED BY 'trinity' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 ;
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;
执行方法参考:
# 登录 mysql后执行
source /home/wow/TrinityCore/sql/create/create_mysql.sql
至此,数据库初始化完毕
数据库你都能搞定,是个人才!要不要加个好友认识一下?
配置网络
让我们打开数据库auth
,查看一下表realmlist
,让我们把address
字段改为服务器的IP,老高的服务器IP为192.168.111.111
。
(`id`, `name`, `address`, `localAddress`, `localSubnetMask`, `port`, `icon`, `flag`, `timezone`, `allowedSecurityLevel`, `population`, `gamebuild`) VALUES ('1', 'Trinity', '192.168.111.116', '192.168.111.111', '255.255.255.0', '8085', '0', '0', '1', '0', '0', '12340');
最后的服务配置
权限: wow
不要急,胜利已经是你的了!
之前的准备工作在这一步汇总,到收获的季节了!
authserver
可以公开的情报:authserver即认证服务,我们登陆账户都是到这里认证后才会请求worldserver,也就是说authserver只有在登陆的时候才起作用,登录后这个进程就可以关闭了!
我们先运行authserver看看
/home/wow/server355/bin/authserver
# or
/home/wow/server355/bin/authserver -c /home/wow/server355/etc/authserver.conf
以下输出即为成功,很不错!
DatabasePool 'auth' opened successfully. 2 total connections running.
Started auth database connection pool.
Loading IP Location Database...
Added realm "Trinity" at 192.168.111.111:8085.
worldserver
/home/wow/server355/bin/worldserver
以下输出即为。。。什么!竟然又报错了!看来之前少下载了一个文件,名字叫TDB_full_world_335.19071_2019_07_15.sql
,这个文件在哪里下载呢?
下载下来的文件后缀为7z,我们需要先解压,得到sql文件后直接放在/home/wow/server355/bin/worldserver
的同级目录即可!
再一次,我们运行worldserver
,如果得到以下输出,那么恭喜你,你已经沐浴到胜利的阳光了!
World initialized in 0 minutes 8 seconds
TrinityCore rev. 7e10438b2759 2019-07-25 17:00:03 +0200 (3.3.5 branch) (Unix, RelWithDebInfo, Static) (worldserver-daemon) ready...
TC>TC>
添加账号
上一节我们终于进入了worldserver
,下面我们给我们的主角创建一个NO1的账号,使用以下命令格式
account create
World initialized in 0 minutes 8 seconds
TrinityCore rev. 7e10438b2759 2019-07-25 17:00:03 +0200 (3.3.5 branch) (Unix, RelWithDebInfo, Static) (worldserver-daemon) ready...
# 这里我们创建了一个用户名为test,密码也为test的账户
TC>TC> account create test test
# 紧接着我们把test账户升级为gm,豪嘛!这老NB了!
TC>TC> account set gmlevel test 3 -1
登录
让我们回到Windows的怀抱,跑到wow客户端下,把下面的代码保存为wow.bat并执行,别管360的提醒,直接允许。
echo y | rd /s "Cache"
echo SET realmlist "192.168.111.111" > Data\zhTW\realmlist.wtf
echo SET realmlist "192.168.111.111" > Data\enTW\realmlist.wtf
echo SET realmlist "192.168.111.111" > Data\zhCN\realmlist.wtf
echo SET realmlist "192.168.111.111" > Data\enCN\realmlist.wtf
echo SET realmlist "192.168.111.111" > Data\enUS\realmlist.wtf
echo SET realmlist "192.168.111.111" > realmlist.wtf
start Wow.exe
goto end
幽灵虎。。。
不好意思,這些指令有辦法在mac上執行嗎?
我自己是用mac系統,但沒有架設過server的經驗
謝謝
自己回自己一下
最新版的mac OS 12.6 可以build success
但舊版的10.14.6反而會失敗
會出現錯誤
不過目前還不知道要怎麼解
"_OSSL_PROVIDER_set_default_search_path", referenced from:
OpenSSLCrypto::threadsCleanup() in libcommon.a(OpenSSLCrypto.o)
"_OSSL_PROVIDER_unload", referenced from:
OpenSSLCrypto::threadsCleanup() in libcommon.a(OpenSSLCrypto.o)
"_OpenSSL_version", referenced from:
main::$_1::__invoke() in Main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
** BUILD FAILED **
The following build commands failed:
Ld build/src/server/authserver/Release/authserver normal x86_64
(1 failure)
可以用docker编译
楼主,我已经架设完毕,内网可以正常玩,外网开了3724和8085 登录时候用户名密码验证完毕,选了服务,然后就卡在“正在登录服务器” 这是还有端口没开么?应该怎么查找呀
我也一样啊,然后我在数据库里面把address改成0.0.0.0,登录倒很快,但选择服务器之后马上就没结果,还是选择服务器的界面
您好 我在執行 這兩行指令都出現以下訊息 請問哪裡出錯了
/home/wow/server355/bin/authserver
/home/wow/server355/bin/worldserver
Using configuration file /home/wow/server355/etc/authserver.conf.
Using SSL version: OpenSSL 1.1.1f 31 Mar 2020 (library: OpenSSL 1.1.1f 31 Mar 2020)
Using Boost version: 1.71.0
Automatic database updates are disabled for all databases!
Opening DatabasePool 'auth'. Asynchronous connections: 1, synchronous connections: 1.
Could not connect to MySQL database at 127.0.0.1: Access denied for user 'trinity'@'localhost' (using password: YES)
DatabasePool Login NOT opened. There were errors opening the MySQL connections. Check your SQLDriverLogFile for specific errors. Read wiki at http://www.trinitycore.info/display/tc/TrinityCore+Home
mysql连接配置有问题
您好,跟着您的教程一切顺利,但是到运行worldserver的步骤,提示 Syntax error: "(" unexpected,请问这是我编译时有问题吗?还是运行环境有问题
第几行?
数据库初始化后,只有三个空的库,库里没有表啊,我怎么去改库auth里的realmlist的address字段啊?
我参考 老高 和 极光飞羽@CCF 的教程,搞了一个master分支部署8.3.0.34220版本的服务的帖子,有兴趣的可以参考一下:
https://www.cnblogs.com/z16166/p/12927380.html
登陆成功后提示无法验证游戏的版本是什么回事。。。
你好,服务器需要开放那几个端口?
开放8085端口
我服务器都没有问题,启动都正常,客户端是 12340,
启动器:
echo y | rd /s "Cache"
echo SET realmlist "192.168.1.224" > Data\zhTW\realmlist.wtf
echo SET realmlist "192.168.1.224" > Data\enTW\realmlist.wtf
echo SET realmlist "192.168.1.224" > Data\zhCN\realmlist.wtf
echo SET realmlist "192.168.1.224" > Data\enCN\realmlist.wtf
echo SET realmlist "192.168.1.224" > Data\enUS\realmlist.wtf
echo SET realmlist "192.168.1.224" > realmlist.wtf
start Wow.exe
goto end
但是就是提示连接不上服务器
服务器安装在虚拟机里面,
老高,百度盘的解压密码是多少?
www.xspio.com
参考链接里面有
https://xspio.com/%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C%E5%AE%98%E6%96%B9%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%8B%E8%BD%BD
老高你好 ,我今天到了最后一步 下载了TDB_full_world_335.19071_2019_07_15.sql 运行worldserver 的时候还是报错了 报错内容是
Loaded 0 trinity strings. DB table `trinity_string` is empty. You have imported an incorrect database for more info search for TCE00003 on forum.
我该咋办,小白一个,Google 了很久,也不是很明白,最后一步卡在这里很难受,老高你知道咋办嘛
是不是版本没有对上?
是我傻了 打扰了 我看到了
那个解压密码是多少啊? 谢谢
请问百度盘下载的 World of Warcraft TW3.3.5(12340)免安装版,解压密码是啥啊,12340解不出来呢
您好,编译了Trinity Core之后,/etc和/bin文件夹下都没有maps那些东西,怎么办?
不在/etc和/bin,是相对目录的etc和bin,能理解吗?
还能这样要玩儿,厉害了!
很好玩,可以怀念下。
到了启动 worldserver 的那一步,提示:
缺少/home/wow/server355/data/dbc四个文件:
DestructibleModelData.dbc
PvpDifficulty.dbc
QuestXP.dbc
QuestFactionReward.dbc
请问怎么办?