魔兽世界私服研究手札

romandion 2009-09-21 01:43:52
前端时间发表了篇关于《单一世界架构初探》的系列文章,争论颇多,很多人持怀疑态度,这也很正常,于是就萌生将理论付诸实践的想法。最终选了魔兽世界私服T端作为研究对象。经过1个月的努力,终于初步建立了实验性私服,QQ群32285689。有兴趣的可以加入这个群玩玩看。下面逐步发表些关于T端的研究手记。事实甚于雄辩,欢迎大家拍砖。
...全文
3032 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
LDingShu 2011-09-05
  • 打赏
  • 举报
回复
为什么我在进行数据库升级时,已经升级到这个文件398_corepatch_mangos_11065_to_11156.sql;在进行这个文件399_corepatch_mangos_11157_to_11242.sql升级时报一下错误:Unknown column 'required_11117_01_mangos_world_template' in 'db_version';是不是在升级这个文件之前还有一个文件呢???
董小尾 2010-11-25
  • 打赏
  • 举报
回复
楼主威武……
romandion 2009-11-13
  • 打赏
  • 举报
回复
这篇帖子内容挺长的,我准备发在自己的博客,欢迎大家查阅。
romandion 2009-11-12
  • 打赏
  • 举报
回复
魔兽世界私服trinitycore2的架构(8)

在T端中,是由数据库保存终端的显示信息,比如物品的名称。默认情况下,他们是enUS英文的。不过,我们需要将他们修改为中文模式。在芒果以及国内比较著名的私服中,都是直接在原地修改的,我原来也是。不过后来发现这样很容易出错,所以仔细研究了下T端的初始化过程,发现了很多有趣的事情。下面,我们先描述下这个过程:

1、客户端在登录认证的时候,会提供一个国家代号,uint8[4],比如:

enUS=0, koKR=1,frFR=2,deDE=3,zhCN=4,zhTW=5,esES=6,esMX=7,ruRU=8

2、认证成功之后,这个国家代号,如中国大陆为“zhCN”,会被转化为代码4保存在realmd.account的locale字段中。同时,会话也会记录这个代码【4】 。

3、以任务为例,当玩家打开任务列表时,任务的ID和标题会被加载进来,T端判断当前的国家代码,如果非enUS的,会根据id检索国际化map,检索出相应的标题。然后返回给客户端。

上面我们看到了,在T端,实际上英文和国际化文字在数据库中是同时存在的,那么,他们是如何存储的呢?在M端和T端中,都有这么几个表:

1、locales_achievement_reward

2、locales_creature

3、locales_gameobject

4、locales_item

5、locales_npc_option

6、locales_npc_text

7、locales_page_text

8、locales_points_of_interest

9、locales_quest

以生物【creature】为例,locales_creature有这么几个字段:

1、entry

2、name_loc1 ... name_loc8

3、subname_loc1 ... subname_loc8

其他几个也一样,他的结构总是为key + [fieldname]_loc[locale_code] 。key就是这个表的关键字,fieldname就是需要国际化的字段,locale_code是个列表,固定从1...8。和 locales_creature相对应的是creature_template表,这个定义表明,creature_template表中 name/subname两个字段需要国际化。我们中国大陆的代码是4,所以,只要填写name_loc4和subname_loc4就行了。

从locales_XXXX总结下需要汉化的每个表的字段如下:

1、achievement_reward [entry + subject + text]

2、creature_template [entry + name + subname]

3、gameobject_template [entry + name + castbarcaption]

4、item_template [entry + name + description]

5、npc_option [entry + option + box_text]

6、npc_text [entry + text0_0 + text0_1 + text1_0 + text1_1 + text2_0 + text2_1 + text3_0 + text3_1 +

text4_0 + text4_1 + text5_0 + text5_1 + text6_0 + text6_1 + text7_0 + text7_1]

7、page_text[entry + text]

8、points_of_interest [entry + icon_name]

9、quest_template[entry + title + details + objectives + offerrewardtext + requestitemtext + endtext +

objectivetext1 + objectivetext2 + objectivetext3 + objectivetext4]

嗯,终于把这个机制写好了。下面就是怎么汉化的问题。有个很多网站提供魔兽世界的翻译信息,比如多玩或者艾泽拉斯地理以及178等。

