| #!/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  | 
|   | 
| #Def_UniversalGameRecType_FamilyRedPacketAllRecord  | 
| #value1    ºì°üΨһID  | 
| #value2    ¼Ò×åID  | 
| #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_osRedCnt = 0 #¿ª·þºì°ü¸öÊý  | 
| ## Íæ¼ÒµÇ¼  | 
| #  @param None  | 
| #  @return None  | 
| def OnPlayerLogin(curPlayer):  | 
|     NotifyRedPacketInfo(curPlayer)  | 
|     return  | 
|   | 
|   | 
| ## ¸ôÌì¸üР | 
| #  @param None  | 
| #  @return None  | 
| def DoOnDay():  | 
|     __CheckGrabRecData()  | 
|       | 
|     return  | 
|   | 
|   | 
| ## Éú³Éкì°ü  | 
| def CreatFamilyRedPacket(msgList):  | 
|     playerID, getType, packetCnt, moneyType, outputNum, wishStr, state, data = msgList  | 
|     curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)  | 
|     if not curPlayer:  | 
|         return  | 
|     if getType == IpyGameDataPY.GetFuncCfg('OpenServerRedPacketType'):  | 
|         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 = PlayerControl.GetJobRank(curPlayer)  | 
|     playerName = curPlayer.GetName()  | 
|     redPacketRecData = __SaveNewRedRecord(familyID, playerID, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt, state, wishStr)  | 
|     #֪ͨ  | 
|     if redPacketRecData:  | 
|         __NotifyFamilyRedPacketInfo(family, redPacketRecData, [])  | 
|         if not familyID:  | 
|             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])  | 
|             #´óÓÚ200¶î¶ÈµÄºì°ü  | 
|             if outputNum >= IpyGameDataPY.GetFuncCfg('OpenServerRedPacketRain'):  | 
|                 PlayerControl.WorldNotify(0, 'OSRedpackSfx')  | 
|     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()  | 
|       | 
|     redPacketRecData = __SaveNewRedRecord(familyID, playerID, playerName, job, jobRank, getType, moneyType, outputNum, 0)  | 
|     #֪ͨ  | 
|     __NotifyFamilyRedPacketInfo(family, redPacketRecData, [])  | 
|     return  | 
|   | 
| ## ¼Ç¼Ðºì°üÊý¾Ý  | 
| def __SaveNewRedRecord(familyID, ownerid, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt,state=State_NoSend, wishStr=''):  | 
|     global g_allRecordDict  | 
|     global g_osRedCnt  | 
|     job = job + jobRank * 10   #¸öλÊÇjob Ê®Î»°ÙλÊÇjobrank  | 
|     recordType = ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord  | 
|     universalRecMgr = GameWorld.GetUniversalRecMgr()  | 
|     recordList = universalRecMgr.GetTypeList(recordType)  | 
|     if getType == IpyGameDataPY.GetFuncCfg('OpenServerRedPacketType'):  | 
|         if not __CheckOSRedPacketCnt(recordList):  | 
|             return  | 
|         if g_osRedCnt:  | 
|             g_osRedCnt += 1  | 
|       | 
|     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(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))  | 
|     return recData  | 
|   | 
|   | 
| def __CheckOSRedPacketCnt(recordList):  | 
|     global g_grabDataDict  | 
|     global g_allRecordDict  | 
|     global g_osRedCnt  | 
|     ##¿ª·þºì°ü¸öÊýÊÇ·ñ´ïÉÏÏÞ  | 
|     openServerRedPacketCnt = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketCnt')  | 
|     if g_osRedCnt and g_osRedCnt < openServerRedPacketCnt + 10:  | 
|         return True  | 
|     OpenServerRedPacketType = IpyGameDataPY.GetFuncCfg('OpenServerRedPacketType')  | 
|     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 != OpenServerRedPacketType:  | 
|             continue  | 
|         redPacketID = universalRecData.GetValue1()  | 
|         curCnt += 1  | 
|         if len(delRedPacketIDList) < 10:  | 
|             delRedPacketIDList.append(redPacketID)  | 
|         elif g_osRedCnt:  | 
|             break  | 
|     if not delRedPacketIDList:  | 
|         return True  | 
|     if not g_osRedCnt:  | 
|         g_osRedCnt = curCnt  | 
|   | 
|     if g_osRedCnt < 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)  | 
|     g_osRedCnt -= 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, OSCanGrabCnt = msgList  | 
|       | 
|     playerID= curPlayer.GetPlayerID()  | 
|     job = curPlayer.GetJob()  | 
|     jobRank = PlayerControl.GetJobRank(curPlayer)  | 
|     job = jobRank * 10 + job  | 
|     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 getWay == IpyGameDataPY.GetFuncCfg('OpenServerRedPacketType'):  | 
|         #¿ª·þºì°üÐèÒªÅжϴÎÊý  | 
|         if not isSelf and OSCanGrabCnt <= 0:  | 
|             GameWorld.DebugLog('    ÇÀ¿ª·þºì°ü£¬´ÎÊý²»×㣡£¡')  | 
|             return  | 
|         getNumformula = IpyGameDataPY.GetFuncCompileCfg('OpenRedRacketOutNum')  | 
|     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_osRedCnt  | 
|     g_osRedCnt = 0  | 
|     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 |