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