| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package PlayerFamilyRedPacket  | 
| #  | 
| # @todo:¼Ò×åºì°ü  | 
| # @author xdh  | 
| # @date 2017-08-29  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¼Ò×åºì°ü  | 
| #  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2017-08-29 18:00"""  | 
| #---------------------------------------------------------------------  | 
|   | 
| import GameWorld  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import ShareDefine  | 
| import IpyGameDataPY  | 
| import PlayerDBGSEvent  | 
| import PlayerUniversalGameRec  | 
| import PlayerControl  | 
| import ChConfig  | 
| import PlayerCompensation  | 
| import PlayerFamily  | 
|   | 
| import time  | 
| import random  | 
| import datetime  | 
|   | 
| '''  | 
| ºì°üÔݶ¨ÓÐЧÆÚ24Сʱ£¬¹ýÌìÇå³ý¹ýÆÚµÄºì°ü£¬Èç¹ûÊÇÍæ¼Ò·¢·ÅµÄ·µ»¹Î´ÁìÈ¡µÄ»õ±Ò  | 
| ÉÏÏßͬ²½ËùÓкì°üÐÅÏ¢£¬ºì°ü±ä»¯ÊµÊ±¹ã²¥È«·þÔÚÏßÍæ¼Ò  | 
| '''  | 
| #Def_UniversalGameRecType_FamilyRedPacketAllRecord  | 
| #Time      ´´½¨ºì°üʱ¼ä£¬·Çºì°üʵ¼Ê¿ª·ÅÁìȡʱ¼ä£¬Èç¹ûºì°ü±íÓÐÅäÖÃϵͳ·¢·Åʱ¼ä£¬Ôò¸Ãʱ¼ä´æÅä±íʱ¼ä£¬Ã»Óеϰ´æ´´½¨Ê±µÄ·þÎñÆ÷ʱ¼ä  | 
| #value1    ºì°üΨһID£¬¸ÃIDΪʵÀýID£¬·ÇÅä±íµÄºì°üID  | 
| #value2    ¼Ò×åID£¬0´ú±íÈ«·þºì°ü  | 
| #value3    ×ܶî¶È*10+½ðÇ®ÀàÐÍ  | 
| #value4    ×´Ì¬  | 
| #value5    Ê±¼ä£¬ÓÃÀ´ÅжÏÊÇ·ñ¹ýÆÚɾ³ýµÄ£¬Êµ¼Ê¿ª·Å¸Ãºì°üÁìÈ¡µÄʱ¼ä  | 
| #strValue1 ´´½¨ÕßID|´´½¨ÕßÃû×Ö|´´½¨ÕßÖ°Òµ|»ñµÃ;¾¶£¨ºì°üÀàÐÍ£©  | 
| #strValue2 ¿ÉÇÀ×ܸöÊý  | 
| #strValue3 ×£¸£Óï£¬Íæ¼Ò×Ô¼º±à¼µÄÄÚÈÝ  | 
|   | 
| #Def_UniversalGameRecType_FamilyRedPacketGrabRecord  | 
| #value1    ºì°üΨһID  | 
| #value2    playerID  | 
| #value3    job  | 
| #value4    moneyType  | 
| #value5    getMoney  | 
| #strValue1 Ãû×Ö  | 
|   | 
| (  | 
| State_NoSend,   #δ·¢  | 
| State_NoGot,    #δÁìÈ¡  | 
| State_HasGot,   #ÒÑÁìÈ¡  | 
| State_HasAllGot,#È«²¿ÁìÍê  | 
| )=range(4)  | 
|   | 
| g_allRecordDict = {} #{ºì°üID:recData, ...}  | 
| g_grabDataDict = {} #{ºì°üID:{playerid:[ÇÀµ½µÄÇ®,Ãû×Ö,job]}, ...}  | 
| g_redPackCountDict = {} #ÓÐÏÞÖÆ×î´óºì°ü¸öÊýµÄÀàÐͶÔÓ¦µ±Ç°ºì°üÊý {ÀàÐÍ×é¶ÔÓ¦¼Ç¼±àºÅ:µ±Ç°¸öÊý, ...}  | 
|   | 
| DBKey_RedPacketSend = "RedPacketSend_%s" # ÏµÍ³¶¨Ê±ºì°üÊÇ·ñÒÑ·¢·Å£¬ ²ÎÊýºì°üID  | 
|   | 
| ## Íæ¼ÒµÇ¼  | 
| #  @param None  | 
| #  @return None  | 
| def OnPlayerLogin(curPlayer):  | 
|     NotifyRedPacketInfo(curPlayer)  | 
|     return  | 
|   | 
|   | 
| ## ¸ôÌì¸üР | 
| #  @param None  | 
| #  @return None  | 
| def DoOnDay():  | 
|     __CheckGrabRecData()  | 
|       | 
|     return  | 
|   | 
| ##---------------------------------------- ½ÚÈÕºì°ü -----------------------------------------------  | 
|   | 
| def OnResetFeastRedPacket(ipyData, dayIndex):  | 
|     ## ÖØÖýÚÈÕºì°ü״̬  | 
|       | 
|     if not ipyData:  | 
|         return  | 
|       | 
|     dayRedPackIDList = ipyData.GetRedPacketIDList()  | 
|     GameWorld.Log("ÖØÖýÚÈÕºì°ü·¢·Å״̬: dayRedPackIDList=%s, dayIndex=%s" % (dayRedPackIDList, dayIndex))  | 
|     if dayIndex < 0 or dayIndex >= len(dayRedPackIDList):  | 
|         GameWorld.ErrLog("µ±Ç°½ÚÈÕÌìË÷ÒýûÓÐÅäÅäÖÃϵͳºì°üID! dayRedPackIDList=%s, dayIndex=%s" % (dayRedPackIDList, dayIndex))  | 
|         return  | 
|       | 
|     for redPackID in dayRedPackIDList[dayIndex]:  | 
|         GameWorld.Log("    ÖØÖýÚÈÕºì°ü·¢·Å״̬: redPackID=%s" % redPackID)  | 
|         if PlayerDBGSEvent.GetDBGSTrig_ByKey(DBKey_RedPacketSend % redPackID):  | 
|             PlayerDBGSEvent.SetDBGSTrig_ByKey(DBKey_RedPacketSend % redPackID, 0)  | 
|               | 
|     return  | 
|   | 
| def __GetTodayRedPacketByTimeList():  | 
|     key = "TodayRedPacketByTime"  | 
|     openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1  | 
|     TodayRedPacketByTimeInfo = IpyGameDataPY.GetConfigEx(key)  | 
|     if TodayRedPacketByTimeInfo and TodayRedPacketByTimeInfo[0] == openServerDay:  | 
|         #GameWorld.DebugLog("ÒѾ¼ÓÔØ¹ý±¾ÈÕϵͳ¶¨Ê±·¢·ÅµÄºì°ü! openServerDay=%s" % openServerDay)  | 
|         return TodayRedPacketByTimeInfo[1]  | 
|       | 
|     redPacketByTimeList = []  | 
|     serverTime = GameWorld.GetServerTime()  | 
|       | 
|     GameWorld.Log("===== ¼ÓÔØ½ñÌìϵͳ¶¨Ê±·¢·Åºì°üÐÅÏ¢ ===== openServerDay=%s" % openServerDay)  | 
|       | 
|     ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|     for index in xrange(ipyDataMgr.GetFamilyRedPackCount()):  | 
|         ipyData = ipyDataMgr.GetFamilyRedPackByIndex(index)  | 
|         redPackID = ipyData.GetID()  | 
|         openTimeStr = ipyData.GetPacketOpenTime()  | 
|         if not openTimeStr:  | 
|             #GameWorld.DebugLog("·Ç¶¨Ê±·¢·ÅµÄºì°ü!redPackID=%s" % (redPackID))  | 
|             continue  | 
|           | 
|         openDateTime = datetime.datetime.strptime("%s:00" % openTimeStr, ChConfig.TYPE_Time_Format)  | 
|         if openDateTime.year != serverTime.year or openDateTime.month != serverTime.month or openDateTime.day != serverTime.day:  | 
|             #GameWorld.DebugLog("·Ç½ñÈÕ¶¨Ê±·¢·ÅµÄºì°ü!redPackID=%s" % (redPackID))  | 
|             continue  | 
|           | 
|         endDateTime = None  | 
|         validMinutes = ipyData.GetValidMinutes()  | 
|         if validMinutes:  | 
|             endDateTime = openDateTime +  + datetime.timedelta(minutes=validMinutes)  | 
|               | 
|         redPacketByTimeList.append([redPackID, openDateTime, endDateTime])  | 
|           | 
|         GameWorld.Log("    Ôö¼Ó±¾ÈÕ¶¨Ê±·¢·Åϵͳºì°üÐÅÏ¢: redPackID=%s, %s" % (redPackID, openTimeStr))  | 
|           | 
|     TodayRedPacketByTimeInfo = IpyGameDataPY.SetConfigEx(key, [openServerDay, redPacketByTimeList])  | 
|     GameWorld.Log("±¾ÈÕϵͳ¶¨Ê±·¢·ÅµÄºì°ü¼ÓÔØÍê±Ï!")  | 
|     GameWorld.Log("=============================================================")  | 
|     return TodayRedPacketByTimeInfo[1]  | 
|   | 
| def OnRedPacketMinuteProcess():  | 
|     ## Ã¿·ÖÖÓ´¦Àí£¬¶¨Ê±·¢·Åϵͳºì°ü  | 
|       | 
|     todayRedPacketByTimeList = __GetTodayRedPacketByTimeList()  | 
|     if not todayRedPacketByTimeList:  | 
|         return  | 
|       | 
|     serverTime = GameWorld.GetServerTime()  | 
|       | 
|     for redPacketOpenInfo in todayRedPacketByTimeList:  | 
|         redPackID, openDateTime, endDateTime = redPacketOpenInfo  | 
|           | 
|         if serverTime < openDateTime or (endDateTime and serverTime >= endDateTime):  | 
|             #GameWorld.DebugLog("·Çºì°ü·¢·Åʱ¶Î!  redPackID=%s, openDateTime=%s, endDateTime=%s" % (redPackID, openDateTime, endDateTime))  | 
|             continue  | 
|           | 
|         if PlayerDBGSEvent.GetDBGSTrig_ByKey(DBKey_RedPacketSend % redPackID):  | 
|             #GameWorld.DebugLog("ºì°üÒÑ·¢·Å¹ý! redPackID=%s" % (redPackID))  | 
|             continue  | 
|         CreateSystemRedPacket(redPackID)  | 
|           | 
|     return  | 
|   | 
| def Sync_FeastRedPacket(ipyData, curPlayer=None):  | 
|     ## Í¬²½½ÚÈÕºì°ü»î¶¯ÐÅÏ¢  | 
|       | 
|     if not ipyData:  | 
|         return  | 
|       | 
|     openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1  | 
|     feastPack = ChPyNetSendPack.tagGCFeastRedPacketInfo()  | 
|     feastPack.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)  | 
|     feastPack.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)  | 
|     feastPack.LimitLV = ipyData.GetLVLimit()  | 
|     feastPack.ResetType = ipyData.GetResetType()  | 
|     feastPack.RedPacketDayList = []  | 
|     for redPacketIDList in ipyData.GetRedPacketIDList():  | 
|         dayInfo = ChPyNetSendPack.tagGCFeastRedPacketDay()  | 
|         dayInfo.RedPacketIDList = redPacketIDList  | 
|         dayInfo.RedPacketCount = len(dayInfo.RedPacketIDList)  | 
|         feastPack.RedPacketDayList.append(dayInfo)  | 
|     feastPack.RedPacketDays = len(feastPack.RedPacketDayList)  | 
|       | 
|     if not curPlayer:  | 
|         # È«·þ¹ã²¥ÔÚÏßÍæ¼Ò  | 
|         playerManager = GameWorld.GetPlayerManager()  | 
|         for i in xrange(playerManager.GetActivePlayerCount()):  | 
|             curPlayer = playerManager.GetActivePlayerAt(i)  | 
|             if curPlayer == None or not curPlayer.GetInitOK():  | 
|                 continue  | 
|             NetPackCommon.SendFakePack(curPlayer, feastPack)  | 
|     else:  | 
|         NetPackCommon.SendFakePack(curPlayer, feastPack)  | 
|     return  | 
|   | 
| ##--------------------------------------------------------------------------------------------------  | 
|   | 
| def CreateSystemRedPacket(redPackID):  | 
|     ## ·¢·Åϵͳºì°ü  | 
|     ipyData = IpyGameDataPY.GetIpyGameData('FamilyRedPack', redPackID)  | 
|     if not ipyData:  | 
|         return  | 
|     getType = ipyData.GetGetType()  | 
|     moneyType = ipyData.GetMoneyType()  | 
|     outputNum = ipyData.GetMoneyNum()  | 
|     packetCnt = ipyData.GetPacketCnt()  | 
|     openTime = ipyData.GetPacketOpenTime() # Èç¹ûÓÐÖ¸¶¨·¢·Åʱ¼äµÄ  | 
|     sysCreateTime = GameWorld.ChangeTimeStrToNum("%s:00" % openTime) if openTime else None  | 
|       | 
|     state = State_NoGot # ÔÝÖ±½ÓÉ趨ÒÑ·¢·Å  | 
|     if ipyData.GetPacketOpenTime():  | 
|         PlayerDBGSEvent.SetDBGSTrig_ByKey(DBKey_RedPacketSend % redPackID, 1)  | 
|         GameWorld.DebugLog("¶¨Ê±·¢·ÅµÄºì°ü£¬ÉèÖÃÒÑ·¢·Å! redPackID=%s" % redPackID)  | 
|           | 
|     job = 0  | 
|     jobRank = 0  | 
|     playerName = ""  | 
|     playerID = 0  | 
|     family = None  | 
|       | 
|     __SaveNewRedRecord(family, playerID, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt, state, sysCreateTime=sysCreateTime)  | 
|     return  | 
|   | 
| ## Éú³Éкì°ü  | 
| def MapServer_CreatRedPacket(msgList):  | 
|     playerID, getType, packetCnt, moneyType, outputNum, wishStr, state, data, isFamilyRedPacket = msgList  | 
|     curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)  | 
|     if not curPlayer:  | 
|         return  | 
|     if not isFamilyRedPacket:  | 
|         familyID = 0  | 
|         family = None  | 
|     else:  | 
|         familyID = curPlayer.GetFamilyID()  | 
|         family = GameWorld.GetFamilyManager().FindFamily(familyID)  | 
|         if not family:  | 
|             return  | 
|         packetCnt = min(packetCnt, family.GetCount())  | 
| #    if getType != 0:  | 
| #        commonCntLimit = IpyGameDataPY.GetFuncCfg('FamilyRedPacketCnt')  | 
| #        packetCnt = max(packetCnt, commonCntLimit)  | 
|       | 
|     if outputNum < packetCnt:  | 
|         GameWorld.DebugLog("    Éú³ÉÐÂÏÉÃ˺ì°ü ºì°ü¶î¶È²»ÄܵÍÓÚºì°ü¸öÊý£¡outputNum=%s,redCnt=%s" % (outputNum, packetCnt))  | 
|         return  | 
|     job = curPlayer.GetJob()  | 
|     jobRank = 0  | 
|     playerName = curPlayer.GetName()  | 
|     __SaveNewRedRecord(family, playerID, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt, state, wishStr, data=data)  | 
|     return  | 
|   | 
| def CreatNewFamilyRedPacket(family, playerID, redPackID):  | 
|     '''Íⲿ½Ó¿Ú£¬Éú³ÉÏÉÃËкì°ü'''  | 
|     if not family or not playerID or not redPackID:  | 
|         return  | 
|     ipyData = IpyGameDataPY.GetIpyGameData('FamilyRedPack', redPackID)  | 
|     if not ipyData:  | 
|         return  | 
|     getType = ipyData.GetGetType()  | 
|     moneyType = ipyData.GetMoneyType()  | 
|     outputNum = ipyData.GetMoneyNum()  | 
|       | 
|     familyID = family.GetID()  | 
|     member = family.FindMember(playerID)  | 
|     if not member:  | 
|         GameWorld.ErrLog("ÏÉÃËûÓиóÉÔ±, ÎÞ·¨·¢·ÅÏÉÃ˺ì°ü!familyID=%s,playerID=%s,redPackID=%s" % (familyID, playerID, redPackID))  | 
|         return  | 
|       | 
|     job = member.GetJob()  | 
|     jobRank = 0  | 
|     playerName = member.GetName()  | 
|       | 
|     __SaveNewRedRecord(family, playerID, playerName, job, jobRank, getType, moneyType, outputNum, 0)  | 
|     return  | 
|   | 
| ## ¼Ç¼Ðºì°üÊý¾Ý  | 
| def __SaveNewRedRecord(family, ownerid, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt,state=State_NoSend, wishStr='', sysCreateTime=None, data=0):  | 
|     global g_allRecordDict  | 
|     global g_redPackCountDict  | 
|     recordType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord  | 
|     universalRecMgr = GameWorld.GetUniversalRecMgr()  | 
|     recordList = universalRecMgr.GetTypeList(recordType)  | 
|     for maxCountKeyNum, getTypeList in ShareDefine.RedPackMaxCountDict.items():  | 
|         if getType in getTypeList:  | 
|             if not __CheckOSRedPacketCnt(recordList, maxCountKeyNum, getTypeList):  | 
|                 return  | 
|             g_redPackCountDict[maxCountKeyNum] = g_redPackCountDict.get(maxCountKeyNum, 0) + 1  | 
|             GameWorld.DebugLog("µ±Ç°ºì°üÊý: g_redPackCountDict=%s" % g_redPackCountDict)  | 
|             break  | 
|           | 
|     familyID = family.GetID() if family else 0  | 
|     recData = recordList.AddRec()  | 
|       | 
|       | 
|     #ºì°üΨһID ´Ó1¿ªÊ¼ÀۼƠ³¬¹ý20ÒÚÔòÖØÐ¿ªÊ¼  | 
|     # ºì°üΨһID  | 
|     DB_RedPacketID = "FamilyRedPacketID"  | 
|     redPacketID = PlayerDBGSEvent.GetDBGSTrig_ByKey(DB_RedPacketID) + 1  | 
|     if redPacketID >= ChConfig.Def_UpperLimit_DWord:  | 
|         redPacketID = 1  | 
|     PlayerDBGSEvent.SetDBGSTrig_ByKey(DB_RedPacketID, redPacketID)  | 
|       | 
|     curTimeNum = int(time.time())  | 
|     recData.SetTime(sysCreateTime if sysCreateTime else curTimeNum) # Îª·½±ãǰ¶Ë¶Ô±ÈÅä±íÉèÖõķ¢·Åºì°üʱ¼ä£¬Èç¹ûÓÐÅäÖõÄʱ¼ä£¬Ôò´´½¨Ê±¼äĬÈÏÈ¡Åä±íµÄ  | 
|     recData.SetValue1(redPacketID) #ºì°üΨһID  | 
|     recData.SetValue2(familyID)  #¼Ò×åID     | 
|     recData.SetValue3(moneyType + outputNum * 10) #×ܶî¶È*10+½ðÇ®ÀàÐÍ  | 
|     recData.SetValue4(state) #ÊÇ·ñÒÑ·¢  | 
|     recData.SetValue5(curTimeNum) #¸Ãʱ¼äΪ¿ª·ÅÁìÈ¡µÄʱ¼ä£¬²»Ò»¶¨µÈÓÚ´´½¨Ê±¼ä  | 
|     recData.SetStrValue1('%s|%s|%s|%s'%(ownerid,playerName,job,getType)) #´´½¨ÕßID|´´½¨ÕßÃû×Ö|´´½¨ÕßÖ°Òµ|;¾¶  | 
|     recData.SetStrValue2(str(packetCnt))#¿ÉÇÀ×ܸöÊý  | 
|     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))  | 
|       | 
|     #֪ͨ  | 
|     __NotifyFamilyRedPacketInfo(family, recData, [])  | 
|     if getType == ShareDefine.RedPackType_OpenServer:  | 
|         if not PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_OSRedPacket):  | 
|             PlayerControl.WorldNotify(0, 'OpenRedBag2', [playerName, data, outputNum])  | 
|             PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_OSRedPacket, 1)  | 
|         elif data in IpyGameDataPY.GetFuncEvalCfg('OSRSuccess'):  | 
|             PlayerControl.WorldNotify(0, 'OpenRedBag3', [playerName, data, outputNum])  | 
|               | 
|     if not familyID:  | 
|         #´óÓÚ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, 'OSRedpackSfx', [getType])     | 
|               | 
|     return recData  | 
|   | 
|   | 
| def __CheckOSRedPacketCnt(recordList, maxCountKeyNum, getTypeList):  | 
|     global g_grabDataDict  | 
|     global g_allRecordDict  | 
|     global g_redPackCountDict  | 
|     ##¿ª·þºì°ü¸öÊýÊÇ·ñ´ïÉÏÏÞ  | 
|     curRedCnt = g_redPackCountDict.get(maxCountKeyNum, 0)  | 
|     openServerRedPacketCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCnt', 1) # Ö±½ÓÓÿª·þºì°üÕâ¸öÅäÖÃ×÷ΪͨÓÃÅäÖà  | 
|     if curRedCnt and curRedCnt < openServerRedPacketCnt + 10:  | 
|         return True  | 
|     allCnt = recordList.Count()  | 
|   | 
|     curCnt = 0  | 
|     delRedPacketIDList = []  | 
|     for index in xrange(allCnt):  | 
|         universalRecData = recordList.At(index)  | 
|         strValue1 = universalRecData.GetStrValue1()  | 
|         strValue1List = strValue1.split('|')  | 
|         getWay = int(strValue1List[3])  | 
|         if getWay not in getTypeList:  | 
|             continue  | 
|         redPacketID = universalRecData.GetValue1()  | 
|         curCnt += 1  | 
|         if len(delRedPacketIDList) < 10:  | 
|             delRedPacketIDList.append(redPacketID)  | 
|         elif curRedCnt:  | 
|             break  | 
|     if not delRedPacketIDList:  | 
|         return True  | 
|     if not curRedCnt:  | 
|         curRedCnt = curCnt  | 
|   | 
|     if curRedCnt < openServerRedPacketCnt + 10:  | 
|         return True  | 
|   | 
|     delCnt = 0  | 
|     for index in xrange(recordList.Count()):  | 
|         dataIndex = index - delCnt  | 
|         universalRecData = recordList.At(dataIndex)  | 
|         delRedPacketID = universalRecData.GetValue1()  | 
|         if delRedPacketID in delRedPacketIDList:  | 
|             recordList.Delete(dataIndex)  | 
|             delCnt +=1  | 
|             g_grabDataDict.pop(delRedPacketID, 0)  | 
|             g_allRecordDict.pop(delRedPacketID, 0)  | 
|     curRedCnt -= delCnt  | 
|       | 
|           | 
|     recordType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord  | 
|     universalRecMgr = GameWorld.GetUniversalRecMgr()  | 
|     recordList = universalRecMgr.GetTypeList(recordType)  | 
|     delCnt = 0  | 
|     for index in xrange(recordList.Count()):  | 
|         dataIndex = index - delCnt  | 
|         universalRecData = recordList.At(dataIndex)  | 
|         if universalRecData.GetValue1() in delRedPacketIDList:  | 
|             recordList.Delete(dataIndex)  | 
|             delCnt +=1  | 
|               | 
|     #֪ͨ  | 
|     NotifyDelRedPacketInfo(delRedPacketIDList)  | 
|     return True  | 
|   | 
| def __DelGrabRecord():  | 
|     #ɾ³ý¶àÓàÇÀÐÅÏ¢  | 
|     universalRecMgr = GameWorld.GetUniversalRecMgr()  | 
|     allRecordList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord)  | 
|     allCnt = allRecordList.Count()  | 
|     redPacketIDList = []  | 
|     for index in xrange(allCnt):  | 
|         universalRecData = allRecordList.At(index)  | 
|         redPacketID = universalRecData.GetValue1()  | 
|         redPacketIDList.append(redPacketID)  | 
|       | 
|     recordType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord  | 
|     recordList = universalRecMgr.GetTypeList(recordType)  | 
|     delCnt = 0  | 
|     for index in xrange(recordList.Count()):  | 
|         dataIndex = index - delCnt  | 
|         universalRecData = recordList.At(dataIndex)  | 
|         if universalRecData.GetValue1() not in redPacketIDList:  | 
|             recordList.Delete(dataIndex)  | 
|             delCnt +=1  | 
|     GameWorld.Log('    É¾³ý¶àÓàÇÀºì°üÐÅÏ¢ delCnt=%s'%delCnt)  | 
|     return  | 
|   | 
| isdel = False  | 
| if not isdel:  | 
|     __DelGrabRecord()  | 
|     isdel = True  | 
|       | 
|   | 
|   | 
| def SendFamilyRedPacket(msgList):  | 
|     '''·¢ÏµÍ³ÔùË͵ĺì°ü£¬¸Ãºì°üÒÑ´æÔÚ£¬Ö»ÊÇ״̬δ·¢·Å£¬ÓɹéÊôÍæ¼Ò×ÔÓÉÑ¡Ôñ·¢·Åʱ»ú'''  | 
|     playerID, redPacketID, packetCnt = msgList  | 
|     curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)  | 
|     if not curPlayer:  | 
|         return  | 
|       | 
|     recDataList = __FindGrabRecData(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord,redPacketID)  | 
|       | 
|     if not recDataList:  | 
|         return  | 
|     recData=recDataList[0]  | 
|     strValue1 = recData.GetStrValue1()  | 
|     strValue1List = strValue1.split('|')  | 
|     ownID = int(strValue1List[0])  | 
|     getWay = int(strValue1List[3])  | 
|       | 
|     ipyData = IpyGameDataPY.GetIpyGameDataByCondition('FamilyRedPack', {'GetType':getWay})  | 
|     if not ipyData:  | 
|         return  | 
|     if ipyData.GetLeaderOwn():  | 
|         if not PlayerFamily.GetPlayerHasFamilyPow(curPlayer, ChConfig.Def_PurviewDictKey_CanSendRedPacket):  | 
|             GameWorld.DebugLog('    ·¢ÏµÍ³ÔùË͵ĺì°ü È¨ÏÞ²»×㣡', playerID)  | 
|             return  | 
|         if playerID != ownID:  | 
|             strValue1List[0] = str(playerID)  | 
|             StrValue1 = '|'.join(strValue1List)  | 
|             recData.SetStrValue1(StrValue1)  | 
|               | 
|     elif playerID != ownID:  | 
|         GameWorld.DebugLog('    ·¢ÏµÍ³ÔùË͵ĺì°ü ²»ÊDZ¾ÈË£¡', playerID)  | 
|         return  | 
|       | 
|     recData.SetValue4(State_NoGot)  | 
|     recData.SetStrValue2(str(packetCnt))  | 
|     #¸üÐÂʱ¼ä  | 
|     curTimeNum = int(time.time())  | 
|     recData.SetValue5(curTimeNum)  | 
|     if recData.GetValue2() == 0:  | 
|         family = None  | 
|     else:  | 
|         family = curPlayer.GetFamily()  | 
|         if family == None:  | 
|             return  | 
|     __NotifyFamilyRedPacketInfo(family, recData, [])  | 
|     return  | 
|   | 
|   | 
| ## ÇÀºì°ü  | 
| def DoGrabFamilyRedPacket(curPlayer, msgList):  | 
|     global g_grabDataDict  | 
|     redPacketID, reqGetWay, canGrabCnt = msgList  | 
|       | 
|     playerID= curPlayer.GetPlayerID()  | 
|     job = curPlayer.GetJob()  | 
|     playerName = curPlayer.GetName()  | 
|       | 
|       | 
|     recDataList = __FindGrabRecData(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord, redPacketID)  | 
|     if not recDataList:  | 
|         GameWorld.Log('    Î´ÕÒµ½¸ÃÏÉÃ˺ì°ü¼Ç¼redPacketID=%s'%redPacketID)  | 
|         return  | 
|     redPacketRecData = recDataList[0]  | 
|     state = redPacketRecData.GetValue4()  | 
|     if state in [State_NoSend]:  | 
|         GameWorld.DebugLog("    ¸ÃÏÉÃ˺ì°ü»¹Î´·¢ËÍ£¡",playerID)  | 
|         return  | 
|     familyID = redPacketRecData.GetValue2()  | 
|     if familyID:  | 
|         curFamily = curPlayer.GetFamily()  | 
|         if curFamily == None:  | 
|             return  | 
|     else:  | 
|         curFamily = None  | 
|       | 
|     value3 = redPacketRecData.GetValue3()  | 
|     moneyType, totalMoney =value3%10, value3/10  | 
|     packetCnt = int(redPacketRecData.GetStrValue2())  | 
|       | 
|     #ÕҸúì°üµÄÇÀÐÅÏ¢  | 
|     grabRecordDict = __GetGrabRecord(redPacketID)  | 
|     if playerID in grabRecordDict or len(grabRecordDict) >= packetCnt:  | 
|         GameWorld.DebugLog("    ¸ÃÍæ¼ÒÒÑÇÀ¹ý´Ëºì°ü£¡",playerID)  | 
|         __NotifyGrabRedPacketInfo(curPlayer, redPacketID, grabRecordDict)  | 
|         return  | 
|       | 
|     outNum = sum([a[0] for a in grabRecordDict.values()]) #Òѱ»ÇÀµÄÇ®  | 
|     remainNum = totalMoney - outNum #Ê£ÓàµÄÇ®  | 
|     remainPacketCnt = packetCnt-len(grabRecordDict)  | 
|     if remainNum < remainPacketCnt:  | 
|         GameWorld.Log(' ¸Ãºì°üÊ£ÓàµÄÇ®²»¹»·¢ packetCnt =%s,totalMoney=%s,outNum=%s,remainMoney=%s,grabRecordDict=%s'%(packetCnt, totalMoney,outNum,remainNum, grabRecordDict))  | 
|         return  | 
|     strValue1 = redPacketRecData.GetStrValue1()  | 
|     strValue1List = strValue1.split('|')  | 
|     getWay = int(strValue1List[3])  | 
|     owerID = int(strValue1List[0])  | 
|     isSelf = owerID == playerID  | 
|     if not isSelf and canGrabCnt != -1 and canGrabCnt <= 0:  | 
|         GameWorld.DebugLog('    ÇÀ¿ª·þºì°ü£¬´ÎÊý²»×㣡£¡')  | 
|         return  | 
|     if reqGetWay != getWay:  | 
|         GameWorld.ErrLog("ÁìÈ¡µÄºì°üÀàÐͲ»Ò»Ö£¬ÎÞ·¨ÁìÈ¡! reqGetWay=%s,getWay=%s" % (reqGetWay, getWay))  | 
|         return  | 
|     if getWay == ShareDefine.RedPackType_OpenServer:  | 
|         getNumformula = IpyGameDataPY.GetFuncCompileCfg('OpenRedRacketOutNum')  | 
|     elif getWay in ShareDefine.FeastRedPackType:  | 
|         getNumformula = IpyGameDataPY.GetFuncCompileCfg('FeastRedPacket', 2)  | 
|     else:  | 
|         getNumformula = IpyGameDataPY.GetFuncCompileCfg('FamilyRedRacketOutNum')  | 
|           | 
|     getMoney = eval(getNumformula) if remainPacketCnt > 1 else remainNum  | 
|     GameWorld.DebugLog("    ¸ÃÍæ¼ÒÇÀµ½ºì°ü=%s£¡"%getMoney, playerID)  | 
|     grabRecordDict[playerID] = [getMoney, playerName, job]  | 
|     #ÐÂÔöÒ»ÌõÇÀµÄ¼Ç¼  | 
|     recType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord  | 
|     valueList = [redPacketID, playerID, job, moneyType, getMoney]  | 
|     strValueList = [playerName]  | 
|     PlayerUniversalGameRec.MapServer_UniversalGameRec(None, recType, valueList, strValueList)  | 
|     #{playerid:[ÇÀµ½µÄÇ®,Ãû×Ö,job]}  | 
|     g_grabDataDict[redPacketID] = grabRecordDict  | 
|       | 
|     if len(grabRecordDict) == packetCnt:  | 
|         redPacketRecData.SetValue4(State_HasAllGot)  | 
|           | 
|         #֪ͨ¸ÃÍæ¼Òºì°üÇÀ½á¹û  | 
|         __NotifyFamilyRedPacketInfo(curFamily, redPacketRecData, grabRecordDict.keys())  | 
|     else:  | 
|         NotifyRedPacketInfo(curPlayer, [redPacketRecData, grabRecordDict.keys()])  | 
|           | 
|     __NotifyGrabRedPacketInfo(curPlayer, redPacketID, grabRecordDict)  | 
|       | 
|     #¸øÇ®  | 
|     result = str([moneyType, getMoney, getWay, isSelf])  | 
|     curPlayer.MapServer_QueryPlayerResult(0, 0, "GrabFamilyRedPacketResult", result, len(result))  | 
|     return getMoney  | 
|   | 
|       | 
|       | 
| ## »ñÈ¡ÇÀºì°ü¼Ç¼  | 
| def __GetGrabRecord(redPacketID):  | 
|     if redPacketID in g_grabDataDict:  | 
|         return g_grabDataDict[redPacketID]  | 
|       | 
|     recDataList = __FindGrabRecData(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord, redPacketID)  | 
|     if not recDataList:  | 
|         return {}  | 
|     grabRecordDict = {}  | 
|     for recData in recDataList: #{playerid:[ÇÀµ½µÄÇ®,Ãû×Ö,job]}  | 
|         grabRecordDict[recData.GetValue2()] = [recData.GetValue5(), recData.GetStrValue1(), recData.GetValue3()]  | 
|       | 
|     return grabRecordDict  | 
|   | 
| def __FindGrabRecData(recordType, redPacketID):  | 
|     global g_allRecordDict  | 
|     if recordType == ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord:  | 
|         if redPacketID in g_allRecordDict:  | 
|             frecData = g_allRecordDict[redPacketID]  | 
|             if frecData:  | 
|                 return [frecData]  | 
|               | 
|       | 
|     recDataList = []  | 
|     universalRecMgr = GameWorld.GetUniversalRecMgr()  | 
|     allRecordList = universalRecMgr.GetTypeList(recordType)  | 
|     allCnt = allRecordList.Count()  | 
|     for index in xrange(allCnt):  | 
|         recData = allRecordList.At(index)  | 
|         if recData.GetValue1() == redPacketID:  | 
|             recDataList.append(recData)  | 
|             if recordType == ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord:  | 
|                 g_allRecordDict[redPacketID] = recData  | 
|                 break  | 
|     return recDataList  | 
|   | 
| ## ¼ì²éºì°üÊÇ·ñ¹ýÆÚ  | 
| def __CheckGrabRecData():  | 
|     global g_grabDataDict  | 
|     global g_allRecordDict  | 
|     global g_redPackCountDict  | 
|     g_redPackCountDict = {}  | 
|     universalRecMgr = GameWorld.GetUniversalRecMgr()  | 
|     allRecordList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord)  | 
|     allCnt = allRecordList.Count()  | 
|     curTimeNum = int(time.time())  | 
|       | 
|     rangeTime = 24*60*60  | 
|     backMoneyDict = {}  | 
|     delRedPacketIDList = []  | 
|     familyIDList = []  | 
|     delCnt = 0  | 
|     for index in xrange(allCnt):  | 
|         dataIndex = index - delCnt  | 
|         universalRecData = allRecordList.At(dataIndex)  | 
|         saveTime = universalRecData.GetValue5()  | 
|         GameWorld.DebugLog("    ¼ì²éºì°üÊÇ·ñ¹ýÆÚ curTime=%s,saveTime=%s,rangeTime=%s,redPacketID=%s"%(curTimeNum, saveTime, curTimeNum -saveTime,universalRecData.GetValue1()))  | 
|         if curTimeNum -saveTime > rangeTime:#¹ýÆÚ  | 
|             redPacketID = universalRecData.GetValue1()  | 
|               | 
|             strValue1 = universalRecData.GetStrValue1()  | 
|             strValue1List = strValue1.split('|')  | 
|             playerID = strValue1List[0]  | 
|             if playerID:  | 
|                 playerID = int(playerID)  | 
|                 grabRecordDict = __GetGrabRecord(redPacketID)  | 
|                 outNum = sum([a[0] for a in grabRecordDict.values()]) #Òѱ»ÇÀµÄÇ®  | 
|                 value3 = universalRecData.GetValue3()  | 
|                 moneyType, totalMoney =value3%10, value3/10  | 
|                 remainMoney = totalMoney - outNum #Ê£ÓàµÄÇ®  | 
|                 #GameWorld.DebugLog('    outNum=%s,remainMoney=%s,moneyType=%s'%(outNum,remainMoney,moneyType))  | 
|                 if moneyType ==1 and remainMoney:  | 
|                     backMoneyDict[playerID] = backMoneyDict.get(playerID, 0) + remainMoney  | 
|               | 
|             delRedPacketIDList.append(redPacketID)  | 
|             familyID=universalRecData.GetValue2()  | 
|             if familyID not in familyIDList:  | 
|                 familyIDList.append(familyID)  | 
|               | 
|             allRecordList.Delete(dataIndex)  | 
|             delCnt +=1  | 
|               | 
|     if not delRedPacketIDList:  | 
|         return  | 
|     for redID in delRedPacketIDList:  | 
|         g_grabDataDict.pop(redID, 0)  | 
|         g_allRecordDict.pop(redID, 0)  | 
|     recordType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord  | 
|     recordList = universalRecMgr.GetTypeList(recordType)  | 
|   | 
|     delCnt = 0  | 
|     for index in xrange(recordList.Count()):  | 
|         dataIndex = index - delCnt  | 
|         universalRecData = recordList.At(dataIndex)  | 
|         if universalRecData.GetValue1() in delRedPacketIDList:  | 
|             recordList.Delete(dataIndex)  | 
|             delCnt +=1  | 
|               | 
|   | 
|     NotifyDelRedPacketInfo(delRedPacketIDList)  | 
|   | 
|           | 
|     #·µ»ØÍæ¼Òδ±»ÁìÈ¡µÄÏÉÓñ  | 
|     if backMoneyDict:  | 
|         for playerID, moneyNum in backMoneyDict.items():  | 
|             PlayerCompensation.SendMailByKey('RedPackBack', [playerID], [], [], moneyNum)  | 
|       | 
|     return  | 
| def DelRedPackByFamilyID(delfamilyID):  | 
|     global g_grabDataDict  | 
|     global g_allRecordDict  | 
|     #ɾ³ýij¸ö¼Ò×åµÄºì°ü¼Ç¼  | 
|     universalRecMgr = GameWorld.GetUniversalRecMgr()  | 
|     allRecordList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord)  | 
|     allCnt = allRecordList.Count()  | 
|     delRedPacketIDList = []  | 
|     delCnt = 0  | 
|     for index in xrange(allCnt):  | 
|         dataIndex = index - delCnt  | 
|         universalRecData = allRecordList.At(dataIndex)  | 
|         familyID=universalRecData.GetValue2()  | 
|         if delfamilyID != familyID:  | 
|             continue  | 
|         redPacketID = universalRecData.GetValue1()  | 
|         delRedPacketIDList.append(redPacketID)  | 
|         allRecordList.Delete(dataIndex)  | 
|         delCnt +=1  | 
|     if not delRedPacketIDList:  | 
|         return  | 
|     for redID in delRedPacketIDList:  | 
|         g_grabDataDict.pop(redID, 0)  | 
|         g_allRecordDict.pop(redID, 0)  | 
|     recordList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord)  | 
|     delCnt = 0  | 
|     for index in xrange(recordList.Count()):  | 
|         dataIndex = index - delCnt  | 
|         universalRecData = recordList.At(dataIndex)  | 
|         if universalRecData.GetValue1() in delRedPacketIDList:  | 
|             recordList.Delete(dataIndex)  | 
|             delCnt +=1  | 
|     #NotifyDelRedPacketInfo(delRedPacketIDList)  | 
|     return  | 
|   | 
| ## ºì°ü±ä¸ü֪ͨµ¥¸öºì°ü¸ø¶ÔÓ¦Õ½ÃËËùÓгÉÔ±  | 
| def __NotifyFamilyRedPacketInfo(family, redPacketRecData, grabHeroIDList):  | 
|     syncPacketDataList = [redPacketRecData, grabHeroIDList]  | 
| #    recordType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord  | 
| #    universalRecMgr = GameWorld.GetUniversalRecMgr()  | 
| #    recordList = universalRecMgr.GetTypeList(recordType)  | 
| #    for index in xrange(recordList.Count()):  | 
| #        recData = recordList.At(index)  | 
| #        familyID = recData.GetValue2()  | 
| #        if familyID and family and family.GetID() != familyID:  | 
| #            continue  | 
| #        if redPacketID:  | 
| #            if recData.GetValue1() == redPacketID:  | 
| #                syncPacketDataList = [recData, grabHeroIDList]  | 
| #                break  | 
| #        else:  | 
| #            syncPacketDataList.append(recData)  | 
|     if not syncPacketDataList:  | 
|         return  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     if not family:  | 
|         for i in xrange(0, playerManager.GetActivePlayerCount()):  | 
|             curPlayer = playerManager.GetActivePlayerAt(i)  | 
|             if curPlayer == None or not curPlayer.GetInitOK():  | 
|                 continue  | 
|             NotifyRedPacketInfo(curPlayer, syncPacketDataList)  | 
|     else:  | 
|         for i in xrange(0, family.GetCount()):  | 
|             notifyMember = family.GetAt(i)  | 
|             notifyPlayer = playerManager.FindPlayerByID(notifyMember.GetPlayerID())  | 
|             if notifyPlayer == None:  | 
|                 continue  | 
|             NotifyRedPacketInfo(notifyPlayer, syncPacketDataList)  | 
|     return  | 
|   | 
| ## Í¨Öªºì°üÐÅÏ¢  | 
| # Í¨ÖªÍæ¼Ò±¾Õ½ÃËËùÓкì°ü»òµ¥¸öºì°ü  | 
| def NotifyRedPacketInfo(curPlayer, packetDataList=[]):  | 
|     if PlayerControl.GetIsTJG(curPlayer):  | 
|         return  | 
|     if not packetDataList:  | 
|         syncPacketDataList = []  | 
|         recordType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord  | 
|         universalRecMgr = GameWorld.GetUniversalRecMgr()  | 
|         recordList = universalRecMgr.GetTypeList(recordType)  | 
|         for index in xrange(recordList.Count()):  | 
|             recData = recordList.At(index)  | 
|             familyID = recData.GetValue2()  | 
|             if familyID and curPlayer.GetFamilyID() != familyID:  | 
|                 continue  | 
|             grabRecordDict = __GetGrabRecord(recData.GetValue1())  | 
|             syncPacketDataList.append([recData, grabRecordDict.keys()])  | 
|     else:  | 
|         syncPacketDataList = [packetDataList]  | 
|     if not syncPacketDataList:  | 
|         return  | 
|     joinFamilyTime = PlayerFamily.GetPlayerJoinFamilyTime(curPlayer)  | 
|     sendPack = ChPyNetSendPack.tagGCFamilyRedPacketInfo()  | 
|     sendPack.Clear()  | 
|     sendPack.IsAll = int(packetDataList==[])  | 
|     sendPack.RedPacketInfo = []  | 
|       | 
|     for packetData, grabHeroIDList in syncPacketDataList:  | 
|         #ÏÉÃ˺ì°üÖ»Í¨ÖªÍæ¼Ò½øÈëÏÉÃ˺óÉú³ÉµÄºì°ü  | 
|         #GameWorld.Log('1111packetData.GetValue2()=%s,joinFamilyTime=%s,packetData.GetValue5()=%s'%(packetData.GetValue2(),joinFamilyTime,packetData.GetValue5()))  | 
|         if packetData.GetValue2() and joinFamilyTime and packetData.GetValue5() < joinFamilyTime:  | 
|             continue  | 
|           | 
|         packetInfo = ChPyNetSendPack.tagFRedPacketInfo()  | 
|         packetInfo.Clear()  | 
|         packetInfo.RedPacketID = packetData.GetValue1()  | 
|         strValue1 = packetData.GetStrValue1()  | 
|         strValue1List = strValue1.split('|')  | 
|         if len(strValue1List) != 4:  | 
|             return  | 
|         playerID, playerName, job, getWay = strValue1List  | 
|         packetInfo.PlayerID = int(playerID)  | 
|         packetInfo.Name = playerName  | 
|         packetInfo.Time = packetData.GetTime()  | 
|         packetInfo.PlayeJob = int(job)  | 
|         value3 = packetData.GetValue3()  | 
|         packetInfo.MoneyType = value3 % 10  | 
|         packetInfo.MoneyNum = value3 / 10  | 
|         packetInfo.GetWay = int(getWay)  | 
|         state = packetData.GetValue4()  | 
|   | 
|         if curPlayer.GetPlayerID() in grabHeroIDList:  | 
|             state = State_HasGot  | 
|         packetInfo.State = state  | 
|         packetInfo.PacketCnt = int(packetData.GetStrValue2())  | 
|           | 
|         packetInfo.Wish = packetData.GetStrValue3()  | 
|         sendPack.RedPacketInfo.append(packetInfo)  | 
|       | 
|     sendPack.Count = len(sendPack.RedPacketInfo)  | 
|     NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|     #GameWorld.Log('ÏÉÃ˺ì°ü֪ͨ IsAll=%s,Count=%s,syncPacketDataList=%s,redPacketID=%s'%(sendPack.IsAll,sendPack.Count,syncPacketDataList,redPacketID))  | 
|     return   | 
|   | 
|   | 
| def __NotifyGrabRedPacketInfo(curPlayer, redPacketID, grabRecordDict):  | 
|     '''֪ͨÇÀºì°üÐÅÏ¢'''  | 
|     sendPack = ChPyNetSendPack.tagGCFamilyRedPacketGrabInfo()  | 
|     sendPack.Clear()  | 
|     sendPack.RedPacketID = redPacketID  | 
|     #grabRecordDict = __GetGrabRecord(redPacketID) #{playerid:[ÇÀµ½µÄÇ®,Ãû×Ö,job]}  | 
|     sendPack.Count = len(grabRecordDict)  | 
|     sendPack.GrabInfo = []  | 
|     for playerID, info in grabRecordDict.items():  | 
|         money, name, job = info  | 
|         grabInfo = ChPyNetSendPack.tagFGrabRedPacketInfo()  | 
|         grabInfo.Name = name  | 
|         grabInfo.PlayeJob = job  | 
|         grabInfo.MoneyNum = money  | 
|         sendPack.GrabInfo.append(grabInfo)  | 
|     NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|     return  | 
|   | 
| def NotifyDelRedPacketInfo(delRedPacketIDList):  | 
|     ##֪ͨºì°üɾ³ýÐÅÏ¢  | 
|     sendPack = ChPyNetSendPack.tagGCRedPacketDel()  | 
|     sendPack.Clear()  | 
|     sendPack.DelRedPacketID = delRedPacketIDList  | 
|     sendPack.Cnt = len(delRedPacketIDList)  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     for i in xrange(0, playerManager.GetActivePlayerCount()):  | 
|         curPlayer = playerManager.GetActivePlayerAt(i)  | 
|         if curPlayer == None or not curPlayer.GetInitOK():  | 
|             continue  | 
|         NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|     return |