#!/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 ShareDefine import NetPackCommon import IpyGameDataPY import ChPyNetSendPack import PlayerCompensation import PlayerDBGSEvent import PlayerViewCache import PlayerControl import PlayerFamily import PyGameData import ChConfig import datetime import random import time ( State_NoSend, #δ·¢ State_NoGot, #δÁìÈ¡ State_HasGot, #ÒÑÁìÈ¡ State_HasAllGot, #È«²¿ÁìÍê ) = range(4) DBKey_RedPacketSend = "RedPacketSend_%s" # ϵͳ¶¨Ê±ºì°üÊÇ·ñÒÑ·¢·Å£¬ ²ÎÊýºì°üID DBKey_RedPacketSystemDayCount = "RedPacketSystemDayCount" # È«·þϵͳºì°üÒÑ·¢·Å¸öÊý def __SaveRedpacketRecData(recData, redPacketObj): ''' ºì°üÔݶ¨ÓÐЧÆÚ24Сʱ£¬¹ýÌìÇå³ý¹ýÆÚµÄºì°ü£¬Èç¹ûÊÇÍæ¼Ò·¢·ÅµÄ·µ»¹Î´ÁìÈ¡µÄ»õ±Ò ÉÏÏßͬ²½ËùÓкì°üÐÅÏ¢£¬ºì°ü±ä»¯ÊµÊ±¹ã²¥È«·þÔÚÏßÍæ¼Ò ''' #ºì°üÊý¾Ý Def_UniversalGameRecType_FamilyRedPacketAllRecord #Time ´´½¨ºì°üʱ¼ä£¬·Çºì°üʵ¼Ê¿ª·ÅÁìȡʱ¼ä£¬Èç¹ûºì°ü±íÓÐÅäÖÃϵͳ·¢·Åʱ¼ä£¬Ôò¸Ãʱ¼ä´æÅä±íʱ¼ä£¬Ã»Óеϰ´æ´´½¨Ê±µÄ·þÎñÆ÷ʱ¼ä #value1 ºì°üΨһID£¬¸ÃIDΪʵÀýID£¬·ÇÅä±íµÄºì°üID #value2 ¼Ò×åID£¬0´ú±íÈ«·þºì°ü #value3 ×ܶî¶È*10+½ðÇ®ÀàÐÍ #value4 ״̬ #value5 ʱ¼ä£¬ÓÃÀ´ÅжÏÊÇ·ñ¹ýÆÚɾ³ýµÄ£¬Êµ¼Ê¿ª·Å¸Ãºì°üÁìÈ¡µÄʱ¼ä #strValue1 ´´½¨ÕßID|´´½¨ÕßÃû×Ö|´´½¨ÕßÖ°Òµ|»ñµÃ;¾¶£¨ºì°üÀàÐÍ£© #strValue2 ¿ÉÇÀ×ܸöÊý|ÊÇ·ñÄäÃû(ĬÈϲ»ÄäÃû¼æÈÝÀÏÊý¾Ý) #strValue3 ×£¸£Óï£¬Íæ¼Ò×Ô¼º±à¼­µÄÄÚÈÝ recData.SetTime(redPacketObj.createTime) recData.SetValue1(redPacketObj.redPacketID) recData.SetValue2(redPacketObj.familyID) recData.SetValue3(redPacketObj.moneyType + redPacketObj.moneyValue * 10) recData.SetValue4(redPacketObj.state) recData.SetValue5(redPacketObj.calcTime) strValue1 = '%s|%s|%s|%s' % (redPacketObj.playerID, redPacketObj.playerName, redPacketObj.playerJob, redPacketObj.getWay) recData.SetStrValue1(strValue1) recData.SetStrValue2('%s|%s' % (redPacketObj.packetCnt, int(redPacketObj.isAnonymous))) recData.SetStrValue3(redPacketObj.wish) return def __SaveRedpacketRecGrabData(recData, grabObj): #ÇÀºì°ü¼Ç¼ Def_UniversalGameRecType_FamilyRedPacketGrabRecord #value1 ºì°üΨһID #value2 playerID #value3 job #value4 moneyType #value5 getMoney #strValue1 Ãû×Ö #strValue2 face|facePic recData.SetValue1(grabObj.redPacketID) recData.SetValue2(grabObj.playerID) recData.SetValue3(grabObj.playerJob) recData.SetValue4(grabObj.moneyType) recData.SetValue5(grabObj.getMoney) recData.SetStrValue1(grabObj.playerName) recData.SetStrValue2('%s|%s' % (grabObj.face, grabObj.facePic)) return class RedPacketGrab(): ## ºì°üÇÀ¼Ç¼Êý¾Ý def __init__(self, redPacketID, playerID): self.redPacketID = redPacketID self.playerID = playerID self.playerJob = 0 self.playerName = "" self.moneyType = 0 self.getMoney = 0 self.face = 0 self.facePic = 0 return class RedPacketData(): ## ºì°üÊý¾Ý def __init__(self, redPacketID): self.redPacketID = redPacketID self.familyID = 0 self.moneyType = 0 self.moneyValue = 0 self.state = 0 self.createTime = 0 self.calcTime = 0 self.playerID = 0 self.playerName = "" self.playerJob = 0 self.getWay = 0 self.packetCnt = 0 self.isAnonymous = 0 # ÊÇ·ñÄäÃû self.wish = "" self.grabDict = {} # ÇÀºì°ü¼Ç¼ {playerID:RedPacketGrab, ...} return class RedPacketMgr(): ''' ºì°ü»º´æ¹ÜÀíµÈ Í¨ÖªÍæ¼Òºì°üÂß¼­: ÓÉÓÚ¸Õ¿ª·þʱºì°ü´ó¸ÅÂÊ»á±È½Ï¶à£¬ºì°üµÄ½»»¥¼°½»²æÍ¨ÖªÒ²Ïà¶Ô±È½ÏÃܼ¯£¬ËùÒÔ×öЩÓÅ»¯£¬²»¶ÔËùÓкì°ü´¦Àí ½«ºì°ü·ÖΪºì°ü×ܿ⼰֪ͨ¸øÍæ¼ÒµÄ²¿·Öºì°ü£¬¼ÙÉ赱ǰËùÓкì°ü×ÜÊýΪ500¸ö£¬±ê¼ÇΪ T ¸ö ¿ÉÅäÖÃÏÞÖÆÍ¨Öª¸øÍæ¼Ò¿É²Ù×÷µÄºì°ü¸öÊýÈçֻ֪ͨ20¸ö£¬±ê¼ÇΪ M ¸ö£¬¿ÉÊÓΪÈȺì°ü£¬µ± M Ïû»¯Íêºó¿É¸½¼Ó֪ͨ N ¸ö Í¨ÖªÍæ¼ÒµÄºì°ü×é³É£º ·ÇÏÉÃ˺ì°ü£º ¹éÊôÍæ¼ÒµÄ먦·Åºì°üA + ²»ÏÞÖÆÍ¨Öª¸öÊýµÄºì°üB + ÏÞÖÆÍ¨Öª¸öÊýµÄºì°üC£» ²»°üº¬ÆäËûÍæ¼Ò먦·ÅµÄ ÏÉÃ˺ì°ü£º ËùÓÐÍæ¼ÒδÁìÈ¡¹ýµÄÇÒδȫ²¿ÁìÍêµÄºì°ü£¬°üº¬ÆäËûÍæ¼Ò먦·ÅµÄ Èç¹û (A + B) >= M ÁË£¬Ôò²»ÐèÒªÔÙ¸½¼Ó֪ͨ C ''' def __init__(self): self.allRedPacketDict = {} # ËùÓкì°üÐÅÏ¢ {ºì°üID:RedPacketData, ...} self.familyRedPacketDict = {} # ÏÉÃ˺ì°üÐÅÏ¢£¬È«²¿Í¬²½ {familyID:[ºì°üID, ...], ...} # --- ÒÔϽöÕë¶Ô·ÇÏÉÃ˺ì°ü --- # Õë¶Ôºì°üÁ¿±È½Ï´óµÄºì°üÀàÐÍ£¬ÓÐÏÞÖÆÍ¬²½¸öÊý£¬°´ÀàÐÍ·Ö×飬ÿ×é°´¹æÔò¶ÀÁ¢Í¬²½£»Èç ¿ª·þ³É¾Íºì°ü¡¢½ÚÈճɾͺì°ü¡¢È«·þºì°ü # ͬ²½¹æÔò£º # ±ÈÈçÏÈͬ²½20¸ö£¬È»ºó¼õÒ»¸öÔòÔÙ´ÓÒÑ¿ª·ÅµÄ¿âÖв¹³ä£» # ÐÂÔöÒ»¸ö¿ª·ÅÁìÈ¡µÄºì°üʱ£¬Èç¹ûÍæ¼ÒÓпÉÁìÈ¡µÄÔò²»ÐèҪͬ²½£¬Ã»ÓпÉÁìÈ¡µÄÔòÐèҪͬ²½¸øËû # ×¢£º È«·þºì°üÖУ¬Î´¿ª·ÅµÄºì°ü½öÍæ¼Ò×Ô¼º¿É¼û self.playerNosendRedPacketIDInfo = {} # Íæ¼Ò먦·ÅµÄºì°üIDÐÅÏ¢£¬Õë¶ÔÓÐͬ²½¸öÊýÏÞÖÆµÄÀàÐÍ {playerID:{ºì°üÀàÐÍ:[ºì°üID, ...], ...}, ...} # playerCanGetRedPacketIDInfo µÄplayerID°üº¬ËùÓÐÔÚÏßÍæ¼Ò£¬²»º¬ÍÑ»ú¹Ò self.playerCanGetRedPacketIDInfo = {} # Íæ¼Ò¿ÉÁìÈ¡µÄºì°üIDÐÅÏ¢£¬Õë¶ÔÓÐͬ²½¸öÊýÏÞÖÆµÄÀàÐÍ {playerID:{ºì°üÀàÐÍ:[ºì°üID, ...], ...}, ...} self.activeRedPacketIDInfo = {} # ÒÑ¿ª·ÅÁìÈ¡µÄºì°üIDÁÐ±í£¬Õë¶ÔÓÐͬ²½¸öÊýÏÞÖÆµÄÀàÐÍ {ºì°üÀàÐÍ:[ºì°üID, ...], ...} # ÆäËûÈ«·þºì°ü£¬Ò»°ãÁ¿±È½ÏÉٵģ¬Ïà¶Ô¹Ì¶¨µÄ£¬È«²¿Í¬²½£¬Èç½ÚÈÕ¶¨Ê±·¢Ë͵ĺì°ü self.notifyAllServerRedPacketIDList = [] # ÆäËûûÓÐÏÞÖÆÏ·¢Í¬²½¸öÊýµÄÈ«·þºì°üID [ºì°üID, ...] return def GetRedPacketObj(self, redPacketID, createNew): ## »ñÈ¡ºì°üʵÀý redPacketObj = None if redPacketID in self.allRedPacketDict: redPacketObj = self.allRedPacketDict[redPacketID] elif createNew: redPacketObj = RedPacketData(redPacketID) self.allRedPacketDict[redPacketID] = redPacketObj return redPacketObj def AddFamilyRedPacketID(self, familyID, redPacketID): ## Ìí¼Óºì°üID½øÈëÏÉÃ˺ì°üID»º´æ if familyID not in self.familyRedPacketDict: self.familyRedPacketDict[familyID] = [] familyRedpacketIDList = self.familyRedPacketDict[familyID] if redPacketID not in familyRedpacketIDList: familyRedpacketIDList.append(redPacketID) return def DelFamilyRedPacketID(self, familyID, redPacketID): ## ɾ³ýÏÉÃ˺ì°üID»º´æ if familyID not in self.familyRedPacketDict: return familyRedpacketIDList = self.familyRedPacketDict[familyID] if redPacketID not in familyRedpacketIDList: return familyRedpacketIDList.remove(redPacketID) return True def AddPlayerNosendRedPacketID(self, playerID, getWay, redPacketID): ## Ìí¼ÓÍæ¼Ò먦·ÅµÄºì°üID»º´æ if playerID not in self.playerNosendRedPacketIDInfo: self.playerNosendRedPacketIDInfo[playerID] = {} playerNosendRedPacketTypeIDInfo = self.playerNosendRedPacketIDInfo[playerID] if getWay not in playerNosendRedPacketTypeIDInfo: playerNosendRedPacketTypeIDInfo[getWay] = [] playerNosendRedPacketTypeIDList = playerNosendRedPacketTypeIDInfo[getWay] if redPacketID not in playerNosendRedPacketTypeIDList: playerNosendRedPacketTypeIDList.append(redPacketID) return def DelPlayerNosendRedPacketID(self, playerID, getWay, redPacketID): ## ɾ³ýÍæ¼Ò먦·ÅµÄºì°üID»º´æ if playerID not in self.playerNosendRedPacketIDInfo: return playerNosendRedPacketTypeIDInfo = self.playerNosendRedPacketIDInfo[playerID] if getWay not in playerNosendRedPacketTypeIDInfo: return playerNosendRedPacketTypeIDList = playerNosendRedPacketTypeIDInfo[getWay] if redPacketID not in playerNosendRedPacketTypeIDList: return playerNosendRedPacketTypeIDList.remove(redPacketID) return True def AddActiveRedPacketID(self, getWay, redPacketID): ## Ìí¼ÓÒÑ¿ª·ÅµÄÈ«·þºì°üID»º´æ if getWay not in self.activeRedPacketIDInfo: self.activeRedPacketIDInfo[getWay] = [] redPacketIDList = self.activeRedPacketIDInfo[getWay] if redPacketID not in redPacketIDList: redPacketIDList.append(redPacketID) return def DelActiveRedPacketID(self, getWay, redPacketID): ## ɾ³ýÒÑ¿ª·ÅµÄÈ«·þºì°üID»º´æ if getWay not in self.activeRedPacketIDInfo: return redPacketIDList = self.activeRedPacketIDInfo[getWay] if redPacketID not in redPacketIDList: return redPacketIDList.remove(redPacketID) return True def AddPlayerCanGetRedPacketID(self, playerID, getWay, redPacketID): ## Ìí¼ÓÍæ¼Ò¿ÉÁìÈ¡µÄºì°üID»º´æ if not playerID: return if playerID not in self.playerCanGetRedPacketIDInfo: self.playerCanGetRedPacketIDInfo[playerID] = {} redPacketTypeIDInfo = self.playerCanGetRedPacketIDInfo[playerID] if getWay not in redPacketTypeIDInfo: redPacketTypeIDInfo[getWay] = [] redPacketIDList = redPacketTypeIDInfo[getWay] if redPacketID not in redPacketIDList: redPacketIDList.append(redPacketID) return redPacketIDList return def DelPlayerCanGetRedPacketID(self, playerID, getWay, redPacketID): ## ɾ³ýÍæ¼Ò¿ÉÁìÈ¡µÄºì°üID»º´æ if playerID not in self.playerCanGetRedPacketIDInfo: return redPacketTypeIDInfo = self.playerCanGetRedPacketIDInfo[playerID] if getWay not in redPacketTypeIDInfo: return redPacketIDList = redPacketTypeIDInfo[getWay] if redPacketID not in redPacketIDList: return redPacketIDList.remove(redPacketID) # ·µ»Øµ±Ç°ÀàÐÍ¿ÉÓúì°üIDÁбí return redPacketIDList def PrintRedPacketData(sign=""): redPacketMgr = GetRedpacketMgr() if sign: GameWorld.DebugLog(" === %s ===" % sign) GameWorld.DebugLog(" ËùÓкì°ü:count=%s,=%s" % (len(redPacketMgr.allRedPacketDict), redPacketMgr.allRedPacketDict.keys())) for familyID, redIDList in redPacketMgr.familyRedPacketDict.items(): GameWorld.DebugLog(" ÏÉÃ˺ì°ü:familyID=%s,count=%s,%s" % (familyID, len(redIDList), redIDList)) GameWorld.DebugLog(" È«·þÈ«²¿Ï·¢ºì°ü=%s" % redPacketMgr.notifyAllServerRedPacketIDList) for getWay, redIDList in redPacketMgr.activeRedPacketIDInfo.items(): GameWorld.DebugLog(" È«·þ¹«¹²»îÔ¾ºì°ü:getWay=%s,count=%s,%s" % (getWay, len(redIDList), redIDList)) for playerID, redIDInfo in redPacketMgr.playerNosendRedPacketIDInfo.items(): for getWay, redIDList in redIDInfo.items(): GameWorld.DebugLog(" È«·þ¸öÈË먦·Åºì°ü:playerID=%s,getWay=%s,count=%s,%s" % (playerID, getWay, len(redIDList), redIDList)) for playerID, redIDInfo in redPacketMgr.playerCanGetRedPacketIDInfo.items(): for getWay, redIDList in redIDInfo.items(): GameWorld.DebugLog(" È«·þ¸öÈË¿ÉÁìÈ¡ºì°ü:playerID=%s,getWay=%s,count=%s,%s" % (playerID, getWay, len(redIDList), redIDList)) return def GetRedpacketMgr(): redPacketMgr = PyGameData.g_redPacketMgr if redPacketMgr == None: redPacketMgr = RedPacketMgr() PyGameData.g_redPacketMgr = redPacketMgr return redPacketMgr def OnServerStart(): redPacketMgr = GetRedpacketMgr() universalRecMgr = GameWorld.GetUniversalRecMgr() # ºì°üÊý¾Ý notifyLimitTypeList = IpyGameDataPY.GetFuncEvalCfg("RedPacketSys", 1) recordList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord) GameWorld.Log("¼ÓÔØºì°üÐÅϢͨÓüǼ: count=%s" % recordList.Count()) for index in xrange(recordList.Count()): recData = recordList.At(index) state = recData.GetValue4() if state == State_HasAllGot: # ÒÑÈ«²¿ÁìÍêµÄ²»´¦Àí continue redPacketID = recData.GetValue1() familyID = recData.GetValue2() redPacketObj = redPacketMgr.GetRedPacketObj(redPacketID, True) redPacketObj.familyID = familyID redPacketObj.createTime = recData.GetTime() redPacketObj.moneyType = recData.GetValue3() % 10 redPacketObj.moneyValue = recData.GetValue3() / 10 redPacketObj.state = recData.GetValue4() redPacketObj.calcTime = recData.GetValue5() strValue1List = recData.GetStrValue1().split('|') playerID, playerName, job, getWay = strValue1List redPacketObj.playerID = GameWorld.ToIntDef(playerID) redPacketObj.playerName = playerName redPacketObj.playerJob = GameWorld.ToIntDef(job) redPacketObj.getWay = GameWorld.ToIntDef(getWay) strValue2List = recData.GetStrValue2().split('|') redPacketObj.packetCnt = GameWorld.ToIntDef(strValue2List[0]) redPacketObj.isAnonymous = GameWorld.ToIntDef(strValue2List[1]) if len(strValue2List) > 1 else 0 redPacketObj.wish = recData.GetStrValue3() playerID = redPacketObj.playerID getWay = redPacketObj.getWay # 1. ÏÉÃ˵ĺì°ü if familyID: redPacketMgr.AddFamilyRedPacketID(familyID, redPacketID) continue # ÒÔÏÂÊÇÃæÏòÈ«·þµÄºì°ü # 2. È«·þ먦·Åºì°ü if state == State_NoSend: # δ·¢·ÅµÄÌí¼Ó½øID»º´æ redPacketMgr.AddPlayerNosendRedPacketID(playerID, getWay, redPacketID) continue # 3. È«·þ²»ÏÞÖÆÏ·¢¸öÊýµÄ if getWay not in notifyLimitTypeList: redPacketMgr.notifyAllServerRedPacketIDList.append(redPacketID) continue # 4. ÓÐÏÞÖÆÍ¨Öª¸öÊýµÄ if state == State_NoGot: redPacketMgr.AddActiveRedPacketID(getWay, redPacketID) # ÇÀºì°ü¼Ç¼ grabRecordList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord) GameWorld.Log("¼ÓÔØºì°üÇÀ¼Ç¼ÐÅϢͨÓüǼ: count=%s" % grabRecordList.Count()) for index in xrange(grabRecordList.Count()): recData = grabRecordList.At(index) redPacketID = recData.GetValue1() playerID = recData.GetValue2() redPacketObj = redPacketMgr.GetRedPacketObj(redPacketID, False) if not redPacketObj: continue strValue2List = recData.GetStrValue2().split('|') grabObj = RedPacketGrab(redPacketID, playerID) grabObj.playerJob = recData.GetValue3() grabObj.playerName = recData.GetStrValue1() grabObj.moneyType = recData.GetValue4() grabObj.getMoney = recData.GetValue5() grabObj.face = GameWorld.ToIntDef(strValue2List[0]) if len(strValue2List) > 0 else 0 grabObj.facePic = GameWorld.ToIntDef(strValue2List[1]) if len(strValue2List) > 1 else 0 redPacketObj.grabDict[playerID] = grabObj #PrintRedPacketData("OnServerStart") return def OnServerClose(): redPacketMgr = GetRedpacketMgr() recMgr = GameWorld.GetUniversalRecMgr() recMgr.Delete(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord) recDataList = recMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketAllRecord) recMgr.Delete(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord) grabRecDataList = recMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_FamilyRedPacketGrabRecord) redPacketCount = 0 grabRecCount = 0 for redPacketObj in redPacketMgr.allRedPacketDict.values(): if redPacketObj.state == State_HasAllGot: # ÒÑÈ«²¿ÇÀÍêµÄ²»±£´æ continue recData = recDataList.AddRec() __SaveRedpacketRecData(recData, redPacketObj) redPacketCount += 1 for grabObj in redPacketObj.grabDict.values(): grabRecData = grabRecDataList.AddRec() __SaveRedpacketRecGrabData(grabRecData, grabObj) grabRecCount += 1 GameWorld.Log("±£´æºì°üÐÅϢͨÓüǼ: count=%s" % redPacketCount) GameWorld.Log("±£´æºì°üÇÀ¼Ç¼ÐÅϢͨÓüǼ: count=%s" % grabRecCount) return def OnPlayerLogin(curPlayer): if not PlayerControl.GetIsTJG(curPlayer): redPacketMgr = GetRedpacketMgr() playerID = curPlayer.GetPlayerID() redPacketMgr.playerCanGetRedPacketIDInfo[playerID] = {} notifyLimitTypeList = IpyGameDataPY.GetFuncEvalCfg("RedPacketSys", 1) maxNotifyCount = IpyGameDataPY.GetFuncCfg("RedPacketSys", 2) for getWay in notifyLimitTypeList: redPacketMgr.playerCanGetRedPacketIDInfo[playerID][getWay] = [] # È·±£ getWay key Ò»¶¨´æÔÚ nowActiveRedPacketIDList = redPacketMgr.activeRedPacketIDInfo.get(getWay, []) # µ±Ç°´ËÀàÐÍ»¹¿ÉÓõĹ«¹²ÒÑ¿ª·Åºì°üÁбí if not nowActiveRedPacketIDList: continue nosendIDList = redPacketMgr.playerNosendRedPacketIDInfo.get(playerID, {}).get(getWay, []) addCount = maxNotifyCount - len(nosendIDList) if addCount <= 0: continue playerCanGetIDList = [] for redPacketID in nowActiveRedPacketIDList: redPacketObj = redPacketMgr.GetRedPacketObj(redPacketID, False) if not redPacketObj: continue if playerID in redPacketObj.grabDict: continue playerCanGetIDList.append(redPacketID) addCount -= 1 if addCount <= 0: break redPacketMgr.playerCanGetRedPacketIDInfo[playerID][getWay] = playerCanGetIDList #PrintRedPacketData("OnPlayerLogin %s" % playerID) NotifyRedPacketInfo(curPlayer, isLogin=True) return def OnLeaveServer(curPlayer): playerID = curPlayer.GetPlayerID() redPacketMgr = GetRedpacketMgr() redPacketMgr.playerCanGetRedPacketIDInfo.pop(playerID, None) return ## ¸ôÌì¸üРdef DoOnDay(): PlayerDBGSEvent.SetDBGSTrig_ByKey(DBKey_RedPacketSystemDayCount, 0) # ÖØÖÃÿÈÕÈ«·þϵͳºì°ü·¢·Å¸öÊý RandTodayServerSystemRedPacketSendTime() return def GetRedPackGetWayType(getWay): ## »ñÈ¡ºì°ügetWayËùÊôºì°ü·ÖÀà getWayTypeDict = IpyGameDataPY.GetFuncEvalCfg("RedPacketClassify", 1, {}) for getWayType, getWayList in getWayTypeDict.items(): if getWay in getWayList: return getWayType return ShareDefine.RedPackWayType_Family def CheckDelRedpacketData(): ## ¼ì²éºì°üɾ³ýºì°ü£¬5·ÖÖÓÒ»´Î£º 1-ɾ³ý¹ýÆÚºì°ü£¬2-ɾ³ýÒÑÈ«²¿ÇÀÍêµÄºì°ü curTimeNum = int(time.time()) rangeTime = IpyGameDataPY.GetFuncCfg("RedPacketSys", 3) * 3600 backMoneyDict = {} delRedPacketIDList = [] # ɾ³ýµÄÈ«·þºì°ü [ºì°üID, ...] delFamilyRedPacketInfo = {} # ɾ³ýµÄÏÉÃ˺ì°ü {familyID:[ºì°üID, ...], ...} delNosendRedPacketInfo = {} # Ҫ֪ͨ¸øÍæ¼Òɾ³ýµÄºì°ü {playerID:[ºì°üID, ...], ...} redPacketMgr = GetRedpacketMgr() for redPacketObj in redPacketMgr.allRedPacketDict.values(): state = redPacketObj.state if state == State_HasAllGot: pass elif curTimeNum - redPacketObj.calcTime < rangeTime: continue redPacketID = redPacketObj.redPacketID playerID = redPacketObj.playerID familyID = redPacketObj.familyID getWay = redPacketObj.getWay if redPacketID in redPacketMgr.allRedPacketDict: redPacketMgr.allRedPacketDict.pop(redPacketID) # ·µ»¹Î´ÁìÍêµÄÍæ¼ÒÖ÷¶¯·¢·ÅµÄÏÉÓñºì°ü if state != State_HasAllGot and playerID and getWay == ShareDefine.RedPackType_GoldPacket: outNum = sum([grabObj.getMoney for grabObj in redPacketObj.grabDict.values()]) #Òѱ»ÇÀµÄÇ® moneyType = redPacketObj.moneyType totalMoney = redPacketObj.moneyValue remainMoney = totalMoney - outNum #Ê£ÓàµÄÇ® if moneyType == 1 and remainMoney: backMoneyDict[playerID] = backMoneyDict.get(playerID, 0) + remainMoney # 1. ÏÉÃ˺ì°ü if familyID: redPacketMgr.DelFamilyRedPacketID(familyID, redPacketID) if familyID not in delFamilyRedPacketInfo: delFamilyRedPacketInfo[familyID] = [] defFamilyRedPacketIDList = delFamilyRedPacketInfo[familyID] defFamilyRedPacketIDList.append(redPacketID) continue # 2. È«·þºì°ü # 2.1 ÊÇ·ñÍæ¼Ò˽ÓÐ먦·ÅµÄÈ«·þºì°ü if state == State_NoSend: redPacketMgr.DelPlayerNosendRedPacketID(playerID, getWay, redPacketID) if playerID not in delNosendRedPacketInfo: delNosendRedPacketInfo[playerID] = [] playerNosendRedPacketIDList = delNosendRedPacketInfo[playerID] playerNosendRedPacketIDList.append(redPacketID) continue # 2.2 ÒÑ¿ª·ÅµÄÈ«·þºì°ü redPacketMgr.DelActiveRedPacketID(getWay, redPacketID) if redPacketID in redPacketMgr.notifyAllServerRedPacketIDList: redPacketMgr.notifyAllServerRedPacketIDList.remove(redPacketID) # Õâ¸öÍæ¼Ò¿ÉÁìÈ¡µÄ¿ÉÄܰüº¬·ÇÍæ¼Ò×Ô¼º·¢µÄºì°ü for typeIDDict in redPacketMgr.playerCanGetRedPacketIDInfo.values(): if getWay not in typeIDDict: continue redpacketIDList = typeIDDict[getWay] if redPacketID not in redpacketIDList: continue redpacketIDList.remove(redPacketID) delRedPacketIDList.append(redPacketID) #·µ»ØÍæ¼Òδ±»ÁìÈ¡µÄÏÉÓñ if backMoneyDict: for playerID, moneyNum in backMoneyDict.items(): PlayerCompensation.SendMailByKey('RedPackBack', [playerID], [], [], moneyNum) playerManager = GameWorld.GetPlayerManager() # ͬ²½É¾³ýµÄÏÉÃ˺ì°ü #GameWorld.DebugLog("ͬ²½É¾³ýµÄÏÉÃ˺ì°ü: %s" % delFamilyRedPacketInfo) for familyID, delIDList in delFamilyRedPacketInfo.items(): family = GameWorld.GetFamilyManager().FindFamily(familyID) if not family: return sendPack = ChPyNetSendPack.tagGCRedPacketDel() sendPack.DelRedPacketID = delIDList sendPack.Cnt = len(delIDList) for i in xrange(family.GetCount()): notifyMember = family.GetAt(i) curPlayer = playerManager.FindPlayerByID(notifyMember.GetPlayerID()) if curPlayer == None or not curPlayer.GetInitOK() or PlayerControl.GetIsTJG(curPlayer): continue NetPackCommon.SendFakePack(curPlayer, sendPack) # ͬ²½É¾³ý¸öÈË먦·ÅµÄÈ«·þºì°ü #GameWorld.DebugLog("ͬ²½É¾³ý¸öÈË먦·ÅµÄÈ«·þºì°ü: %s" % delNosendRedPacketInfo) for playerID, nosendIDList in delNosendRedPacketInfo.items(): curPlayer = playerManager.FindPlayerByID(playerID) if curPlayer == None or not curPlayer.GetInitOK() or PlayerControl.GetIsTJG(curPlayer): continue sendPack = ChPyNetSendPack.tagGCRedPacketDel() sendPack.DelRedPacketID = nosendIDList sendPack.Cnt = len(nosendIDList) NetPackCommon.SendFakePack(curPlayer, sendPack) # ͬ²½É¾³ýÒÑ¿ª·ÅµÄÈ«·þºì°ü #GameWorld.DebugLog("ͬ²½É¾³ýÒÑ¿ª·ÅµÄÈ«·þºì°ü: %s" % delRedPacketIDList) if delRedPacketIDList: sendPack = ChPyNetSendPack.tagGCRedPacketDel() sendPack.Clear() sendPack.DelRedPacketID = delRedPacketIDList sendPack.Cnt = len(delRedPacketIDList) for i in xrange(playerManager.GetActivePlayerCount()): curPlayer = playerManager.GetActivePlayerAt(i) if curPlayer == None or not curPlayer.GetInitOK() or PlayerControl.GetIsTJG(curPlayer): continue NetPackCommon.SendFakePack(curPlayer, sendPack) return def OnChangeRedPacketState(family, redPacketObj, beforeState=None): ## ºì°ü״̬±ä¸ü´¦Àí state = redPacketObj.state if state == beforeState: return redPacketMgr = GetRedpacketMgr() redPacketID = redPacketObj.redPacketID familyID = redPacketObj.familyID ownerID = redPacketObj.playerID getWay = redPacketObj.getWay GameWorld.DebugLog("ºì°ü״̬±ä¸ü´¦Àí: redPacketID=%s,ownerID=%s,familyID=%s,beforeState=%s,state=%s" % (redPacketID, ownerID, familyID, beforeState, state)) notifyPlayerDict = {ownerID:[redPacketID]} # ֪ͨ¸øÖ¸¶¨Íæ¼ÒµÄÐÅÏ¢£¬Ã¿¸öÍæ¼Ò¿ÉÄܲ»Ò»Ñù # 1. ÏÉÃ˺ì°üÖ±½Ó֪ͨ¸ÃÏÉÃËËùÓгÉÔ± if family: if state in [State_NoSend, State_NoGot]: redPacketMgr.AddFamilyRedPacketID(family.GetID(), redPacketID) elif state == State_HasAllGot: redPacketMgr.DelFamilyRedPacketID(familyID, redPacketID) # ³ýÏÉÃ˺ì°üÍ⣬ÒÔÏÂÊÇÈ«·þºì°üµÄÏà¹Ø´¦Àí # 2. È«·þ먦·Åºì°üĬÈÏÖ»·¢¸ø¸öÈË elif state == State_NoSend: if not ownerID: return if beforeState == None: redPacketMgr.AddPlayerNosendRedPacketID(ownerID, getWay, redPacketID) # 3. È«·þ²»ÏÞÖÆÏ·¢¸öÊýµÄͬ²½È«·þÍæ¼Ò elif getWay not in IpyGameDataPY.GetFuncEvalCfg("RedPacketSys", 1): notifyPlayerDict = None if state == State_HasAllGot: if redPacketID in redPacketMgr.notifyAllServerRedPacketIDList: redPacketMgr.notifyAllServerRedPacketIDList.remove(redPacketID) else: if redPacketID not in redPacketMgr.notifyAllServerRedPacketIDList: redPacketMgr.notifyAllServerRedPacketIDList.append(redPacketID) # 4. ÆäËûµÄÒªÏÞÖÆÏ·¢¸öÊýµÄ¼ì²éÐèҪͬ²½µÄÍæ¼Ò¼´¿É # 4.1 ±äΪ ¿ª·ÅÁìȡ״̬ elif state == State_NoGot: if beforeState != State_NoGot: redPacketMgr.DelPlayerNosendRedPacketID(ownerID, getWay, redPacketID) # ÒÆ³öÓµÓÐÕß˽ÓÐ먦·Åºì°ü¶ÓÁÐ redPacketMgr.AddPlayerCanGetRedPacketID(ownerID, getWay, redPacketID) # Ìí¼ÓÓµÓÐÕß˽ÓÐÒÑ¿ª·Åºì°ü¶ÓÁÐ redPacketMgr.AddActiveRedPacketID(getWay, redPacketID) # Ìí¼Ó¹«¹²ÒÑ¿ª·Åºì°ü¶ÓÁÐ maxNotifyCount = IpyGameDataPY.GetFuncCfg("RedPacketSys", 2) # ¼ì²é×·¼Ó¸Ãºì°ü¼Ç¼µÄÍæ¼Ò for playerID, typeRedIDDict in redPacketMgr.playerCanGetRedPacketIDInfo.items(): if playerID == ownerID: continue redIDList = typeRedIDDict.get(getWay, []) if redPacketID in redIDList: continue nosendTypeRedIDDict = redPacketMgr.playerNosendRedPacketIDInfo.get(playerID, {}) nosendRedIDList = nosendTypeRedIDDict.get(getWay, []) totalCount = len(nosendRedIDList) + len(redIDList) # Íæ¼Òµ±Ç°»¹¿É²Ù×÷ÁìÈ¡µÄºì°üÊý if totalCount >= maxNotifyCount: continue redPacketMgr.AddPlayerCanGetRedPacketID(playerID, getWay, redPacketID) # Ìí¼ÓÄ¿±êÍæ¼Ò˽ÓÐÒÑ¿ª·Åºì°ü¶ÓÁÐ notifyPlayerDict[playerID] = [redPacketID] # 4.1 ±äΪ È«²¿ÁìÈ¡Íê±Ï elif state == State_HasAllGot: if beforeState != State_HasAllGot: redPacketMgr.DelActiveRedPacketID(getWay, redPacketID) # ÒÆ³ý¹«¹²ÒÑ¿ª·Åºì°ü¶ÓÁÐ nowActiveRedPacketIDList = redPacketMgr.activeRedPacketIDInfo.get(getWay, []) # µ±Ç°´ËÀàÐÍ»¹¿ÉÓõĹ«¹²ÒÑ¿ª·Åºì°üÁбí # ¼ì²éÐèÒª²¹³äºì°ü¼Ç¼µÄÍæ¼Ò£¬²ÉÓà ¼õÈ¥1 ²¹³ä1 µÄģʽ for playerID in redPacketMgr.playerCanGetRedPacketIDInfo.keys(): notifyRedIDList = DoPlayerReductCanGetRedPacket(playerID, redPacketObj, nowActiveRedPacketIDList) if notifyRedIDList: notifyPlayerDict[playerID] = notifyRedIDList else: return #PrintRedPacketData("StateChange") syncRedPacketList = [redPacketID] playerManager = GameWorld.GetPlayerManager() # ÏÉÃ˵ÄÖ±½Óͬ²½¸ÃÏÉÃËËùÓÐÍæ¼Ò if family: for i in xrange(family.GetCount()): notifyMember = family.GetAt(i) player = playerManager.FindPlayerByID(notifyMember.GetPlayerID()) if player == None or not player.GetInitOK() or PlayerControl.GetIsTJG(player): continue NotifyRedPacketInfo(player, syncRedPacketList) # ûÓÐÖ¸¶¨Íæ¼Ò£¬Ôò֪ͨȫ·þÍæ¼Ò elif notifyPlayerDict == None: for i in xrange(playerManager.GetActivePlayerCount()): player = playerManager.GetActivePlayerAt(i) if player == None or not player.GetInitOK() or PlayerControl.GetIsTJG(player): continue NotifyRedPacketInfo(player, syncRedPacketList) # ָ֪ͨ¶¨Íæ¼Ò else: for playerID, syncRedPacketList in notifyPlayerDict.items(): if not playerID: continue player = playerManager.FindPlayerByID(playerID) if player == None or not player.GetInitOK() or PlayerControl.GetIsTJG(player): continue NotifyRedPacketInfo(player, syncRedPacketList) return def DoPlayerReductCanGetRedPacket(playerID, redPacketObj, nowActiveRedPacketIDList=None): ## Íæ¼Ò¼õÉÙÈ«·þÏÞÖÆÏ·¢ºì°ü¿ÉÁìÈ¡¸öÊý´¦Àí ## @return: ÐèҪ֪ͨµÄºì°üIDÁбí getWay = redPacketObj.getWay redPacketID = redPacketObj.redPacketID redPacketMgr = GetRedpacketMgr() if nowActiveRedPacketIDList == None: nowActiveRedPacketIDList = redPacketMgr.activeRedPacketIDInfo.get(getWay, []) # µ±Ç°´ËÀàÐÍ»¹¿ÉÓõĹ«¹²ÒÑ¿ª·Åºì°üÁбí # ¼ì²éÐèÒª²¹³äºì°ü¼Ç¼µÄÍæ¼Ò£¬²ÉÓà ¼õÈ¥1 ²¹³ä1 µÄģʽ canGetIDList = redPacketMgr.DelPlayerCanGetRedPacketID(playerID, getWay, redPacketID) # ÒÆ³ö˽ÓÐÒÑ¿ª·Åºì°ü¶ÓÁÐ if canGetIDList == None: return lastCanGetID = 0 if not canGetIDList else canGetIDList[-1] checkIndex = nowActiveRedPacketIDList.index(lastCanGetID) if lastCanGetID in nowActiveRedPacketIDList else 0 for i in xrange(checkIndex + 1, len(nowActiveRedPacketIDList)): newCanGetRedID = nowActiveRedPacketIDList[i] newRedPacketObj = redPacketMgr.GetRedPacketObj(newCanGetRedID, False) if not newRedPacketObj: continue if playerID in newRedPacketObj.grabDict: continue if newCanGetRedID not in canGetIDList: if redPacketMgr.AddPlayerCanGetRedPacketID(playerID, getWay, newCanGetRedID): # Ìí¼ÓÄ¿±êÍæ¼Ò˽ÓÐÒÑ¿ª·Åºì°ü¶ÓÁÐ return [redPacketID, newCanGetRedID] return [redPacketID] def DelRedPackByFamilyID(delfamilyID): ## ɾ³ýÏÉÃ˵Äʱºò²ÅÐèҪɾ³ýºì°ü£¬ËùÒÔÕâÀï²»×ö֪ͨ£¬ÖØÐ¼ÓÈëÏÉÃËʱ»áÖØÐÂͬ²½Ò»´Î isAll µÄÇé¿ö familyID = delfamilyID redPacketMgr = GetRedpacketMgr() if familyID not in redPacketMgr.familyRedPacketDict: return familyRedpacketIDList = redPacketMgr.familyRedPacketDict.pop(familyID) for redPacketID in familyRedpacketIDList: if redPacketID in redPacketMgr.allRedPacketDict: redPacketMgr.allRedPacketDict.pop(redPacketID) GameWorld.DebugLog("½âÉ¢ÏÉÃËɾ³ýÏÉÃ˺ì°ü! familyID=%s, %s" % (familyID, familyRedpacketIDList)) 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(): ## ÿ·ÖÖÓ´¦Àí£¬¶¨Ê±·¢·Åϵͳºì°ü CheckSendServerSystemRedPacket() 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 startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData) feastPack = ChPyNetSendPack.tagGCFeastRedPacketInfo() feastPack.StartDate = startDateStr feastPack.EndtDate = endDateStr 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 RandTodayServerSystemRedPacketSendTime(): ## Ëæ»úÉú³É½ñÈÕÈ«·þϵͳºì°ü·¢·Åʱ¼äµã sendTimeList = [] sysRedPackketSendCountToday = PlayerDBGSEvent.GetDBGSTrig_ByKey(DBKey_RedPacketSystemDayCount) maxCount = IpyGameDataPY.GetFuncCfg("ServerSysRedPacket", 1) if not maxCount: return 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): ## ·¢·Åϵͳºì°ü 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 isAnonymous = 0 state = State_NoGot # ÔÝÖ±½ÓÉ趨ÒÑ·¢·Å if ipyData.GetPacketOpenTime(): PlayerDBGSEvent.SetDBGSTrig_ByKey(DBKey_RedPacketSend % redPackID, 1) GameWorld.DebugLog("¶¨Ê±·¢·ÅµÄºì°ü£¬ÉèÖÃÒÑ·¢·Å! redPackID=%s" % redPackID) getWayType = GetRedPackGetWayType(getType) if getWayType == ShareDefine.RedPackWayType_Server: isAnonymous = 1 job = 0 jobRank = 0 playerName = "" playerID = 0 family = None __SaveNewRedRecord(family, playerID, playerName, job, jobRank, getType, moneyType, outputNum, packetCnt, state, sysCreateTime=sysCreateTime, isAnonymous=isAnonymous) 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 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, isAnonymous=0): #ºì°üΨһ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) familyID = family.GetID() if family else 0 curTimeNum = int(time.time()) redPacketMgr = GetRedpacketMgr() redPacketObj = redPacketMgr.GetRedPacketObj(redPacketID, True) redPacketObj.redPacketID = redPacketID redPacketObj.familyID = familyID redPacketObj.moneyType = moneyType redPacketObj.moneyValue = outputNum redPacketObj.state = state redPacketObj.createTime = sysCreateTime if sysCreateTime else curTimeNum redPacketObj.calcTime = curTimeNum redPacketObj.playerID = ownerID redPacketObj.playerName = playerName redPacketObj.playerJob = job redPacketObj.getWay = getType redPacketObj.packetCnt = packetCnt redPacketObj.isAnonymous = isAnonymous # ÊÇ·ñÄäÃû redPacketObj.wish = wishStr redPacketObj.grabDict = {} GameWorld.Log("Éú³Éеĺì°ü: familyID=%s,redPacketID=%s,ownerID=%s,getType=%s,moneyType=%s,outputNum=%s,packetCnt=%s,state=%s,isAnonymous=%s" % (familyID, redPacketID, ownerID, getType, moneyType, outputNum, packetCnt, state, isAnonymous)) #֪ͨ OnChangeRedPacketState(family, redPacketObj, None) 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 redPacketObj def SendFamilyRedPacket(msgList): '''¿ª·Åºì°ü¿ÉÁìÈ¡£¬¸Ãºì°üÒÑ´æÔÚ£¬Ö»ÊÇ״̬δ·¢·Å£¬ÓɹéÊôÍæ¼Ò×ÔÓÉÑ¡Ôñ·¢·Åʱ»ú''' playerID, redPacketID, packetCnt, isAnonymous = msgList curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not curPlayer: return redPacketMgr = GetRedpacketMgr() redPacketObj = redPacketMgr.GetRedPacketObj(redPacketID, False) if not redPacketObj: return ownID = redPacketObj.playerID getWay = redPacketObj.getWay 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: redPacketObj.playerID = playerID elif playerID != ownID: GameWorld.DebugLog(' ·¢ÏµÍ³ÔùË͵ĺì°ü ²»ÊDZ¾ÈË£¡', playerID) return beforeState = redPacketObj.state redPacketObj.state = State_NoGot redPacketObj.packetCnt = packetCnt redPacketObj.isAnonymous = int(isAnonymous) redPacketObj.calcTime = int(time.time()) if redPacketObj.familyID == 0: family = None else: family = curPlayer.GetFamily() if family == None: return OnChangeRedPacketState(family, redPacketObj, beforeState) return def DoGrabFamilyRedPacket(curPlayer, msgList): ## ÇÀºì°ü redPacketID, reqGetWay, canGrabCnt = msgList redPacketMgr = GetRedpacketMgr() redPacketObj = redPacketMgr.GetRedPacketObj(redPacketID, False) if not redPacketObj: GameWorld.ErrLog("ºì°ü²»´æÔÚ£¡") return playerID = curPlayer.GetPlayerID() state = redPacketObj.state beforeState = state if state in [State_NoSend]: GameWorld.DebugLog(" ¸Ãºì°ü»¹Î´·¢ËÍ£¡", playerID) return familyID = redPacketObj.familyID if familyID: curFamily = curPlayer.GetFamily() if curFamily == None: return else: curFamily = None moneyType = redPacketObj.moneyType totalMoney = redPacketObj.moneyValue packetCnt = redPacketObj.packetCnt #ÕҸúì°üµÄÇÀÐÅÏ¢ grabRecordDict = redPacketObj.grabDict if playerID in grabRecordDict: GameWorld.DebugLog(" ¸ÃÍæ¼ÒÒÑÇÀ¹ý´Ëºì°ü£¡", playerID) __NotifyGrabRedPacketInfo(curPlayer, redPacketID, grabRecordDict) return outNum = sum([grabObj.getMoney for grabObj in grabRecordDict.values()]) #Òѱ»ÇÀµÄÇ® remainNum = totalMoney - outNum #Ê£ÓàµÄÇ® if len(grabRecordDict) >= packetCnt or remainNum <= 0: GameWorld.DebugLog(" ºì°üÒѱ»ÇÀÍ꣡", playerID) if state != State_HasAllGot: redPacketObj.state = State_HasAllGot #GameWorld.DebugLog(" ¾ÀÕýºì°üÒÑÇÀÍê״̬! state=%s,updState=%s" % (state, State_HasAllGot)) OnChangeRedPacketState(curFamily, redPacketObj, beforeState) __NotifyGrabRedPacketInfo(curPlayer, redPacketID, grabRecordDict) return remainPacketCnt = packetCnt - len(grabRecordDict) getWay = redPacketObj.getWay owerID = redPacketObj.playerID 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 getWayType = GetRedPackGetWayType(getWay) if getWayType == ShareDefine.RedPackWayType_Server: getNumformula = IpyGameDataPY.GetFuncCompileCfg('OpenRedRacketOutNum') elif getWayType == ShareDefine.RedPackWayType_Feast: getNumformula = IpyGameDataPY.GetFuncCompileCfg('FeastRedPacket', 2) else: getNumformula = IpyGameDataPY.GetFuncCompileCfg('FamilyRedRacketOutNum') getMoney = eval(getNumformula) if remainPacketCnt > 1 else remainNum getMoney = min(getMoney, remainNum) remainNum -= getMoney GameWorld.DebugLog(" ¸ÃÍæ¼ÒÇÀµ½ºì°ü: redPacketID=%s,getWay=%s,getMoney=%s,remainNum=%s" % (redPacketID, getWay, getMoney, remainNum), playerID) # ÐÂÔöÇÀµÄ¼Ç¼ grabObj = RedPacketGrab(redPacketID, playerID) grabObj.playerJob = curPlayer.GetJob() grabObj.playerName = curPlayer.GetName() grabObj.face = curPlayer.GetFace() grabObj.facePic = curPlayer.GetFacePic() grabObj.moneyType = moneyType grabObj.getMoney = getMoney grabRecordDict[playerID] = grabObj if len(grabRecordDict) >= packetCnt or remainNum <= 0: redPacketObj.state = State_HasAllGot OnChangeRedPacketState(curFamily, redPacketObj, beforeState) else: if getWay in IpyGameDataPY.GetFuncEvalCfg("RedPacketSys", 1): #PrintRedPacketData("GrabBefore") notifyRedIDList = DoPlayerReductCanGetRedPacket(playerID, redPacketObj) if notifyRedIDList: NotifyRedPacketInfo(curPlayer, notifyRedIDList) #PrintRedPacketData("GrabAfter") else: NotifyRedPacketInfo(curPlayer, [redPacketID]) __NotifyGrabRedPacketInfo(curPlayer, redPacketID, grabRecordDict) #¸øÇ® result = str([moneyType, getMoney, getWay, isSelf]) curPlayer.MapServer_QueryPlayerResult(0, 0, "GrabFamilyRedPacketResult", result, len(result)) return getMoney def __NotifyGrabRedPacketInfo(curPlayer, redPacketID, grabRecordDict): '''֪ͨÇÀºì°üÐÅÏ¢''' sendPack = ChPyNetSendPack.tagGCFamilyRedPacketGrabInfo() sendPack.Clear() sendPack.RedPacketID = redPacketID sendPack.GrabInfo = [] for grabObj in grabRecordDict.values(): grabInfo = ChPyNetSendPack.tagFGrabRedPacketInfo() grabInfo.Name = grabObj.playerName grabInfo.NameLen = len(grabInfo.Name) grabInfo.PlayeJob = grabObj.playerJob grabInfo.Face = grabObj.face grabInfo.FacePic = grabObj.facePic grabInfo.MoneyNum = grabObj.getMoney sendPack.GrabInfo.append(grabInfo) sendPack.Count = len(sendPack.GrabInfo) NetPackCommon.SendFakePack(curPlayer, sendPack) return def NotifyRedPacketInfo(curPlayer, syncRedPacketIDList=None, isLogin=False): ## ֪ͨºì°üÐÅÏ¢ if PlayerControl.GetIsTJG(curPlayer): return redPacketMgr = GetRedpacketMgr() isAll = int(syncRedPacketIDList == None) if syncRedPacketIDList == None: syncRedPacketIDList = [] playerID = curPlayer.GetPlayerID() family = curPlayer.GetFamily() familyID = family.GetID() if family else 0 syncRedPacketIDList += redPacketMgr.familyRedPacketDict.get(familyID, []) # 1. ÏÉÃËËùÓУ¨º¬Î´¿ª·ÅµÄ£© syncRedPacketIDList += redPacketMgr.notifyAllServerRedPacketIDList # 2. È«·þ²»ÏÞÖÆÏ·¢¸öÊý # 3. È«·þ˽ÓÐ먦·Å for redIDList in redPacketMgr.playerNosendRedPacketIDInfo.get(playerID, {}).values(): syncRedPacketIDList += redIDList # 4. È«·þÏÞÖÆÏ·¢¸öÊý·ÖÅ䏸¸öÈË¿ÉÁìÈ¡µÄºì°ü for redIDList in redPacketMgr.playerCanGetRedPacketIDInfo.get(playerID, {}).values(): syncRedPacketIDList += redIDList if not syncRedPacketIDList and isLogin: return redPacketInfo = [] playerID = curPlayer.GetPlayerID() joinFamilyTime = PlayerFamily.GetPlayerJoinFamilyTime(curPlayer) #GameWorld.DebugLog("֪ͨºì°üÐÅÏ¢: isLogin=%s,isAll=%s,syncRedPacketIDList=%s" % (isLogin, isAll, syncRedPacketIDList), playerID) for redPacketID in syncRedPacketIDList: redPacketObj = redPacketMgr.GetRedPacketObj(redPacketID, False) if not redPacketObj: continue #ÏÉÃ˺ì°üÖ»Í¨ÖªÍæ¼Ò½øÈëÏÉÃ˺óÉú³ÉµÄºì°ü if redPacketObj.familyID: if joinFamilyTime and redPacketObj.calcTime < joinFamilyTime: #GameWorld.DebugLog(" ¼ÓÈëÏÉÃË֮ǰµÄºì°ü²»·¢: redPacketID=%s,joinFamilyTime=%s > %s" % (redPacketID, joinFamilyTime, redPacketObj.calcTime)) continue state = redPacketObj.state if playerID in redPacketObj.grabDict: state = State_HasGot if isAll and state in [State_HasGot, State_HasAllGot]: #GameWorld.DebugLog(" ÒÑÇÀ»òÇÀÍêµÄ²»·¢: redPacketID=%s,state=%s" % (redPacketID, state)) continue tagCacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(redPacketObj.playerID)) packetInfo = ChPyNetSendPack.tagFRedPacketInfo() packetInfo.Clear() packetInfo.RedPacketID = redPacketObj.redPacketID packetInfo.PlayerID = redPacketObj.playerID packetInfo.Name = "" if redPacketObj.isAnonymous else redPacketObj.playerName packetInfo.NameLen = len(packetInfo.Name) packetInfo.Time = redPacketObj.createTime packetInfo.PlayeJob = redPacketObj.playerJob packetInfo.Face = tagCacheDict.get("Face", 0) packetInfo.FacePic = tagCacheDict.get("FacePic", 0) packetInfo.MoneyType = redPacketObj.moneyType packetInfo.MoneyNum = redPacketObj.moneyValue packetInfo.GetWay = redPacketObj.getWay packetInfo.State = state packetInfo.PacketCnt = redPacketObj.packetCnt packetInfo.IsAnonymous = int(redPacketObj.isAnonymous) packetInfo.Wish = redPacketObj.wish packetInfo.WishLen = len(packetInfo.Wish) redPacketInfo.append(packetInfo) if len(redPacketInfo) > 250: #GameWorld.DebugLog("ºì°üÌ«¶àÁË!") break if not redPacketInfo: return sendPack = ChPyNetSendPack.tagGCFamilyRedPacketInfo() sendPack.Clear() sendPack.IsAll = isAll sendPack.RedPacketInfo = redPacketInfo sendPack.Count = len(sendPack.RedPacketInfo) NetPackCommon.SendFakePack(curPlayer, sendPack) return