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/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyRedPacket.py                          |   72 +++++++++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                                           |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                                           |   11 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                                       |   19 +++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                                                |   11 +
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py                                               |  121 +++++++++++++++++++++--
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                                                |    3 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                                            |   19 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GrabFamilyRedPacketResult.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                              |    2 
 10 files changed, 233 insertions(+), 30 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index ebff0fa..650f1b5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -12768,6 +12768,7 @@
     PacketCnt = 0    #(WORD PacketCnt)// 红包数量
     MoneyNum = 0    #(WORD MoneyNum)//金钱数量
     Wish = ""    #(char Wish[33])//祝福语
+    IsAnonymous = 0    #(BYTE IsAnonymous)//是否匿名
     data = None
 
     def __init__(self):
@@ -12783,6 +12784,7 @@
         self.PacketCnt,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.MoneyNum,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.Wish,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.IsAnonymous,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -12794,6 +12796,7 @@
         self.PacketCnt = 0
         self.MoneyNum = 0
         self.Wish = ""
+        self.IsAnonymous = 0
         return
 
     def GetLength(self):
@@ -12803,6 +12806,7 @@
         length += 2
         length += 2
         length += 33
+        length += 1
 
         return length
 
@@ -12813,6 +12817,7 @@
         data = CommFunc.WriteWORD(data, self.PacketCnt)
         data = CommFunc.WriteWORD(data, self.MoneyNum)
         data = CommFunc.WriteString(data, 33, self.Wish)
+        data = CommFunc.WriteBYTE(data, self.IsAnonymous)
         return data
 
     def OutputString(self):
@@ -12821,14 +12826,16 @@
                                 RedPacketID:%d,
                                 PacketCnt:%d,
                                 MoneyNum:%d,
-                                Wish:%s
+                                Wish:%s,
+                                IsAnonymous:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
                                 self.RedPacketID,
                                 self.PacketCnt,
                                 self.MoneyNum,
-                                self.Wish
+                                self.Wish,
+                                self.IsAnonymous
                                 )
         return DumpString
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 4d99f79..631dd3a 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -1411,6 +1411,7 @@
     PacketCnt = 0    #(BYTE PacketCnt)//可抢个数
     State = 0    #(BYTE State)//0未发,1未领取,2已领取,3全部领完
     Wish = ""    #(char Wish[33])//祝福语
+    IsAnonymous = 0    #(BYTE IsAnonymous)//是否匿名
     data = None
 
     def __init__(self):
@@ -1430,6 +1431,7 @@
         self.PacketCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.State,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.Wish,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.IsAnonymous,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -1444,6 +1446,7 @@
         self.PacketCnt = 0
         self.State = 0
         self.Wish = ""
+        self.IsAnonymous = 0
         return
 
     def GetLength(self):
@@ -1459,6 +1462,7 @@
         length += 1
         length += 1
         length += 33
+        length += 1
 
         return length
 
@@ -1475,6 +1479,7 @@
         data = CommFunc.WriteBYTE(data, self.PacketCnt)
         data = CommFunc.WriteBYTE(data, self.State)
         data = CommFunc.WriteString(data, 33, self.Wish)
+        data = CommFunc.WriteBYTE(data, self.IsAnonymous)
         return data
 
     def OutputString(self):
@@ -1489,7 +1494,8 @@
                                 GetWay:%d,
                                 PacketCnt:%d,
                                 State:%d,
-                                Wish:%s
+                                Wish:%s,
+                                IsAnonymous:%d
                                 '''\
                                 %(
                                 self.RedPacketID,
@@ -1502,7 +1508,8 @@
                                 self.GetWay,
                                 self.PacketCnt,
                                 self.State,
-                                self.Wish
+                                self.Wish,
+                                self.IsAnonymous
                                 )
         return DumpString
 
@@ -20843,6 +20850,7 @@
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
                   ("HasSendGold", c_int),    # 已用额度
+                  ("ServerGrabCnt", c_int),    # 全服红包已抢次数
                   ]
 
     def __init__(self):
@@ -20860,6 +20868,7 @@
         self.Cmd = 0xA5
         self.SubCmd = 0x05
         self.HasSendGold = 0
+        self.ServerGrabCnt = 0
         return
 
     def GetLength(self):
@@ -20872,12 +20881,14 @@
         DumpString = '''// A5 05 通知家族钻石红包已用额度 //tagMCFamilyRedPacketGoldLimit:
                                 Cmd:%s,
                                 SubCmd:%s,
