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

本文详细分析了游戏服务器如何处理玩家、商人和怪物的消息,包括移动对象、地图更新、商人和怪物的视线范围计算。游戏服务器在ProcessMonster和ProcessMerchants线程中创建和更新对象,向客户端发送SM_TURN消息,客户端接收后处理移动物体、地图项和事件。客户端通过CGameProcess和CClientSocket类处理消息,更新UI并响应服务器事件。
摘要由CSDN通过智能技术生成
 
 
6. 接收怪物,商人,其它玩家的消息:
ProcessUserHuman:( 其它玩家—服务器处理)
CPlayerObject->SearchViewRange();
CPlayerObject->Operate();
遍历 UserInfoList列表,依次调用每个UserInfo的Operate来处理命令队列中的所有操作; pUserInfo->Operate()调用m_pxPlayerObject->Operate()调用。根据分发消息(RM_TURN)向客户端发送SM_TURN消息。GameSrv广播新玩家上线(坐标)的消息。向该新玩家发送玩家信息( 等级,装备,魔法,攻击力等)。
玩家,移动对象:
1. 遍历 m_xVisibleObjectList列表,所有(玩家,商人,怪物)发送调用AddProcess
 (RM_TURN向周围玩家发送消息 )。
地图:
2.遍历 m_xVisibleItemList,发送AddProcess(this, RM_ITEMSHOW消息更新地图。
3.遍历 m_xVisibleEventList,发送AddProcess(this, RM_SHOWEVENT
 
ProcessMonster 线程(怪物—服务器处理)
GameSrv服务器在 ProcessMonster线程: 创建不同的CMonsterObject对象,并且加入xMonsterObjList列表和pMapCellInfo->m_xpObjectList列表中,然后再调用CMonsterObject::SearchViewRange()更新视线范围内目标,根据g_SearchTable计算出搜索坐标,转换为相应的地图单元格,遍历所有可移动生物,加入m_xVisibleObjectList列表,调用Operate;Operate遍历m_DelayProcessQ列表,过滤出RM_DOOPENHEALTH,RM_STRUCK和RM_MAGSTRUCK三个事件(恢复生命值,攻击,魔法攻击),并处理。
ProcessMerchants 线程:(商人--服务器处理)
       1). 遍历 g_pMerchantInfo结构(根据nNumOfMurchantInfo数量)。得到商人类型相关的地图,创建商人对象,设置不同的编号,坐标,头像及所属地图。在该地图中加入该商人,且在g_xMerchantObjList商人清单中加入该商人。
2). 遍历 g_xMerchantObjList, SearchViewRange,对每个商人更新视线范围内目标
a). 遍历 m_xVisibleObjectList,设置每个pVisibleObject->nVisibleFlag = 0;设置状态(删除)。
b). 搜索 VisibleObjectList列表,(服务器启动时InitializingServer加载 searchTable.tbl),根据坐标,找到相应的地图单元格。然后遍历pMapCellInfo->m_xpObjectList列表,判断如果为OS_MOVINGOBJECT标志,调用UpdateVisibleObject函数,该函数遍历 m_xVisibleObjectList列表,如果找到该商人对象,则pVisibleObject->nVisibleFlag = 1;否则判断pNewVisibleObject对象,设置nVisibleFlag为2,设置对象为该商人实体,然后加入m_xVisibleObjectList列表中。
 
总结:循环列表,找出地图单元格中的所有玩家,把所有玩家 (OS_MOVINGOBJECT)加入到m_xVisibleObjectList列表中。
c). 遍历 m_xVisibleObjectList列表,(pVisibleObject->nVisibleFlag == 0)则删除该pVisibleObject对象。
d). RunRace调用 AddRefMsg 向周围玩家发送SM_TURN和SM_HIT
 
客户端收到消息后相应的处理:
1. CGameProcess::OnSocketMessageRecieve加入m_xWaitPacketQueue队列
       遍历m_xVisibleObjectList队列中所有移动物体(角色):
         RM_DISAPPEAR   消失 (SM_DISAPPEAR)   ProcessDefaultPacket函数
        RM_DEATH       死亡 (SM_NOWDEATH, SM_DEATH)
           CHero::OnDeath 其它玩家。
           CActor::OnDeath 怪物。
//g_xGameProc.m_xMagicList
        RM_TURN        移动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值