def enterOneTable(self, userId, shadowRoomId, tableId): '''指定桌子坐下 Returns False: 重试超过次数 ''' if ftlog.is_debug(): ftlog.debug("<< |userId, roomId, shadowRoomId, tableId", userId, self.roomId, shadowRoomId, tableId, caller=self) if tyconfig.getRoomDefine(shadowRoomId).tableCount == 1: return tableId for _ in xrange(5): # 这张桌子有可能正在分配座位,如果取桌子失败,需要休眠后重试 result = roomdao.DaoTableScore.removeTableScore( shadowRoomId, tableId) if ftlog.is_debug(): ftlog.debug("after ZREM tableId", "|userId, shadowRoomId, tableId, result:", userId, shadowRoomId, tableId, result, caller=self) if result == 1: return tableId ftcore.sleep(1) return 0
def _initCandidateRoomIdsByGameId(cls, gameId): roomids = {'': []} for bigRoomId in tyconfig.getAllBigRoomIds(): roomDef = tyconfig.getRoomDefine(bigRoomId) playMode = roomDef.configure.get('playMode', '') ismatch = roomDef.configure.get('ismatch', 0) if ismatch == 0: sortVal = roomDef.configure.get('quickIndex', 0) if not playMode in roomids: roomids[playMode] = [] roomids[playMode].append( [tyconfig.getControlRoomIds(bigRoomId)[0], sortVal]) croomids = {} allids = [] for k, v in roomids.items(): v.sort(key=lambda x: x[1]) rids = [x[0] for x in v] croomids[k] = rids allids.extend(rids) ftlog.debug('_initCandidateRoomIds->', gameId, k, '=', croomids[k]) allids.sort() croomids['_all_'] = allids ftlog.debug('_initCandidateRoomIds->', gameId, '_all_', '=', croomids['_all_']) return croomids
def isFriendRoom(roomId): if roomId <= 0: return False roomType = tyconfig.getRoomDefine(roomId).configure tableType = roomType.get('tableType', 'normal') return tableType == 'create'
def _canQuickEnterRoom(cls, userId, gameId, roomId, isOnly): try: chip = hallrpcutil.getChip(userId) if ftlog.is_debug(): ftlog.debug(tyconfig.getRoomDefine(roomId).configure) roomConfig = tyconfig.getRoomDefine(roomId).configure if ftlog.is_debug(): ftlog.debug('userId =', userId, 'minCoin =', roomConfig.get('minCoin'), 'maxCoin =', roomConfig.get('maxCoin'), 'minCoinQS =', roomConfig.get('minCoinQS'), 'maxCoinQS =', roomConfig.get('maxCoinQS'), 'chip =', chip, 'isOnly =', isOnly) if isOnly: minCoinQs = roomConfig['minCoin'] maxCoinQs = roomConfig['maxCoin'] else: minCoinQs = roomConfig['minCoinQS'] maxCoinQs = roomConfig['maxCoinQS'] ismatch = roomConfig.get('ismatch') if ismatch or minCoinQs <= 0: return TYRoom.ENTER_ROOM_REASON_NOT_QUALIFIED if ftlog.is_debug(): ftlog.debug('roomId =', roomId, 'minCoinQs =', minCoinQs, 'maxCoinQs =', maxCoinQs, 'chip =', chip, caller=cls) if chip < minCoinQs: return TYRoom.ENTER_ROOM_REASON_LESS_MIN if maxCoinQs > 0 and chip >= maxCoinQs: return TYRoom.ENTER_ROOM_REASON_GREATER_MAX return TYRoom.ENTER_ROOM_REASON_OK except Exception as e: ftlog.error(e) return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
def fetchAllRoomInfos(uid, gid, playMode): ''' 获取所有的现金桌房间信息 ''' if _DEBUG: debug('fetchAllRoomInfos->', uid, gid, playMode) roomInfos = [] if playMode: ucount_infos = tybireport.getRoomOnLineUserCount(gid, True) bigRoomIds = tyglobal.bigRoomIdsMap().keys() bigRoomIds.sort() if _DEBUG: debug('bigRoomIds->', uid, gid, bigRoomIds) for bigRoomId in bigRoomIds: roomDef = tyconfig.getRoomDefine(bigRoomId) roomConfig = roomDef.configure if roomConfig.get('playMode', None) == playMode \ and (not roomConfig.get('ismatch', 0)) \ and (not roomConfig.get(MFTDefine.IS_CREATE, 0)): # 有playMode 非比赛 非自建桌 roomDesc = {} roomDesc["play_mode"] = roomConfig["playMode"] roomDesc["min_coin"] = roomConfig[MTDefine.MIN_COIN] roomDesc["max_coin"] = roomConfig[MTDefine.MAX_COIN] roomDesc["max_table_coin"] = roomConfig.get( MTDefine.MAX_TABLE_COIN, roomDesc["max_coin"]) roomDesc["base_chip"] = roomConfig["tableConf"]["base_chip"] roomDesc["service_fee"] = roomConfig["tableConf"][ "service_fee"] roomDesc["maima"] = roomConfig["tableConf"].get("maima", 0) roomDesc["macount"] = roomConfig["tableConf"].get("macount", 0) roomDesc["laizi"] = roomConfig["tableConf"].get("laizi", 0) roomNameDesc = roomConfig['name'] roomTaskDesc = roomConfig['tableConf'][ 'taskDesc'] if 'taskDesc' in roomConfig['tableConf'] else '' playerCount = ucount_infos[1].get(str(roomDef.bigRoomId), 0) ftlog.debug('ucount_infos:', ucount_infos[1], ' bigRoomId:', roomDef.bigRoomId, ' playerCount:', playerCount) roomInfos.append([ bigRoomId, playerCount, roomNameDesc, roomTaskDesc, "", roomDesc ]) return roomInfos
def _chooseCreateRoom(cls, userId, gameId, playMode, playerCount=4, hasRobot=0, itemId=None): '''服务端为玩家选择要创建的房间''' candidateRoomIds = MajiangQuickStartCoin._getCandidateRoomIds( gameId, playMode) ftlog.debug("MajiangCreateTable._chooseCreateRoom:", candidateRoomIds, ' playMode=', playMode, ' playerCount=', playerCount, ' hasRobot=', hasRobot) for roomId in candidateRoomIds: roomConfig = tyconfig.getRoomDefine(roomId).configure tableConf = roomConfig.get('tableConf', {}) if roomConfig.get(MFTDefine.IS_CREATE, 0) \ and (tableConf.get(MTDefine.MAXSEATN, 4) == playerCount) \ and (roomConfig.get(MTDefine.HAS_ROBOT, 0) == hasRobot): roomItemId = roomConfig.get(MFTDefine.CREATE_ITEM, 0) if not hasRobot and itemId and (itemId != roomItemId): ftlog.debug( 'MajiangCreateTable.check playMode ok, hasRobot ok, but fangKa item no ok, curRoomConsume:', roomItemId, ' findRoomConsume:', itemId) continue ret = cls._canQuickEnterCreateRoom(userId, gameId, roomId) ftlog.debug("MajiangCreateTable.check roomId, ret:", roomId, ret, caller=cls) if ret == TYRoom.ENTER_ROOM_REASON_OK: return roomId, TYRoom.ENTER_ROOM_REASON_OK else: ftlog.debug('_chooseCeateRoom roomConf:', roomConfig) return 0, TYRoom.ENTER_ROOM_REASON_LESS_MIN
def _onEnterRoomFailed(cls, msg, checkResult, userId, gameId, clientId, roomId=0, playMode=''): ''' 进入房间失败回调函数 playMode为'',则进房间失败不用在帮用户选择房间 ''' ftlog.warn("|userId, reason, roomId:", userId, checkResult, roomId, caller=cls) # 调用最小房间金币不够充值提醒的todotask if not roomId: roomId = msg.getParam('candidateRoomId', 0) if checkResult == TYRoom.ENTER_ROOM_REASON_LESS_MIN or checkResult == 104: product, _ = pluginCross.mj2productselector.selectLessbuyProduct( userId, clientId, roomId) if product: chooseRoomId, _ = cls._chooseRoom(userId, gameId, playMode) pluginCross.mj2todotask.sendQuickStartNeedCharge( gameId, userId, product, chooseRoomId) if checkResult == TYRoom.ENTER_ROOM_REASON_GREATER_MAX and playMode: chooseRoomId, checkResult = cls._chooseRoom( userId, gameId, playMode) if checkResult == TYRoom.ENTER_ROOM_REASON_OK: roomConfig = tyconfig.getRoomDefine(chooseRoomId).configure nameDesc = roomConfig['tableConf'][ 'nameDesc'] if 'nameDesc' in roomConfig[ 'tableConf'] else '富豪' tipStr = '您已是%s,快去%s找角搓麻吧' % (nameDesc, roomConfig['name']) pluginCross.mj2todotask.sendQuickStartJumpRoom( gameId, userId, chooseRoomId, playMode, tipStr)
def sendChangeBetsConfReqToAllShadowRoom(cls, ctrlRoomId, betsConf): for shadowRoomId in tyconfig.getRoomDefine(ctrlRoomId).shadowRoomIds: cls.sendChangeBetsConfReq(shadowRoomId, betsConf)
def getBestTableId(self, userId, shadowRoomId, exceptTableId=None): '''原子化从redis里获取和删除评分最高的桌子Id Return: None: tableScores 队列为空, 所有桌子都在分配座位中 ''' def getBestTableIdFromRedis(shadowRoomId): '''从redis里取出并删除一个评分最高的牌桌 ''' tableId, tableScore = 0, 0 datas = roomdao.DaoTableScore.getBestTableId(shadowRoomId) if datas and len(datas) == 2: tableId, tableScore = datas[0], datas[1] return tableId, tableScore if ftlog.is_debug(): ftlog.debug("<<", "|shadowRoomId, exceptTableId:", shadowRoomId, exceptTableId, caller=self) pigTables = [] tableId = 0 for _ in xrange(5): # 所有桌子有可能正在分配座位,如果取桌子失败,需要休眠后重试 if tyconfig.getRoomDefine(shadowRoomId).tableCount == 1: tableId = shadowRoomId * 10000 + 1 tableScore = 100 else: tableId, tableScore = getBestTableIdFromRedis( shadowRoomId) # 从redis取一个牌桌 # 该牌桌被客户端指定排除了,另外再取一个牌桌 if exceptTableId and tableId and exceptTableId == tableId: tableId1, tableScore1 = getBestTableIdFromRedis( shadowRoomId) # 把之前从redis取出的牌桌加回redis self._updateTableScore(shadowRoomId, tableScore, tableId, force=True) tableId, tableScore = tableId1, tableScore1 if ftlog.is_debug(): ftlog.debug( 'getBestTableId shadowRoomId, tableId, tableScore=', shadowRoomId, tableId, tableScore) if tableId: if tyglobal.gameIns().isWaitPigTable(userId, self, tableId): pigTables.append([shadowRoomId, tableScore, tableId]) tableId = 0 continue else: break else: ftcore.sleep(0.2) if ftlog.is_debug(): ftlog.debug('getBestTableId pigTables=', pigTables) if pigTables: for pig in pigTables: self._updateTableScore(pig[0], pig[1], pig[2], False) return tableId
def _remoteTableLeave(self, userId, reason=LEAVE_ROOM_REASON_ACTIVE, locList=None): if not locList: locList = pluginCross.onlinedata.getOnLineLocList(userId) if ftlog.is_debug(): ftlog.debug("<< |roomId, userId: ", self.roomId, userId, "|locList:", locList, caller=self) for loc in locList: onlineRoomId, onlineTableId = loc[0], loc[1] onlineGameId = tyconfig.getRoomGameId(onlineRoomId) if onlineGameId <= 0: # 房间已经无效 pluginCross.onlinedata.removeOnLineLoc(userId, onlineRoomId, onlineTableId) continue if onlineGameId != tyglobal.gameId(): # 不隶属与当前的游戏,不处理 continue ctrlRoomId = tyconfig.getRoomDefine(onlineRoomId).parentId if ctrlRoomId == self.roomId: ftlog.hinfo( "table leave |userId, onlineRoomId, onlineTableId:", userId, onlineRoomId, onlineTableId, caller=self) clientId = tysessiondata.getClientId(userId) tableLeaveResultStr = self.queryTableManageTableLeaveReq( userId, onlineRoomId, onlineTableId, clientId, {"reason": reason}) if not tableLeaveResultStr: ftlog.warn( "table leave timeout, |userId, onlineRoomId, onlineTableId, reason:", userId, onlineRoomId, onlineTableId, reason, caller=self) # 玩家离开牌桌只返回成功 # tableLeaveResult = json.loads(tableLeaveResultStr) # ftlog.debug("|tableLeaveResult:", tableLeaveResult) # if tableLeaveResult.get("error"): # return False # if not tableLeaveResult["result"]["isOK"]: # return False if ftlog.is_debug(): locList = pluginCross.onlinedata.getOnLineLocList(userId) ftlog.debug(">> |roomId, userId: ", self.roomId, userId, "|locList:", locList, caller=self) # return True return True
def onCmdQuickStart(cls, msg, userId, gameId, roomId, tableId, playMode, clientId): '''UT server中处理来自客户端的quick_start请求 Args: msg cmd : quick_start if roomId == 0: 表示快速开始,服务器为玩家选择房间,然后将请求转给GR if roomId > 0 and tableId == 0 : 表示玩家选择了房间,将请求转给GR if roomId > 0 and tableId == roomId * 10000 : 表示玩家在队列里断线重连,将请求转给GR if roomId > 0 and tableId > 0: if onlineSeatId > 0: 表示玩家在牌桌里断线重连,将请求转给GT else: 表示玩家选择了桌子,将请求转给GR ''' assert isinstance(userId, int) and userId > 0 assert isinstance(roomId, int) and roomId >= 0 assert isinstance(tableId, int) and tableId >= 0 if ftlog.is_debug(): ftlog.debug("<< |clientId:", clientId, "|userId, roomId, tableId:", userId, roomId, tableId, "|gameId, playMode:", gameId, playMode, caller=cls) # 单开, 无论何时quick_start进入都检查loc if not pokerconf.isOpenMoreTable(clientId): truelocs, _onTableIds = pluginCross.onlinedata.checkUserLoc( userId, clientId, gameId) if ftlog.is_debug(): ftlog.debug('old client, checkUserLoc->', truelocs, caller=cls) for loc in truelocs: lgameId, lroomId, ltableId, lseatId = loc.split('.') lgameId, lroomId, ltableId, lseatId = ftstr.parseInts( lgameId, lroomId, ltableId, lseatId) # if gameId == 60 and lgameId != gameId and lroomId > 0: # try: # ftlog.info("gtServerRpc.doPlayerLeave:", lgameId, userId, lroomId, ltableId, lseatId) # gtServerRpc.doPlayerLeave(lgameId, userId, lroomId, ltableId, lseatId, clientId) # except Exception as e: # ftlog.error(e) if lgameId == gameId and lroomId > 0: ftlog.debug('onCmdQuickStart re-connected |userId, loc:', userId, loc, '|roomId, tableId:', roomId, tableId, caller=cls) roomId = lroomId tableId = ltableId msg.setParam('isReConnected', True) if ftlog.is_debug(): ftlog.debug('old client, reset roomId, tableId->', roomId, tableId, caller=cls) if roomId == 0: # 玩家点击快速开始 chosenRoomId, checkResult = cls._chooseRoom( userId, gameId, playMode) ftlog.debug("after choose room", "|userId, chosenRoomId, checkResult:", userId, chosenRoomId, checkResult, caller=cls) if checkResult == TYRoom.ENTER_ROOM_REASON_OK: TYRoomMixin.queryRoomQuickStartReq(msg, chosenRoomId, 0) # 请求转给GR else: candidateRoomIds = cls._getCandidateRoomIds(gameId, playMode) if candidateRoomIds: rid = candidateRoomIds[0] msg.setParam('candidateRoomId', rid) cls._onEnterRoomFailed(msg, checkResult, userId, clientId, roomId) return bigRoomId = tyconfig.getBigRoomId(roomId) ftlog.debug('bigRoomId:', bigRoomId) if bigRoomId == 0: cls._onEnterRoomFailed(msg, TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR, userId, clientId, roomId) return if tyconfig.getRoomGameId(bigRoomId) != gameId: cls._onEnterRoomFailed(msg, TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR, userId, clientId, roomId) return if tableId == 0: # 玩家只选择了房间 # if gameId == 6 and roomId != bigRoomId: # ctrlRoomId = tyconfig.getRoomDefine(roomId).parentId or roomId # queryRoomId = roomId # else: ctrRoomIds = tyconfig.getControlRoomIds(bigRoomId) ctrlRoomId = ctrRoomIds[userId % len(ctrRoomIds)] queryRoomId = ctrlRoomId reason = cls._canQuickEnterRoom(userId, gameId, ctrlRoomId, 1) if reason == TYRoom.ENTER_ROOM_REASON_OK: # if gameId == 6: # TYRoomMixin.queryRoomQuickStartReq(msg, queryRoomId, 0) # 请求转给GR或GT # else: TYRoomMixin.queryRoomQuickStartReq(msg, ctrlRoomId, 0) # 请求转给GR或GT elif reason == TYRoom.ENTER_ROOM_REASON_LESS_MIN or reason == TYRoom.ENTER_ROOM_REASON_GREATER_MAX: # if gameId == 6: # innerTable = msg.getParam("innerTable", 0) # innerTable 区分不同版本弹窗 # if innerTable == 1: # roomDef = tyconfig.getRoomDefine(ctrlRoomId) # playMode = roomDef.configure.get('playMode', None) # if ftlog.is_debug(): # ftlog.debug('enter_less_min userId=', userId, 'roomId=', ctrlRoomId, 'msg=', msg, 'playmode=', playMode) # msgpack = MsgPack() # msgpack.setCmd("quick_start") # msgpack.setParam("userId", userId) # msgpack.setParam("gameId", gameId) # msgpack.setParam("clientId", clientId) # msgpack.setParam("innerTable", 1) # msgpack.setParam("apiver", msg.getParam("apiver", 3.7)) # cls.onCmdQuickStart(msgpack, userId, gameId, 0, 0, playMode, clientId) # if ftlog.is_debug(): # ftlog.debug('reenter_less_min userId=', userId, 'roomId=', ctrlRoomId, 'msgpack=', msgpack.pack()) # else: # cls._onEnterRoomFailed(msg, reason, userId, clientId, roomId) # else: cls._onEnterRoomFailed(msg, reason, userId, clientId, roomId) else: cls._onEnterRoomFailed(msg, reason, userId, clientId, roomId) return if tableId == roomId * 10000: # 玩家在队列里断线重连 TYRoomMixin.queryRoomQuickStartReq(msg, roomId, tableId) # 请求转给GR return onlineSeat = pluginCross.onlinedata.getOnLineLocSeatId( userId, roomId, tableId) if onlineSeat: if onlineSeat == tyconfig.getRoomDefine( roomId).configure['tableConf']['maxSeatN'] + 1: # 牌桌里旁观的玩家断线重连,请求转给GT TYRoomMixin.sendTableCallObserveReq(userId, roomId, tableId, clientId) else: # 牌桌里坐着的玩家断线重连,请求转给GT # TYRoomMixin.querySitReq(userId, roomId, tableId, clientId) # GT人多时会有超时异常 TYRoomMixin.sendSitReq(userId, roomId, tableId, clientId) else: # 玩家选择了桌子, shadowRoomId = tyconfig.getTableRoomId(tableId) ctrRoomId = tyconfig.getRoomDefine(shadowRoomId).parentId TYRoomMixin.queryRoomQuickStartReq( msg, ctrRoomId, tableId, shadowRoomId=shadowRoomId) # 请求转给GR
def _canQuickEnterRoom(cls, userId, gameId, roomId, isUserChoosed, where='roomlist'): ''' 是用户选择的,校验用户金币是否在[minCoin, maxCoin]之间 牌桌内的快速开始,校验用户的金币是否在[minCoin, maxTableCoin]之间 是服务推荐的,校验用户的金币是否在[minCoinQS, maxCoinQS]之间 房间的minCoin/maxCoin可以重叠 minCoinQS/maxCoinQS最好不要重叠 ''' if isFriendRoom(roomId): return TYRoom.ENTER_ROOM_REASON_NOT_QUALIFIED try: chip = hallrpcutil.getChip(userId) ftlog.debug('MajiangQuickStartCoin:', tyconfig.getRoomDefine(roomId).configure, caller=cls) roomConfig = tyconfig.getRoomDefine(roomId).configure ismatch = roomConfig.get('ismatch') isBigMatch = False if roomConfig.get('typeName', '') == 'majiang_bigmatch': isBigMatch = True if ismatch and not isBigMatch: return cls._canQuickEnterMatch(userId, gameId, roomId, chip) if isUserChoosed: minCoinQs = roomConfig[MTDefine.MIN_COIN] maxCoinQs = roomConfig[MTDefine.MAX_COIN] if where == 'table': maxCoinQs = roomConfig.get(MTDefine.MAX_TABLE_COIN, maxCoinQs) ftlog.debug('quick_start from table, maxCoinQS:', maxCoinQs) else: minCoinQs = roomConfig[MTDefine.MIN_COIN_QS] maxCoinQs = roomConfig[MTDefine.MAX_COIN_QS] ftlog.debug('MajiangQuickStartCoin roomId:', roomId, 'minCoinQs:', minCoinQs, 'maxCoinQs:', maxCoinQs, 'chip:', chip, caller=cls) if chip < minCoinQs and (minCoinQs != -1): return TYRoom.ENTER_ROOM_REASON_LESS_MIN if maxCoinQs > 0 and chip > maxCoinQs: return TYRoom.ENTER_ROOM_REASON_GREATER_MAX return TYRoom.ENTER_ROOM_REASON_OK except Exception as e: ftlog.error(e) return TYRoom.ENTER_ROOM_REASON_INNER_ERROR
def onCmdQuickStart(cls, msg, userId, gameId, roomId, tableId, playMode, clientId): '''UT server中处理来自客户端的quick_start请求 Args: msg cmd : quick_start if roomId == 0: 表示快速开始,服务器为玩家选择房间,然后将请求转给GR if roomId > 0 and tableId == 0 : 表示玩家选择了房间,将请求转给GR if roomId > 0 and tableId == roomId * 10000 : 表示玩家在队列里断线重连,将请求转给GR if roomId > 0 and tableId > 0: if onlineSeatId > 0: 表示玩家在牌桌里断线重连,将请求转给GT else: 表示玩家选择了桌子,将请求转给GR ''' assert isinstance(userId, int) and userId > 0 assert isinstance(roomId, int) and roomId >= 0 assert isinstance(tableId, int) and tableId >= 0 ftlog.debug("MajiangQuickStartCoin.onCmdQuickStart clientId:", clientId, " userId:", userId, " roomId:", roomId, " tableId:", tableId, " gameId:", gameId, " playMode:", playMode) gTimeStamp = pluginCross.mj2dao.getQuickStartCoinTimeStamp(userId) cTimeStamp = time.time() ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart gTimeStamp:', gTimeStamp, 'cTimeStamp:', cTimeStamp) # 判断两次quick_start间隔是否超过5秒,没有超过5秒,则不匹配 if cTimeStamp - gTimeStamp < 3: ftlog.debug( 'MajiangQuickStartCoin.onCmdQuickStart cTimeStamp - gTimeStamp < 5 !!!' ) return # 单开, 无论何时quick_start进入都检查loc if not pokerconf.isOpenMoreTable(clientId): truelocs, _onTableIds = pluginCross.onlinedata.checkUserLoc( userId, clientId, gameId) ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart checkUserLoc:', truelocs, caller=cls) for loc in truelocs: lgameId, lroomId, ltableId, lseatId = loc.split('.') lgameId, lroomId, ltableId, lseatId = ftstr.parseInts( lgameId, lroomId, ltableId, lseatId) if lgameId == gameId and lroomId > 0: roomId = lroomId tableId = ltableId ftlog.debug( 'MajiangQuickStartCoin.onCmdQuickStart old client roomId:', roomId, ' tableId:', tableId, caller=cls) if roomId == 0: # 玩家点击快速开始 chosenRoomId, checkResult = cls._chooseRoom( userId, gameId, playMode) ftlog.info( "MajiangQuickStartCoin.onCmdQuickStart after choose room userId:", userId, " chosenRoomId:", chosenRoomId, " checkResult:", checkResult, caller=cls) if checkResult == TYRoom.ENTER_ROOM_REASON_OK: # 找到合适的房间 根据roomId找到合适的table TYRoomMixin.queryRoomQuickStartReq(msg, chosenRoomId, 0) # 请求转给GR cls.saveQuickStartTime(userId, gameId, cTimeStamp) else: candidateRoomIds = cls._getCandidateRoomIds(gameId, playMode) if candidateRoomIds: rid = candidateRoomIds[0] msg.setParam('candidateRoomId', rid) cls._onEnterRoomFailed(msg, checkResult, userId, clientId, roomId) return if tableId == 0: # 玩家只选择了房间 bigRoomId = tyconfig.getBigRoomId(roomId) ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart bigRoomId:', bigRoomId) if bigRoomId == 0: cls._onEnterRoomFailed(msg, TYRoom.ENTER_ROOM_REASON_ROOM_ID_ERROR, userId, gameId, clientId, roomId) return ctrRoomIds = tyconfig.getControlRoomIds(bigRoomId) ctrlRoomId = ctrRoomIds[userId % len(ctrRoomIds)] qsParams = msg.getParam('where', 'roomlist') reason = cls._canQuickEnterRoom(userId, gameId, ctrlRoomId, True, qsParams) ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart reason:', reason, 'ctrRoomIds:', ctrRoomIds, 'ctrlRoomId', ctrlRoomId) if reason == TYRoom.ENTER_ROOM_REASON_OK: TYRoomMixin.queryRoomQuickStartReq(msg, ctrlRoomId, 0) # 请求转给GR或GT cls.saveQuickStartTime(userId, gameId, cTimeStamp) else: cls._onEnterRoomFailed(msg, reason, userId, gameId, clientId, roomId, playMode) return if tableId == roomId * 10000: # 玩家在队列里断线重连 ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart tableId:', tableId) TYRoomMixin.queryRoomQuickStartReq(msg, roomId, tableId) # 请求转给GR cls.saveQuickStartTime(userId, gameId, cTimeStamp) return onlineSeat = pluginCross.onlinedata.getOnLineLocSeatId( userId, roomId, tableId) if onlineSeat: ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart tableId:', tableId) extParam = {} extParam['seatId'] = onlineSeat moParams = msg.getKey('params') for k, v in moParams.items(): if not k in extParam: extParam[k] = v ftlog.debug('extParam=', extParam) TYRoomMixin.querySitReq(userId, roomId, tableId, clientId, extParam) # 玩家断线重连,请求转给GT cls.saveQuickStartTime(userId, gameId, cTimeStamp) else: # 玩家选择了桌子, ftlog.debug('MajiangQuickStartCoin.onCmdQuickStart tableId:', tableId) shadowRoomId = tyconfig.getTableRoomId(tableId) ctrRoomId = tyconfig.getRoomDefine(shadowRoomId).parentId TYRoomMixin.queryRoomQuickStartReq( msg, ctrRoomId, tableId, shadowRoomId=shadowRoomId) # 请求转给GR cls.saveQuickStartTime(userId, gameId, cTimeStamp)