-                                HasSendGold:%d
+                                HasSendGold:%d,
+                                ServerGrabCnt:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
-                                self.HasSendGold
+                                self.HasSendGold,
+                                self.ServerGrabCnt
                                 )
         return DumpString
 
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)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 38b4c10..db8a215 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1871,10 +1871,13 @@
 RedPackType_FeastSysBig = 31 # 节日系统大红包
 RedPackType_FeastSysSmall = 32 # 节日系统小红包
 RedPackType_FeastSucc = 33 # 节日成就红包
+RedPackType_Server = 36 # 全服红包
+
 # 节日红包类型
 FeastRedPackType = [RedPackType_FeastSysBig, RedPackType_FeastSysSmall, RedPackType_FeastSucc]
 # 需要限制服务器最大红包数的红包类型 {统计个数编号:[红包类型, ...], ...}
 RedPackMaxCountDict = {1:[RedPackType_OpenServer],
                        2:[RedPackType_FeastSucc],
+                       3:[RedPackType_Server],
                        }
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index a7d3216..14822b0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3526,7 +3526,6 @@
 Def_PDict_FirstGoldRemainTime = "FirstGoldRemainTime"  # 首充提示剩余时间
 Def_PDict_FirstGoldTipStartTime = "FirstGoldTipStartTime"     # 首充提示开始时间
 Def_PDict_FirstGoldTry = "FirstGoldTry"     # 首充试用状态 0-不可试用 1-可试用 2-已试用
-Def_PDict_DailyChargeState = "DailyChargeState"  # 当日是否已充值
 Def_PDict_SuperGiftStartTime = "SuperGiftStartTime"  # 超值礼包开始时间
 Def_PDict_IsReBorn = "Def_PDict_IsReBorn"  # 是否回城复活
 Def_PDict_FamilyWarDailyReward = "FamilyWarDailyReward"  # 王者仙盟每日俸禄领取状态
@@ -3999,6 +3998,7 @@
 Def_PDict_OSRedPacketGrabMoney = "OSRedPacketGrabMoney"  # 开服红包已抢数量
 Def_PDict_OSRedPacketCanGrabCnt = "OSRedPacketCanGrabCnt"  # 开服红包可抢次数
 Def_PDict_OSRedPacketStartTime = "OSRedPacketStartTime" #开服红包开始倒计时时间
+Def_PDict_ServerRedPacketGrabCnt = "ServerRedPacketGrabCnt"  # 今日已抢全服红包次数
 
 #节日红包
 Def_PDict_FeastRedPacketActID = "FeastRedPacketActID"  # 玩家身上的节日红包活动ID,唯一标识,取活动开始日期time值
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index ebff0fa..650f1b5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -12768,6 +12768,7 @@
     PacketCnt = 0    #(WORD PacketCnt)// 红包数量
     MoneyNum = 0    #(WORD MoneyNum)//金钱数量
     Wish = ""    #(char Wish[33])//祝福语
+    IsAnonymous = 0    #(BYTE IsAnonymous)//是否匿名
     data = None
 
     def __init__(self):
@@ -12783,6 +12784,7 @@
         self.PacketCnt,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.MoneyNum,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.Wish,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.IsAnonymous,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -12794,6 +12796,7 @@
         self.PacketCnt = 0
         self.MoneyNum = 0
         self.Wish = ""
+        self.IsAnonymous = 0
         return
 
     def GetLength(self):
@@ -12803,6 +12806,7 @@
         length += 2
         length += 2
         length += 33
+        length += 1
 
         return length
 