假如有个物品,编号编号[entry]是[44444],那么你连接【http://db.178.com/wow/cn/item /44444.html】,可以看到这是【黑暗蛛魔胸甲】,在网上看到个方法是这样的:【http://db.178.com/wow/cn/a /item/44444.js】,他会返回这样的内容

view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

1. $178DB.regstItem({id:44444,icon:'inv_chest_chain_13',tip:'<table width="100%"& gt;<tr><td><h2 class="q3">< a href="http://wowdb.178.com/cn/item/44444.html" mce_href="http: //wowdb.178.com/cn/item/44444.html" rel="no">黑暗蛛魔胸甲</a></h2& gt; 装备后绑定<br /><table width="100%"><tr><td>胸部& lt;/td><th> 锁甲</th></tr></table>1089 护甲<br /><span>+ 64 耐力</span><br /><span>+ 59 智力</span><br/><!--e-->耐久度 120 /120<br />需要 等級 76<br /></td></tr>< /table><table width="100%"><tr><td>< span class="q2">装备:法术强度提高70点。</span><br/>< span class="q2">装备:爆击等级提高34。</span><small class="q0"& gt;(0.74% @lv80)</small><br/></td></tr>< /table><br /><span class="q"><a href="/wow/cn/itemset /755.html" mce_href="wow/cn/itemset/755.html">蛛魔之巢</a> (0/8) & lt;/span><br /><spen class="itemsets"><a href="/wow/cn /item/38418.html" mce_href="wow/cn/item/38418.html" class="q0" rel="no"& gt;蛛魔腰带</a><br/><a href="/wow/cn/item /38419.html" mce_href="wow/cn/item/38419.html" class="q0" rel="no">蛛魔长靴</a><br/><a href="/wow/cn/item /38420.html" mce_href="wow/cn/item/38420.html" class="q0" rel="no">蛛魔胸甲</a><br/><a href="/wow/cn/item /38421.html" mce_href="wow/cn/item/38421.html" class="q0" rel="no">蛛魔手套</a><br/><a href="/wow/cn/item /38422.html" mce_href="wow/cn/item/38422.html" class="q0" rel="no">蛛魔护腿</a><br/><a href="/wow/cn/item /38417.html" mce_href="wow/cn/item/38417.html" class="q0" rel="no">蛛魔护肩</a><br/><a href="/wow/cn/item /38439.html" mce_href="wow/cn/item/38439.html" class="q0" rel="no">蛛魔头盔</a><br/><a href="/wow/cn/item /38435.html" mce_href="wow/cn/item/38435.html" class="q0" rel="no">蛛魔护腕</a><br/></span><br /><span class="q0"& gt;(2) <a href="/wow/cn/spell/51262.html" mce_href="wow/cn/spell /51262.html">使你的命中等级提高15。</a>< /span><br /><span class="q0">(4) <a href="/wow/cn /spell/51263.html" mce_href="wow/cn/spell/51263.html">使你的耐力值提高25点。& lt;/a></span><br /><span class="q7">物品等級: 171< /span><br /><span class="money_g">7</span><span class="money_s">25</span><span class="money_c">26</span>'});

