遍历传奇源码分析-客户端(游戏逻辑处理源分析三)

传奇2客户端  时间:2021-02-12  阅读:()

6.接收怪物商人其它玩家的消息:

ProcessUserHuman:(其它玩家—服务器处理)

CPlayerObj ect->S earchVie wRange();

C P la ye rO bj e ct->Op erat e();

遍历Use rInfo Lis t列表依次调用每个Us erInfo的Operate来处理命令队列中的所有操作;pUse rI nfo->Op erate()调用m_p xPlaye rObj e ct->Op erat e()调用。根据分发消息

RM_TURN 向客户端发送SM_TURN消息。 GameSrv广播新玩家上线坐标的消息。 向该新玩家发送玩家信息等级装备魔法攻击力等 。

玩家移动对象

1.遍历m_xVisib leObjectList列表所有(玩家商人怪物发送调用AddProcess(RM_TURN向周围玩家发送消息)。

地图

2遍历m_xVis ib le ItemList发送AddProces s(thi s,RM_ITEM SHOW消息更新地图。

3遍历m_xVisib leEventList发送AddProcess(this,RM_SHOWEVENT

ProcessMonster线程 (怪物—服务器处理)

GameSrv服务器在Proces sMonster线程创建不同的CMonsterO bject对象并且加入xMonsterObjList列表和pMapCellInfo->m_xpObjectList列表中然后再调用CMonsterObject: :S e archViewRange()更新视线范围内目标根据g_S earchTab le计算出搜索坐标转换为相应的地图单元格遍历所有可移动生物加入m_xVis ib leObj ectLi st列表调用Operate Operate遍历m_De layProc essQ列表过滤出RM_DO OPENHEALTH RM_S TRUCK和RM_MAGS TRUCK三个事件(恢复生命值攻击魔法攻击)并处理。

ProcessMerchants线程 (商人--服务器处理)

1).遍历g_p Merc hantInfo结构(根据nN umO fMurc hantInfo数量)。得到商人类型相关的地图创建商人对象设置不同的编号坐标头像及所属地图。在该地图中加入该商人且在g_xMe rc hantObjLis t商人清单中加入该商人。

2).遍历g_xM erchantObj Lis t,S earchVie wRange对每个商人更新视线范围内目标a).遍历m_xVisibleObjectList设置每个pVisibleObject->nVisibleFlag=0;设置状态

删除 。b).搜索Vis ib leObjectList列表 (服务器启动时InitializingServer加

载searchTab le.tb l)根据坐标找到相应的地图单元格。然后遍历pMapCellInfo->m_xp ObjectList列表判断如果为O S_MOVINGOBJECT标志调用

UpdateVisibleObject函数该函数遍历m_xVisibleObjectList列表如果找到该商人对象则pVisibleObject->nVisib leFlag=1;否则判断pNewVisibleObject对象设置nVisibleFlag为2设置对象为该商人实体然后加入m_xVisibleObjectList列表中。

总结循环列表找出地图单元格中的所有玩家把所有玩家

(O S_MOVINGOBJECT)加入到m_xVisibleObjectList列表中。

c).遍历m_xVisibleObjectList列表,(pVisibleObject->nVisibleFlag==0)则删除该pVisibleObject对象。d).RunRace调用Add Re fMs g向周围玩家发送S M_TURN和S M_HI T

客户端收到消息后相应的处理

1 CGameProcess: :O nS ocketMessageRecieve加入m_xWaitPacketQueue队列

遍历m_xVisibleObjectList队列中所有移动物体(角色)

RM_DISAPPEAR 消失(SM_DISAPPEAR) ProcessDefaultPacket函数

RM_DEATH 死亡(SM_NOWDEATH,SM_DEATH)

CHero: :O nDe ath其它玩家。

CActor: :O nDeath怪物。

//g_xGameProc.m_xMagicList

RM_TURN 移动

S M_TU RN消息处理

遍历m_xVis ib leItemList队列中所有移动物体(地图)

RM_ITEMHIDE 从m_stMapItemList列表中删除该移动对象

RM_ITEM SHOW 遍历m_stMapItemList如果不存在则创建一个

GRO UNDITEM结构并加入m_stMap ItemList列表中。typedef struct tagGROUNDITEM