@@ -12813,6 +12817,7 @@
         data = CommFunc.WriteWORD(data, self.PacketCnt)
         data = CommFunc.WriteWORD(data, self.MoneyNum)
         data = CommFunc.WriteString(data, 33, self.Wish)
+        data = CommFunc.WriteBYTE(data, self.IsAnonymous)
         return data
 
     def OutputString(self):
@@ -12821,14 +12826,16 @@
                                 RedPacketID:%d,
                                 PacketCnt:%d,
                                 MoneyNum:%d,
-                                Wish:%s
+                                Wish:%s,
+                                IsAnonymous:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
                                 self.RedPacketID,
                                 self.PacketCnt,
                                 self.MoneyNum,
-                                self.Wish
+                                self.Wish,
+                                self.IsAnonymous
                                 )
         return DumpString
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 4d99f79..631dd3a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -1411,6 +1411,7 @@
     PacketCnt = 0    #(BYTE PacketCnt)//可抢个数
     State = 0    #(BYTE State)//0未发,1未领取,2已领取,3全部领完
     Wish = ""    #(char Wish[33])//祝福语
+    IsAnonymous = 0    #(BYTE IsAnonymous)//是否匿名
     data = None
 
     def __init__(self):
@@ -1430,6 +1431,7 @@
         self.PacketCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.State,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.Wish,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.IsAnonymous,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -1444,6 +1446,7 @@
         self.PacketCnt = 0
         self.State = 0
         self.Wish = ""
+        self.IsAnonymous = 0
         return
 
     def GetLength(self):
@@ -1459,6 +1462,7 @@
         length += 1
         length += 1
         length += 33
+        length += 1
 
         return length
 
@@ -1475,6 +1479,7 @@
         data = CommFunc.WriteBYTE(data, self.PacketCnt)
         data = CommFunc.WriteBYTE(data, self.State)
         data = CommFunc.WriteString(data, 33, self.Wish)
+        data = CommFunc.WriteBYTE(data, self.IsAnonymous)
         return data
 
     def OutputString(self):
@@ -1489,7 +1494,8 @@
                                 GetWay:%d,
                                 PacketCnt:%d,
                                 State:%d,
-                                Wish:%s
+                                Wish:%s,
+                                IsAnonymous:%d
                                 '''\
                                 %(
                                 self.RedPacketID,
@@ -1502,7 +1508,8 @@
                                 self.GetWay,
                                 self.PacketCnt,
                                 self.State,
-                                self.Wish
+                                self.Wish,
+                                self.IsAnonymous
                                 )
         return DumpString
 
@@ -20843,6 +20850,7 @@
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
                   ("HasSendGold", c_int),    # 已用额度
+                  ("ServerGrabCnt", c_int),    # 全服红包已抢次数
                   ]
 
     def __init__(self):
@@ -20860,6 +20868,7 @@
         self.Cmd = 0xA5
         self.SubCmd = 0x05
         self.HasSendGold = 0
+        self.ServerGrabCnt = 0
         return
 
     def GetLength(self):
@@ -20872,12 +20881,14 @@
         DumpString = '''// A5 05 通知家族钻石红包已用额度 //tagMCFamilyRedPacketGoldLimit:
                                 Cmd:%s,
                                 SubCmd:%s,
-                                HasSendGold:%d
+                                HasSendGold:%d,
+                                ServerGrabCnt:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
-                                self.HasSendGold
+                                self.HasSendGold,
+                                self.ServerGrabCnt
                                 )
         return DumpString
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyRedPacket.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyRedPacket.py
index db0a347..4e2b21a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyRedPacket.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyRedPacket.py
@@ -48,6 +48,7 @@
     if onEventType == ShareDefine.Def_OnEventType:
         #发钻石红包额度重置
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyRedPacketGoldLimit, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ServerRedPacketGrabCnt, 0)
         __NotifyGoldLimt(curPlayer)
     elif onEventType == ShareDefine.Def_OnEventTypeEx:
         oscDay = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg')