$178DB.regstItem({id:44444,icon:'inv_chest_chain_13',tip:'<table width="100%"><tr><td><h2 class="q3"><a href="http://wowdb.178.com/cn/item/44444.html" mce_href="http://wowdb.178.com/cn/item/44444.html" rel="no">黑暗蛛魔胸甲</a></h2> 装备后绑定<br /><table width="100%"><tr><td>胸部</td><th> 锁甲</th></tr></table>1089 护甲<br /><span>+ 64 耐力</span><br/><span>+ 59 智力</span><br/><!--e-->耐久度 120/120<br />需要 等級 76<br /></td></tr></table><table width="100%"><tr><td><span class="q2">装备:法术强度提高70点。</span><br/><span class="q2">装备:爆击等级提高34。</span><small class="q0">(0.74% @lv80)</small><br/></td></tr></table><br /><span class="q"><a href="/wow/cn/itemset/755.html" mce_href="wow/cn/itemset/755.html">蛛魔之巢</a> (0/8) </span><br /><spen class="itemsets"><a href="/wow/cn/item/38418.html" mce_href="wow/cn/item/38418.html" class="q0" rel="no">蛛魔腰带</a><br/><a href="/wow/cn/item/38419.html" mce_href="wow/cn/item/38419.html" class="q0" rel="no">蛛魔长靴</a><br/><a href="/wow/cn/item/38420.html" mce_href="wow/cn/item/38420.html" class="q0" rel="no">蛛魔胸甲</a><br/><a href="/wow/cn/item/38421.html" mce_href="wow/cn/item/38421.html" class="q0" rel="no">蛛魔手套</a><br/><a href="/wow/cn/item/38422.html" mce_href="wow/cn/item/38422.html" class="q0" rel="no">蛛魔护腿</a><br/><a href="/wow/cn/item/38417.html" mce_href="wow/cn/item/38417.html" class="q0" rel="no">蛛魔护肩</a><br/><a href="/wow/cn/item/38439.html" mce_href="wow/cn/item/38439.html" class="q0" rel="no">蛛魔头盔</a><br/><a href="/wow/cn/item/38435.html" mce_href="wow/cn/item/38435.html" class="q0" rel="no">蛛魔护腕</a><br/></span><br /><span class="q0">(2) <a href="/wow/cn/spell/51262.html" mce_href="wow/cn/spell/51262.html">使你的命中等级提高15。</a></span& gt;<br /><span class="q0">(4) <a href="/wow/cn/spell/51263.html" mce_href="wow/cn/spell/51263.html">使你的耐力值提高25点。</a></span& gt;<br /><span class="q7">物品等級: 171</span><br /><span class="money_g">7</span><span class="money_s">25</span><span class="money_c">26</span>'});

从中可以解出需要的信息。这个地址的格式是:http://db.178.com/wow/[locale]/a/[type] /[entry].js,其中[locale]是cn,表示简体中文,台湾应该是tw;[type]是类型,有item/npc等;而[entry]就是表格中的entry值。

还有些很奇怪的单词或者名称不一定有,那么就需要翻译了。有个地址不错,输入这个地址:

http://db.ngacn.cc/tips/index.php?key=Might of Kalimdor Archmage&word=1,他会输出:

Might of Kalimdor Archmage 卡利姆多联军大法

0.006599

表示“Might of Kalimdor Archmage” 的中文意思是【卡利姆多联军大法师】,0.006599是他的执行时间。

注意,将你所要查的东西都可以放在key后面,不过最好用加入&word=1,不然,输出就不会这么简单。

好了,累死,终于写好了。我在www.romandion.com提供我的成果,如果你需要的话,用用户locale,密码为空连接到上去,推荐 navicat。可以随时看到我汉化的结果。如果你以及汉化好了,欢迎共享。加入我的群【32285689】,大家互相学习,不过群是实名制,请见谅。
romandion 2009-11-04
  • 打赏
  • 举报
回复
看了下行者推荐的讨论,还是有不少收获。我这个系列主要还是针对实现方面做了探讨,理论方面依然是依据前面所说的单一世界架构。因此会尽量围绕代码来分析。

另外提一下,trinitycore2从【http://dev.trinitycore.org/trinitycore2】下载,原来的URL是TC1的代码。
xingzhe2001 2009-11-03
  • 打赏
  • 举报
回复
另一篇有关芒果服务器相关的讨论,
http://bbs.gameres.com/showthread.asp?threadid=93775
bbvs1 2009-11-03
  • 打赏
  • 举报
回复
ding下
xingzhe2001 2009-10-27
  • 打赏
  • 举报
回复
楼主辛苦了
romandion 2009-10-27
  • 打赏
  • 举报
回复
差点忘了介绍GameObject这个另类。在GameObject.h中,有个struct GameObjectInfo定义,里面有个union能大概看出GameObject究竟指的是哪些东西。

0、GAMEOBJECT_TYPE_DOOR,指的是门

1、GAMEOBJECT_TYPE_BUTTON,应该是按钮,锁之类的。

2、GAMEOBJECT_TYPE_QUESTGIVER任务物品

3、GAMEOBJECT_TYPE_CHEST箱子

4、GAMEOBJECT_TYPE_BINDER没定义,估计没有用上。

5、GAMEOBJECT_TYPE_GENERIC通用的,跟任务相关的东西

6、GAMEOBJECT_TYPE_TRAP陷阱