{

INT nRecog;

SHORT shTileX;

SHORT shTileY;

WORD wLooks;

CHAR szItemName[40];

}GROUNDITEM, *LPGROUNDITEM;

遍历m_xVisibleEventList队列中所有移动物体(事件)

RM_HIDEEVEN T

RM_SHOWEVENT

2.部分数据未处理加入m_xW aitPacketQueue队列中由ProcessPacket处理。CClientSocket: :OnSocketMe ssage的FD_READ事件中 PacketQ.PushQ把接收到的消息压入PacketQ队列中。处理PacketQ队列数据是由C GameProcess: :Load()时调用OnTime r在C GamePro cess: :O nTimer中处理的处理过程为

OnTimer->ProcessP acket ->Proces sPacket处理m_xWaitPacketQ ueue队列消息

OnSocketMessageRecieve函数中未处理的消息 。

ProcessPacket函数处理流程

1 处理本玩家SM_NOWDEATH,SM_DEATH,SM_CHANGEMAP,

S M_S TRUC Ka.如果接收到消息是SM_NOWDEATH或S M_DEATH则加入m_xPriorPacketQueue队列。

b.如果接收到消息是SM_CHANGEMAP则调用LoadM apChanged,设置场景。c.SM_STRUCK处理受攻击本玩家或者其它的玩家NPC等 。

2 其它消息 m_xMyHero.S truckMsgRe ass ign();m_xMyHero.m_xPacketQueue.PushQ((BYTE*)lpPacketMs g);

判断服务器发送来的消息ID是否相同。m_xMyH ero.m_dwIdentity在登录成功的时候由服务器发送的用户消息获取的。if( lpPacketMs g->stDe fMs g.nRec og==m_xMyHero.m_dwIdentity)

如果是服务器端游戏玩家自己发送的消息则处理自己的消息。否则如果是其它玩家(怪物)发送的消息遍历m_xAc torLi st列表,判断该对象是否存在如果该不存在则根据stF e ature.bGender的类型

_GENDER_MAN 创建一个C Hero对象加入到m_xAc torList列表中。

_GENDER_WOMAN

_GENDER_NPC 创建一个CNPC对象加入到m_xActorList列表中。

_GEN DER_M ON 创建一个CActor对象加入到m_xAc torLi st列表中。

然后pxActo r->m_xPack etQ ue ue.P ushQ然后把消息压入该对象的xPack etQue ue列表中。

总结 ProcessPacket处理CClientS ocket类接受的消息(m_xWaitP acketQueue)判断是否是服务器发送给自己的消息处理一些发送给自己的重要消息其它消息处理则加入m_xMyHe ro.m_xPack etQue ue队列中然后再遍历m_xActorLis t队列判断如果服务器端发来的消息里的玩家(NPC怪物)在m_xAc to rLis t队列中找不到就判断一个加入m_xAc torLis t列表中并且把该消息压入pxActo r-

>m_xPacketQueue交给该NPC去处理该事件。

而xPac ketQueue队列的消息分别由该对象的UpdatePacketState处理如下B O O L CActo r: :Upd atePa cketState() ,BO O L CNPC: :Update PacketState()

BO O L CHero: :Upd atePacketS tate()。

ProcessDe faultP acket函数

处理CGameProcess: :OnSocketMessageRecieve中SM_CLEAROBJECT消息处理SM_DISAPPEAR SM_CLEAROBJECT消息。

遍历m_xWaitD e faultPack etQue ue消息列表

SM_DISAPPEAR和SM_CLEAROBJECT

遍历m_xAc to rLis t列表清除pxActor->m_xPac ketQueue队列内所有消息。m_xActorList.De leteCurrentNo deEx();从对列中删除该对象。

CHero*pxHe ro=(CHero*)pxActor;de le te((C Hero*)pxHe ro);销毁该玩家。

游戏循环处理 CGameProcess: :RenderScene(INT nLoopTime)函数

主要流程如下wM ove Time+=nLoo pTime;判断wMo veTime>100时 bIsMo veTime置为真。

1m_xMyHero.UpdateMotionState(nLoopTime,b IsMo veTime);处理本玩家消息。a.UpdateP acke tStat e函数

