一 角色选择流程开始
可能的一种情况是,客户端接到服务器发送的包(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();
}
}
{
__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 ;
}
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 ;
}
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流程(等待进入场景流程),不过暂时没有找到更新到这个状态的合理地方,有待进一步分析