7、GAMEOBJECT_TYPE_CHAIR椅子

8、GAMEOBJECT_TYPE_SPELL_FOCUS没搞懂啥玩意儿。

9、GAMEOBJECT_TYPE_TEXT文本

10、GAMEOBJECT_TYPE_GOOBER应该是果实一类的吧。

11、GAMEOBJECT_TYPE_TRANSPORT传送点

12、GAMEOBJECT_TYPE_AREADAMAGE区域性伤害,没搞懂啥玩意儿。

13、GAMEOBJECT_TYPE_CAMERA照相机,再研究下

14、GAMEOBJECT_TYPE_MAPOBJECT地图对象,空着

15、GAMEOBJECT_TYPE_MO_TRANSPORT地图对象的传送,不知道啥玩意儿。

16、GAMEOBJECT_TYPE_DUELFLAG决斗标志,估计就是PK,插旗吧。空着没用

17、GAMEOBJECT_TYPE_FISHINGNODE钓鱼点

18、GAMEOBJECT_TYPE_SUMMONING_RITUAL仪式,不知道干啥。估计跟术士拉人那东西有关。

19、GAMEOBJECT_TYPE_MAILBOX邮箱

20、GAMEOBJECT_TYPE_DONOTUSE顾名思义,没用

21、GAMEOBJECT_TYPE_GUARDPOST岗哨,是某种生物

22、GAMEOBJECT_TYPE_SPELLCASTER魔法施放。

23、GAMEOBJECT_TYPE_MEETINGSTONE集合石

24、GAMEOBJECT_TYPE_FLAGSTAND不知道啥玩意儿。

25、GAMEOBJECT_TYPE_FISHINGHOLE估计也是钓鱼点

26、GAMEOBJECT_TYPE_FLAGDROP掉落标记

27、GAMEOBJECT_TYPE_MINI_GAME也没懂是啥玩意儿。

28、GAMEOBJECT_TYPE_CAPTURE_POINT应该是部落和联盟争夺地区

29、GAMEOBJECT_TYPE_AURA_GENERATOR灵气

30、GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY地下城难度

31、GAMEOBJECT_TYPE_BARBER_CHAIR理发师的椅子,唉,都啥玩意儿啊。

32、GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING可摧毁的建筑

33、GAMEOBJECT_TYPE_GUILDBANK工会银行,空,不可见。

34、GAMEOBJECT_TYPE_TRAPDOOR陷阱的门。

应该说,GameObject是描述游戏中,除装备、生物、魔法外,无法准确归类的东西,比较杂,因此只能笼统归结为游戏对象。
romandion 2009-10-27
  • 打赏
  • 举报
回复
魔兽世界私服trinitycore2的架构(7)

不好意思,上面的继承关系有地方错误,改正一下。
假设世界突然静止,你能够从中单独去掉的物体就是构成这个世界的对象,包括玩家、怪物、武器、矿石等。魔兽世界是个大型的网游,里面的种类十分丰富,更不用说对象了。当我看着trinity-core2的源码中,game目录的时候,有种傻眼的感觉,实在太多了。为了理解方便,我们抽丝剥茧,分析出类的继承关系。

在tc2中,所有的对象都被认为是object,以object作为基类,以1.2.3格式表示继承关系,如:1 --> object ;1.2 --> worldobject。1.2表示worldobject继承自1(object)。下面列出完整的对象继承族谱。

1、 Object

1.1 Item 【物品,比如武器】

1.1.1 Bag 【包裹,特殊的物品,可以容纳其他物品】

1.2 WorldObject 【显示在地图上的物体】

1.2.1 Corpse 【尸体】

1.2.2 DynamicObject 【动态生成的对象,比如魔法,生命周期比较短】

1.2.3 GameObject 【游戏物品,这个分类很难从字面上理解,后面会比较详细的介绍】

1.2.3.1 Transport 【传送点】

1.2.4 Unit 【游戏中有生命的单位】

1.2.4.1 Creature 【生物,非玩家】

1.2.4.2 TempSummon 【临时召唤物】

1.2.4.2.1 Minion 【宠物】

1.2.4.2.1.1 Guardian 【守卫】

1.2.4.2.1.1.1 Pet 【玩家的宠物,比如猎人的宠物,或者术士的恶魔】

