diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index 24998b3f..ee913d4e 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -147,10 +147,68 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) MatchMgr::Instance()->_CMJoin(hdr, msg); return; } - std::vector> join_msgs; + std::shared_ptr join_msg = std::make_shared(); + *join_msg = msg; + std::vector> join_msgs{join_msg}; + auto ip_saddr = hdr.ip_saddr; + auto socket_handle = hdr.socket_handle; auto cb = - [] (std::vector>&) + [ip_saddr, socket_handle, join_msg] (std::vector>& results) { + cs::CMJoin& msg = *join_msg; + if (RoomMgr::Instance()->IsLimitJoin()) { + RoomMgr::Instance()->JoinErrorHandle(msg, 2, socket_handle); + return; + } + int game_times = 0; + RoomType_e self_room_type = GetHumanRoomType(msg, game_times); + if (self_room_type < RT_OldBrid1) { + self_room_type = RT_OldBrid1; + } + time_t register_time = f8::ExtractRegisterTimeFromSessionId(msg.session_id()); + int proto_version = msg.proto_version(); + int channel = f8::ExtractChannelIdFromAccountId(msg.account_id()); + Room* room = RoomMgr::Instance()->GetJoinableRoom + ( + msg, + self_room_type, + game_times, + register_time, + proto_version, + channel + ); + if (!room) { + RoomMgr::Instance()->JoinErrorHandle(msg, 3, socket_handle); + return; + } + Player* hum = room->NewPlayer(); + hum->ProcPreSettlementInfo(msg.pre_settlement_info()); + PlayerMgr::Instance()-> + CreatePlayerByCMJoin(hum, + ip_saddr, + socket_handle, + msg + ); + hum->meta = MetaMgr::Instance()->GetPlayer(msg.hero_id()); + if (!hum->meta) { + hum->meta = MetaMgr::Instance()->human_meta; + } + hum->room = room; + room->AddPlayer(hum); + hum->ProcPrepareItems(msg.prepare_items()); + hum->ProcPrepareItems2(msg.prepare_items2()); + hum->ProcSkillList(msg.skill_list()); + PlayerMgr::Instance()->IncAccountNum(msg.account_id()); + if (JsonDataMgr::Instance()->channel != 0 && + JsonDataMgr::Instance()->channel != channel) { + a8::UdpLog::Instance()->Warning + ("join room channel not match channel:%d account_id:%s", + { + JsonDataMgr::Instance()->channel, + msg.account_id() + }); + } + RoomMgr::Instance()->OnJoinRoomOk(msg, hum); }; SendGetBattleData(join_msgs, cb); }