#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package CrossActionControl # # @todo:¿ç·þ»î¶¯×Ü¿ª¹ØÂß¼­ # @author hxp # @date 2020-01-13 # @version 1.0 # # ÏêϸÃèÊö: ¿ç·þ»î¶¯×Ü¿ª¹ØÂß¼­ # ¿ç·þ»î¶¯µÄʱ¼äÒÔ¿ç·þ·þÎñÆ÷Ϊ׼£¬ËùÓеÄ״̬¿ØÖÆÓÉ¿ç·þ·þÎñÆ÷¿ØÖƲ¢¹ã²¥×Ó·þÎñÆ÷ # ×Ó·þ½ö×ö¾ßÌå»î¶¯Âß¼­ # #------------------------------------------------------------------------------- #"""Version = 2020-01-13 17:00""" #------------------------------------------------------------------------------- import GameWorld import ShareDefine import PlayerControl import IpyGameDataPY import CrossActCTGBillboard import CrossRealmMsg import PyGameData import ChConfig import datetime import time ( CrossAct_ReloadSign, # ÐÅÏ¢ÖØÔØ±ê¼Ç CrossAct_TodayInfo, # µ±ÈյĻÐÅÏ¢ ) = range(2) def OnPlayerLogin(curPlayer): return def OnServerClose(): if not GameWorld.IsCrossServer(): return GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_CrossActInfo) if not PyGameData.g_crossActInfoDict: return GameWorld.Log("±£´æ¿ç·þÔËÓª»î¶¯ÐÅϢͨÓüǼ: ") # ±£´æ»î¶¯ÖÐµÄ recDataList = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_CrossActInfo) for actName, actInfoDict in PyGameData.g_crossActInfoDict.items(): for cfgID, actInfo in actInfoDict.items(): if not actInfo.get(ShareDefine.ActKey_State): # ·Ç»î¶¯Öеģ¬ÒѾ­½áËã¹ýÁË£¬²»ÐèÒª´æ´¢ continue state = actInfo.get(ShareDefine.ActKey_State, 0) actID = actInfo.get(ShareDefine.ActKey_ID, 0) templateID = actInfo.get(ShareDefine.ActKey_TemplateID, 0) serverIDRangeList = actInfo.get(ShareDefine.ActKey_ServerIDRangeList, "") recData = recDataList.AddRec() recData.SetStrValue1(actName) recData.SetStrValue3(str(serverIDRangeList)) recData.SetValue1(cfgID) recData.SetValue2(state) recData.SetValue3(actID) recData.SetValue4(templateID) GameWorld.Log(" actName=%s,cfgID=%s,state=%s,actID=%s,templateID=%s,serverIDRangeList=%s" % (actName, cfgID, state, actID, templateID, serverIDRangeList)) return def GetCrossActInfoDict(): if PyGameData.g_crossActInfoDict == None: PyGameData.g_crossActInfoDict = {} # ÏȼÓÔØÍ¨ÓüǼ´æ´¢ÖеĻÐÅÏ¢ recDataList = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_CrossActInfo) GameWorld.Log("¼ÓÔØÍ¨ÓüǼÖеĿç·þÔËÓª»î¶¯ÐÅÏ¢: %s" % recDataList.Count()) for index in xrange(recDataList.Count()): recData = recDataList.At(index) actName = recData.GetStrValue1() strValue3 = recData.GetStrValue3() serverIDRangeList = eval(strValue3) if strValue3 else [] cfgID = recData.GetValue1() state = recData.GetValue2() actID = recData.GetValue3() templateID = recData.GetValue4() if not state: continue if actName not in PyGameData.g_crossActInfoDict: PyGameData.g_crossActInfoDict[actName] = {} actInfoDict = PyGameData.g_crossActInfoDict[actName] dbInfo = {ShareDefine.ActKey_ID:actID, ShareDefine.ActKey_State:state, ShareDefine.ActKey_TemplateID:templateID} # »î¶¯ID¡¢×´Ì¬¡¢Ä£°åÐÅÏ¢µ¥¶À´æ´¢£¬ÖØÖûÅжÏÓà actInfo = {ShareDefine.ActKey_CfgID:cfgID, ShareDefine.ActKey_ServerIDRangeList:serverIDRangeList} actInfo.update(dbInfo) actInfo[ShareDefine.ActKey_DBInfo] = dbInfo actInfoDict[cfgID] = actInfo GameWorld.Log(" actName=%s,cfgID=%s, %s" % (actName, cfgID, actInfoDict)) return PyGameData.g_crossActInfoDict def __GetParseIpyDataList(ipyDataMgr, actName, actInfoDict): ## »ñÈ¡ÐèÒª´¦ÀíµÄºÏ·¨·Ö×é»î¶¯ÅäÖÃÁÐ±í£¬ÒѾ­ÔڻÖеıØÐëÒª´¦Àí groupInfo = {} actCfgCount = getattr(ipyDataMgr, "Get%sCount" % actName)() for cfgIndex in xrange(actCfgCount): ipyData = getattr(ipyDataMgr, "Get%sByIndex" % actName)(cfgIndex) actGroupName = ipyData.GetActGroupName() if actGroupName not in groupInfo: groupInfo[actGroupName] = [] groupIpyDataList = groupInfo[actGroupName] groupIpyDataList.append(ipyData) parseIpyDataList = [] for actGroupName, groupIpyDataList in groupInfo.items(): allOpen = False cfgIDList = [] allServerIDRangeList = [] for ipyData in groupIpyDataList: cfgID = ipyData.GetCfgID() cfgIDList.append(cfgID) serverIDRangeList = ipyData.GetServerIDRangeList() if cfgID in actInfoDict and actInfoDict[cfgID]: actInfo = actInfoDict[cfgID] # ÒѾ­ÔڻÖеļǼ±ØÐëÒª´¦Àí parseIpyDataList.append(ipyData) serverIDRangeList = actInfo[ShareDefine.ActKey_ServerIDRangeList] GameWorld.Log(" ʹÓÃÒѾ­ÔڻÖеļǼµÄÇø·þ·Ö×é: cfgID=%s,serverIDRangeList=%s" % (cfgID, serverIDRangeList)) # ûÅäÖõÄÈ«·þ¿ª·Å if not serverIDRangeList: allOpen = True else: allServerIDRangeList.extend(serverIDRangeList) if allOpen and len(groupIpyDataList) > 1: GameWorld.ErrLog(" ͬ×é»î¶¯·þÎñÆ÷IDÅäÖÃÒì³££¬ÓÐÈ«·þ¿ª·ÅµÄ£¬Ö»ÄÜÅäÖÃ1Ìõ£¬²»´¦Àí! actGroupName=%s,cfgIDList=%s" % (actGroupName, cfgIDList)) continue errorServerIDList = [] for i in xrange(len(allServerIDRangeList)): checkIDA, checkIDB = allServerIDRangeList[i] for j in xrange(i): serverIDA, serverIDB = allServerIDRangeList[j] if serverIDA <= checkIDA <= serverIDB: errorServerIDList.append(checkIDA) if serverIDA <= checkIDB <= serverIDB: errorServerIDList.append(checkIDB) if errorServerIDList: GameWorld.ErrLog(" ͬ×é»î¶¯·þÎñÆ÷IDÅäÖÃÒì³££¬Óн»²æ£¬²»´¦Àí! actGroupName=%s,cfgIDList=%s,errorServerIDList=%s" % (actGroupName, cfgIDList, errorServerIDList)) continue for ipyData in groupIpyDataList: cfgID = ipyData.GetCfgID() if cfgID in actInfoDict and actInfoDict[cfgID]: continue parseIpyDataList.append(ipyData) return parseIpyDataList def __GetCrossActInfo(isRefreshState=True): # @return: isReload, CrossActInfo key = "CrossActInfo" CrossActInfo = IpyGameDataPY.GetConfigEx(key) serverTime = GameWorld.GetServerTime() curDateStr = "%d-%d-%d" % (serverTime.year, serverTime.month, serverTime.day) curHour = serverTime.hour reloadSignHour = 0 if curHour < 5 else 5 reloadSign = "%s %s" % (curDateStr, reloadSignHour) if CrossActInfo and CrossActInfo[CrossAct_ReloadSign] == reloadSign: #GameWorld.DebugLog("ÒѾ­¼ÓÔØ¹ý±¾ÈÕ¿ç·þÔËÓª»î¶¯´¦ÀíÐÅÏ¢£¡reloadSign=%s" % reloadSign) return False, CrossActInfo # ÒòΪºóÃæµÄʱ¼äÅж϶¼ÊǾ«È·µ½·ÖµÄ£¬¶ø´¦Àí´ËÂß¼­µÄʱºò¿ÉÄܲ»ÊÇ0Ã룬ËùÒÔÕâÀïµÄdatetimeÈ¡µ±Ç°Ê±¼ä¾«È·µ½·ÖµÄ curDateTimeStr = "%s %02d:%02d:00" % (curDateStr, serverTime.hour, serverTime.minute) curDateTime = datetime.datetime.strptime(curDateTimeStr, ChConfig.TYPE_Time_Format) actTimeInfoDict = {} ipyDataMgr = IpyGameDataPY.IPY_Data() GameWorld.Log("=============================================================") GameWorld.Log("¼ÓÔØ±¾ÈÕ¿ç·þÔËÓª»î¶¯ÐÅÏ¢: %s, reloadSign=%s =====" % (curDateTime, reloadSign)) crossActInfoDict = GetCrossActInfoDict() GameWorld.Log(" crossActInfoDict=%s" % crossActInfoDict) for actName in ShareDefine.CrossActNameList: # È¡³ö±¾»î¶¯ËùÊô±¾·þIDµÄËùÓÐÅäÖà GameWorld.Log("¼ÓÔØ¿ç·þÔËÓª»î¶¯: actName=%s" % (actName)) if not hasattr(ipyDataMgr, "Get%sCount" % actName): GameWorld.ErrLog(" ûÓиÿç·þÔËÓª»î¶¯ÀàÐͶÔÓ¦»î¶¯Ê±¼ä±í! actName=%s" % actName) continue curActInfoDict = crossActInfoDict.get(actName, {}) # ÑéÖ¤·þÎñÆ÷ID²»Öظ´µÄÅäÖà parseIpyDataList = __GetParseIpyDataList(ipyDataMgr, actName, curActInfoDict) for ipyData in parseIpyDataList: cfgID = ipyData.GetCfgID() startDateStr = ipyData.GetStartDate() endDateStr = ipyData.GetEndDate() GameWorld.Log(" cfgID=%s,startDateStr=%s,endDateStr=%s,curDateTime=%s" % (cfgID, startDateStr, endDateStr, curDateTime)) if not startDateStr: startDateStr = curDateStr GameWorld.Log(" ¿ªÊ¼ÈÕÆÚΪ¿Õ£¬Ä¬ÈÏÿÌ죬½ñÈÕΪ: startDateStr=%s" % startDateStr) if not endDateStr: endDateStr = curDateStr GameWorld.Log(" ½áÊøÈÕÆÚΪ¿Õ£¬Ä¬ÈÏÿÌ죬½ñÈÕΪ: endDateStr=%s" % endDateStr) if hasattr(ipyData, "GetStartTimeList") and hasattr(ipyData, "GetEndTimeList"): startHMStrList = ipyData.GetStartTimeList() endHMStrList = ipyData.GetEndTimeList() else: startHMStrList = [] endHMStrList = [] notifyInfoDictStart = ipyData.GetNotifyInfoStart() if hasattr(ipyData, "GetNotifyInfoStart") else {} notifyInfoDictEnd = ipyData.GetNotifyInfoEnd() if hasattr(ipyData, "GetNotifyInfoEnd") else {} notifyInfoLoopInfo = ipyData.GetNotifyInfoLoop() if hasattr(ipyData, "GetNotifyInfoLoop") else [] # [Ñ­»··ÖÖÓ, ¹ã²¥key, [¹ã²¥²ÎÊýÁбí¿ÉÑ¡]] if len(startHMStrList) != len(endHMStrList): GameWorld.ErrLog(" »î¶¯ÅäÖÿªÊ¼¼°½áÊøÊ±¼ä¸öÊý²»Æ¥Åä! actName=%s,cfgID=%s,startHMStrList=%s,endHMStrList=%s" % (actName, cfgID, startHMStrList, endHMStrList)) resetType = 0 if not hasattr(ipyData, "GetResetType") else ipyData.GetResetType() # ÖØÖÃÀàÐÍ£¬0-0µãÖØÖã»1-5µãÖØÖà if resetType == 1: startDayDate = datetime.datetime.strptime("%s 05:00:00" % (startDateStr), ChConfig.TYPE_Time_Format) endDayDate = datetime.datetime.strptime("%s 05:00:00" % (endDateStr), ChConfig.TYPE_Time_Format) # ½áÊøÈÕÆÚ5µã elif resetType == 2: startDayDate = datetime.datetime.strptime("%s 05:00:00" % (startDateStr), ChConfig.TYPE_Time_Format) endDayDate = datetime.datetime.strptime("%s 00:00:00" % (endDateStr), ChConfig.TYPE_Time_Format) + datetime.timedelta(days=1) # ½áÊøÈÕÆÚ¸ôÌì0µã else: startDayDate = datetime.datetime.strptime("%s 00:00:00" % (startDateStr), ChConfig.TYPE_Time_Format) endDayDate = datetime.datetime.strptime("%s 00:00:00" % (endDateStr), ChConfig.TYPE_Time_Format) + datetime.timedelta(days=1) # ½áÊøÈÕÆÚ¸ôÌì0µã GameWorld.Log(" resetType=%s,startDayDate=%s,endDayDate=%s,startHMStrList=%s,endHMStrList=%s" % (resetType, startDayDate, endDayDate, startHMStrList, endHMStrList)) if curDateTime < startDayDate or curDateTime >= endDayDate: isActTime = False if cfgID not in curActInfoDict or not curActInfoDict[cfgID]: GameWorld.Log(" ·Ç»î¶¯Ê±¼ä£¡²»´¦Àí£¡") continue else: isActTime = True GameWorld.Log(" ÐèÒª´¦ÀíµÄ¿ç·þÔËÓª»î¶¯ÐÅÏ¢: cfgID=%s,isActTime=%s" % (cfgID, isActTime)) startList = [] # [startDateTime, ...] endList = [] # [endDateTime, ...] startNotifyDict = {} # {notifyDateTime:notifyInfo, ...} endNotifyDict = {} # {notifyDateTime:notifyInfo, ...} loopNotifyDict = {} # {notifyDateTime:notifyInfo, ...} notifyDict = {} # ûÅäÖÃʱ·ÖµÄ´ú±íÈ«Ìì if not startHMStrList: startDateTime = startDayDate endDateTime = endDayDate startList.append(startDateTime) endList.append(endDateTime) # ÿÌ찴ʱ¶Î¿ªÆôµÄ£¬Ö§³Ö¶àʱ¶Î else: for hmIndex, startHMStr in enumerate(startHMStrList): if hmIndex >= len(endHMStrList): break endHMStr = endHMStrList[hmIndex] # ÿÌ쿪µÄ, ʵ¼Ê¿ª¹ØÊ±¼äֻȡ½ñÌìµÄÈÕÆÚ£» ÕâÀïÓиöÎÊÌ⣬ȫ·þ¹ã²¥µÄʱ¼ä²»ÊǽñÌìµÄ, Ôݲ»×öÖ§³Ö£¬Ö®ºóÕæÓÐÕâÖÖÐèÇóÔÙ˵ startTimeStr = "%d-%d-%d %s:00" % (curDateTime.year, curDateTime.month, curDateTime.day, startHMStr) endTimeStr = "%d-%d-%d %s:00" % (curDateTime.year, curDateTime.month, curDateTime.day, endHMStr) startDateTime = datetime.datetime.strptime(startTimeStr, ChConfig.TYPE_Time_Format) endDateTime = datetime.datetime.strptime(endTimeStr, ChConfig.TYPE_Time_Format) startList.append(startDateTime) endList.append(endDateTime) GameWorld.Log(" startList=%s" % (startList)) GameWorld.Log(" end List=%s" % (endList)) for dtIndex, startDateTime in enumerate(startList): endDateTime = endList[dtIndex] # ¹ã²¥ - Ïà¶Ôʵ¼Ê¿ªÊ¼Ê±¼ä for notifyMinute, notifyInfo in notifyInfoDictStart.items(): notifyDateTime = startDateTime + datetime.timedelta(minutes=notifyMinute) if notifyDateTime.year == curDateTime.year and notifyDateTime.month == curDateTime.month and notifyDateTime.day == curDateTime.day: startNotifyDict[notifyDateTime] = notifyInfo # ¹ã²¥ - Ïà¶Ôʵ¼Ê½áÊøÊ±¼ä for notifyMinute, notifyInfo in notifyInfoDictEnd.items(): notifyDateTime = endDateTime + datetime.timedelta(minutes=notifyMinute) if notifyDateTime.year == curDateTime.year and notifyDateTime.month == curDateTime.month and notifyDateTime.day == curDateTime.day: endNotifyDict[notifyDateTime] = notifyInfo # ¹ã²¥ - Ñ­»·¹ã²¥ if notifyInfoLoopInfo and len(notifyInfoLoopInfo) >= 2: loopMinutes, loopNotifyKey = notifyInfoLoopInfo[:2] loopNotifyParamList = notifyInfoLoopInfo[2] if len(notifyInfoLoopInfo) > 2 else [] notifyInfo = [loopNotifyKey, loopNotifyParamList] # Ñ­»·¹ã²¥µÄĬÈÏÎÞ²ÎÊý loopCount, loopMaxCount = 0, 100 while loopMinutes and loopNotifyKey and loopCount < loopMaxCount: loopCount += 1 notifyDateTime = curDateTime + datetime.timedelta(minutes=loopMinutes * loopCount) if notifyDateTime >= endDateTime: break if notifyDateTime.year == curDateTime.year and notifyDateTime.month == curDateTime.month and notifyDateTime.day == curDateTime.day: loopNotifyDict[notifyDateTime] = notifyInfo if startNotifyDict or endNotifyDict or loopNotifyDict: GameWorld.Log(" startNotifyDict: %s, %s" % (len(startNotifyDict.keys()), sorted(startNotifyDict.keys()))) GameWorld.Log(" end NotifyDict: %s, %s" % (len(endNotifyDict.keys()), sorted(endNotifyDict.keys()))) GameWorld.Log(" loop NotifyDict: %s, %s" % (len(loopNotifyDict.keys()), sorted(loopNotifyDict.keys()))) notifyDict.update(startNotifyDict) notifyDict.update(endNotifyDict) notifyDict.update(loopNotifyDict) if actName not in actTimeInfoDict: actTimeInfoDict[actName] = {} actTimeInfoDict[actName][cfgID] = [ipyData, startList, endList, notifyDict] if actName not in crossActInfoDict: crossActInfoDict[actName] = {} curActInfoDict = crossActInfoDict[actName] if cfgID not in curActInfoDict: curActInfoDict[cfgID] = {} curCfgActInfoDict = curActInfoDict[cfgID] # ipyData »î¶¯Ê±¼ä±íÐÅÏ¢ÓÉ¿ç·þ·þÎñÆ÷ͬ²½×Ó·þ£¬»î¶¯ÄÚÈÝÈ¡×Ó·þ×Ô¼ºµÄ ipyDataDict = {} for k, v in ipyData.__dict__.items(): if k in ["NotifyInfoStart", "NotifyInfoEnd", "NotifyInfoLoop", "ServerIDRangeList"]: continue ipyDataDict[k] = v ipyDataDict.update({"StartDate":startDateStr, "EndDate":endDateStr}) GameWorld.Log(" ipyDataDict=%s" % ipyDataDict) curCfgActInfoDict.update({ShareDefine.ActKey_CfgID:cfgID, ShareDefine.ActKey_IpyDataInfo:ipyDataDict}) if ShareDefine.ActKey_ServerIDRangeList not in curCfgActInfoDict: # ûÓеϰÔòʹÓÃÅäÖÃÖе쬷ÀÖ¹ÅäÖÃÐ޸ĵ¼Ö·þÎñÆ÷ID·ÖÇø±ä¶¯ÒýÆðµÄ»î¶¯Êý¾ÝÒì³££¬³ý·Çºǫ́¹¤¾ßÇ¿ÖÆÐÞ¸Ä curCfgActInfoDict[ShareDefine.ActKey_ServerIDRangeList] = ipyData.GetServerIDRangeList() actID, dayIndex, templateID = 0, 0, 0 if isActTime: dayIndex = (curDateTime - startDayDate).days actIDDateTime = startDayDate isDayReset = 0 if not hasattr(ipyData, "GetIsDayReset") else ipyData.GetIsDayReset() # °´Ê±¶Î¿ªµÄĬÈÏÿÌìÖØÖà if isDayReset or (startHMStrList and endHMStrList): actIDDateTime += datetime.timedelta(days=dayIndex) actID = int(time.mktime(actIDDateTime.timetuple())) # ĬÈÏÈ¡¿ªÊ¼Ê±¼äµãµÄtimeÖµ×÷Ϊ»î¶¯ID GameWorld.Log(" isDayReset=%s,actIDDateTime=%s,actID=%s" % (isDayReset, actIDDateTime, actID)) # Ä£°åID if hasattr(ipyData, "TemplateIDList"): templateIDList = ipyData.GetTemplateIDList() templateID = templateIDList[-1] if dayIndex >= len(templateIDList) else templateIDList[dayIndex] # ÆäËûÌØÊâÄ£°åID»ñÈ¡´¦Àí£¬ÓÐÐèÒªµÄµ¥¶À´¦Àí¼´¿É£¬¸ù¾Ý»î¶¯¹æÔò×ÔÐÐÀ©Õ¹... curCfgActInfoDict.update({ShareDefine.ActKey_ID:actID, ShareDefine.ActKey_TemplateID:templateID, ShareDefine.ActKey_DayIndex:dayIndex}) CrossActInfo = IpyGameDataPY.SetConfigEx(key, [reloadSign, actTimeInfoDict]) GameWorld.Log("±¾ÈÕ¿ç·þÔËÓª»î¶¯ÐÅÏ¢¼ÓÔØÍê±Ï!reloadSign=%s,isRefreshState=%s" % (reloadSign, isRefreshState)) GameWorld.Log(" actTimeInfoDict=%s" % actTimeInfoDict) GameWorld.Log(" crossActInfoDict=%s" % crossActInfoDict) GameWorld.Log("=============================================================") if isRefreshState: Dispose_CrossActState(True) return True, CrossActInfo def Dispose_CrossActState(reloadRefresh=False): isReload, CrossActInfo = __GetCrossActInfo(False) # ÕâÀï±ØÐë´«False isReload = isReload or reloadRefresh actTimeInfoDict = CrossActInfo[CrossAct_TodayInfo] crossActInfoDict = GetCrossActInfoDict() # ÕâÀïʱ¼äÐ辫ȷµ½·ÖÖÓ£¬²»È»ºóÃæµÄ±È½Ï»áÆ¥Åä²»µ½ curDateTime = GameWorld.GetServerTime() curDateTime = datetime.datetime.strptime("%d-%d-%d %d:%d:00" % (curDateTime.year, curDateTime.month, curDateTime.day, curDateTime.hour, curDateTime.minute), ChConfig.TYPE_Time_Format) sysnCrossActInfoDict = {} for actName in ShareDefine.CrossActNameList: if actName not in actTimeInfoDict or actName not in crossActInfoDict: continue for ipyData, startList, endList, notifyDict in actTimeInfoDict[actName].values(): state = 0 # ĬÈÏ¹Ø±Õ cfgID = ipyData.GetCfgID() if cfgID not in crossActInfoDict[actName]: crossActInfoDict[actName][cfgID] = {} actInfoDict = crossActInfoDict[actName][cfgID] # ״̬ for dIndex, startDateTime in enumerate(startList): endDateTime = endList[dIndex] if startDateTime <= curDateTime < endDateTime: state = dIndex + 1 # Ò²ÊÇ´ú±íµÚ¼¸¸öʱ¼ä¶Î break # È«·þ¹ã²¥ÌáʾÐÅÏ¢ if curDateTime in notifyDict: serverIDRangeList = actInfoDict.get(ShareDefine.ActKey_ServerIDRangeList) if serverIDRangeList != None: notifyKey, paramList = notifyDict[curDateTime] country = 0 serverGroupIDList = [] crossNotifyList = [] crossNotifyList.append([ShareDefine.CrossNotify_CrossAct, [country, notifyKey, paramList], serverIDRangeList]) PlayerControl.CrossNotifyEx(serverGroupIDList, crossNotifyList) dbInfo = actInfoDict.get(ShareDefine.ActKey_DBInfo, {}) dbState = dbInfo.get(ShareDefine.ActKey_State, 0) dbActID = dbInfo.get(ShareDefine.ActKey_ID, 0) dbTemplateID = dbInfo.get(ShareDefine.ActKey_TemplateID, 0) actID = actInfoDict.get(ShareDefine.ActKey_ID, 0) templateID = actInfoDict.get(ShareDefine.ActKey_TemplateID, 0) if not isReload and dbState == state and dbActID == actID: #ÒѾ­ÊÇÕâ¸ö״̬ÁË continue GameWorld.Log("¿ç·þÔËÓª»î¶¯±ä¸ü: actName=%s,cfgID=%s,dbState=%s -> state=%s, dbActID=%s -> actID=%s" % (actName, cfgID, dbState, state, dbActID, actID)) if dbActID != actID: GameWorld.Log(" »î¶¯ID±ä¸ü: actName=%s,cfgID=%s,dbActID=%s -> actID=%s,dbTemplateID=%s" % (actName, cfgID, dbActID, actID, dbTemplateID)) if actName == ShareDefine.CrossActName_CTGBillboard: CrossActCTGBillboard.OnActIDChange(cfgID, dbTemplateID, state) if dbState != state: pass # ¸üÐÂ״̬ actInfoDict[ShareDefine.ActKey_State] = state actInfoDict[ShareDefine.ActKey_DBInfo] = {ShareDefine.ActKey_ID:actID, ShareDefine.ActKey_State:state, ShareDefine.ActKey_TemplateID:templateID} GameWorld.Log(" »î¶¯×´Ì¬Í¬²½ÐÅÏ¢: actName=%s,cfgID=%s,actInfoDict=%s" % (actName, cfgID, actInfoDict)) if actName not in sysnCrossActInfoDict: sysnCrossActInfoDict[actName] = {} sysnCrossActInfoDict[actName][cfgID] = actInfoDict # ·Ç»î¶¯ÖеĴ¦ÀíÍê¹Ø±Õºó£¬×îºóɾ³ý if not state: del crossActInfoDict[actName][cfgID] if not crossActInfoDict[actName]: del crossActInfoDict[actName] GameWorld.DebugLog(" ɾ³ý½áÊøµÄ»î¶¯: actName=%s,cfgID=%s,crossActInfoDict=%s" % (actName, cfgID, crossActInfoDict)) # ͬ²½×Ó·þÎñÆ÷ serverGroupIDList = [] CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossActInfo, sysnCrossActInfoDict, serverGroupIDList) return def Sync_CrossActInfoToClientServer(serverGroupID=0): ''' ͬ²½¿ç·þÔËÓª»î¶¯ÐÅÏ¢µ½×Ó·þÎñÆ÷ @param serverGroupID: Ϊ0ʱͬ²½ËùÓÐ×Ó·þ ''' isReload, _ = __GetCrossActInfo() if isReload: # Èç¹ûÊÇÖØ¶ÁµÄ£¬ÔòÔÚÄÚ²ãÒѾ­Í¬²½ÁË£¬´Ë´¦²»Öظ´Í¬²½ return # ͬ²½×Ó·þÎñÆ÷ sysnCrossActInfoDict = GetCrossActInfoDict() serverGroupIDList = [serverGroupID] if serverGroupID else [] CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossActInfo, sysnCrossActInfoDict, serverGroupIDList) return ## ================================================================================================ def CrossServerMsg_CrossActInfo(sysnCrossActInfoDict): ## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄ¿ç·þÔËÓª»î¶¯×´Ì¬ GameWorld.Log("===== ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄ¿ç·þÔËÓª»î¶¯×´Ì¬: %s" % sysnCrossActInfoDict) if PyGameData.g_crossActInfoDict == None: PyGameData.g_crossActInfoDict = {} PyGameData.g_crossActInfoDict.update(sysnCrossActInfoDict) for actName, actInfoDict in sysnCrossActInfoDict.items(): GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossActInfo % actName, actInfoDict) # ɾ³ý·Ç»î¶¯ÖÐµÄ for actName, actInfoDict in PyGameData.g_crossActInfoDict.items(): for cfgID, actInfo in actInfoDict.items(): if not actInfo.get(ShareDefine.ActKey_State, 0): del PyGameData.g_crossActInfoDict[actName][cfgID] return def SendMapServerCrossActionState(): # µØÍ¼Æô¶¯³É¹¦Ê±Í¨Öª¿ç·þ»î¶¯Ïà¹Ø×´Ì¬ - ±¾·þµØÍ¼£¬¿ç·þµØÍ¼²»ÐèҪ֪ͨ if PyGameData.g_crossActInfoDict == None: return sysnCrossActInfoDict = PyGameData.g_crossActInfoDict for actName in ShareDefine.CrossActNameList: actInfoDict = sysnCrossActInfoDict.get(actName, {}) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossActInfo % actName, actInfoDict) return