hxp
2021-04-14 9ed7a50c30881fd97a44c9fef82e1e4d97fcdff8
8901 【BT2】【后端】全服红包

# Conflicts:
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldGift.py
10个文件已修改
259 ■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyRedPacket.py 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamilyRedPacket.py 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_GrabFamilyRedPacketResult.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
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
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))
@@ -336,7 +427,8 @@
        getTypeRainDict = IpyGameDataPY.GetFuncEvalCfg('OpenServerRedPacketRain', 2, {})
        if str(getType) in getTypeRainDict:
            PlayerControl.WorldNotify(0, getTypeRainDict[str(getType)])  
        elif outputNum >= IpyGameDataPY.GetFuncCfg('OpenServerRedPacketRain'):
        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)
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],
                       }
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值
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
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
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():
@@ -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
    #开服红包恢复次数
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
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],
                       }