摘要: 网络游戏服务器端对时间的需求可以说是无处不在的,小到技能的冷却、技能的释放时间、物品使用的冷却、怪物的死亡重生、掉落物品的存在时间,大到节日活动的开启、boss怪的精确出生、周任务日任务的准点开始等等。而这些对时间的需求都依赖于服务器端提供的时间服务的实现,因此时间服务、时间控制模块在网游服务器端设计中是占有比较重要的地位。 本系列的第一篇《时间服务(一)序言》也描述了部分需求,但是用词较为戏谑。本文将进一步细化需求,最大程度上把实际工作中对时间的需求描述清楚。一、总体分类 按照大类来分,时间需求主要分为两大类:相对时间需求和绝对时间需求。下面具体展开来说:相对时间需求: 相对时间指的是时间. 阅读全文
posted @ 2012-03-04 00:06 ychellboy 阅读(3562) 评论(3) 推荐(2) 编辑
摘要: 在网络游戏中常常会出现这样的情况,玩家在进行一些操作的同时是不能进行另一些操作的。比如说:正在移动的玩家不能释放带有吟唱的技能;死亡时不能交易;不能同时和两个玩家进行交易;不同阵营不允许交易等等。而很多需要交互的操作(比如交易)当一方取消或异常操作时,服务器会撤消双方的操作,并通知双方撤消的原因。在这就会面临一个问题,应该使用什么方式来通知客户端这些错误? 在设计游戏错误提示模块时应该考虑一下几个问题:易用性:每次添加新的错误提示都不费劲!可维护性:来个新人和他说两句,下次添加的时候他想都不想就能找到在哪加!可扩展性:今天加逻辑服务器给客户端的错误提示,明天要加连接服务器给客户端的错误提示也. 阅读全文
posted @ 2012-02-24 17:39 ychellboy 阅读(2255) 评论(2) 推荐(0) 编辑
摘要: 网络游戏服务器端对于时间的需求很多,有些需求依赖于相对时间,比如开始采矿——需要随后几秒时间让客户端播动作。有些需求依赖绝对时间,比如只在2012年12月21日开启“末日之旅”的活动。正是由于有众多需求对时间有依赖性,使得时间服务、时间控制成为服务器端模块设计中较为重要的一部份。本系列将从游戏开发需求出发,循序渐进的介绍时间服务模块的设计和实现。 Attention:本文措辞比较调侃、夸张,非少数民族程序员请在父母陪同下观看:-) 壮族小伙本文简称“小伙”Scene 1 话说公元某年某月某日,帝都一个阳光明媚的早上,策划A笑眯眯的跑过来道“少年!我们想在4月1日愚人节开启一个活动,所有玩家发. 阅读全文
posted @ 2012-02-13 23:26 ychellboy 阅读(2194) 评论(1) 推荐(2) 编辑
摘要: 网络游戏服务器的主要作用是模拟整个游戏世界,客户端用过网络连接把一些信息数据发给服务器,在操作合法的情况下,更新服务器上该客户端对应的player实体、所在场景等,并把这些操作及其影响广播出去。让别的客户端能显示这些操作。 在这个模拟过程中,需要解决的一个重要问题是:多长时间处理(更新)一次该服务器上的待处理事件,体现在实际开发中,这就是一个服务器端的心跳设计问题(tick)。 在网络游戏服务器端的心跳设计里主要面临以下几个问题:心跳函数的处理间隔往往是固定的,因为需要模拟现实世界中时间的性质,不能让游戏世界表现得忽快忽慢。但处理间隔固定不代表一定要和真实时间一致,有可能有快放慢放的需求。固. 阅读全文
posted @ 2012-02-10 17:37 ychellboy 阅读(13095) 评论(4) 推荐(6) 编辑
摘要: 上篇《socket的处理方式》介绍了mangosd是如何接收和管理socket的,而在MaNGOS中客户端的所有游戏操作都是通过消息传递与游戏逻辑服务器进行交互的,比如玩家角色移动,与NPC对话,领取任务,释放技能等等。 消息传递在mangosd上以会话的形式维护,在客户端通过服务器的验证之后,mangosd会主动建立并保持一个与客户端连接的会话。所有的消息传递在该会话里进行。一、会话的建立 会话建立过程如下代码: 1: int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) 2: { 3: .......... 阅读全文
posted @ 2012-01-10 16:15 ychellboy 阅读(2657) 评论(0) 推荐(0) 编辑
摘要: 本篇将介绍客户端与游戏逻辑服务器连接建立以后,mangosd如何接收、解析和处理客户端发过来的协议。本篇不再讨论mangosd与客户端的认证及建立最终RC4流加密的过程,想了解这部分内容请看该系列的第一篇。一、acceptor socket的监听启动及注册 mangosd的main ()函数调用单例对象sMaster的Run ()函数,启动监听socket的代码如下: 1: int Master::Run() 2: { 3: ........ 4: 5: ///- Launch the world listener socket 6: uin... 阅读全文
posted @ 2011-12-24 19:05 ychellboy 阅读(3734) 评论(0) 推荐(1) 编辑
摘要: 在MaNGOS-Zero中使用ACE库来处理网络IO,先看一下realmd工程下的Main.cpp。经过简化后main()函数中和socket相关的代码可以表示为: 1: int main() 2: { 3: ......... 4: 5: ACE_Reactor::instance(new ACE_Reactor(new ACE_TP_Reactor(), true), true); 6: 7: ///- Launch the listening network socket 8: ACE_Acceptor<Aut... 阅读全文
posted @ 2011-12-10 18:10 ychellboy 阅读(3042) 评论(0) 推荐(1) 编辑
摘要: mangosd是MaNGOS-Zero项目中的游戏逻辑进程,玩家一旦与realmd的keyexchange过程完成后(详细内容见《realmd认证登录服务器(一):认证登录基本流程》),便只与mangosd进行交互。而客户端与realmd的连接也会在客户端向mangosd发送enterworld之后断开。 本文将介绍客户端连接到mangosd后,mangosd认证客户端合法性并最终建立RC4流加密的过程。具体过程如下:(1) 客户端与mangosd建立TCP连接后,mangosd会向客户端发送消息SMSG_AUTH_CHALLENGE 1: int WorldSocket::open (... 阅读全文
posted @ 2011-11-26 19:48 ychellboy 阅读(9631) 评论(0) 推荐(0) 编辑
摘要: 在MaNGOS-Zero中认证登录服务器是已独立的进程存在的,名字叫realmd,这样命名可能是和游戏client端根目录下的realmlist.wtf文件相对应。realmd的主要工作是:检查登录用户的合法性,并在合法的情况下完成通信密钥的交换,最后把游戏逻辑服务器的地址信息列表传给client端。 realmd认证的基本流程如下:图中的(1)~(7)详细过程如下:(1)Client启动后立即尝试连接realmlist.wtf文件中指定的认证服务器,就发送LogonChallenge给认证服务器realmd。协议结构如下: 1: typedef struct AUTH_LOGON_CH... 阅读全文
posted @ 2011-10-30 20:36 ychellboy 阅读(9293) 评论(0) 推荐(0) 编辑
摘要: 最近周末咸蛋,抽时间看了一下传说中的开源WOW服务器模拟器,虽然只看了登陆认证这块,但感触颇多,兴起随便写写。 MaNGOS的介绍如下:What is MaNGOS?The mangos project is a full featured World of Warcraft server suite, including servers for authentication, client updates, world content serving, and battlegrounds. Additional features include tools to build and dev. 阅读全文
posted @ 2011-09-17 16:47 ychellboy 阅读(5724) 评论(0) 推荐(0) 编辑