TrinityCore服务端的初步认识

简述以TrinirtCore为基础的WOW服务端的结构、作用以及一些架设要点,不涉及源码编译。

  在之前的文章《云服务器搭建游戏服务器实战》中初步实现了对一般意义上的MMORPG的服务端搭建,但问题也很明显,就是服务端稳定性普遍不足。本次使用比较普遍的端核即TrinityCore,在不涉及源码编译的情况下(也就是直接使用别人编译好的端)进一步了解WOW服务端结构。相信这篇文章也适用于想了解WOW服务端工作原理的新手小白。因为本人也只是初学者,难免有认识错误的地方,本文也将在后续的学习中进行修正。

TrinityCore的官方wiki页面为:https://trinitycore.atlassian.net/wiki/spaces/tc/overview ,可查询具体细节问题;
TrinityCore的Github项目为:https://github.com/TrinityCore ,可于此找到项目源码及搜索各种issue。

什么是TrinityCore

  Trinity是基于MANGOS、SD2、UDB、ACID及其他各种补丁之上发展而来的一个MMORPG服务端项目,Trinity最著名的服务端是3.3.5a的WLK版本。多年来在TrinityCore的技术基础上诞生了很多自制端,可以说目前市面上能看到的很多私服都是基于Trinity的技术修改而来。

  Trinity本身发展较早,在网络上多年来拥有了相当多的衍生端,以及团队、社区、论坛、技术文件等,这使得Trinity端的各种问题解决起来都相对方便。本人测试过的Trinity 3.3.5 12340(TW)相当稳定,故十分推荐从Trinity 3.3.5开始学习WOW端的搭建,能少走很多弯路,且3.3.5可以说是WOW历史上公认的最经典的版本,也具有一定的收藏和娱乐价值。

  Trinity的端一般都需要安装VC++和OpenSSL的的运行环境,环境包一般都在下载的端里带的有,简述如下:

  1. 安装 vcredist_x86;
  2. 安装 Win32OpenSSL,路径默认到C盘,中途选择“The OpenSSL binaries”的选项;

TrinityCore的文件结构及说明

  Trinity的结构可以说是比较简单明了的,我这里简单用一个图来说明TrinityCore的文件结构:

  Trinity文件夹下应当存在两个主要文件夹,名称不一定,这里将其称为Server和Core。另外还最好存在一个名为JRC.exe的辅助工具,全名应为Jeutie’s Repack Restarter,它将worldserver、Authserver以及MySQL和Apache服务的启动停止功能集成在一个软件里,并可以快捷打开.conf配置文件,只要指定好路径以后就可以使用这些功能,是一个很方便的工具。

  回到Trinity本身,Server下主要是服务器的数据库与程序,其中MySQL集成了MySQL(至于版本,一般都是MySQL5)程序本体以及数据库,但是注意这里并没有带数据库管理工具,需要自行安装(我使用Navicat8,建立一个localhost3306就可以连接数据库了);Apache是一个Web服务器软件,用来提供一个可以自助注册的注册页面;剩下的php等文件是该注册页面的内容,如果在启动Apache后无法从127.0.0.1打开注册页面,多是因为缺少了注册页面的内容。

  Core下存在三类内容,maps、vmaps、mmaps、dbc、logs等文件夹;启动器和启动器配置文件;.dll文件。

  先说第一类,maps、vmaps、mmaps、dbc这四项内容是非常重要的,可以说这些内容直接决定了一个端的基本质量。这里很有必要详细说明各种文件的作用,而且强调一点,这四项都是一定要有的,否则根本没法正常使用,并非很多内容里说的除了maps都是“可选”;且就算服务端的确包含了这些地图数据,但在配置文件(worldserver.conf)里有可能默认禁用了vmaps等模组(其值为0),一定要将其全部启用(值改为1):
maps是世界的逻辑地图,各种坐标定位、坐标名称、传送关系等均靠maps实现,没有maps内容是绝对不行的。

vmaps(vector maps)是矢量地图,可以理解为是一种具有真实矢量关系的视觉地图,它控制地图的方向关系。若缺少mmaps则会出现野怪单位arggo(wow术语,即产生仇恨)离它们距离虽近,但实际上无法看到的地方(比如墙后、地下室等)的bug。