1.2.4.2.1.2 Puppet 【傀儡,有一定的存在时间。比如德鲁依的树人】

1.2.4.2.1.3 Totem 【图腾,萨满的图腾】

1.2.4.2 Player 【玩家,就不用多解释了】

将整个魔兽世界分解静态物体和静态物体的行为,就比较好理解了。事实上,现实世界也是如此。将世界划分为时间和空间2个维度,现实物体就是空间的概念,行为就是空间物体在时间维度上的变化。象光或者其他不可见或者没有空间占位的物品也可以看作特殊的空间物体。我在这里先将空间维度将分离出来分析。
romandion 2009-10-27
  • 打赏
  • 举报
回复
魔兽世界私服trinitycore2的架构(7)

假设世界突然静止,你能够从中单独去掉的物体就是构成这个世界的对象,包括玩家、怪物、武器、矿石等。魔兽世界是个大型的网游,里面的种类十分丰富,更不用说对象了。当我看着trinity-core2的源码中,game目录的时候,有种傻眼的感觉,实在太多了。为了理解方便,我们抽丝剥茧,分析出类的继承关系。

在tc2中,所有的对象都被认为是object,以object作为基类,以1.2.3格式表示继承关系,如:1 --> object ;1.2 --> worldobject。1.2表示worldobject继承自1(object)。下面列出完整的对象继承族谱。

1、 Object

1.1 Item 【物品,比如武器】

1.1.1 Bag 【包裹,特殊的物品,可以容纳其他物品】

1.2 WorldObject 【显示在地图上的物体】

1.2.1 Corpse 【尸体】

1.2.2 DynamicObject 【动态生成的对象,比如魔法,生命周期比较短】

1.2.3 GameObject 【游戏物品,这个分类很难从字面上理解,后面会比较详细的介绍】

1.2.3.1 Transport 【传送点】

1.3 Unit 【游戏中有生命的单位】

1.3.1 Creature 【生物,非玩家】

1.3.2 TempSummon 【临时召唤物】

1.3.2.1 Minion 【宠物】

1.3.2.1.1 Guardian 【守卫】

1.3.2.1.1.1 Pet 【玩家的宠物,比如猎人的宠物,或者术士的恶魔,除非主人解散,否则一直存在】

1.3.2.1.2 Puppet 【傀儡,有一定的存在时间。比如德鲁依的树人】

1.3.2.1.3 Totem 【图腾,萨满的图腾】

1.3.2 Player 【玩家,就不用多解释了】

将整个魔兽世界分解静态物体和静态物体的行为,就比较好理解了。事实上,现实世界也是如此。将世界划分为时间和空间2个维度,现实物体就是空间的概念,行为就是空间物体在时间维度上的变化。象光或者其他不可见或者没有空间占位的物品也可以看作特殊的空间物体。我在这里先将空间维度将分离出来分析。
lovenadia 2009-10-26
  • 打赏
  • 举报
回复
值得关注!!1
romandion 2009-10-26
  • 打赏
  • 举报
回复
魔兽世界私服trinitycore2的架构(6)

trinity core2的主要工作进程是trinity-core,他实际上扮演的是一个服的作用。一个进程带多个线程的架构。本篇主要介绍每个线程的作用,以及相互之间的关联。

1、主线main.cpp,主线程main函数完成配置信息读取之后,会启动sMaster,sMaster不是线程,他实际是工作逻辑总体框架的封装。主线程的循环在sMaster.Run()中实现。

2、 sMaster是个单实例,在sMaster中,首先会初始化3个数据库(Login/Character/World)的连接,这3个数据库是以线程池方式在运作。同时,还会初始化sWorld,WorldDatabase/CharacterDatabase/loginDatabase是个全局变量,sWorld是个单实例,实际上,他们都可以看做单实例。sWorld的循环部分,在WorldRunnable.Run中完成,由 WorlRunnable循环调用sWorld.Update来更新状态。用来管理的RA功能在RARunnable线程中完成。

值得一提的是,有个单实例sWorldSocketMgr,是sWorld的服务端口。他启动多个服务线程做一个线程池,每个请求的socket,都被排序然后由线程池中线程来服务。