@@ -57,6 +58,34 @@
             sendCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCfg', 5)
             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSRedPacketCanGrabCnt, grabCnt+sendCnt)
             NotifyOSRedPacket(curPlayer)
+    return
+
+def OnPlayerRecharge(curPlayer, orderRMB):
+    ## 玩家充值
+    
+    todayCoin = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AllCoinToday)
+    # 每日首充红包
+    if todayCoin - orderRMB * 100 == 0:
+        dayFirstRedPacketID = IpyGameDataPY.GetFuncCfg("RechargeRedPacket", 1)
+        GameWorld.DebugLog("每日首充红包: dayFirstRedPacketID=%s" % dayFirstRedPacketID)
+        if dayFirstRedPacketID:
+            CreatRedPacketByID(curPlayer, dayFirstRedPacketID)
+    #else:
+    #    GameWorld.DebugLog("非每日首充: todayCoin=%s" % todayCoin)
+        
+    # 单笔充值红包
+    rmbRedPacketID = 0
+    rmbRedPackIDDict = IpyGameDataPY.GetFuncEvalCfg("RechargeRedPacket", 2, {})
+    rmbList = rmbRedPackIDDict.keys()
+    rmbList.sort()
+    for rmb in rmbList:
+        if orderRMB <= rmb:
+            rmbRedPacketID = rmbRedPackIDDict[rmb]
+            break
+        
+    if rmbRedPacketID:
+        GameWorld.DebugLog("单笔充值红包: orderRMB=%s,rmbRedPacketID=%s" % (orderRMB, rmbRedPacketID))
+        CreatRedPacketByID(curPlayer, rmbRedPacketID)
     return
 
 def CreatCacheRedPacktet(curPlayer):
@@ -91,6 +120,8 @@
         if not PlayerFeastRedPacket.GetFeastRedPacketState():
             GameWorld.DebugLog('    非节日红包活动中,不可发送!')
             return
+        isFamilyRedPacket = False
+    elif getType == ShareDefine.RedPackType_Server:
         isFamilyRedPacket = False
     else:
         if not curPlayer.GetFamilyID():
@@ -141,7 +172,7 @@
     return
 
 
-#// A6 08 发家族红包 #tagCMSendFamilyRedPacket
+#// A6 08  发家族红包 #tagCMSendFamilyRedPacket
 #
 #struct     tagCMSendFamilyRedPacket
 #{
@@ -149,8 +180,8 @@
 #    DWORD        RedPacketID;    // 红包ID,没有发0
 #    WORD        PacketCnt;    // 红包数量
 #    WORD        MoneyNum;    //金钱数量
-#    WORD        WishLen;            //祝福语长度
-#    char        Wish[NameLen];        //size=WishLen
+#    char        Wish[33];        //祝福语
+#    BYTE        IsAnonymous;    //是否匿名
 #};
 ## 发家族红包
 def OnSendFamilyRedPacket(index, clientData, tick):
@@ -159,6 +190,7 @@
     packetCnt = clientData.PacketCnt
     moneyNum = clientData.MoneyNum
     wishInfo = clientData.Wish
+    isAnonymous = clientData.IsAnonymous
     if not redPacketID:
         #主动发的钻石红包 vip限制
         if not PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_FamilyGoldPack):
@@ -167,7 +199,7 @@
         __DoCreatRedPacket(curPlayer, ShareDefine.RedPackType_GoldPacket, IPY_GameWorld.TYPE_Price_Gold_Money, moneyNum, packetCnt, State_NoGot, wishInfo)
     else:
         # 注意:该函数发放的是已创建的红包,该操作只是把该红包开放给玩家可抢
-        msg = str([curPlayer.GetPlayerID(), redPacketID, packetCnt])
+        msg = str([curPlayer.GetPlayerID(), redPacketID, packetCnt, isAnonymous])
         GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "SendFamilyRedPacket", msg, len(msg))
     return
 
@@ -178,6 +210,7 @@
     packData = ChPyNetSendPack.tagMCFamilyRedPacketGoldLimit()
     packData.Clear()
     packData.HasSendGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyRedPacketGoldLimit, 0)
