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 移动