天龙源码分析 - 选择角色流程

一 角色选择流程开始

可能的一种情况是,客户端接到服务器发送的包(LCRetCharList)开始的,这个包里面有玩家角色的个数等信息

UINT    LCRetCharListHandler::Execute(LCRetCharList *  pPacket, Player *  pPlayer )
{
    __ENTER_FUNCTION

        
if (pPacket && (pPacket -> GetResult()  ==  ASKCHARLIST_SUCCESS))
        {

            
int  iCharacterCount  =  pPacket -> GetCharNumber();
            
//  保存角色的个数
            CGameProcedure::s_pProcCharSel -> m_iCharacterCount  =   0 ;

            
if ( iCharacterCount  >   0 )
            {
                DB_CHAR_BASE_INFO
*  pInfo  =  NULL;
                
for ( int  i  =   0 ; i  <  iCharacterCount; i ++ )
                {
                    pInfo 
=  pPacket -> GetCharBaseInfo(i);
                    
if (pInfo)
                    {
                        
//  添加一个角色
                        CGameProcedure::s_pProcCharSel -> AddCharacter( * pInfo);
                
                        CGameProcedure::s_pProcCharCreate
-> m_iCamp  =  pInfo -> m_Camp;
                    }

                }
                
            }
            
else
            {
                CGameProcedure::s_pProcCharCreate
-> m_iCamp  =   - 1 ;
            }

            CGameProcedure::s_pEventSystem
-> PushEvent( GE_GAMELOGIN_CLOSE_SYSTEM_INFO);    


            
//  转换到人物选择界面。
             if (CGameProcedure::GetActiveProcedure()  ==  (CGameProcedure * )CGameProcedure::s_pProcCharCreate)
            {
                
if (CGameProcedure::s_pProcCharCreate -> m_Status  ==  CGamePro_CharCreate::CHAR_CREATE_CREATE_OK)
                {
                    CGameProcedure::s_pProcCharCreate
-> ChangeToRoleSel();
                }
            }

 

 

上面流程做了两件事:

(1)在界面上显示玩家所有角色,通过AddCharacter方法执行,等下分析

(2)把流程修改为角色选择,ChangeToRoleSel()

 

二 AddCharacter

服务器会发送玩家角色列表,角色信息保存在这个结构里面DB_CHAR_BASE_INFO,包括GUID,名字,等级,发型等。AddCharacter函数会根据上述信息,创建角色,而且所有角色都会一次创建完毕

 

三 进入场景

触发条件是脚本发送命令

     //  发送进入游戏消息
    INT CGameProduce_Login::SendEnterGameMsg(LuaPlus::LuaState *  state)
    {
        
        LuaStack args(state);
        
if  ( ! (args[ 2 ].IsInteger()))
        {
            TDThrow(
" LUA:GetBuffIconNameByIndex param parameter error " );
        }

        
if (CGameProcedure::s_pProcCharSel)
        {
            
int  iRoleIndex  =  args[ 2 ].GetInteger();
            CGameProcedure::s_pProcCharSel
-> SendEnterGameMsg(iRoleIndex);

            
        }
//     

        
return   0 ;
    }

 

 

根据传下来的ID,发送进入游戏的包

//  进入游戏
int  CGamePro_CharSel::SendEnterGameMsg( int  iRoleIndex)
{
    
if ((iRoleIndex  <  m_iCharacterCount) && (iRoleIndex  >=   0 ))
    {
        
if (iRoleIndex  <  MAX_SHOW_IN_UI)
        {
            CLAskCharLogin msg;

            m_EnterGameGUID 
=  m_CharacterInfo[iRoleIndex].m_GUID;
            msg.SetCharGuid(m_EnterGameGUID);

            
//  删除角色
            CNetManager::GetMe() -> SendPacket( & msg);
            CGameProcedure::s_pEventSystem
-> PushEvent( GE_GAMELOGIN_SHOW_SYSTEM_INFO_NO_BUTTON,  " 准备进入游戏..... " );    
            
return   0 ;
        }
    }

    CGameProcedure::s_pEventSystem
-> PushEvent( GE_GAMELOGIN_SHOW_SYSTEM_INFO,  " 请选择一个角色 " );    
    
return   1 ;
}

 

 

三 经过上面的发包,客户端应当进入CGamePro_Enter流程(等待进入场景流程),不过暂时没有找到更新到这个状态的合理地方,有待进一步分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值