+    packData.ServerGrabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ServerRedPacketGrabCnt)
     NetPackCommon.SendFakePack(curPlayer, packData)
     return
 
@@ -213,11 +246,13 @@
         canGrabCnt = GetOSCanGrabCnt(curPlayer)
     elif reqGetWay == ShareDefine.RedPackType_FeastSucc:
         canGrabCnt = PlayerFeastRedPacket.GetFeastSuccRedPacketCanGrabCnt(curPlayer)
+    elif reqGetWay == ShareDefine.RedPackType_Server:
+        canGrabCnt = GetServerRedPackCanGrabCnt(curPlayer)
     else:
         canGrabCnt = -1
     msg = str([redPacketID, reqGetWay, canGrabCnt])
     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "GrabFamilyRedPacket", msg, len(msg))
-    GameWorld.DebugLog('    抢红包 getWay=%s,canGrabCnt=%s' % (reqGetWay, canGrabCnt))
+    GameWorld.DebugLog('    抢红包 redPacketID=%s,getWay=%s,canGrabCnt=%s' % (redPacketID, reqGetWay, canGrabCnt))
     return
 
 
@@ -264,6 +299,33 @@
     NotifyOSRedPacket(curPlayer)
     return
 
+def GetServerRedPackCanGrabCnt(curPlayer):
+    #获取全服红包可抢次数
+    # @return: -1为不限
+    vipLVMaxGrabCntDict = IpyGameDataPY.GetFuncEvalCfg("RechargeRedPacket", 3, {})
+    vipLVList = vipLVMaxGrabCntDict.keys()
+    vipLVList.sort()
+    for vipLV in vipLVList:
+        if curPlayer.GetVIPLv() <= vipLV:
+            maxGrabCnt = vipLVMaxGrabCntDict[vipLV]
+            if not maxGrabCnt:
+                return -1
+            todayGrabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ServerRedPacketGrabCnt)
+            return max(0, maxGrabCnt - todayGrabCnt)
+    return 0
+
+def GrabServerRedPacketResult(curPlayer, moneyNum, isSelf):
+    ##抢全服红包结果
+    
+    if isSelf:
+        return
+    
+    grabCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ServerRedPacketGrabCnt)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ServerRedPacketGrabCnt, grabCnt + 1)
+    
+    __NotifyGoldLimt(curPlayer)
+    return
+
 def ProcessOSRedPacket(curPlayer, tick):
     return
     #开服红包恢复次数
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GrabFamilyRedPacketResult.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GrabFamilyRedPacketResult.py
index d6bffb9..85ddc37 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GrabFamilyRedPacketResult.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GrabFamilyRedPacketResult.py
@@ -54,6 +54,8 @@
             PlayerFamilyRedPacket.GrabOSRedPacketResult(curPlayer, moneyNum, isSelf)
         elif getWay in ShareDefine.FeastRedPackType:
             PlayerFeastRedPacket.GrabFeastRedPacketResult(curPlayer, moneyNum, getWay, isSelf)
+        elif getWay == ShareDefine.RedPackType_Server:
+            PlayerFamilyRedPacket.GrabServerRedPacketResult(curPlayer, moneyNum, isSelf)
             
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 38b4c10..db8a215 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1871,10 +1871,13 @@
 RedPackType_FeastSysBig = 31 # 节日系统大红包
 RedPackType_FeastSysSmall = 32 # 节日系统小红包
 RedPackType_FeastSucc = 33 # 节日成就红包
+RedPackType_Server = 36 # 全服红包
+
 # 节日红包类型
 FeastRedPackType = [RedPackType_FeastSysBig, RedPackType_FeastSysSmall, RedPackType_FeastSucc]
 # 需要限制服务器最大红包数的红包类型 {统计个数编号:[红包类型, ...], ...}
 RedPackMaxCountDict = {1:[RedPackType_OpenServer],
                        2:[RedPackType_FeastSucc],
+                       3:[RedPackType_Server],
                        }
 

--
Gitblit v1.8.0