3、 WorldSocket.h是每个world session使用的端口,当WorldSocket::open的时候,会调用WorldSocketMgr::OnSocketOpen,挂接到线程池中,m_NetThreads[min].AddSocket(sock)。有个地方必须注意,WorldSocket的open是实现继承自ACE SVR HANDLE的方法。在trinity core2的其他代码中没有调用,很容易摸不着头脑。WorldSocketMgr的线程池ReactorRunnable继承自 ACE_Task_Base类,他的主要函数svc应该也是和线程的执行体一样。每个执行实际上也是使用WorldSocket的Update来驱动。

4、在sMaster中,通过WorldSocketMgr.Wait()/WorldRunnable.Wait()/RARunnable.Wait() 来等待所有的线程结束。WorldDatabase/CharacterDatabase/loginiDatabase的终止,在 WorldRunnable中结束。

5、WorldSocket.h继承自ACE_Event_Handler的handle_input用来处理输出数据。handle_input-->handle_input_payload-->ProcessIncoming

在 ProcessIncoming中,如果是CMSG_PING/CMSG_AUTH_SESSION/CMSG_KEEP_ALIVE,则由不同的handler来实现。如果是 CMSG_AUTH_SESSION,那么则由HandleAuthSession负责创建一个会话,该会话实际上只是实现各种类型报文的 Handler。其他类型的报文,则先放在一个队列中,由WorldSession来处理。

6、当WorldSocket创建 WorldSession之后,WorldSession就被添加到sWorld的SessionMap中,该map是以AccountID作为关键字的。我们在WorldRunnable中说过,执行体会不断的调用sWorld的Update方法,而在sWorld::Update方法中,就不断的调用WorldSession的Update方法。

上面,我们介绍了各种线程的作用,以及他们之间的关联。sWorld的Update方法是主要的业务逻辑过程。他负责串行处理所有的业务逻辑。这个架构有很大的问题,实际上,一旦某个业务逻辑发生阻塞,极有可能对整个系统造成很大的问题。
romandion 2009-10-22
  • 打赏
  • 举报
回复
魔兽世界私服trinitycore2的架构(5)


地图数据在MMO中占据重要的位置,不但数据量大,还具有基础性地位。在魔兽世界中,地图数据分布于几个mpq文件中,一般说来,他存在于mpq内部目录\world\maps\下,而maps也会被划分成多个目录,比如东部王国和卡里姆多。每个地图中,都会有一个wdt和多个adt文件构成,实际上,还有一个wdl文件,只是tc2中没有提到,估计是文件列表。

每个wdt文件被划分成64×64个格子(GRID),每个格子被划分成16×16个单元(CELL),每个CELL的长度为8个点。总共算来应该2^26个点。每个点都有2个高度,一个估计是CELL本身的高度,另外一个是自定义的高度,点的实际高度是这2个高度的和。

每个CELL除了这种空间数据外,还有一个是液体的数据,液体的类型包括水、海洋、岩浆、稀泥,由此看来,液体实际上种特殊的地图数据。在adt文件还包括矢量点、蒙皮等数据,当在服务端提取出来的时候,似乎都被忽略掉,这是正常的,TrinityCore2在运行之前必须从客户端的mpq文件中,提取出地图数据,这些地图数据是被简化过的,然后保存在*.map文件中。

我在【投影世界 】【动态分区 】中,也同样表达了这种观点。首先,将整个地图将整个切割成多个分区,我的观点和暴雪有所不同的是,我建议以蜂巢模式进行切割,而暴雪是以矩形进行切割。虽然理论上,我的观点比较先进,但是实现上,我也倾向于矩形,毕竟矩形是最简单的地图切割方案。不过,我还是希望能找到一种高效的方式,能够对地图进行蜂巢切割。在服务器端,提取出地形数据,而摒弃那些外观数据,这也是我在投影世界中所表达的那样。

当我越来越深入研究tc2,发现很多思想跟我在《单一世界架构》表述的,惊人吻合。实际上我在研究tc2的代码时,在地图方面遇到很多麻烦的事情,最后我从tc2提供的地图提取工具中,找到了线索,在system.cpp的ConvertADT函数中,了解到*.map中的数据情况。
Pro_X 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 romandion 的回复:]
近日研究WOW的地图,进展甚缓。不知道谁有经验,提供些参考。
[/Quote]
呃,听研究过的多为朋友说,要看完这套代码基本上理解需要耗费5年左右的时间。