遍历m_xPriorPacketQueue队列如果有SM_NOWDEATH或SM_DEATH消息则优先处理。

处理m_xP acketQueue队列中消息。

SM_STRUCK:

SM_RUSH

SM_BACKSTEP

SM_FEATURECHANGED:

SM_OPENHEALTH:

SM_CLO SEHEALTH:

SM_CHANGELIGHT:

SM_USERNAME:

SM_CHANGENAMECOLO R:

SM_CHARSTATUSCHANGE:

SM_MA GICFI RE:

SM_HEALTHSPELLCHANGED:

2 C heckMapp edD ata函数遍历m_xActo rL is t列表分别调用

CActor: :UpdateMotionS tate(INT nLoopTime,BOOL bIsMove Time)

CNPC::UpdateMotionState(INT nLoopTime,BOOL bIsMoveTime)

CMyHero: :UpdateMo tio nS tate(INT nLoopTime,B O OL bIsMo veTime)

处理自己消息。

CHero: :Update PacketState()case SM_SITDOWN:

case SM_BUTCH:

case SM_FEATURECHANGED:

case SM_CHARSTATUSCHANGE:

case SM_OPENHEALTH:

case SM_CLOSEHEALTH:

case SM_CHANGELIGHT:

case SM_USERNAME:

case SM_CHANGENAMECOLOR:

case SM_HEALTHSPELLCHANGED:

case SM_RUSH:

case SM_BACKSTEP:

case SM_NOWDEATH:

case SM_DEATH:

case SM_WALK:

case SM_RUN:

case SM_TURN:

case SM_STRUCK:

case SM_HIT:

case SM_FIREHIT:

case SM_LONGHIT:

case SM_POWERHIT:

case SM_WIDEHIT:

case SM_MAGIC FIRE:

case SM_SPELL:

CNPC: :Upd atePa cketS tate()case SM_OPENHEALTH:

case SM_CLOSEHEALTH:

case SM_CHANGELIGHT:

case SM_USERNAME:

case SM_CHANGENAMECOLOR:

case SM_HEALTHSPELLCHANGED:

case SM_TURN:

case SM_HIT:

CActor: :UpdateP acketSt ate()case SM_DEATH: SetMotionFrame(_MT_MON_DIE,bDir);case SM_WALK: SetMotionFrame(_MT_MON_WALK,bDir);case SM_TURN: SetMotionFrame(_MT_MON_STAND,bDir);case SM_DIGUP: SetMotionFrame(_MT_MON_APPEAR,bDir);case SM_DIGDOWN: SetMotionFrame(_MT_MON_APPEAR,bDir);case SM_FEATURECHANGED:

case SM_OPENHEALTH:

case SM_CLOSEHEALTH:

case SM_CHANGELIGHT:

case SM_CHANGENAMECOLOR:

case SM_USERNAME:

case SM_HEALTHSPELLCHANGED:

case SM_BACKSTEP: SetMotionFrame(_MT_MON_WALK,bDir);case SM_STRUCK: SetMotionFrame(_MT_MON_HITTED,m_bCurrDir);case SM_HIT: SetMotionFrame(_MT_MON_ATTACK_A,bDir);case SM_FLYAXE:

case SM_LIGHTING:

case SM_SKELETON:

收到多个NPC玩家发送的SM_TURN消息 由下面对象调用处理

CHero: :O nTurn

CNPC: :OnTurn

CActor: :O nTurn

根据服务器发送的消息 (创建一个虚拟玩家NPC怪物在客户端)根据参数初始化该对象设置(方向坐标名字等级等)。在后面的处理中绘制该对象到UI界面中(移动对象的UI界面处理。 )

SetMotionFrame(_MT_MON_STAND,bDir);m_bCurrMtn:=_MT_MON_STAND

m_dwF s tF rame ,m_dwEndF rame ,m_wDe lay第一帧最后一帧延迟时间。

3.Auto T arge t ing自动搜索目标(N P C,怪物玩家等)

4 RenderO bject补偿对象时间

5.RenderMapTile Gridm_xMagicList处理玩家魔法后 UI界面的处理。

