def _doSitDown(self, msg, userId, seatId, clientId): """ 比赛牌桌只有玩家断线重连时才会触发坐下操作,既重新坐回牌桌 """ if seatId != 0: if self.seats[seatId - 1].userId == 0: onlinedata.removeOnlineLoc(userId, self.roomId, self.tableId) ftlog.warn("reconnect user is cleaned from table", "seats =", self.seats) return False elif userId != self.seats[seatId - 1].userId: onlinedata.removeOnlineLoc(userId, self.roomId, self.tableId) ftlog.warn("reconnect user id is not matched", "seats =", self.seats) return False else: ftlog.info("user reconect, userId:", userId) onlinedata.addOnlineLoc(userId, self.roomId, self.tableId, seatId) self.players[seatId - 1].offline = 1 self.players[seatId - 1].clientId = clientId self.players[seatId - 1].lang = util.getLanguage( userId, clientId) self.players[seatId - 1].refreshGunSkin() self._sendTableInfo(userId, seatId) self._updateMatchInfo(userId) self._updateMatchRank(userId) self._updateMatchTask(userId) self.players[seatId - 1].dealEnterTable() self.players[seatId - 1].enterTime = int(time.time()) self.players[seatId - 1].offline = 0 from newfish.game import TGFish event = EnterTableEvent(userId, FISH_GAMEID, self.roomId, self.tableId, seatId, 1) TGFish.getEventBus().publishEvent(event) return True else: for i in range(len(self.seats)): if self.seats[i].userId == userId: ftlog.info("lost user reconect, userId:", userId, "i =", i) onlinedata.addOnlineLoc(userId, self.roomId, self.tableId, i + 1) self.players[i].offline = 1 self.players[i].clientId = clientId self.players[i].lang = util.getLanguage(userId, clientId) self.players[i].refreshGunSkin() self._sendTableInfo(userId, i + 1) self._updateMatchInfo(userId) self._updateMatchRank(userId) self._updateMatchTask(userId) self.players[i].dealEnterTable() self.players[i].enterTime = int(time.time()) self.players[i].offline = 0 from newfish.game import TGFish event = EnterTableEvent(userId, FISH_GAMEID, self.roomId, self.tableId, seatId, 1) TGFish.getEventBus().publishEvent(event) return True
def getTaskInfo(self): """ 获取返回给客户端的任务数据 """ progress = min(self.taskData["progress"], self.taskData["targetNum"]) progress = int(progress) if progress - int(progress) == 0 else progress meProgress = progress - self.helpProgress meProgress = int(meProgress) if meProgress - int(meProgress) == 0 else meProgress taskInfo = {} taskInfo["taskId"] = self.taskConfig["taskId"] taskInfo["isLimitTime"] = self.isLimitTime() taskInfo["shareMode"] = 1 # 1 if not self.isLimitTime() or util.isLocationLimit(self.userId) else 0 taskInfo["progress"] = [int(progress), int(meProgress), self.taskData["targetNum"]] taskInfo["state"] = self.taskData["state"] taskInfodescId = self.taskConfig["desc"] taskInfo["desc"] = config.getMultiLangTextConf(str(taskInfodescId), lang=util.getLanguage(self.userId)) taskInfo["reward"] = self.taskConfig["rewards"] if self.receiveRewards: taskInfo["realReward"] = self.receiveRewards taskInfo["target"] = self.taskConfig["target"] taskInfo["suggestTarget"] = self.taskConfig["suggestTarget"] timeLeft = self.recordStartTime + self.taskInterval - int(time.time()) taskInfo["timeLeft"] = timeLeft if timeLeft >= 0 else self.taskInterval taskInfo["timeLong"] = self.taskInterval taskInfo["failTimeConf"] = self.taskConfig["failTime"] taskInfo["failTime"] = self.taskData["failTime"] # 失败次数 taskInfo["isNextLimitTime"] = self.taskSystem.isNextLimitTime(self.getTaskId()) taskInfo["model"] = TaskModel.Red if util.isNewbieRoom(self.player.table.typeName) and self.taskSystem.taskModel == TaskModel.Main else self.taskSystem.taskModel taskInfo["type"] = self.taskConfig["type"] if self.taskSystem.taskModel in [TaskModel.Red, TaskModel.Main]: taskInfo["index"] = self.taskSystem.allMainTaskIds.index(self.taskId) return taskInfo
def _sendQuestFinished(userId, quest): """发送完成的每日任务""" level = util.getUserLevel(userId) if level < config.getCommonValueByKey("dailyQuestOpenLevel"): return lang = util.getLanguage(userId) mo = MsgPack() mo.setCmd("task") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("action", "finished") mo.setResult("taskId", quest["taskId"]) # if quest["taskType"] == TaskType.CoinNum and quest["des"].find("%s") >= 0: # des = quest["des"] % util.formatScore(quest["targetsNum"]) # elif quest["des"].find("%d") >= 0: # des = quest["des"] % quest["targetsNum"] # else: # des = quest["des"] questDes = config.getMultiLangTextConf(quest["des"], lang=lang) if questDes.find("%s") >= 0: des = questDes % util.formatScore(quest["targetsNum"], lang=lang) elif questDes.find("%d") >= 0: des = questDes % quest["targetsNum"] elif questDes.count("{}") >= 2: des = questDes.format(quest["gunX"], quest["targetsNum"]) else: des = questDes mo.setResult("des", des) router.sendToUser(mo, userId)
def sendLuckyTreeInfo(userId, clientId): """ 发送免费金币摇钱树详情 """ isAppClient = util.isAppClient(userId) # 判断是否为单包客户端 luckyTreeConf = config.getLuckyTreeConf() accelerateTimes, rewardTs, copperCount = getRewardTsAndCopperCount(userId) vipLevel = hallvip.userVipSystem.getUserVip(userId).vipLevel.level vipLimit = luckyTreeConf.get("vipLimit") maxAcceleratetimes = luckyTreeConf.get("maxAcceleratetimes") state = 4 if accelerateTimes < maxAcceleratetimes: if vipLevel >= vipLimit: state = 1 else: state = 3 if isAppClient else 0 else: state = 2 message = MsgPack() message.setCmd("lucky_tree_info") message.setResult("gameId", FISH_GAMEID) message.setResult("userId", userId) message.setResult( "rule", config.getMultiLangTextConf(str(luckyTreeConf.get("rule")), lang=util.getLanguage(userId, clientId))) message.setResult("copperCount", copperCount) message.setResult("state", state) message.setResult("rewardTs", rewardTs) message.setResult("rewardCount", luckyTreeConf.get("rewardCount", 0)) message.setResult("rewardsList", getAllRewardList()) router.sendToUser(message, userId)
def doSendLevelGift(userId, clientId): """ 获取升级礼包数据 """ message = MsgPack() message.setCmd("levelGiftData") message.setResult("gameId", FISH_GAMEID) message.setResult("userId", userId) giftInfo = [] if not util.isVersionLimit(userId) and not util.isPurchaseLimit(userId) and util.isFinishAllNewbieTask(userId): levelGiftConf = config.getLevelGiftConf() gunLv = util.getGunLevelVal(userId, config.MULTIPLE_MODE) for giftId, giftConf in levelGiftConf.iteritems(): if _isBought(userId, giftId): continue if not (giftConf["minLevel"] <= gunLv <= giftConf["maxLevel"]): continue now = int(time.time()) timeout = giftConf["showTime"] * 60 data = weakdata.getDayFishData(userId, WeakData.LevelUpCountDownData, []) if not data: weakdata.setDayFishData(userId, WeakData.LevelUpCountDownData, json.dumps([giftId, now])) else: if data[0] == giftId: if timeout - (now - data[1]) > 0: timeout = timeout - (now - data[1]) else: timeout = 0 else: weakdata.setDayFishData(userId, WeakData.LevelUpCountDownData, json.dumps([giftId, now])) giftInfo.append(getGiftDetail(giftConf, util.getLanguage(userId, clientId), timeout)) message.setResult("giftInfo", giftInfo) router.sendToUser(message, userId) return giftInfo
def getTreasureList(userId): """ 宝藏列表 """ treasures = [] lang = util.getLanguage(userId) for kindId, treasureConf in config.getTreasureConf().iteritems(): kindId = int(kindId) treasure = {} level, _ = getTreasureInfo(userId, kindId) treasure["kindId"] = kindId treasure["sortId"] = treasureConf["sortId"] treasure["name"] = config.getMultiLangTextConf(treasureConf["name"], lang=lang) treasure["desc"] = config.getMultiLangTextConf(treasureConf.get("desc"), lang=lang) treasure["level"] = level treasure["convert"] = treasureConf["convert"] treasures.append(treasure) def cmpSort(x, y): if x["level"] > y["level"]: return 1 elif x["level"] < y["level"]: return -1 else: if x["sortId"] < y["sortId"]: return 1 else: return -1 treasures.sort(cmp=cmpSort, reverse=True) return treasures
def sendGameplayInfo(roomId, userId, clientId, mode): """ 发送玩法相关信息 """ bigRoomId, _ = util.getBigRoomId(roomId) key = "%s_%d" % (bigRoomId, mode) lang = util.getLanguage(userId, clientId) conf = config.getSuperBossCommonConf() tabs = conf.get(str(key), {}).get("tabs", []) tabs = [{ "title": config.getMultiLangTextConf(v["title"], lang=lang), "data": v["data"], "param": v.get("param", 0) } for v in tabs] mo = MsgPack() mo.setCmd("superboss_gameplay_info") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("roomId", roomId) mo.setResult("mode", mode) mo.setResult("tabs", tabs) router.sendToUser(mo, userId) checkModuleTip(bigRoomId, userId, mode) if ftlog.is_debug(): ftlog.debug("gameplay, userId =", userId, "mo =", mo)
def sendWelcomeMail(userId): """ 发送欢迎邮件 """ message = None welcomeMailConfs = config.getCommonValueByKey("ignoreConf") clientId = util.getClientId(userId) ftlog.debug("sendWelcomeMail", userId, "clientId = ", clientId) lang = util.getLanguage(userId) rewards = config.getCommonValueByKey("welcomeMailRewards") for welcomeMailConf in welcomeMailConfs: if clientId in welcomeMailConf.get("clientIds", []): # 不可显示实物、人民币相关描述 message = config.getMultiLangTextConf( "ID_CONFIG_BAN_ENTITY_WELCOME_MSG", lang=lang) else: # 可显示实物、人民币相关描述 message = config.getMultiLangTextConf( "ID_CONFIG_ALLOW_ENTITY_WELCOME_MSG", lang=lang) if message: mail_system.sendSystemMail(userId, mail_system.MailRewardType.SystemReward, rewards, message=message, title=config.getMultiLangTextConf( "ID_MAIL_TITLE_HOT_WELCOME", lang=lang))
def __init__(self, userId, taskConf): self.userId = userId self.taskId = taskConf["Id"] self.taskConfig = taskConf self.lang = util.getLanguage(userId) self.taskData = None self.taskData = self._getAchievementTaskData()
def doReturnFee(self, msg): """ 停服准备返还玩家报名费 """ # des = u"由于游戏维护导致您离开了比赛,特将此次报名费全额返还,请您查收!非常抱歉给您带来不便,祝您游戏愉快!" userList = msg.getParam("users") assert (isinstance(userList, list)) for user in userList: userId = user.get("userId", 0) if userId <= config.ROBOT_MAX_USER_ID: continue lang = util.getLanguage(userId) des = config.getMultiLangTextConf("ID_DO_RETURN_FEE_MESSAGE", lang=lang) player = self.match.findPlayer(userId) if player and self.userFee.get(userId, None): fee = self.userFee.get(int(userId)) rewardsList = [] if fee: rewardsList = util.convertToFishItems(fee) self._logger.debug("doReturnFee", "userId=", userId, "fee=", rewardsList) self.match.matchUserIF.unlockUser(self.matchId, self.roomId, player.instId, userId) if rewardsList: mail_system.sendSystemMail( userId, mail_system.MailRewardType.SystemCompensate, rewardsList, des)
def sendTideTaskStartInfo(self, userId, timeLeft): """ 发送限时任务开始消息 :param userId: 玩家Id :param timeLeft: 剩余时间 """ userData = self.usersData.get(userId, {}) task = userData.get("task") if userData and task: msg = MsgPack() msg.setCmd("tide_task") msg.setResult("gameId", FISH_GAMEID) msg.setResult("userId", userId) msg.setResult("action", "start") msg.setResult("taskId", task["taskId"]) desc = config.getMultiLangTextConf(str(task["desc"]), lang=util.getLanguage(userId)) if desc.find("%d") >= 0: if task["taskType"] == 1: desc = desc % (task["targets"].get( "number", 0), task["targets"].get("target")) elif task["taskType"] == 2: desc = desc % (task["targets"].get("number")) elif task["taskType"] == 3: desc = desc % (task["targets"].get("number")) msg.setResult("desc", desc) msg.setResult("timeLeft", timeLeft) msg.setResult("timeLong", task["timeLong"]) msg.setResult("taskType", task["taskType"]) msg.setResult("rewardType", userData["rewardType"]) msg.setResult("targets", task["targets"]) msg.setResult("rewards", task["rewards"]) GameMsg.sendMsg(msg, userId)
def sendNcmpttTaskStartInfo(self, userId, timeLeft): """ 发送限时任务开始消息 :param userId: 玩家Id :param timeLeft: 剩余时间 """ userData = self.usersData.get(userId, {}) task = userData.get("task") if userData and task: msg = MsgPack() msg.setCmd("ncmptt_task") msg.setResult("gameId", FISH_GAMEID) msg.setResult("userId", userId) msg.setResult("action", "start") msg.setResult("taskId", task["taskId"]) desc = config.getMultiLangTextConf(str(task["desc"]), lang=util.getLanguage(userId)) if desc.find("%d") >= 0: desc = desc % (task["targets"].get("target1") or task["targets"].get("number1", 0)) msg.setResult("desc", desc) msg.setResult("timeLeft", timeLeft) msg.setResult("timeLong", task["timeLong"]) msg.setResult("taskType", task["taskType"]) msg.setResult("rewardType", userData["rewardType"]) msg.setResult("targets", task["targets"]) msg.setResult("reward", {"name": task["chestReward"], "count": 1}) GameMsg.sendMsg(msg, userId)
def getAllTabs(userId): """ 获取所有可以显示的排行榜 """ confs = [] isVerLimit = util.isVersionLimit(userId) # 是否是提审版本 lang = util.getLanguage(userId) rankRewardConf = config.getAllRankConfs() # rankRewardConf = OrderedDict(sorted(rankRewardConf.iteritems(), key=lambda d: d[1]["order"])) # for rankType, conf in rankRewardConf.iteritems(): # if (isVerLimit is False or conf.get("reviewVerLimit", 0) == 0) and conf["visible"] and conf["showInCommon"]: # confs.append({"rankType": int(rankType), "rankName": config.getMultiLangTextConf(str(conf["rankName"]), lang=lang)}) for _tab in rankRewardConf.get("tabs"): ranks = [] for _rankType in _tab["rankList"]: conf = rankRewardConf.get("ranks", {}).get(str(_rankType)) if conf and (not isVerLimit or not conf.get("reviewVerLimit", 0) ) and conf["visible"] and conf["showInCommon"]: ranks.append({ "rankType": int(_rankType), "rankName": config.getMultiLangTextConf(str(conf["rankName"]), lang=lang) }) if ranks: confs.append({ "tabName": config.getMultiLangTextConf(str(_tab["tabName"]), lang=lang), "ranks": ranks }) return confs
def vipAutoSupplyPerDay(userId): """ vip每日自动补足 """ vipLevel = hallvip.userVipSystem.getVipInfo(userId).get("level", 0) key = GameData.autoSupplyKey % config.CHIP_KINDID autoSupplyCount = config.getVipConf(vipLevel).get(key, 0) chips = userchip.getUserChipAll(userId) if autoSupplyCount >= 10000 and chips < autoSupplyCount and weakdata.getDayFishData( userId, key, 0) == 0: weakdata.incrDayFishData(userId, key, 1) lang = util.getLanguage(userId) rewards = [{ "name": config.CHIP_KINDID, "count": (autoSupplyCount - chips) }] message = config.getMultiLangTextConf( "ID_VIP_AUTO_SUPPLY_PER_DAY", lang=lang) % (autoSupplyCount / 10000) mail_system.sendSystemMail(userId, mail_system.MailRewardType.SystemReward, rewards, message) if ftlog.is_debug(): ftlog.debug("vipAutoSupplyPerDay", userId, vipLevel, autoSupplyCount, chips, key, autoSupplyCount - chips)
def _sendMailBySender(senderUserId, receiverUserId, type, reward=None, desc=None, title=None): """ 添加邮件到发件人发件箱 :param senderUserId: 发件人 :param receiverUserId: 收件人 :param type: 邮件类型 :param reward: 附件奖励 :param desc: 邮件内容 :param title: 标题 """ curTime = int(time.time()) desc = desc or "" reward = reward or [] title = title or "" mailOutId = gamedata.incrGameAttr(senderUserId, FISH_GAMEID, GameData.outMailId, 1) mailOutInfos = gamedata.getGameAttrJson(senderUserId, FISH_GAMEID, GameData.outMailInfos, []) receiverUserName = util.getNickname(receiverUserId) mailOutInfos.insert(0, { "id": mailOutId, "userId": receiverUserId, "time": curTime, "name": receiverUserName, "reward": reward, "type": type, "desc": desc, "title": title }) mailOutInfos = _removeOutMailExpData(mailOutInfos, MAX_OUT_MAIL_COUNT) gamedata.setGameAttr(senderUserId, FISH_GAMEID, GameData.outMailInfos, json.dumps(mailOutInfos)) if type == MailRewardType.Present: lang = util.getLanguage(senderUserId) message = config.getMultiLangTextConf("ID_PRESENT_TO_OTHER_MSG", lang=lang) message = message.format(receiverUserName, receiverUserId, util.buildRewardsDesc(reward, lang)) GameMsg.sendPrivate(FISH_GAMEID, senderUserId, 0, message)
def getReturnerMission(userId, clientId): """ 获取回归豪礼 """ timeLeft = 0 currTime = int(time.time()) returnerMission = getReturnerMissionData(userId) returnerMissionConf = config.getReturnerMissionConf() if returnerMission: # 获取回归豪礼结束倒计时 expireDays = returnerMissionConf["expireDays"] * 24 * 3600 endTime = returnerMission["lastActiveTime"] + expireDays timeLeft = max(endTime - currTime, 0) mo = MsgPack() mo.setCmd("returner_mission") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("timeLeft", timeLeft) if timeLeft > 0: # 是否首次登录弹出 dayFirst = weakdata.incrDayFishData(userId, WeakData.returnerMission, 1) # 当前是激活后的第几个任务(按天处理) lastActiveTime = util.getDayStartTimestamp(returnerMission["lastActiveTime"]) fewDays = (datetime.fromtimestamp(currTime) - datetime.fromtimestamp(lastActiveTime)).days + 1 fewDays = max(1, min(fewDays, len(returnerMission["tasks"]))) currentTaskId = returnerMissionConf["tasks"][fewDays - 1]["taskId"] lang = util.getLanguage(userId, clientId) # 任务数据 tasks = buildTaskData(returnerMission, lang) mo.setResult("dayFirst", 1 if dayFirst == 1 else 0) mo.setResult("currentTaskId", currentTaskId) mo.setResult("rule", config.getMultiLangTextConf(returnerMissionConf["rule"], lang=lang)) mo.setResult("tasks", tasks) router.sendToUser(mo, userId)
def doReadFishNotice(userId, clientId, noticeId): """ 读通知 """ message = MsgPack() message.setCmd("fishNoticeRead") message.setResult("gameId", FISH_GAMEID) message.setResult("userId", userId) message.setResult("noticeId", noticeId) noticeConf = config.getNoticeConf(noticeId) vipLevel = int(hallvip.userVipSystem.getUserVip(userId).vipLevel.level) level = util.getActivityCheckLevel(userId) clientIdNum = util.getClientIdNum(userId, clientId) acTemplate = config.getActivityTemplateByClientIdNum( clientIdNum, util.getLanguage(userId, clientId)) if noticeConf and noticeConf.get("enable", 0) and _isNoticeEnable( userId, acTemplate, noticeConf, vipLevel, level): noticeData = readNoticeById(userId, clientId, noticeConf) if noticeData: message.setResult("notice", noticeData) message.setResult("code", 0) else: message.setResult("code", ActivityErrorCode.OtherError) else: message.setResult("code", ActivityErrorCode.OtherError) router.sendToUser(message, userId)
def provideTimeMatchRankReward(userId, roomId, rank, rankRewards): """ 回馈赛上榜发放宝藏奖励到邮件 """ treasureConf = config.getTreasureConf(effectType=EffectType.MatchRankRewardAdd) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return rewards = [] lang = util.getLanguage(userId) ratio = levelConf["params"]["time_match"] for _reward in rankRewards: if _reward["name"] in config.BULLET_VALUE: name = config.BRONZE_BULLET_KINDID count = int(math.ceil(_reward["count"] * config.BULLET_VALUE[_reward["name"]] * ratio)) else: name = _reward["name"] count = int(math.ceil(_reward["count"] * ratio)) rewards.append({"name": name, "count": count}) if rewards: matchName = config.getMultiLangTextConf(gdata.getRoomConfigure(roomId).get("name", ""), lang=lang) treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_TIME_MATCH_RANK", lang=lang) message = message.format(matchName, rank, level, treasureName) title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) activeTreasure(userId, kindId, treasureData)
def provideFinishGrandPrixReward(userId): """ 完成大奖赛发放宝藏奖励到邮件 """ treasureConf = config.getTreasureConf(effectType=EffectType.MatchItemReward) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return rewards = [] lang = util.getLanguage(userId) for _kindId, _count in levelConf.get("params", {}).iteritems(): rewards.append({"name": int(_kindId), "count": _count}) if rewards: treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_FINISH_GRAND_PRIX", lang=lang).format(level, treasureName) title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) activeTreasure(userId, kindId, treasureData)
def doFTEnter(self, ftId, userId, seatId): ftlog.info("FishFriendTable.doFTEnter", "tableId=", self.tableId, "ftId=", ftId, "seatId=", seatId) lang = util.getLanguage(userId) if ftId != self.ftId: raise TYBizException( 1, config.getMultiLangTextConf("ID_INPUT_ROOMID_ERROR_INFO", lang=lang)) player = self.getPlayer(userId) if player and player.userId: self.sendFriendDetails(userId) else: if self._expiresTimer: # 重置桌子超时计时器 self._expiresTimer.cancel() self._expiresTimer = None self._expiresTimer = FTLoopTimer(self._tableExpiresTime, 0, self._tableExpires) self._expiresTimer.start() self._doTableQuickStart(userId, seatId) # 用户进入 self.sendFriendDetails(userId) # 发送对战详情信息 if userId != self.ftTable.userId: # 记录参与者Id self.otherId = userId fight_history.addOneHistory(userId, self.ftTable.userId, fight_history.HistoryType.Enter, self.ftId, self.ftTable.fee) # 进入房间记录 return 0
def sendGrandPrizeReward(roomId, tableId, userId, fId, coinCount, level, seatId, fpMultiple): """ 发放巨奖奖励 """ try: rewards = [{"name": config.CHIP_KINDID, "count": coinCount}] room = gdata.rooms()[roomId] table = room.maptable[tableId] player = table.getPlayer(userId) msg = MsgPack() msg.setCmd("getGrandPrizeRewards") msg.setResult("gameId", FISH_GAMEID) msg.setResult("userId", userId) msg.setResult("fId", fId) msg.setResult("rewards", rewards) msg.setResult("level", level) msg.setResult("seatId", seatId) msg.setResult("fpMultiple", fpMultiple) GameMsg.sendMsg(msg, table.getBroadcastUids()) if player: for bigRoomId in config.getGrandPrizeConf().get("roomIds", []): player.fireCost[str(bigRoomId)] = 0 name = player.name player.addTableChip(coinCount, "BI_NFISH_GRAND_PRIZE") player.totalGainChip += coinCount # 深海巨奖触发幸运降临 table.checkBigPrize(player, coinCount // fpMultiple, coinCount, fpMultiple, isGrandPriz=True) else: from poker.entity.dao import gamedata from newfish.entity.redis_keys import GameData fireCost = gamedata.getGameAttrJson(userId, FISH_GAMEID, GameData.fireCost, {}) for bigRoomId in config.getGrandPrizeConf().get("roomIds", []): fireCost[str(bigRoomId)] = 0 gamedata.setGameAttr(userId, FISH_GAMEID, GameData.fireCost, json.dumps(fireCost)) name = util.getNickname(userId) util.addRewards(userId, rewards, "BI_NFISH_GRAND_PRIZE", roomId) leds = [ "ID_LED_GRAND_PRIZE_1", "ID_LED_GRAND_PRIZE_2", "ID_LED_GRAND_PRIZE_3" ] if len(leds) > level >= 0: lang = util.getLanguage(userId) msg = config.getMultiLangTextConf(leds[level], lang=lang) % \ (name, config.getMultiLangTextConf(table.runConfig.title, lang=lang), util.formatScore(coinCount, lang=lang)) user_rpc.sendLed(FISH_GAMEID, msg, id=leds[level], lang=lang) except Exception as e: ftlog.error("sendGrandPrizeReward", roomId, tableId, userId, fId, coinCount, traceback.format_exc()) return 0
def getCurrentGiftConf(self): """ 获取当前可显示礼包的配置 """ isIn, roomId, _, _ = util.isInFishTable(self.userId) if not isIn: return [], "" mode = util.getGiftDTestMode(self.userId) fishPool = util.getFishPoolByBigRoomId(util.getBigRoomId(roomId)[0]) grade, nextGrade = self._getGrade(fishPool) # 获取礼包档位 giftAbcTestConf = config.getGiftAbcTestConf(self.clientId) giftListConf = giftAbcTestConf.get("data", {}).get( str(fishPool), {}).get(grade, {}).get("giftList", {}).get(mode, []) nextGiftListConf = giftAbcTestConf.get("data", {}).get( str(fishPool), {}).get(nextGrade, {}).get("giftList", {}).get(mode, []) buyTimes = self._getBuyTimes(fishPool) recommonGift = [] # 当前房间可以使用的破产礼包列表. for idx, giftGroup in enumerate(zip(giftListConf, nextGiftListConf)): if not set(self.availableGift) & set(giftGroup): # 优先展示可领取的礼包 continue if buyTimes - 1 != idx: continue for giftId in giftGroup: giftConf = giftAbcTestConf.get("gift", {}).get(str(giftId)) if not giftConf: continue recommonGift.append(giftConf) if ftlog.is_debug(): ftlog.debug("BankruptGift_getCurrentGiftConf", fishPool, giftListConf, nextGiftListConf, grade, nextGrade, recommonGift) # 没有可领取礼包则按照已购买次数显示礼包. if not recommonGift: if 0 <= buyTimes < len(giftListConf): listConf2 = giftAbcTestConf.get("data", {}).get( str(fishPool), {}).get(nextGrade, {}).get("giftList", {}).get(mode, []) giftId1, giftId2 = giftListConf[buyTimes], listConf2[buyTimes] recommonGift = [ giftAbcTestConf.get("gift", {}).get(str(giftId1)), giftAbcTestConf.get("gift", {}).get(str(giftId2)) ] lang = util.getLanguage(self.userId, self.clientId) remainTimes = max(0, len(giftListConf) - buyTimes) if recommonGift: gamedata.setGameAttr(self.userId, FISH_GAMEID, GameData.bankruptGiftInfo, json.dumps([fishPool, grade, nextGrade])) tip = config.getMultiLangTextConf("ID_BANKRUPT_GIFT_TIP", lang=lang).format(remainTimes) else: tip = "" return recommonGift, tip
def readNoticeById(userId, clientId, noticeConf): """ 读活动 """ noticeId = noticeConf["Id"] readNotice = _getNoticeReadInfo(userId) if noticeId in readNotice: return None readNotice.append(noticeId) _setNoticeReadInfo(userId, readNotice) updateUnReadNotice(userId, clientId, readNotice=readNotice) lang = util.getLanguage(userId, clientId) return _getNoticeInfo(noticeConf, lang, readNotice)
def getFailedInfo(cls, reason, userId, roomId): """ 获取失败提示信息 """ lang = util.getLanguage(userId) roomConf = {} if gdata.roomIdDefineMap().get(roomId): roomConf = gdata.roomIdDefineMap()[roomId].configure info = config.getMultiLangTextConf("ID_ENTER_ROOM_REASON", lang=lang) if reason == cls.ENTER_ROOM_REASON_LESS_LEVEL: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_LESS_LEVEL", lang=lang) % roomConf["minLevel"] elif reason == cls.ENTER_ROOM_REASON_MAINTENANCE: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_MAINTENANCE", lang=lang) elif reason == cls.ENTER_ROOM_REASON_VERSION_DISABLE: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_VERSION_DISABLE", lang=lang) elif reason == cls.ENTER_ROOM_REASON_LESS_FEES: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_LESS_FEES", lang=lang) elif reason == cls.ENTER_ROOM_REASON_LESS_BULLET: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_LESS_BULLET", lang=lang) elif reason == cls.ENTER_ROOM_REASON_LESS_COIN: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_LESS_COIN", lang=lang) % util.formatScore(roomConf["minCoin"], lang=lang) elif reason == cls.ENTER_ROOM_REASON_TIME_LIMIT: info = config.getMultiLangTextConf("ID_ENTER_ROOM_REASON_NOT_OPEN", lang=lang) if roomConf.get("typeName") == config.FISH_ROBBERY: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_TIME_LIMIT", lang=lang) elif reason == cls.ENTER_ROOM_REASON_EXCESSIVE_LOSS: info = config.getMultiLangTextConf( "ID_ENTER_ROOM_REASON_EXCESSIVE_LOSS", lang=lang) % config.getMultiLangTextConf(roomConf["name"], lang=lang) elif reason == cls.ENTER_ROOM_REASON_NOT_OPEN: info = config.getMultiLangTextConf("ID_ENTER_ROOM_REASON_NOT_OPEN", lang=lang) elif reason == cls.ENTER_ROOM_REASON_GRAND_PRIX_LESS_FEES: # 大奖赛门票不足 info = config.getMultiLangTextConf( "ENTER_ROOM_REASON_GRAND_PRIX_LESS_FEES", lang=lang) elif reason == cls.ENTER_ROOM_REASON_GRAND_PRIX_NOE_OPEN: info = config.getMultiLangTextConf( "ENTER_ROOM_REASON_GRAND_PRIX_NOE_OPEN", lang=lang) return info
def getSectionTasksInfo(userId, sectionId=None): """ 获取该章节下的所有任务信息 """ sectionId = sectionId or gamedata.getGameAttrInt(userId, FISH_GAMEID, GameData.currSectionId) tasks = [] if sectionId: clientId = util.getClientId(userId) lang = util.getLanguage(userId) sectionConf = config.getMainQuestSectionConf(clientId, sectionId) for taskId in sectionConf["taskIds"]: taskDict = getTaskInfo(userId, clientId, taskId, lang) tasks.append(taskDict) return tasks
def _triggerUserVipExpChangeEvent(event): try: rmbs = int(event.toAddExp / 10) rewards = [{ "name": config.SOUVENIR_KINDID, "count": int(RMB_SOUVENIR_RATE * rmbs) }] message = config.getMultiLangTextConf("ID_MAIL_SOUVENIR_COIN_MESSAGE", lang=util.getLanguage( event.userId)) mail_system.sendSystemMail(event.userId, mail_system.MailRewardType.SystemReward, rewards, message) except Exception as e: ftlog.error("souvenir_coin._triggerUserVipExpChangeEvent error", e, "userId=", event.userId, "toAddExp=", event.toAddExp)
def sendMinigameInfo(roomId, userId, mode): """ 发送小游戏信息 """ bigRoomId, _ = util.getBigRoomId(roomId) subkey = "%s_%d" % (bigRoomId, mode) mgType = config.getSuperBossCommonConf().get(str(subkey), {}).get("mgType", "") key = "%s_%d" % (mgType, mode) mo = MsgPack() mo.setCmd("superboss_minigame_info") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("roomId", roomId) mo.setResult("mode", mode) mo.setResult("type", mgType) data = {} if mgType in MINIGAME_TYPE_LIST: conf = config.getSuperBossMiniGameConf() superbossPlayedTimes = weakdata.getDayFishData(userId, WeakData.superbossMGPlayedTimes, {}) playedTimes = superbossPlayedTimes.get(key, 0) vipLevel = hallvip.userVipSystem.getUserVip(userId).vipLevel.level maxTimesList = conf.get("info", {}).get(key, {}).get("maxTimes", []) maxTimes = maxTimesList[vipLevel] if maxTimesList and len(maxTimesList) > vipLevel else 0 remainTimes = max(0, maxTimes - playedTimes) if maxTimes >= 0 else -1 currencyList = conf.get("info", {}).get(key, {}).get("currencyList", []) items = config.rwcopy(conf.get("game", {}).get(key, [])) gunLevelVal = util.getGunLevelVal(userId, config.MULTIPLE_MODE) lang = util.getLanguage(userId) itemsinfo = [] for item in items: if gunLevelVal >= item["level"]: item["des"] = config.getMultiLangTextConf(item["des"], lang=lang) if item["des"] else "" itemsinfo.append(item) if mgType == "box": for iteminfo in itemsinfo: rewards = iteminfo["rewards"] groupIdx = util.selectIdxByWeight([int(reward.keys()[0]) for reward in rewards]) iteminfo["rewards"] = rewards[groupIdx].values()[0] iteminfo["groupIdx"] = groupIdx mo.setResult("showItemsList", currencyList) data = {"remainTimes": remainTimes, "items": itemsinfo} else: ftlog.warn("minigame, type error, userId =", userId, "roomId =", roomId, "mode =", mode, "mgType =", mgType) mo.setResult("data", data) router.sendToUser(mo, userId) if ftlog.is_debug(): ftlog.debug("minigame, userId =", userId, "mode =", mode, "mo =", mo)
def getAllNotice(userId, clientId): """ 获取所有开启活动的信息 """ noticeConfigs = _getAllNoticeConfigs(userId, clientId) readNotice = _getNoticeReadInfo(userId) ftlog.debug() noticeInfos = [] lang = util.getLanguage(userId, clientId) ftlog.debug("getAllNotice->noticeInfos =", noticeConfigs) for noticeConf in noticeConfigs: noticeInfo = _getNoticeInfo(noticeConf, lang, readNotice) noticeInfos.append(noticeInfo) ftlog.debug("getAllNotice->noticeInfos =", noticeInfos) updateUnReadNotice(userId, clientId, noticeInfos) return noticeInfos
def _triggerTYOpenItemEvent(event): userId = event.userId itemKind = event.item.itemKind lang = util.getLanguage(userId) for key, value in config.getChestConf().iteritems(): if value["kindId"] == itemKind.kindId: from hall.entity import halluser from hall.entity.todotask import TodoTaskShowInfo, TodoTaskHelper from newfish.entity import mail_system message = config.getMultiLangTextConf("ID_OPEN_ITEM_GET_REWARD_MSG", lang=lang) % value["name"] GameMsg.sendPrivate(FISH_GAMEID, userId, 0, message) todoTask = TodoTaskShowInfo(message) TodoTaskHelper.sendTodoTask(FISH_GAMEID, userId, todoTask) halluser.ensureGameDataExists(userId, FISH_GAMEID, util.getClientId(userId)) message = config.getMultiLangTextConf("ID_USE_ITEM_GET_REWARD_MSG", lang=lang).format(itemKind.displayName, value["name"]) rewards = [{"name": value["chestId"], "count": 1}] mail_system.sendSystemMail(userId, mail_system.MailRewardType.ChestReward, rewards, message) break
def doGiveup(self, userId): if self._logger.isDebug(): self._logger.debug("doGiveup", "userId=", userId) mo = MsgPack() mo.setCmd("m_giveup") mo.setResult("gameId", self.gameId) mo.setResult("roomId", self.roomId) mo.setResult("userId", userId) lang = util.getLanguage(userId) try: if self.match.giveup(userId): mo.setResult("giveup", 1) else: # mo.setResult("error", {"code": -1, "info": "不能退出比赛"}) mo.setResult("error", {"code": -1, "info": config.getMultiLangTextConf("ID_MATCH_FORBID_GIVE_UP", lang=lang)}) except: mo.setResult("error", {"code": -1, "info": config.getMultiLangTextConf("ID_MATCH_FORBID_GIVE_UP", lang=lang)}) router.sendToUser(mo, userId)