创建角色逻辑部分

逻辑代码

接口

  • 初始化角色信息
int32_t process_request_create_role(CMessageHead& rstMsgHead, char* pszMsgBody, int32_t iBodyLength);
int32_t process_response_create_role(CMessageHead& rstMsgHead, char* pszMsgBody, int32_t iBodyLength);
  • 获取角色信息

int32_t process_request_get_role_info(CMessageHead& rstMsgHead, char* pszMsgBody, int32_t iBodyLength);
int32_t process_response_get_role_info(CMessageHead& rstMsgHead, char* pszMsgBody, int32_t iBodyLength);
int32_t process_notify_load_player_completed(CMessageHead& rstMsgHead, char* pszMsgBody, int32_t iBodyLength);


## 创建角色
1. 功能图

2. CPbMsgRequestCreateRole 结构体信息

//MSG_LOGIC_CREATE_ROLE 0x2020
message CPbMsgRequestCreateRole
{
required string m_szRoleName = 1;
required int32 m_iSirdarID = 2;
optional string m_szFBAccount = 3;
}

3. process_request_create_role接口实现
  MSG_LOGIC_CREATE_ROLE
  `int32_t CPlayer::process_request_create_role(CMessageHead& rstMsgHead, char* pszMsgBody, int32_t iBodyLength)`
  1. 未创建角色状态判断 
  2. 定时器判断
    目的防止客户端还在创建过程中,没有返回给客户端,但是客户端又重新创建。
  3. 填充玩家信息
  4. 设置定时器
4. ProcessRequestCreateRole
  SS_MSG_CREATE_ROLE
  `int32_t CRoleProcessor::ProcessRequestCreateRole(int32_t iServerID, CMessageHead& rstMsgHead, char* pszMsgBody, int32_t iBodyLength)`

  1. 向数据库写入角色信息
      **注意:** 防止SQL非法字符注入,
    ```
char szEscapeName[max_role_name_length+max_role_name_length+1] = {0};
        MakeRealEscapeString(szEscapeName, stReqBody.m_stInfo.m_stRoleBrief.m_szRoleName, strlen(stReqBody.m_stInfo.m_stRoleBrief.m_szRoleName));
    ```
  2. 同步插入
    ```
    int32_t CProcessor::FormatAndExecuteSQLSync(const char* szFormat,...)
    {
        va_list vaList;
        va_start(vaList,szFormat);
        int32_t iRet = FormatSQLString(szFormat, vaList);
        va_end(vaList);
        
        if (success != iRet)
        {
          return fail;
        }
        
        return m_stMySql.execute(&m_szSQL[0]);
    }
    ```
    因为在玩家创建角色过程中,我们关注玩家的返回结果。创建玩家账号,和玩家角色信息。创建角色信息失败,自然也要删除之前创建的账号信息。之后可以给新玩家,赠送道具什么的。整个创建角色过程中,判断是否有超时。
  3. 响应

stRspBody.m_nResultID = result_id_success;
stRspBody.m_stInfo = stReqBody.m_stInfo;
return SendResponse(iServerID, rstMsgHead, stRspBody);

到此玩家创建角色结束。
5. process_response_create_role  
SS_MSG_CREATE_ROLE
解除定时器
6. process_request_get_role_info
获取之前生成一个FlagKey

m_lRoleFlagKey = now_msec();
CRequstGetRoleInfo stReqBody;
stReqBody.m_lRoleFlagKey = m_lRoleFlagKey;
send_request_to_gamedb(&stReqBody, SS_MSG_GET_ROLE_INFO, rstMsgHead.m_iMessageSequence);
return success;

7.process_response_get_role_info

7. 获取gamedb中创建角色信息
SS_MSG_GET_ROLE_INFO
`irtual void Excuting(int32_t iServerID, CMessageHead& rstMsgHead, char* pszMsgBody, int32_t iBodyLength);`

接口实现
  ```
 void CGetRoleCommand::Excuting(int32_t iServerID, CMessageHead& rstMsgHead, char* pszMsgBody, int32_t iBodyLength)
{
  CRequestGetRoleInfo stMsgBody;
  if (!stMsgBody.ParseFromArray(pszMsgBody, iBodyLength))
  {
      return;
  }
  CResponseGetRoleInfo stRspBody;
  stRspBody.m_nResultID = GetProcessor()->LoadPlayerDataFromDB(GetPlayer());

  if  (result_id_success == stRspBody.m_nResultID)
  {
      stRspBody.m_stInfo = GetPlayer()->m_stRole;
  }
  SendResponse(iServerID, rstMsgHead, stRspBody);
  
  if (result_id_success == stRspBody.m_nResultID)
  {
      GetProcessor()->SendPlaterDataToLogicServer(GetPlayer());
      GetProcessor()->NotifyMessageToPlayer(GetPlayer()->get_group(), GetPalyer()->get_uin(), SS_MSG_NOTIFY_LOAD_PLAYER_COMPLETED, &stMsgBody);
  }
}
  1. process_notify_load_player_completed
    SS_MSG_NOTIFY_LOAD_PLAYER_COMPLETED
    检查状态是否同步,检查和更新玩家数据信息。
    int32_t CPlayer::process_notify_load_player_completed(CMessageHead& rstMsgHead, char* pszMsgBody, int32_t iBodyLength)
    {
      CNotifyLoadPlayerComplete stMsgBody;
      if (!stMsgBody.ParseFromArray(pszMsgBody, iBodyLength))
      {  
        return fail;
      }
      
      if (stMsgBody.m_lRoleFlagKey != m_lRoleFlagKey)
      {
          return fail;
      }
      .
      .
      .
      google::protobuf::MessageLite* pstBody = NULL;
      return send_notify_to_client(pstBody, MSG_LOGIC_NOTIFY_LOAD_PLAYER_COMPLETED);
    }  
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容