玩家上线 //------------------c2s_login------------------------- bool GameChannel::OnLogin(void* data, int len) { UserInfo* info = (UserInfo*)data; m_asyndb->getUserID(&m_on_getUserID ,info->userName); m_pUserInfo = new UserInfo; strcpy(m_pUserInfo->userPwd, info->userPwd); return true; } 1.获得用户ID 根据ID判断用户是否存在,即如果ID == -1就认为用户不存在 void GameChannel::on_getUserID(int id) { if(-1 == id) { LoginEnum ret = LoginUserNotExist; send_cmd(s2c_login, &ret, sizeof(LoginEnum)); return; } m_pUserInfo->userID = m_user_id = id; m_asyndb->getUserInfo(&m_on_getUserInfo, m_user_id); } 2.根据用户提供的密码和数据库的密码进行比较看是否正确 void GameChannel::on_getUserInfo(UserInfo info) { if(0 == strcmp(info.userPwd, m_pUserInfo->userPwd)) { LoginEnum ret = LoginSuccess; send_cmd(s2c_login, &ret, sizeof(LoginEnum)); send_actors(m_user_id); } else { LoginEnum ret = LoginPasswordOrUserError; send_cmd(s2c_login, &ret, sizeof(LoginEnum)); } } //---------------------根据以上信息发送用户不存在或者密码不正确----------------------------------- //---------------------登录成功发送角色列表---------------------------- 如果验证密码是正确的,就发送用户下的角色信息 send_json(L"角色列表", jsonOutputStream.str().c_str()); //---------------------------c2s_select_actor(选择其中一个角色)---------------------------------- void GameChannel::on_getActorStat(bool isOnline)//查看玩家是否在线 { //如果在线 直接提示 if(isOnline) { //...提示该玩家另一处登录 //将该玩家踢下线。 m_share->kick_player(m_actor_id); } m_asyndb->setActorStat(m_actor_id, true);//设置玩家在线状态 m_asyndb->getActorInfoEx(&m_on_getActorInfoEx, m_actor_id); } //---------------------------获取玩家的详细信息------------------------ send_cmd(s2c_local_player_info, &info, sizeof(info));//向客户端发送本地玩家信息 //----------------------------玩家进入map------------------------------ m_map->gs2msData(gs2ms_add_player, m_channel_id, (void*)ss.str().c_str(), ss.str().size()); else if(gs2ms_add_player == pkt.cmd) { auto ply = new PlayerChannel(); ply->send_ms2gs_data = [this](int cmd, int channel_id, void* data, int len) { MapPkt pkt; pkt.cmd = cmd; pkt.channel_id = channel_id; char* p = new char[len]; memcpy(p, data, len); pkt.data = p; pkt.len = len; #ifdef BOOST_LOCKFREE while(1) { if(m_quePkts2.push(pkt)) break; else boost::this_thread::interruptible_wait(1); } #else std::lock_guard<std::mutex> lock(m_queue_mutex); m_quePkts.push(pkt); #endif }; ply->initMap(this);//给playerchannel中设置地图信息 //加到地图中,但是并未激活该玩家 int id = ply->OnPlayerEnter(pkt.data, pkt.len); m_PlayerChannels[id] = ply; add_player(id); //此时向客户端发送玩家进入地图消息,此时玩家尚未激活 } //-------------------------激活玩家----------------------------------- void Map::activate_player(int mapChannelId) //激活玩家 { auto plchannel = m_PlayerChannels[mapChannelId]; if(!plchannel->isActive) plchannel->isActive = true; else return; // pos2d& mpos = m_spBase->getMapPos(plchannel->tgtPos); set_map_coll(mpos.x, mpos.y, true); m_roles_mpos_mgr.add(mpos.x, mpos.y, plchannel->objId, plchannel); //在新进入块中通知 pos2d newBlockPos = {plchannel->block_x, plchannel->block_y}; notify_block(pos2d(), newBlockPos, plchannel, true);//通知 //让玩家上线就能看到所有附近角色的动作。 m_map_blocks[plchannel->block_x][plchannel->block_y].add(plchannel); if(plchannel->actInfoEx->pet) { if(plchannel->actInfoEx->petinfo.cur_hp <= 0) { return; } PetObj* pet = (PetObj*)plchannel->pet; pet = new PetObj(); pet->owner = plchannel; plchannel->pet = pet; //pet->objId.id; pet->objId.type = ObjID_Pet; pet->stat.level = plchannel->actInfoEx->petinfo.level; wcscpy(pet->name, plchannel->actInfoEx->petinfo.name); pet->nBodyID = plchannel->actInfoEx->petinfo.nBodyID; pet->typeInfo = m_monster_type_infos[pet->nBodyID]; pet->stat.cur_hp = plchannel->actInfoEx->petinfo.cur_hp; pet->stat.max_hp = plchannel->actInfoEx->petinfo.max_hp; pet->stat.cur_exp = plchannel->actInfoEx->petinfo.cur_exp; pet->stat.max_exp = plchannel->actInfoEx->petinfo.max_exp; std::deque<pos2d> pos;// = {0, 0}; pos2d mpos = GetMapPos(plchannel->tgtPos); Round(1, mpos, pos); if(pos.empty()) { delete plchannel->pet; // plchannel->pet = nullptr; } // pos2d mpos = GetMapPos(pos.front()); if(m_spNPCmgr->addNPC(pet, pos.front())) plchannel->isCarryPet = true; else { delete plchannel->pet; // plchannel->pet = nullptr; } } } //----------------------------------------此时玩家算是真正的进入地图了-------------------------------------------