From 9ed7a50c30881fd97a44c9fef82e1e4d97fcdff8 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 23 四月 2021 18:12:58 +0800 Subject: [PATCH] 8901 【BT2】【后端】全服红包 --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py | 121 ++++++++++++++++++++++++++++++++++++---- 1 files changed, 109 insertions(+), 12 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py index da7e44b..7c07e9a 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py @@ -45,7 +45,7 @@ #value4 状态 #value5 时间,用来判断是否过期删除的,实际开放该红包领取的时间 #strValue1 创建者ID|创建者名字|创建者职业|获得途径(红包类型) -#strValue2 可抢总个数 +#strValue2 可抢总个数|是否匿名(默认不匿名兼容老数据) #strValue3 祝福语,玩家自己编辑的内容 #Def_UniversalGameRecType_FamilyRedPacketGrabRecord @@ -68,6 +68,7 @@ g_redPackCountDict = {} #有限制最大红包个数的类型对应当前红包数 {类型组对应记录编号:当前个数, ...} DBKey_RedPacketSend = "RedPacketSend_%s" # 系统定时红包是否已发放, 参数红包ID +DBKey_RedPacketSystemDayCount = "RedPacketSystemDayCount" # 全服系统红包已发放个数 ## 玩家登录 # @param None @@ -82,7 +83,8 @@ # @return None def DoOnDay(): __CheckGrabRecData() - + PlayerDBGSEvent.SetDBGSTrig_ByKey(DBKey_RedPacketSystemDayCount, 0) # 重置每日全服系统红包发放个数 + RandTodayServerSystemRedPacketSendTime() return ##---------------------------------------- 节日红包 ----------------------------------------------- @@ -150,6 +152,8 @@ def OnRedPacketMinuteProcess(): ## 每分钟处理,定时发放系统红包 + CheckSendServerSystemRedPacket() + todayRedPacketByTimeList = __GetTodayRedPacketByTimeList() if not todayRedPacketByTimeList: return @@ -203,6 +207,89 @@ return ##-------------------------------------------------------------------------------------------------- +##---------------------------------------- 全服系统红包 --------------------------------------------- + +def RandTodayServerSystemRedPacketSendTime(): + ## 随机生成今日全服系统红包发放时间点 + + sendTimeList = [] + sysRedPackketSendCountToday = PlayerDBGSEvent.GetDBGSTrig_ByKey(DBKey_RedPacketSystemDayCount) + maxCount = IpyGameDataPY.GetFuncCfg("ServerSysRedPacket", 1) + needSendCount = max(0, maxCount - sysRedPackketSendCountToday) + + GameWorld.Log("随机生成发放全服系统红包时间! maxCount=%s,sysRedPackketSendCountToday=%s,needSendCount=%s" + % (maxCount, sysRedPackketSendCountToday, needSendCount)) + if needSendCount > 0: + startHour, endHour = IpyGameDataPY.GetFuncEvalCfg("ServerSysRedPacket", 3) + serverTime = GameWorld.GetServerTime() + year, month, day = serverTime.year, serverTime.month, serverTime.day + startDateTime = datetime.datetime(year, month, day, startHour) + if endHour == 0: + endDateTime = datetime.datetime(year, month, day) + datetime.timedelta(days=1) + else: + endDateTime = datetime.datetime(year, month, day, endHour) + + totalSeconds = (endDateTime - startDateTime).seconds # 可处理的总秒数 + aveSeconds = totalSeconds / maxCount # 平均间隔 + GameWorld.Log(" startDateTime=%s" % startDateTime) + GameWorld.Log(" endDateTime=%s" % endDateTime) + GameWorld.Log(" totalSeconds=%s,aveSeconds=%s" % (totalSeconds, aveSeconds)) + + nextStartDateTime = startDateTime + for _ in xrange(maxCount): + randSeconds = random.randint(60, aveSeconds - 60) # 前后扣掉1分钟,防止随机到同分钟 + randSendDateTime = nextStartDateTime + datetime.timedelta(seconds=randSeconds) + if randSendDateTime > serverTime: + sendTimeList.append(randSendDateTime) + GameWorld.Log(" 随机起始时间=%s,randSeconds=%s,随机发放时间=%s" % (nextStartDateTime, randSeconds, randSendDateTime)) + + nextStartDateTime += datetime.timedelta(seconds=aveSeconds) + + GameWorld.Log(" sendTimeList=%s" % sendTimeList) + IpyGameDataPY.SetConfigEx("ServerSystemRedPacketSendTime", sendTimeList) + return sendTimeList + +def CheckSendServerSystemRedPacket(): + ## 检查发送今日全服系统红包 + + sendTimeList = IpyGameDataPY.GetConfigEx("ServerSystemRedPacketSendTime") + if sendTimeList == None: + sendTimeList = RandTodayServerSystemRedPacketSendTime() + + if not sendTimeList: + #GameWorld.DebugLog("没有随机发放系统红包时间了!") + return + + serverTime = GameWorld.GetServerTime() + nextSendTime = sendTimeList[0] + if serverTime.hour == nextSendTime.hour and serverTime.minute == nextSendTime.minute: + sendTimeList.pop(0) + + randSysRedPacketList = IpyGameDataPY.GetFuncEvalCfg("ServerSysRedPacket", 2) + redPackID = GameWorld.GetResultByRandomList(randSysRedPacketList) + if not redPackID: + return + + CreateSystemRedPacket(redPackID) + + sysRedPackketSendCountToday = PlayerDBGSEvent.GetDBGSTrig_ByKey(DBKey_RedPacketSystemDayCount) + 1 + PlayerDBGSEvent.SetDBGSTrig_ByKey(DBKey_RedPacketSystemDayCount, sysRedPackketSendCountToday) + GameWorld.Log("发放全服系统红包: redPackID=%s, sysRedPackketSendCountToday=%s" % (redPackID, sysRedPackketSendCountToday)) + + maxCount = IpyGameDataPY.GetFuncCfg("ServerSysRedPacket", 1) + if sysRedPackketSendCountToday >= maxCount: + IpyGameDataPY.SetConfigEx("ServerSystemRedPacketSendTime", []) + GameWorld.Log(" 今日全服系统红包已经全部发完了! maxCount=%s" % maxCount) + + elif nextSendTime < serverTime: + sendTimeList.pop(0) + #GameWorld.DebugLog("发放系统红包时间过期了!serverTime=%s, nextSendTime=%s" % (serverTime, nextSendTime)) + #else: + # GameWorld.DebugLog("非发放系统红包时间!serverTime=%s, nextSendTime=%s" % (serverTime, nextSendTime)) + + return + +##-------------------------------------------------------------------------------------------------- def CreateSystemRedPacket(redPackID): ## 发放系统红包 @@ -216,10 +303,14 @@ openTime = ipyData.GetPacketOpenTime() # 如果有指定发放时间的 sysCreateTime = GameWorld.ChangeTimeStrToNum("%s:00" % openTime) if openTime else None + isAnonymous = 0 state = State_NoGot # 暂直接设定已发放 if ipyData.GetPacketOpenTime(): PlayerDBGSEvent.SetDBGSTrig_ByKey(DBKey_RedPacketSend % redPackID, 1) GameWorld.DebugLog("定时发放的红包,设置已发放! redPackID=%s" % redPackID) + + if getType == ShareDefine.RedPackType_Server: + isAnonymous = 1 job = 0 jobRank = 0 @@ -227,7 +318,7 @@ playerID = 0 family = None - __SaveNewRedRecord(family, playerID, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt, state, sysCreateTime=sysCreateTime) + __SaveNewRedRecord(family, playerID, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt, state, sysCreateTime=sysCreateTime, isAnonymous=isAnonymous) return ## 生成新红包 @@ -283,7 +374,7 @@ return ## 记录新红包数据 -def __SaveNewRedRecord(family, ownerid, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt,state=State_NoSend, wishStr='', sysCreateTime=None, data=0): +def __SaveNewRedRecord(family, ownerid, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt,state=State_NoSend, wishStr='', sysCreateTime=None, data=0, isAnonymous=0): global g_allRecordDict global g_redPackCountDict recordType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord @@ -317,7 +408,7 @@ recData.SetValue4(state) #是否已发 recData.SetValue5(curTimeNum) #该时间为开放领取的时间,不一定等于创建时间 recData.SetStrValue1('%s|%s|%s|%s'%(ownerid,playerName,job,getType)) #创建者ID|创建者名字|创建者职业|途径 - recData.SetStrValue2(str(packetCnt))#可抢总个数 + recData.SetStrValue2('%s|%s' % (packetCnt, int(isAnonymous)))#可抢总个数|是否匿名 recData.SetStrValue3(wishStr)#祝福语 g_allRecordDict[redPacketID] = recData GameWorld.Log("生成新的红包: familyID=%s,redPacketID=%s,ownerid=%s,ownername=%s,getType=%s,moneyType=%s,outputNum=%s,packetCnt=%s" % (familyID, redPacketID, ownerid, playerName, getType, moneyType, outputNum, packetCnt)) @@ -335,8 +426,9 @@ #大于200额度的红包 getTypeRainDict = IpyGameDataPY.GetFuncEvalCfg('OpenServerRedPacketRain', 2, {}) if str(getType) in getTypeRainDict: - PlayerControl.WorldNotify(0, getTypeRainDict[str(getType)]) - elif outputNum >= IpyGameDataPY.GetFuncCfg('OpenServerRedPacketRain'): + PlayerControl.WorldNotify(0, getTypeRainDict[str(getType)]) + elif outputNum >= IpyGameDataPY.GetFuncCfg('OpenServerRedPacketRain') \ + and getType not in [ShareDefine.RedPackType_Server]: PlayerControl.WorldNotify(0, 'OSRedpackSfx', [getType]) return recData @@ -436,7 +528,7 @@ def SendFamilyRedPacket(msgList): '''发系统赠送的红包,该红包已存在,只是状态未发放,由归属玩家自由选择发放时机''' - playerID, redPacketID, packetCnt = msgList + playerID, redPacketID, packetCnt, isAnonymous = msgList curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not curPlayer: return @@ -468,7 +560,7 @@ return recData.SetValue4(State_NoGot) - recData.SetStrValue2(str(packetCnt)) + recData.SetStrValue2('%s|%s' % (packetCnt, int(isAnonymous))) #更新时间 curTimeNum = int(time.time()) recData.SetValue5(curTimeNum) @@ -511,7 +603,9 @@ value3 = redPacketRecData.GetValue3() moneyType, totalMoney =value3%10, value3/10 - packetCnt = int(redPacketRecData.GetStrValue2()) + strValue2 = redPacketRecData.GetStrValue2() + strValue2List = strValue2.split('|') + packetCnt = int(strValue2List[0]) #找该红包的抢信息 grabRecordDict = __GetGrabRecord(redPacketID) @@ -546,7 +640,7 @@ if reqGetWay != getWay: GameWorld.ErrLog("领取的红包类型不一致,无法领取! reqGetWay=%s,getWay=%s" % (reqGetWay, getWay)) return - if getWay == ShareDefine.RedPackType_OpenServer: + if getWay in [ShareDefine.RedPackType_OpenServer, ShareDefine.RedPackType_Server]: getNumformula = IpyGameDataPY.GetFuncCompileCfg('OpenRedRacketOutNum') elif getWay in ShareDefine.FeastRedPackType: getNumformula = IpyGameDataPY.GetFuncCompileCfg('FeastRedPacket', 2) @@ -817,7 +911,10 @@ #GameWorld.DebugLog("已抢或抢完的不发: RedPacketID=%s,state=%s" % (packetInfo.RedPacketID, state)) continue packetInfo.State = state - packetInfo.PacketCnt = int(packetData.GetStrValue2()) + strValue2 = packetData.GetStrValue2() + strValue2List = strValue2.split('|') + packetInfo.PacketCnt = int(strValue2List[0]) + packetInfo.IsAnonymous = int(strValue2List[1]) if len(strValue2List) > 1 else 0 packetInfo.Wish = packetData.GetStrValue3() sendPack.RedPacketInfo.append(packetInfo) -- Gitblit v1.8.0