GS玩家登录

玩家上线
这个过程看了很多很多次了,这里在看下
客户端打开,服务器收到libevent事件,然后new Channel这个过程都付给他各种指针,然后放到channel容器中
1.客户端发送c2s_login
服务器发送s2c_login
并带以下结果
enum LoginEnum
{
    LoginSuccess,
    LoginPasswordOrUserError,
    LoginUserNotExist,
    LoginUserIsOnline, //用户已在线
};
1.根据用户名查询id,如果没有返回LoginUserNotExist
2.如果有在去查询用户信息,然后匹配密码,如果不正确
发送LoginPasswordOrUserError
成功就发送LoginSuccess
3.登录成功之后发送角色列表
这步走的是json,感觉可以改成结构体,json解析封装太慢

2.客户端发送c2s_select_actor
服务器根据id到数据库获取actorinfoex
{//给客户端发送本地玩家信息s2c_local_player_info,其实就是客户端玩家,其实这个刚知道,其实是通过这个消息发送登录玩家信息
    LocPlayerInfo info;
    InitLocalPlayer(rActorEx, info);
    SendCmd(s2c_local_player_info, &info, sizeof(info));
}
3.将玩家加载到map中
m_pMap->Gs2MsData(gs2ms_add_player, m_nChannelId, (void*)&rActorEx, sizeof(rActorEx));
GameMap专门负责地图的所有东西,和GS之间通过内部协议通信
void Map::Gs2MsData(int cmd, int channel_id, void* data, int len)
{
    MapPkt pkt;
    pkt.channelId = channel_id;
    pkt.data = m_memPool.popPkt(len);//需要拷贝一份内存
    memcpy(pkt.data, data, len);
    pkt.len = len;
    pkt.cmd = cmd;

    PushPkt(pkt);//
}

void ThrTransData::PushPkt(MapPkt Pkt)
{
#ifdef BOOST_LOCKFREE
    for (;;)
    {
        if(m_gs2msPkts2.push(Pkt))
            break;
        boost::this_thread::interruptible_wait(1);
    }
#else
    {
        std::lock_guard<std::mutex> lock(m_mtxGs2Ms);
        m_queGs2MsPkts.push(Pkt);
    }
#endif
};

//...
        else if(gs2ms_add_player == pkt.cmd)//在MS里面还有大量的事情要做,才能进入地图,回头再看
        {
            PlayerChannel* pPC = new PlayerChannel(this);
            //加到地图中,但是并未激活该玩家
            int nChannelId = pPC->OnPlayerEnter(pkt.data, pkt.len);
            m_vecPlayerChannel[nChannelId] = pPC;
            AddPlayer(nChannelId);        
        }
//...


c2s_login  s2c_login
s2c_json  角色列表
c2c_select_actor 
s2c_local_player_info
然后将玩家放到MS中

 

posted @ 2014-11-23 21:44  zzyoucan  阅读(309)  评论(0编辑  收藏  举报