我自己没有看过,不知道真实的情况如何。

不知道看了linux的兄弟有几个具备写windows95的商业化能力,如果有这个能力,找个公司投资,说不定可以与Windows NT的操作系统比画比划~
romandion 2009-10-13
  • 打赏
  • 举报
回复
近日研究WOW的地图,进展甚缓。不知道谁有经验,提供些参考。
jeff_pilson 2009-10-13
  • 打赏
  • 举报
回复
差距要是大了,人人都选高级种族,就不能更好得展现WOW的所有,广告效应就差了.
jeff_pilson 2009-10-11
  • 打赏
  • 举报
回复
因为你早玩2年游戏就觉得自己高大了,伟大了,不可一世了,可以骂人了,可以说别人脑残,S/B了?
game_dev_men 2009-10-07
  • 打赏
  • 举报
回复
非常好,楼主为游戏事业做了很多贡献。
romandion 2009-09-30
  • 打赏
  • 举报
回复
魔兽世界私服trinitycore2的架构(4)

以前介绍了TDB0.0.5的渊源,现在继续介绍TDB内部的一些细节。从[TC2 wiki ]可以查到TDB_0.0.5结构比较详细的介绍。

在一个完整的TDB_0.0.5的MYSQL安装库中,你可以看到已经安装的库包括:1、realmd;2、characters;3、world。

realmd库的表比较少,主要是realmlist和account比较重要,realmcharacters主要记录每个服每个帐号有多少个角色。realmlist主要记录每个服的IP地址和端口,而account记录帐号的信息。当一个帐号登录时,首先会在account中校验用户和密码,然后返回realmlist中服列表给客户端。客户端选择服之后,根据服的ip/port就转给了trinity-core来处理了。

characters库主要是帐号的角色信息。这里主要有characters表,是描述角色的各种属性,比如名称,种族、职业,金钱,所在地图。还有个data字段比较特殊,由空格划分成子字段,每个字段的含义根据序号来描述。需要注意的是,在【character data 】中描述的索引和trinity core2实际使用的索引是不一样的,trinity core2使用的索引在UpdateFields.h中EObjectFields和EUnitFields定的,最大的索引PLAYER_END = UNIT_END + 0x047A = OBJECT_END + 0x008E + 0x047A = 0x0006 + 0x008E + 0x047A = 0x050E= 1294 。

除此之外,还有角色所在的行会(GUILD)、竞技场(ARENA)、副本(INSTANCE)、宠物(PET)、战场(BATTLEGROUP)、成就(ACHIEVEMENT)、天赋(TALENT)、声望(REPUTATION)等。更详细的介绍,参看【characters db 】。

world库是比较复杂的。他存储的是和玩家无关的一些东西,即使没有任何玩家登录到trinity-core,这些数据也是被需要的。比如说,没有玩家,但副本的BOSS的相关数据也会被存储在world库中,当玩家进入副本后,这些数据就从world库中提取出来,创建一个新的副本。【world db 】是他比较详细的介绍,一般说来,每次升级,或者增加新的副本,都是修改world库中的数据,基本上不会涉及到realmd和characters库。

world库有几个部分:

1、生物(creatures)相关,包括生物的基本信息,装备、相关声望、相关任务、人工智能。

2、玩家(player)相关,包括种族、职业相关的基本属性、每级经验、创建期信息

3、宠物(pet)相关,包括级别相关的信息。

4、NPC相关,训练师,对白,任务、魔法等

5、物品(item),属性以及和职业种族相关的东西

6、任务(quest)相关.

7、魔法(spell)相关,范围、属性、过程、要求、脚本等。

8、技能(skill)相关。

9、游戏事件(game event)相关,这个比较复杂,相关的表也很多。

10、游戏物品(game object)相关,item是静态,game object可以是动态的,还包含有脚本。

11、寻径(waypoint)相关。

DBC是从客户端提取出来一些比较特殊的数据库文件,他的具体描述[dbc db ]介绍比较详细。

客户端的所有基础数据都是在DBC中放着,在服务端使用DBC也是从客户端解压出来,所以DBC的数据和表十分庞大。我粗略估算了下解压出来的DBC文件,有464个之多。包含的内容也可以归纳入world那样的各个种类。
加载更多回复(29)

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