mmaps(movement maps)是移动地图,它控制行动路线上的关系,若缺少vmaps则会导致怪物穿墙杀向玩家,掉入虚空、单位一跳一跳踏空而行的典型bug。

dbc是一系列功能性内容,控制如成就、天赋、法术施放时间、地图势力范围等等众多功能性内容。网络上有一张表注明了dbc文件中各个文件的作用:

点此展开dbc具体内容

Achievement.dbc 记录了成就的详细内容–名字,描述等等 !
Achievement_Category.dbc 成就的分类[像:”经典旧世”、”任务”、”战场”、”荣誉击杀” 、”战斗、”消耗品”……等等]
Achievement_Criteria.dbc 记录了成就的达成要求
AnimationData.dbc 里面是各种行为、动作的镜头动作
AreaTable.dbc 地区表,记录了小地区的信息–名字、范围等[比如” 奈辛瓦里远征队营地”、” 莫格罗什要塞”等……] )
AreaTrigger.dbc 传送点坐标
AuctionHouse.dbc 拍卖行种类 )
BankBagSlotPrices.dbc 开银行栏位的价钱
BarberShopStyle.dbc 理发店能做的发型
BattlemasterList.dbc 战场、竞技场种类
Cfg_Categories.dbc 记录了WOW的各个服务大区[居然还有一到十区、网易的3.13果然很赶工]
由Char打头的dbc 记录了角色的脸型、发型、发色、肤色、特征[胡须、耳环]等包含的种类
CharSections.dbc 角色的各部位贴图文件
CharStartOutfit.dbc 出生时的装备
CharTitles.dbc 角色能获取的称号总类别ChatChannels.dbc 系统默认频道总类别
ChatProfanity.dbc 敏感字眼 开启过滤后会显示成****的那些词
ChrClasses.dbc 职业总类别
ChrRaces.dbc 所有种族[包括但不仅限于玩家]
CinematicCamera.dbc 每个种族出生的种族介绍的镜头[比如,你建了一个人类,背后就有一个家伙唠叨人类的起源、特长、特征等等,然后同时,镜头从暴风城一路飞到北郡,介绍完最后一句话,镜头刚到走到你身上,就是记录的这个玩意]
CreatureDisplayInfo.dbc和CreatureDisplayInfoExtra.dbc 两个记录了生物的ID、模型、贴图、装备等。这其中的关联要理清的话,要花很大的功夫。猫扑模型区有很详细的介绍
CreatureFamily.dbc 生物所属的类型[其实就是指野兽的分类,Family是野兽独有的属性,“生物”在这特指野兽]
CreatureModelData.dbc 生物模型信息
CreatureSoundData.dbc 生物语音路径
CreatureSpellData.dbc 生物的法术信息
CreatureType.dbc 生物类型[人型、亡灵、野兽、龙类……这种分类]
CurrencyCategory.dbc 货币的大分类
SCurrencyTypes.dbc 货币细类
SEmotes.dbc 表情动作的名字
EmotesText.dbc 表情动作的命令[/dance、/cry……]
EmotesTextData.dbc 表情动作的提示文字[一般分这几种:你看到的,A对B做了什么,A对自己做了什么,某人对你做了什么,你对某人做了什么,你对自己做了什么]
EmotesTextSound.dbc 做表情时发出什么样的声音
Exhaustion.dbc 玩家的休息状态及处于这种状态下的收益减益设定[精力充沛、正常、疲倦1、疲倦2、精疲力竭、战友招募]
Faction.dbc 记录了WOW里所有的阵营[名字,阵营ID等]
FactionGroup.dbc 阵营分类[玩家、联盟、部落、怪物]
FileData.dbc 开场动画的名字
GameObjectArtKit.dbc 旗杆[战场里,被联盟占下的旗,部落占下的旗,还有争夺中的旗,还有火焰节的那个旗……等等]
GameObjectDisplayInfo.dbc 游戏中的对象外观[对象就是WOW里的摆设啦等,比如一本魔法宝典,等]
GameTables.dbc 游戏公式表[比如,抗性的设定、升一级需要的经验、NPC魔法消耗倍数等。这个与游戏中各种各样的公式计算有关]
GameTips.dbc 角色登录的时候,Loading条上面的“小窍门” GMSurveyAnswers.dbc 、GMSurveyQuestions.dbc GM评价问卷的答案、题目 !
GMTicketCategory.dbc 联系GM时的问题分类
GroundEffectDoodad.dbc 地表模型
GroundEffectTexture.dbc 地表模型的材质贴图
gtBarberShopCostBase.dbc 理发店的价钱
HolidayDescriptions.dbc 节日描述
HolidayNames.dbc 节日名字、ID
Holidays.dbc 节日设定
Item.dbc 物品总汇
ItemBagFamily.dbc 物品可放入包裹[按包裹的属性,箭矢、灵魂碎片、附魔材料、矿物……]
ItemClass.dbc 物品种类[武器、护甲、配方、消耗品……在AH浏览时的那个分类就用的这个]
ItemCondExtCosts.dbc、ItemExtendedCost.dbc物品的售出与购回价
ItemDisplayInfo.dbc 物品外观
ItemGroupSounds.dbc 各类物品的声音
ItemPetFood.dbc 宠物食物总类别
ItemRandomProperties.dbc 物品的随机属性[灵猴之、孤狼之、雄鹰之……]
ItemRandomSuffix.dbc 随机属性的加成方法
ItemSet.dbc 套装总汇
ItemSubClass.dbc 物品子类[容器、灵魂袋、法杖、红色、多彩……AH的子类搜索就是用的这个分类]
ItemVisualEffects.dbc 视觉特效
Languages.dbc WOW中的语言[达纳苏斯语、侏儒二进制语等]
LanguageWords.dbc 不同语言的字符映射
LFGDungeons.dbc 组队功能中的地下城、地下城的等级范围、ID
LightSkybox.dbc 天空模型
LiquidMaterial.dbc 流体的材质[猜测是岩浆、普通水、烫水……这种分类]
LiquidType.dbc 不同类型的流体的贴图
LoadingScreens.dbc 切换场景时的Loading画面路径
LoadingScreenTaxiSplines.dbc 乘坐飞艇和船时的航线图
Lock.dbc 锁的位置
LockType.dbc 箱子的类型 MailTemplate.dbc 邮件模板[NPC经常会寄信给你,这个dbc就管的这个信的内容]
Map.dbc 大地图区域
Movie.dbc 开场电影怎么放[先来个BLZ的LOGO,再来一段正式CG]
NameGen.dbc 名字不能包含的字符(提示为已注册?)
NamesProfanity.dbc 名字禁止包含的字符
NamesReserved.dbc 名字已存在
NPCSounds.dbc NPC声音文件
PageTextMaterial.dbc
PaperDollItemFrame.dbc 装备栏贴图
ParticleColor.dbc 粒子颜色(可能是各个场合的粒子外观)
PetitionType.dbc 签名表[包括公会、战队]
QuestInfo.dbc 任务难度[地下城、组队、团队、PVP、团队-10、团队-20,这个在任务名的后面有一个括号会说明]
QuestSort.dbc 任务归类[季节性、法师、猎人、制皮……等]
Resistances.dbc 抗性分类
ServerMessages.dbc 服务器提示消息[还有多少时间关机啦、多少时间重启什么的]
SkillCostsData.dbc 法术的消耗需求
SkillLine.dbc 技能面板技能总类别[快键 K]
SkillLineAbility.dbc 技能面板上的技能熟练度
SkillLineCategory.dbc 技能大类
SoundEntries.dbc 声音文件的入口[详细定义了每一个”引用”]
SoundProviderPreferences.dbc 同类场景的引用[比如,冬泉谷和丹莫罗的音乐都是MOUNTAINS]
SoundWaterType.dbc 各类”水”的声音
SpamMessages.dbc “乱码”的转换方法
Spell.dbc 技能定义[最大的dbc文档!!!]
SpellCastTimes.dbc 施法时间分类
SpellDispelType.dbc 法术类型[诅咒、魔法、疾病……]
SpellFocusObject.dbc 技能施放对象[object,一般是指游戏内的对象]
SpellIcon.dbc 技能-图标对应
SpellItemEnchantment.dbc “使用”类物品提供的效果
SpellMechanic.dbc 技能命中的效果[被魅惑、被缴械、被变形、流血、瘫痪……]
SpellMissileMotion.dbc 技能算法
SpellRange.dbc 技能距离、范围
SpellShapeshiftForm.dbc 各种形态……
SpellVisualEffectName.dbc 技能外观模型
Startup_Strings.dbc WOW.exe的提示字符串
Talent.dbc 天赋总汇
TalentTab.dbc 天赋系别
TaxiNodes.dbc 出租车节点
TaxiPath.dbc 节点对应的行走路径
TaxiPathNode.dbc 节点坐标
TerrainType.dbc 地区类型[比如 山、平原、干地等]
TerrainTypeSounds.dbc 各种地区类型对应的音乐
TotemCategory.dbc 工具分类[指”需要XX物品”的情况下,被需求的物品
WeaponImpactSounds.dbc 武器攻击声效
WeaponSwingSounds2.dbc 武器挥舞声效
Weather.dbc 天气配置
WMOAreaTable.dbc “小地区”表
WorldMapArea.dbc 地图区域划分
WorldStateUI.dbc 区域内战斗提示[麦迪文的剩余护盾:X%;部落控制了内城区!]
WowError_Strings.dbc WOW出错界面及错误报告界面字符
ZoneIntroMusicTable.dbc 地区介绍音乐[这个音乐作为IntroMusic一般是主题性质的音乐]
ZoneMusic.dbc 地区音乐

  有必要说明,这些内容即使缺失服务端仍能运行起来,但结果可想而知。这也就是为什么网络上能找到的很多野生端bug奇多,因为很多野生端都没有包含vmaps、mmaps等文件。vmaps、mmaps等文件的获取难点在于它们和服务端及客户端版本是严格对应的,若做不到版本的严格对应则无法使用其文件。一般来说它们可以从对应的客户端进行手动提取,这里需要用到地图数据提取工具,这些工具一般都是直接从服务端源码里直接编译出来的,因本文不涉及源码编译工作,所以需要从其他途径获取,它们通常如下:

1
2
3
4
mapextractor.exe
mmaps_generator.exe
vmap4assembler.exe
vmap4extractor.exe

  将这几个文件放置在客户端根目录(和wow.exe一个目录)运行即可生成出对应的文件夹,然后将这些文件夹置于服务器目录即可。经测试不同的版本的extractor无法互通。老实说这部分问题贼多,通常我认为,自己手动提取的文件(前提是有效)是最好的,但不能保证自己提取的文件就和服务端完全适配,因为网上下载的那些客户端也是有可能出这样那样的问题的。实在不行的话还是考虑在服务端提供方那里弄到对应的文件,一般也都会有的。

  再下来是启动器和配置文件,Authserver主要控制和账户、登录、服务器相关的功能,而worldserver主要控制和游戏具体内容相关的功能,如常用的经验倍率、掉落倍率等等,其实.conf里已经写的很明白了,读一遍就能解决很多问题。这里我们最关心的是端口、IP地址、数据库名和数据库密码。首先是端口,Trinity的端通常会使用这些端口,确保这些端口不被占用:

1
2
3
4
5
6
80 //Apache服务的端口,运行Apache注册页面网站所需
3306 // MySQL的端口,必需,否则无法连接数据库
3343 // 远程连接的端口,必需
7878 // 简单对象访问协议的默认端口
3724 // wow服务器列表中默认服务器(realm)的端口,必需。我们默认这里只有一个realm
8085 // 世界服务器端口,必需

  这里简述一下如何查看哪个服务占用了哪个端口:CMD>键入netstat -ano>回车>看到本地地址列中地址的最后一个数即是端口名,找到其对应的PID,然后在任务管理器中的服务中找到该PID对应的服务即可。

  Trinity下,IP地址、数据库名和数据库密码通常不需要修改,即使是架设在远程服务器上,也只需用Navicat8修改数据库中auth下realmlist中的两个ip地址(address和localaddress)为服务器公网IP地址即可,服务端配置文件中均使用127.0.0.1。不过如果你的端是自行组装的话,这些内容有可能是需要自定义的。

  接下来是三个.dll文件,这些dll文件控制启动器程序和数据库的连接,因为版本和运行环境的原因很容易出问题,上面说到,服务端安装包中一般都带有服务端运行环境(vcredist_x86和OpenSSL),确保运行环境已经被正确安装后,启动服务端(authserver或worldserver)若报错(无法启动程序等错误)或显示缺少 libeay32.dll、ssleay32.dll,,考虑手动提取,在C:\OpenSSL-Win32\bin 中复制 libeay32.dll 和 ssleay32.dll,到服务端文件夹中(即authserver和worldserver所在的文件夹),通常即可解决问题。

  若出现缺少msvcr.dll(及形如此类的.dll)的情况,显示错误为:

1
2
无法启动此程序,因为计算机中丢失MSVCR100.dll。尝试重新安装该程序以解决问题
无法启动此程序,因为计算机中丢失MSVCP100.dll。尝试重新安装该程序以解决问题

  若安装包中没有提供,建议从网上下载或直接从别的机器复制对应的.dll到服务器/本机,对windows系统进行补全。若是32位系统,dll放在:WindowsSystem32;若是64位系统需要放两个dll文件,一个32位,一个64位(下面两个一定要看仔细,反的):32位dll放在:WindowsSysWOW64, 64位dll放在:WindowsSystem32

  若设备缺少zlib1.dll和bzip2.dll,采取和上述同样的方式对设备进行补全。

有关TrinityCore的文件结构差不多就到这里了。

Trinity端的启动

  通常来说我们首先需要启动数据库,也就是MySQL服务,确保数据库相关的服务上线运行后才能进行数据库管理,以及开启authserver和worldserver。因为Trinity的MySQL程序是自带的,启动前应确保设备上没有其他相关的MySQL服务运行,否则有可能因为这些数据库服务都使用3306端口而引发端口冲突。在之前的测试中发现,冲突后旧的localhost_3306会连不上,报出denied错误,这时通常右键断线数据库再连接即可解决。

  一般情况下不建议将Trinity自带的MySQL端口改成3307或其他值,因为需要修改的地方实在太多,各种配置文件里也都需要修改,难免出现问题,除非需要运行多个WOW数据库内容。一般来说将数据库都集成到3306即可。在之前的测试中合并了一个Maplestory079的数据库,二者都能正常运行。

  如果需要使用注册信息的页面则需要启动Apache服务,本机的话从127.0.0.1即可进入注册页面。如果服务端在服务器上的话,将地址改为公网IP地址即可,或者如果拥有服务器域名的话也是可以通过域名进入的。

  启动数据库后依次启动authserver和worldserver,注意其是否报错。worldserver启动完毕通常需要30s左右的时间。

  数据库、authserver和worldserver都启动完毕后即可运行客户端,客户端运行中也留意一下Worldserver是不是会继续报错,通常worldserver多多少少都会报出一点问题,出现非致命问题一般来说是可以忽略的,只要不闪退或出现严重刷屏的错误就行。

关于修改角色的名称、种族、职业、性别、外观等固有数据

  相信玩过一段时间GM权限账号后,我们应该都知道如何通过GM命令给自己角色加钱加装备等常规操作。其实理论上讲任何角色都是可以直接在数据库中修改的,难点在于数据库内的数据记录方式可能不太好懂,某些数据可能是以二进制或者是某种算法结果的形式存在,造成了修改的困难性。

  这里将角色的名称、种族、职业、性别、外观等数据称为角色的“固有数据”,因为这些内容在正常游戏中通常是不会改动的。如果我们这里的服务端是老版本的话,要想修改这些数据只能从数据库里改。这里说点题外话,从WOW发展历史来看,随着版本更新,玩家对这些“固有数据”的修改权限也是在一步步扩大的。从没有理发店的60版本到80版本开设理发店可以修改发型,再到更晚的版本里可以更改脸型,听说现在9.0当下的理发店已经能变性了…花一点金币就能从白色精灵男秒变黑色精灵妹,可以说Blizzard的这些动作也算是这几年老美在种族、LGBT等问题上的一个很直观的反映。以前不能改这些东西的时候,这些通常是一项收费项目,无论是国服还是外服基本要花大概10-15$。

这里列一下我掌握的修改方法。

  这些角色固有数据均存在于Char的character表中,name为名称,修改name可直接改名,但注意不要使用服务端不支持的字符。gender栏目为性别ID,gender=0则为男性,gender=1为女性,修改这个项目可以直接变性。

race为种族ID,修改这项将改变种族。不同种族对应的ID为(不包含后续版本的同盟种族等):

ID Value Name
1 1 Human
2 2 Orc
3 4 Drawf
4 8 Night Elf
5 16 Undead
6 32 Tauren
7 64 Gnome
8 128 Troll
9 256 Goblin (4.x)
10 512 Blood Elf
11 1024 Draenei
12 2048 Fel Orc
13 4096 Naga
14 8192 Broken
15 16384 Skeleton
16 32768 Vrykul
17 65536 Tuskarr
18 131072 Forest Troll
19 262144 Taunka
20 524288 Northrend Skeleton
21 1048576 Ice Troll
22 2097152 Worgen (4.x)
24 8388608 Pandaren Neutral (5.x)
25 16777216 Pandaren Alliance (5.x)
26 33554432 Pandaren Horde (5.x)

(注:本表由Trinitycore官方页面提供,如果是旧版本的话只用前面的内容即可,为什么ID没有23号?我也不清楚..)


class栏目为职业的ID,修改这项将改变职业。不同职业对应的ID为:

ID class
1 Warrior
2 Paladin
3 Hunter
4 Rogue
5 Priest
6 Death Knight
7 Shaman
8 Mage
9 Warlock
10 Monk
11 Druid
12 Demon Hunter

  外观选项由playerBytes和playerBytes2控制。playerBytes控制肤色、脸型、发型、发色,playerBytes2则是角色的“特征”,也就是老版本中我们在建立角色时能修改的第五项内容,这项具体是什么根据种族和性别有所变化:如男性人类是改变胡须,女性人类则是改变耳环,女性暗夜精灵是改变面纹,等。

  playerBytes和playerBytes2似乎使用取余数的算法来记录数据,总之我很难看懂,而且我们也不清楚到底哪个脸型和特征对应了哪个数值,所以靠谱的办法是直接以修改目标新建一个模板角色,再从character中找到该新角色,复制它的playerBytes和playerBytes2数值覆盖到我们想要修改的旧角色即可,实现人脸“克隆”,然后再在游戏中将模板角色删除。

(4.3.4)问题解决 - “无法传输所需的压缩数据”

  Trinity 4.3.4版本中,若打开wow.exe出现:无法传输所需的压缩数据,请检查网络连接。(英文为 cannot stream required archive data. please check the network connection.)的框,一般是客户端根目录的WoW.mfil出了问题,这个文件只有1kB,和能正常工作的文件只有内容上的区别。其内容为:

1
2
3
4
version=2
server=limelight
location=http://cdn.twinstar-wow.com/15050.direct/
manifest_partial=wow-15595-0C3502F50D17376754B9E9CB0109F4C5.mfil

所以我们可以将其编辑为:

1
2
3
4
5
6
version=2
server=limelight
location=http://blizzard.vo.llnwd.net/o16/content/wow-pod-retail/EU/15050.direct/
server=akamai
location=http://ak.worldofwarcraft.com.edgesuite.net/wow-pod-retail/EU/15050.direct/
manifest_partial=wow-15595-0C3502F50D17376754B9E9CB0109F4C5.mfil

并关掉网络代理程序,则可以解决问题。或手头有能正常工作的客户端的话,直接复制过来也行。

  • 版权声明: 本博客所有文章著作权归作者所有,禁止任何形式的转载。
  • Copyrights © 2019-2024 Caelica

请我喝杯咖啡吧~