def _onTableWinlose(event): status = gamedata.getGameAttrJson(event.userId, DIZHU_GAMEID, 'item.win.progress', {}) if ftlog.is_debug(): ftlog.debug('dizhuredenvelope._onTableWinlose userId=', event.userId, 'status=', status) if event.winlose.isWin: changed = False roomConf = gdata.getRoomConfigure(event.roomId) playMode = roomConf.get('playMode') for itemConf in _itemConfList: if not itemConf['playModes'] or playMode in itemConf['playModes']: changed = True itemId = str(itemConf['itemId']) winTimes = itemConf['winTimes'] progress = status.get(itemId, 0) + 1 status[itemId] = progress if progress >= winTimes: flagName = 'item.open.flag:%s' % (itemId) gamedata.setnxGameAttr(event.userId, HALL_GAMEID, flagName, 1) if changed: gamedata.setGameAttr(event.userId, DIZHU_GAMEID, 'item.win.progress', strutil.dumps(status)) if ftlog.is_debug(): ftlog.debug('dizhuredenvelope._onTableWinlose userId=', event.userId, 'status=', status, 'changed=', changed)
def doUpdate(userId, gameId, clientId): ''' 刷新信息,判断用户进入银盘抽奖还是金盘抽奖 ''' result = {} # 判断用户是否是第一次进入该功能,如果是,则赠送一张银盘抽奖卡 isFirstRoulette = pkgamedata.setnxGameAttr(userId, gameId, 'isFirstRoulette', 1) if isFirstRoulette: sendToUserALotteryCard(userId, gameId, clientId) # 拿到配置信息 tempResult = getConfForClient(userId, gameId, clientId) # 判断用户的抽奖卡张数,决定进入金盘抽奖还是银盘抽奖 if nowUserLotteryCardNumber(userId, gameId, clientId) or (not tempResult.get('gold_items', None)): # 银盘 result['rouletteType'] = 'silver' result['items'] = tempResult.get('silver_items', []) timestamp = pktimestamp.getCurrentTimestamp() userAssets = hallitem.itemSystem.loadUserAssets(userId) result['cardNumber'] = userAssets.balance(gameId, hallitem.ASSET_ITEM_LOTTERY_CARD_ID, timestamp) else: # 金盘 result['rouletteType'] = 'gold' result['isFirstCheck'] = doGetFisrtToGold(userId, gameId) result['items'] = tempResult.get('gold_items', []) return result
def doUpdate(userId, gameId, clientId): ''' 刷新信息,判断用户进入银盘抽奖还是金盘抽奖 ''' result = {} # 判断用户是否是第一次进入该功能,如果是,则赠送一张银盘抽奖卡 isFirstRoulette = pkgamedata.setnxGameAttr(userId, gameId, 'isFirstRoulette', 1) if isFirstRoulette: sendToUserALotteryCard(userId, gameId, clientId) # 拿到配置信息 tempResult = getConfForClient(userId, gameId, clientId) # 判断用户的抽奖卡张数,决定进入金盘抽奖还是银盘抽奖 if nowUserLotteryCardNumber( userId, gameId, clientId) or (not tempResult.get('gold_items', None)): # 银盘 result['rouletteType'] = 'silver' result['items'] = tempResult.get('silver_items', []) timestamp = pktimestamp.getCurrentTimestamp() userAssets = hallitem.itemSystem.loadUserAssets(userId) result['cardNumber'] = userAssets.balance( gameId, hallitem.ASSET_ITEM_LOTTERY_CARD_ID, timestamp) else: # 金盘 result['rouletteType'] = 'gold' result['isFirstCheck'] = doGetFisrtToGold(userId, gameId) result['items'] = tempResult.get('gold_items', []) return result
def isFirst(cls, userId, key, gameId=6): ''' 只有第一次才能设置成功,若已经成功设置过,则在设置就会失败 :param key: hashmap中的key :param gameId 存储在redis中的位置,默认存在game:6下 :return: True代表设置成功,False代表已经设置过了 ''' return gamedata.setnxGameAttr(userId, gameId, key, 1) == 1
def doGetFisrtToGold(userId, gameId): ''' 获取是否第一次进入金盘 ''' result = 0 isFirstCheck = pkgamedata.setnxGameAttr(userId, gameId, 'isFirstGoldRoulette', 1) if isFirstCheck: result = 1 return result
def doGetFisrtToGold(userId, gameId): ''' 获取是否第一次进入金盘 ''' result = 0 isFirstCheck = pkgamedata.setnxGameAttr(userId, gameId, 'isFirstGoldRoulette', 1) if isFirstCheck: result = 1 return result
def _isCheckContinuousBreak(userId, ts=None): """ 检查是否需要中断连续签到 """ ts = ts or int(time.time()) dayStartTS = util.getDayStartTimestamp(int(ts)) gamedata.setnxGameAttr(userId, FISH_GAMEID, GameData.breakContinuousCheckinTS, dayStartTS) gamedata.setnxGameAttr(userId, FISH_GAMEID, GameData.continuousCheckinDayTS, dayStartTS) # 未连续签到时要中断. continuousCheckinDayTS = gamedata.getGameAttrInt( userId, FISH_GAMEID, GameData.continuousCheckinDayTS) if continuousCheckinDayTS + 86400 <= dayStartTS: breakContinuousCheckinTS = dayStartTS continuousCheckinDayTS = dayStartTS gamedata.setGameAttrs(userId, FISH_GAMEID, [ GameData.breakContinuousCheckinTS, GameData.continuousCheckinDayTS ], [breakContinuousCheckinTS, continuousCheckinDayTS]) # vip小于配置时,每周按照配置日期中断连续签到数据. st = time.localtime(dayStartTS) vipLevel = hallvip.userVipSystem.getVipInfo(userId).get("level", 0) conf = config.getCheckinConf("resetInfo") resetVip = conf.get("vip", 0) resetWeekDay = conf.get("resetWeekDay", 0) if vipLevel <= resetVip and st.tm_wday == resetWeekDay: breakContinuousCheckinTS = gamedata.getGameAttrInt( userId, FISH_GAMEID, GameData.breakContinuousCheckinTS) if breakContinuousCheckinTS < dayStartTS: breakContinuousCheckinTS = dayStartTS continuousCheckinDayTS = dayStartTS gamedata.setGameAttrs(userId, FISH_GAMEID, [ GameData.breakContinuousCheckinTS, GameData.continuousCheckinDayTS ], [breakContinuousCheckinTS, continuousCheckinDayTS]) ftlog.debug("checkin, reset, userId =", userId, "resetTS =", dayStartTS)
def doSendReward(cls, gameId, userId, clientId, activityId): todotasks = [TodoTaskDownloadApkPromote('http://apk.dl.tuyoo.com/down/hszz/Clash_Royale.apk')] if gamedata.setnxGameAttr(userId, gameId, 'act.sendReward:%s' % (activityId), 1) == 1: # 发1完金币 userchip.incrChip(userId, gameId, cls.REWARD_CHIP_COUNT, daoconst.CHIP_NOT_ENOUGH_OP_MODE_NONE, 'ACTIVITY_REWARD', 20000, clientId) datachangenotify.sendDataChangeNotify(gameId, userId, ['chip']) todotasks.append(TodoTaskGoldRain('恭喜您获得1万金币')) ftlog.info('ActivitySendReward.doSendReward gameId=', gameId, 'userId=', userId, 'clientId=', clientId, 'activityId=', activityId, 'rewardChip=', cls.REWARD_CHIP_COUNT) TodoTaskHelper.sendTodoTask(gameId, userId, todotasks)
def doUpdate(userId, gameId, clientId): ''' 刷新信息,判断用户进入银盘抽奖还是金盘抽奖 ''' result = {} # 判断用户是否是第一次进入该功能,如果是,则赠送一张银盘抽奖卡 isFirstRoulette = pkgamedata.setnxGameAttr(userId, gameId, 'isFirstRoulette', 1) if isFirstRoulette: sendToUserALotteryCard(userId, gameId, clientId) # 拿到配置信息 tempResult = getConfForClient(userId, gameId, clientId) # 判断用户的抽奖卡张数,决定进入金盘抽奖还是银盘抽奖 if nowUserLotteryCardNumber(userId, gameId, clientId): # 银盘 result['rouletteType'] = 'silver' result['items'] = tempResult.get('silver_items', []) timestamp = pktimestamp.getCurrentTimestamp() userAssets = hallitem.itemSystem.loadUserAssets(userId) result['cardNumber'] = userAssets.balance( gameId, hallitem.ASSET_ITEM_LOTTERY_CARD_ID, timestamp) else: if tempResult.get('gold_items', None): # 金盘 result['rouletteType'] = 'gold' result['isFirstCheck'] = doGetFisrtToGold(userId, gameId) result['items'] = tempResult.get('gold_items', []) # 部分情况需要限制每日抽奖的次数 isSuitableClient = isSuitableClientID(userId, gameId, clientId) if isSuitableClient: result['10lottoryNum'] = pkgamedata.getGameAttrInt( userId, HALL_GAMEID, 'Do10LottoryNum') result['50lottoryNum'] = pkgamedata.getGameAttrInt( userId, HALL_GAMEID, 'Do50LottoryNum') result['10MaxNum'] = tempResult.get('roulette_10_max_daily_num', 0) result['50MaxNum'] = tempResult.get('roulette_50_max_daily_num', 0) else: result['10lottoryNum'] = -1 result['50lottoryNum'] = -1 result['10MaxNum'] = -1 result['50MaxNum'] = -1 pass return result
def doSendReward(cls, gameId, userId, clientId, activityId): activities = { 'activity_hall_reward_hszz':{ 'url':'http://apk.dl.tuyoo.com/down/hszz/Clash_Royale.apk', 'rewardChip':10000, 'goldRain':'恭喜您获得1万金币', 'intActId':20000 }, 'act_hall_reward_wzry':{ 'url':'http://down.s.qq.com/download/apk/10015420_com.tencent.tmgp.sgame.apk', 'rewardChip':0, 'goldRain':'恭喜您获得100金币', 'intActId':20001 }, 'act_hall_reward_cyhx':{ 'url':'http://down.s.qq.com/download/apk/10015420_com.tencent.tmgp.cf.apk', 'rewardChip':0, 'goldRain':'恭喜您获得100金币', 'intActId':20002 } } actConf = activities.get(activityId) if actConf: todotasks = [TodoTaskDownloadApkPromote(actConf['url'])] if (actConf['rewardChip'] > 0 and gamedata.setnxGameAttr(userId, gameId, 'act.sendReward:%s' % (activityId), 1) == 1): # 发1完金币 userchip.incrChip(userId, gameId, actConf['rewardChip'], daoconst.CHIP_NOT_ENOUGH_OP_MODE_NONE, 'ACTIVITY_REWARD', actConf['intActId'], clientId) datachangenotify.sendDataChangeNotify(gameId, userId, ['chip']) todotasks.append(TodoTaskGoldRain(actConf['goldRain'])) ftlog.info('ActivitySendReward.doSendReward gameId=', gameId, 'userId=', userId, 'clientId=', clientId, 'activityId=', activityId, 'rewardChip=', actConf['rewardChip']) TodoTaskHelper.sendTodoTask(gameId, userId, todotasks)
def doSendReward(cls, gameId, userId, clientId, activityId): activities = { 'activity_hall_reward_hszz': { 'url': 'http://apk.dl.tuyoo.com/down/hszz/Clash_Royale.apk', 'rewardChip': 10000, 'goldRain': '恭喜您获得1万金币', 'intActId': 20000 }, 'act_hall_reward_wzry': { 'url': 'http://down.s.qq.com/download/apk/10015420_com.tencent.tmgp.sgame.apk', 'rewardChip': 0, 'goldRain': '恭喜您获得100金币', 'intActId': 20001 }, 'act_hall_reward_cyhx': { 'url': 'http://down.s.qq.com/download/apk/10015420_com.tencent.tmgp.cf.apk', 'rewardChip': 0, 'goldRain': '恭喜您获得100金币', 'intActId': 20002 } } actConf = activities.get(activityId) if actConf: todotasks = [TodoTaskDownloadApkPromote(actConf['url'])] if (actConf['rewardChip'] > 0 and gamedata.setnxGameAttr(userId, gameId, 'act.sendReward:%s' % (activityId), 1) == 1): # 发1完金币 userchip.incrChip(userId, gameId, actConf['rewardChip'], daoconst.CHIP_NOT_ENOUGH_OP_MODE_NONE, 'ACTIVITY_REWARD', actConf['intActId'], clientId) datachangenotify.sendDataChangeNotify(gameId, userId, ['chip']) todotasks.append(TodoTaskGoldRain(actConf['goldRain'])) ftlog.info('ActivitySendReward.doSendReward gameId=', gameId, 'userId=', userId, 'clientId=', clientId, 'activityId=', activityId, 'rewardChip=', actConf['rewardChip']) TodoTaskHelper.sendTodoTask(gameId, userId, todotasks)
def _onUserLogin(gameId, userId, clientId, isCreate, isDayfirst): from hall.entity import hallsubmember ftlog.debug('hallitem._onUserLogin gameId=', gameId, 'userId=', userId, 'clientId=', clientId, 'isCreate=', isCreate, 'isDayfirst', isDayfirst) if not hallitem._inited: return timestamp = pktimestamp.getCurrentTimestamp() userAssets = hallitem.itemSystem.loadUserAssets(userId) userBag = userAssets.getUserBag() if isCreate: pkgamedata.setGameAttr(userId, HALL_GAMEID, 'flag.item.trans', 1) hallitem._initUserBag(gameId, userId, clientId, userBag) else: if pkgamedata.setnxGameAttr(userId, HALL_GAMEID, 'flag.item.trans', 1) == 1: if not hallitem._tranformItems(gameId, userId, clientId, userBag): hallitem._initUserBag(gameId, userId, clientId, userBag) hallsubmember.checkSubMember(gameId, userId, timestamp, 'LOGIN_CHECK_SUBMEM', 0, userAssets) userBag.processWhenUserLogin(gameId, isDayfirst, timestamp)
def setFirstRechargeReward(userId): return pkgamedata.setnxGameAttr(userId, HALL_GAMEID, 'first_recharge_reward', 1) == 1
def setFirstRechargeReward(userId): return pkgamedata.setnxGameAttr(userId, HALL_GAMEID, 'first_recharge_reward', 1) == 1
def doOldRemoteCallNew(userId, msgline): ''' 必须要返回dict的实例 ''' try: ftlog.debug('doOldRemoteCallNew->msgline=', msgline) msg = MsgPack() msg.unpack(msgline) action = msg.getAction() gameId = msg.getParam('gameId', -1) userId = msg.getParam('userId', -1) userBag = hallitem.itemSystem.loadUserAssets(userId).getUserBag() clientId = sessiondata.getClientId(userId) if pkgamedata.setnxGameAttr(userId, HALL_GAMEID, 'flag.item.trans', 1) == 1: hallitem._tranformItems(gameId, userId, clientId, userBag) mo = MsgPack() mo.setResult('action', action) if action == 'getUserItem': kindId = msg.getParam('itemId', -1) val = getUserItem(userId, gameId, kindId, userBag) mo.setResult('item', val) elif action == 'getUserItemList': result = getUserItemList(userId, gameId, userBag) mo.setResult('item', result) elif action == 'addUserItem': kindId = msg.getParam('itemId', -1) count = msg.getParam('count', -1) eventId = msg.getParam('eventId', -1) eventId = eventIdToString(eventId) ftlog.debug('addUserItem itemId=', kindId, 'count=', count, 'eventId=', eventId) val = addUserItem(userId, gameId, kindId, count, eventId, userBag) mo.setResult('item', val) elif action == 'addUserItems': pass elif action == 'consumeUserItem': kindId = msg.getParam('itemId', -1) count = msg.getParam('count', -1) eventId = msg.getParam('eventId', -1) eventId = eventIdToString(eventId) ftlog.debug('consumeUserItem itemId=', kindId, 'count=', count, 'eventId=', eventId) val = consumeUserItem(userId, gameId, kindId, count, eventId, userBag) mo.setResult('item', val) elif action == 'useUserItem': kindId = msg.getParam('itemId', -1) val = useUserItem(userId, gameId, kindId, userBag) mo.setResult('item', val) elif action == 'updateTimingUserItems': isDayFirst = msg.getParam('isDayFirst', False) val = updateTimingUserItems(userId, gameId, isDayFirst, userBag) mo.setResult('item', val) elif action == 'loadUserDecroation': val = loadUserDecroation(userId, gameId, userBag) mo.setResult('item', val) else: ftlog.error('doOldRemoteCallNew unknown rpc action action=', action, 'gameId=', gameId, 'userId=', userId) ftlog.debug('doOldRemoteCallNew->mo=', mo._ht) mo.setResult('code', 0) return mo._ht except TYItemException: mo = MsgPack() mo.setResult('code', -1) return mo._ht except: ftlog.error() mo = MsgPack() mo.setResult('code', -1) return mo._ht
def loginGame(userId, gameId, clientId, iscreate, isdayfirst): """ 用户登录一个游戏, 游戏自己做一些其他的业务或数据处理 """ if ftlog.is_debug(): ftlog.debug("userId =", userId, "gameId =", gameId, "clientId =", clientId, "iscreate =", iscreate, "isdayfirst =", isdayfirst, gdata.name()) gamedata.setnxGameAttr(userId, FISH_GAMEID, GameData.gunLevel_m, 2101) if isdayfirst: sendVipSpringFestivalRewards(userId) if isdayfirst: vipAutoSupplyPerDay(userId) if isdayfirst: from newfish.entity.quest import daily_quest from newfish.entity import weakdata resetTime = weakdata.getDayFishData(userId, "resetTime") if not resetTime: weakdata.setDayFishData(userId, "resetTime", int(time.time())) daily_quest.refreshDailyQuestData(userId) # FTLoopTimer(1, 0, util.doSendFishNotice, userId).start() gamedata.setnxGameAttr(userId, FISH_GAMEID, GameData.vipShow, 1) serverVersion = gamedata.getGameAttrInt(userId, gameId, GameData.serverVersion) if isdayfirst and gamedata.getGameAttr( userId, FISH_GAMEID, GameData.hasBoughtMonthCard) is None: from hall.entity import hallitem userBag = hallitem.itemSystem.loadUserAssets(userId).getUserBag() item = userBag.getItemByKindId(config.PERMANENT_MONTH_CARD_KINDID) or \ userBag.getItemByKindId(config.MONTH_CARD_KINDID) bought = 1 if item else 0 gamedata.setGameAttr(userId, FISH_GAMEID, GameData.hasBoughtMonthCard, json.dumps(bought)) if serverVersion and serverVersion <= 20180907: # 珍珠数量调整 util.adjustPearlCount(userId) if serverVersion and serverVersion <= 20180918: # 老玩家屏蔽10元话费卡兑换 gamedata.setGameAttr(userId, gameId, GameData.exchangeCount, 1) if serverVersion and serverVersion <= 20180928: # 老玩家金猪出现次数数据迁移 from newfish.entity import share_system from newfish.entity.share_system import FlyingPig shareClass = FlyingPig(userId) flyPigFinishCount = shareClass.shareData[ share_system.INDEX_FINISH_COUNT] gamedata.incrGameAttr(userId, FISH_GAMEID, GameData.flyPigFinishCount, flyPigFinishCount) # 清理金币购买记录,19/12/25日0点后开始检测 if int(time.time()) >= util.getTimestampFromStr("2019-12-25 00:00:00") and \ not gamedata.getGameAttrInt(userId, gameId, "resetBuyCoinCount"): gamedata.delGameAttr(userId, FISH_GAMEID, GameData.buyCoinCount) gamedata.setGameAttr(userId, gameId, "resetBuyCoinCount", 1) if not serverVersion or int(serverVersion) != SERVER_VERSION: gamedata.setGameAttr(userId, gameId, GameData.serverVersion, SERVER_VERSION) if not util.isFinishAllNewbieTask(userId): # 没完成所有新手引导,不主动弹出每日签到和最新消息 return # 限定玩家比赛幸运值. from newfish.entity.match_record import MatchRecord vip = hallvip.userVipSystem.getUserVip(userId).vipLevel.level for roomId in [44102]: key = "initLuckyValue:%d" % int(roomId) initVal = config.getVipConf(vip).get(key, 10000) record = MatchRecord.loadRecord(FISH_GAMEID, userId, roomId) record.luckyValue = min(record.luckyValue, initVal) MatchRecord.saveRecord(FISH_GAMEID, userId, roomId, record)