WoW的WDB数据

    WOW中的WDB数据用于保存在游戏中看到过的对象的描述信息,包括物品(Item)、游戏对象(GameObject)、任务(Quest)、生物(Creature)等等。


    在我以前参与制作的游戏中,游戏中的对象属性会强制地分为服务端属性和客户端属性两部分,并且会以两个独立的文件来保存。每次增加或者修改游戏中的一个对象属性都有可能需要同时对这两个文件进行修改,并且做好两个表的对应关系。另外客户端属性表的内容发生改变时必须通过客户端版本升级的方式来发布。
    这样做最大的问题是同时修改两个表容易引起错误,另外需要升级客户端版本也会给玩家带来很大的不便。虽然升级的数据量并不大,但也会给玩家不种不好的感受。

    在WOW中,使用了WDB的cache文件后,其本质上并没有变化,对象的属性还是有服务器属性和客户端属性两部分,但记录的数据不需要分成两个文件,所有的数据都放在服务器上,由程序来为客户端生成相应的文件。而且这些文件的内容只在需要时才产生,并不会一次将所有的数据都发给客户端。这样做以后,策划的工作简单了许多。

    WOW的WDB文件中记录了该文件产生时的客户端版本号,当检测到某个文件中的版本信息与当前客户端版本不一致时,会重建cache数据。也就是说,每次客户端版本升级后都会清空客户端的cache数据。并且,cache数据只在客户端版本升级时才重建。
    这样便引入了一个问题:假设在游戏运行过程中,希望更改某个对象的属性,比如修改物品描述中的一个错别字,或者修改某件物品的售卖价格。服务器端一般会支持在不停机的情况下修改这些配置信息,但修改后的信息却不能立即反馈到客户端。而且即使服务器维护后,如果没有升级客户端版本,也是一样看不到最新的信息。
    在WOW中,实际情况也确实如此。我们从WOW的版本更新说明中可以看到一些如“迅猛龙改名为橄榄色迅猛龙来进行更好的描述”和“修改了艾尔文森林管理员莱琳说话中的语法错误”之类的更新信息。其实这些信息都是保存在服务器上,由服务器发给客户端,但是在客户端做了cache,所以要想更新这些信息,除了修改服务器上的数据外,还需要让客户端删除cache,这只有在客户端版本升级的时候才能实现。当然,WOW这样做也许是另一个目的:不在背后偷偷地修改内容。谁知道呢 :)

    那么有没有办法既使用cache还来的好处,又可以在游戏运行过程中动态地修改对象属性呢?人非圣贤,孰能无过?起码得给个立即改过自新的机会吧 :)
    很自然地可以想到,让客户端主动向服务器请求验证数据是否发生了改变。请求的时机可以在客户端需要显示某条属性信息时。客户端会把该信息的编号连同该信息的校验值发给服务器,服务器校验数据,如果未改变,可以直接忽略此条消息,如果数据发生了改变,则返回最新的数据内容给客户端,客户端用新的内容更新cache,这样便实现了数据的动态更改。另外当然不能在每次需要显示数据时都请求校验一次,这样便失去cache的意义了,可以在客户端限制为在线的时间段内,每条信息只会请求验证一次。

    最后就是WDB中到底需要cache哪些数据。在WOW中,客户端数据库文件分为两种:一为DBC文件,另一就是WDB文件。基本上游戏世界的配置信息保存为DBC文件,这些数据只在客户端版本升级时才会改变。WDB即为cache数据,都为游戏内容相关的属性数据,也是游戏中会显示出来的数据。目前已知的有:生物类,保存显示名称、描述以及图标等信息。游戏对象类,指地图上的动态小物件,如火盆、商店招牌、路标等道具的名称信息。任务信息类,记录在游戏中看到过的所有任务的描述、需要搜索的物品、奖励物品、经验值等显示信息。物品类,记录在游戏中看到过的所有物品对象的名称、描述、买卖价格等信息。 

 

附上将wdb文件转为csv文件的一段代码,目前只转了creaturecache.wdb、gameobjectcache.wdb、questcache.wdb三个文件

http://helloqinglan.googlepages.com/WDBReader.rar

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值