def doQuickStart(self, msg): """ Note: 1> 由于不同游戏评分机制不同,例如德州会根据游戏阶段评分,所以把桌子评分存到redis里,方便各游戏服务器自由刷新。 2> 为了防止同一张桌子同时被选出来分配座位,选桌时会把tableScore里选出的桌子删除,玩家坐下成功后再添加回去,添回去之前无需刷新该桌子的评分。 3> 玩家自选桌时,可能选中一张正在分配座位的桌子,此时需要休眠后重试,只到该桌子完成分配或者等待超时。 """ assert self.roomId == msg.getParam("roomId") userId = msg.getParam("userId") shadowRoomId = msg.getParam("shadowRoomId") tableId = msg.getParam("tableId") clientId = msg.getParam("clientId") extParams = msg.getKey("params") ftlog.hinfo("doQuickStart->", "userId =", userId, "clientId =", clientId, "roomId =", self.roomId, "shadowRoomId =", shadowRoomId, "tableId =", tableId, "extParams =", extParams) if self.runStatus != self.ROOM_STATUS_RUN: FishQuickStart.onQuickStartFailed( FishQuickStart.ENTER_ROOM_REASON_MAINTENANCE, userId, clientId, self.roomId) return self.quickStartInGR(shadowRoomId, tableId, userId, clientId, extParams)
def quickStartInGT(self, shadowRoomId, tableId, userId, clientId, extParams): isSitDown = self._trySitDown(shadowRoomId, tableId, userId, clientId, extParams) if not isSitDown: FishQuickStart.onQuickStartFailed( FishQuickStart.ENTER_ROOM_REASON_INNER_ERROR, userId, clientId, self.roomId)
def quickStartInGR(self, shadowRoomId, tableId, userId, clientId, extParams): """快速进入GR""" try: if shadowRoomId is None: shadowRoomId = self._choiceTableRoom(userId) table_remote.quickStart(shadowRoomId, tableId, userId, clientId, extParams) except Exception, e: ftlog.error("quickStartInGR error", userId, extParams, traceback.format_exc()) FishQuickStart.onQuickStartFailed(FishQuickStart.ENTER_ROOM_REASON_INNER_ERROR, userId, clientId, self.roomId)
def quickStartInGR(self, shadowRoomId, tableId, userId, clientId, extParams): """ 快速进入房间进程 :param shadowRoomId: 影子房间Id :param tableId: 桌子Id :param userId: 玩家Id :param clientId: 客户端 :param extParams: 扩展参数 """ try: if shadowRoomId is None: shadowRoomId = self._choiceTableRoom(userId) table_remote.quickStart(shadowRoomId, tableId, userId, clientId, extParams) # 访问桌子进程 except Exception, e: ftlog.error("quickStartInGR error", userId, extParams, traceback.format_exc()) FishQuickStart.onQuickStartFailed(FishQuickStart.ENTER_ROOM_REASON_INNER_ERROR, userId, clientId, self.roomId)
def _fetchAllRoomInfos(self, userId, gameId): """ 获取所有房间信息 """ lang = util.getLanguage(userId) testMode = util.getNewbieABCTestMode(userId) recommendRoomId, reason = FishQuickStart._chooseRoom(userId, gameId) if reason != FishQuickStart.ENTER_ROOM_REASON_OK: recommendRoomId = 0 re_roomConf = None if recommendRoomId != 0: re_roomConf = gdata.roomIdDefineMap()[recommendRoomId] if re_roomConf: re_roomConf = re_roomConf.configure ctrlRoomIds = [bigRoomId * 10000 + 1000 for bigRoomId in gdata.gameIdBigRoomidsMap()[gameId]] ctrlRoomIds.sort() ftlog.debug("_fetchAllRoomInfos", userId, gameId, ctrlRoomIds, recommendRoomId, re_roomConf) normalRoomInfos = [] friendRoomInfos = [] matchRoomInfos = [] pointMatchRoomInfos = [] robberyRoomInfos = [] grandPrixRoomInfos = [] poseidonRoomInfos = [] isLimitedVer = util.isVersionLimit(userId) newbieRoomListMode = gamedata.getGameAttr(userId, FISH_GAMEID, ABTestData.newbieRoomListMode) # 新手房间列表模式 isFinishAllRedTask = util.isFinishAllRedTask(userId) clientVersion = gamedata.getGameAttr(userId, FISH_GAMEID, GameData.clientVersion) fpMultipleTestMode = config.getPublic("fpMultipleTestMode") or gamedata.getGameAttr(userId, FISH_GAMEID, ABTestData.fpMultipleTestMode) # 渔场倍率AB测试 for ctlRoomId in ctrlRoomIds: pass return normalRoomInfos, friendRoomInfos, matchRoomInfos, robberyRoomInfos, \ pointMatchRoomInfos, grandPrixRoomInfos, poseidonRoomInfos
def doGetQuickEnterRoom(self, userId, gameId, roomId0, tableId0, kindId): """ 获取快速进入房间信息 """ from newfish.entity.quick_start import FishQuickStart reason = FishQuickStart.ENTER_ROOM_REASON_OK info = u"" if not util.isUsableClientVersion(userId): reason = FishQuickStart.ENTER_ROOM_REASON_VERSION_DISABLE elif game.isShutDown(): reason = FishQuickStart.ENTER_ROOM_REASON_MAINTENANCE if reason != FishQuickStart.ENTER_ROOM_REASON_OK: info = FishQuickStart.getFailedInfo(reason, userId, roomId0) self.sendQuickEnterInfo(gameId, userId, roomId0, tableId0, kindId, reason, info) return isIn, roomId, tableId, _ = util.isInFishTable(userId) if not isIn: if roomId0: # 用户选择了房间,先判断用户自己选的房间能否进入 try: reason = FishQuickStart.canQuickEnterRoom(userId, gameId, roomId0, kindId) if reason == FishQuickStart.ENTER_ROOM_REASON_OK: roomId = roomId0 tableId = tableId0 else: # 用户选择的房间无法进入 roomConf = gdata.getRoomConfigure(roomId0) if roomConf and roomConf.get("typeName") in config.QUICK_START_ROOM_TYPE: # 系统自动分配 roomId, reason = FishQuickStart._chooseRoom(userId, gameId) else: # 非普通房间无法进入 roomId = roomId0 tableId = tableId0 info = FishQuickStart.getFailedInfo(reason, userId, roomId) except Exception as e: roomId, reason = FishQuickStart._chooseRoom(userId, gameId) ftlog.error("doGetQuickEnterRoom error", userId, gameId, roomId0, tableId0, e) else: # 用户不选择房间,点击快速开始,系统自动分配 roomId, reason = FishQuickStart._chooseRoom(userId, gameId) self.sendQuickEnterInfo(gameId, userId, roomId, tableId, kindId, reason, info)
def doQuickStart(self, msg): """ Note: 1> 由于不同游戏评分机制不同,例如德州会根据游戏阶段评分,所以把桌子评分存到redis里,方便各游戏服务器自由刷新。 2> 为了防止同一张桌子同时被选出来分配座位,选桌时会把tableScore里选出的桌子删除,玩家坐下成功后再添加回去,添回去之前无需刷新该桌子的评分。 3> 玩家自选桌时,可能选中一张正在分配座位的桌子,此时需要休眠后重试,只到该桌子完成分配或者等待超时。 """ assert self.roomId == msg.getParam("roomId") userId = msg.getParam("userId") shadowRoomId = msg.getParam("shadowRoomId") tableId = msg.getParam("tableId") clientId = msg.getParam("clientId") ftlog.hinfo(getMethodName(), "->|userId, clientId, roomId, shadowRoomId, tableId:", userId, clientId, self.roomId, shadowRoomId, tableId) if self.runStatus != self.ROOM_STATUS_RUN: FishQuickStart.onQuickStartFailed( FishQuickStart.ENTER_ROOM_REASON_MAINTENANCE, userId, clientId, self.roomId) return if tableId == 0: # 服务器为玩家选择桌子并坐下 _, _, details = bireport.getRoomOnLineUserCount(FISH_GAMEID, True) complete = False roomIds = self.roomDefine.shadowRoomIds # 按VIP等级分桌 vipRoomConf = OrderedDict({6: -3, 3: -6, 1: -8, 0: -10}) vipLevel = hallvip.userVipSystem.getVipInfo(userId).get("level", 0) index = 0 for level in vipRoomConf: if vipLevel >= level: index = vipRoomConf[level] break for roomId in roomIds[index:]: tableCount = self.roomDefine.configure["gameTableCount"] maxSeatN = self.tableConf["maxSeatN"] if details.get(str(roomId)) < int(tableCount * maxSeatN * 0.9): shadowRoomId = roomId complete = True break if not complete: shadowRoomId = choice(self.roomDefine.shadowRoomIds) tableId = self.getBestTableId(userId, shadowRoomId) else: # 玩家自选桌子坐下 assert isinstance(shadowRoomId, int) and gdata.roomIdDefineMap( )[shadowRoomId].bigRoomId == self.roomDefine.bigRoomId tableId = self.enterOneTable(userId, shadowRoomId, tableId) if not tableId: ftlog.error(getMethodName(), "getFreeTableId timeout", "|userId, roomId, tableId:", userId, self.roomId, tableId) return if ftlog.is_debug(): ftlog.info(getMethodName(), "after choose table", "|userId, shadowRoomId, tableId:", userId, shadowRoomId, tableId) extParams = msg.getKey("params") self.querySitReq(userId, shadowRoomId, tableId, clientId, extParams)