6. m_xS no w,m_xRa in,m_xF lying Ta il,m_xS moke,m_xLightF og设置场景UI界面处理。

7.m_xMyHero.ShowMessage(nLoopTime);显示用户(UI处理)m_xM yHe r o.Dra wHPB a r();显示用户H P值。

遍历m_xAc to rLis t处理所有NP C的UI界面重绘pxHero->ShowMes s age(nLoop Time);pxH ero->Dra wH PBa r();

8.DropItemS ho w下拉显示。

9.判断m_pxMouse TargetActor(玩家查看其它玩家NPC怪物时)g_xC lientSocket.SendQueryName向服务器提交查询信息。m_p xMous eOldTargetActor=m_pxMouseTargetAc tor;保存该对象m_p xMo us e Tar ge tAc to r->Dr awN ame();重绘对象名字(UI界面显示)

下面分析一下用户登录之后的流程

从前面的分析中可以看到该用户玩家登录成功之后得到了服务器发送来的各种消息。处理也比较复杂 同时有一定的优先级处理。并且根据用户登录后的XY坐标 向用户发送来了服务器XY坐标为中心附近单元格中的所有玩家(NPC,怪物)的SM_TURN消息。

客户端根据数据包的标志创建这些NPC设置属性并且把它们加

入m_xAc torList对列中。最后在UI界面上绘制这些对象。

宝塔面板批量设置站点404页面

今天遇到一个网友,他在一个服务器中搭建有十几个网站,但是他之前都是采集站点数据很大,但是现在他删除数据之后希望设置可能有索引的文章给予404跳转页面。虽然他程序有默认的404页面,但是达不到他引流的目的,他希望设置统一的404页面。实际上设置还是很简单的,我们找到他是Nginx还是Apache,直接在引擎配置文件中设置即可。这里有看到他采用的是宝塔面板,直接在他的Nginx中设置。这里我们找到当前...

JustHost,最新高性价比超便宜俄罗斯CN2 VPS云服务器终身8折优惠,最低仅8元/月起,200Mbps带宽不限流量,五大机房自助自由切换,免费更换IP,俄罗斯cn2vps怎么样,justhost云服务器速度及综合性能详细测评报告

主机参考最新消息:JustHost怎么样?JustHost服务器好不好?JustHost好不好?JustHost是一家成立于2006年的俄罗斯服务器提供商,支持支付宝付款,服务器价格便宜,200Mbps大带宽不限流量,支持免费更换5次IP,支持控制面板自由切换机房,目前JustHost有俄罗斯5个机房可以自由切换选择,最重要的还是价格真的特别便宜,最低只需要87卢布/月,约8.5元/月起!just...

HyperVMart:加拿大vps,2核/3G/25G NVMe/G口不限流量/季付$10.97,免费Windows系统

hypervmart怎么样?hypervmart是一家成立了很多年的英国主机商家,上一次分享他家还是在2年前,商家销售虚拟主机、独立服务器和VPS,VPS采用Hyper-V虚拟架构,这一点从他家的域名上也可以看出来。目前商家针对VPS有一个75折的优惠,而且VPS显示的地区为加拿大,但是商家提供的测速地址为荷兰和英国,他家的优势就是给到G口不限流量,硬盘为NVMe固态硬盘,这个配置用来跑跑数据非常...

传奇2客户端为你推荐
有趣的广告比较有趣的广告词有哪些快递打印快递单打印时快递单子怎么放置?拂晓雅阁?英特尔和AMD有什么区别啊?ghostxp3目前最好的ghost xp3是什么?二叉树遍历二叉树三种遍历方式原则?今日热点怎么删除千牛里面的今日热点怎么取消_?godaddygodaddy域名怎样使用ejb开发什么是EJB?bt封杀BT下载可以封杀迅雷吗?什么原理?能破吗?电子商务网站模板电子商务网站模板哪个好?电子商务网站模板免费建站怎么样?
域名代理 vir stablehost 空间出租 服务器是干什么的 免费高速空间 100mbps 江苏双线服务器 starry 服务器防火墙 徐州电信 nic 德国代理ip 俄勒冈州 大硬盘分区 招聘瓦工 8度空间论坛 qq空间技术网 万根云主机 电脑主机报警 更多