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

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

posted on 2012-08-21 13:01  DieAngel  阅读(399)  评论(0编辑  收藏  举报

导航