| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GM.Commands.GMT_CrossActServerIDChange  | 
| #  | 
| # @todo:¿ç·þ»î¶¯Çø·þIDÐÞ¸Ä  | 
| # @author hxp  | 
| # @date 2021-01-13  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¿ç·þ»î¶¯Çø·þIDÐÞ¸Ä  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2021-01-13 17:00"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import GameWorld  | 
| import DataRecordPack  | 
| import CrossActionControl  | 
| import CrossRealmMsg  | 
| import ShareDefine  | 
| import GMCommon  | 
|   | 
| #---------------------------------------------------------------------  | 
|   | 
| ## Ö´ÐÐÂß¼  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param gmCmdDict: ÃüÁî×Öµä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def OnExec(orderId, gmCmdDict):  | 
|       | 
|     GameWorld.Log("GMT_CrossActServerIDChange gmCmdDict=%s" % str(gmCmdDict))  | 
|       | 
|     if not GameWorld.IsCrossServer():  | 
|         GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_IsNotCrossServer)  | 
|         return  | 
|       | 
|     errInfo = ""  | 
|     doChange = gmCmdDict.get("doChange")  | 
|     if doChange:  | 
|         errInfo = __DoChangeCrossActServerIDRangeList(gmCmdDict)  | 
|           | 
|     crossActInfoDict = CrossActionControl.GetCrossActInfoDict()  | 
|     backMsg = {"crossActInfoDict":crossActInfoDict}  | 
|     if errInfo:  | 
|         backMsg["ErrorInfo"] = errInfo  | 
|         GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ParamErr, backMsg)  | 
|         return  | 
|       | 
|     # ¼Ç¼Á÷Ïò  | 
|     DataRecordPack.DR_ToolGMOperate(0, '', '', 'GMT_CrossActServerIDChange', str(gmCmdDict))  | 
|     # »Ø¸´  | 
|     GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_Success, backMsg)  | 
|     return  | 
|       | 
| def __DoChangeCrossActServerIDRangeList(gmCmdDict):  | 
|       | 
|     crossActInfoDict = CrossActionControl.GetCrossActInfoDict()  | 
|     changeInfoDict = {} # {actName:{cfgID:ServerIDList, ...}, ...}  | 
|     for k, v in gmCmdDict.items():  | 
|         if not k.endswith("_ServerIDRangeList"):  | 
|             continue  | 
|         kspList = k.split("_")  | 
|         if len(kspList) != 3:  | 
|             continue  | 
|         actName, cfgID, _ = kspList  | 
|         try:  | 
|             cfgID = int(cfgID)  | 
|             changeServerIDList = eval(v)  | 
|             # ¼ì²éÐ޸ĸñʽÊÇ·ñÕýÈ·  | 
|             for changeList in changeServerIDList:  | 
|                 if not (isinstance(changeList, list)   | 
|                         and len(changeList) == 2   | 
|                         and isinstance(changeList[0], int)   | 
|                         and isinstance(changeList[1], int)  | 
|                         ):  | 
|                     errInfo = "%s CfgID(%s) error serverIDList(%s)" % (actName, cfgID, changeList)  | 
|                     return errInfo  | 
|         except:  | 
|             errInfo = "%s CfgID(%s) error %s" % (actName, cfgID, v)  | 
|             return errInfo  | 
|           | 
|         if actName not in changeInfoDict:  | 
|             changeInfoDict[actName] = {}  | 
|         changeInfoDict[actName][cfgID] = changeServerIDList  | 
|           | 
|     GameWorld.Log("    crossActInfoDict=%s" % crossActInfoDict)  | 
|     GameWorld.Log("    changeInfoDict=%s" % changeInfoDict)  | 
|     if not changeInfoDict:  | 
|         errInfo = "no change info!"  | 
|         return errInfo  | 
|       | 
|     # ¼ì²éÐ޸ĺóÊÇ·ñÓн»²æ  | 
|     checkGroupInfo = {} # {actName:{actGroupName:[cfgID, ...], ...}} # ÏÈ·Ö×é  | 
|     for actName, actInfoDict in crossActInfoDict.items():  | 
|         if actName not in changeInfoDict:  | 
|             # Ã»ÓÐÐ޸ĵĻ²»ÐèÒª¼ì²é  | 
|             continue  | 
|         if actName not in checkGroupInfo:  | 
|             checkGroupInfo[actName] = {}  | 
|         actGroupListDict = checkGroupInfo[actName]  | 
|         for cfgID, actInfo in actInfoDict.items():  | 
|             actGroupName = actInfo[ShareDefine.ActKey_IpyDataInfo]["ActGroupName"]  | 
|             if actGroupName not in actGroupListDict:  | 
|                 actGroupListDict[actGroupName] = []  | 
|             cfgIDList = actGroupListDict[actGroupName]  | 
|             cfgIDList.append(cfgID)  | 
|               | 
|     GameWorld.Log("    checkGroupInfo: %s" % checkGroupInfo)  | 
|       | 
|     for actName, actGroupListDict in checkGroupInfo.items():  | 
|         actInfoDict = crossActInfoDict[actName]  | 
|         changeInfo = changeInfoDict.get(actName, {})  | 
|         for actGroupName, cfgIDList in actGroupListDict.items():  | 
|             allServerIDRangeList = []  | 
|             for cfgID in cfgIDList:  | 
|                 befActInfo = actInfoDict[cfgID]  | 
|                 if cfgID in changeInfo:  | 
|                     allServerIDRangeList.extend(changeInfo[cfgID])  | 
|                 else:  | 
|                     befServerIDList = befActInfo[ShareDefine.ActKey_ServerIDRangeList]  | 
|                     allServerIDRangeList.extend(befServerIDList)  | 
|                       | 
|             GameWorld.Log("    actName=%s,actGroupName=%s,cfgIDList=%s" % (actName, actGroupName, cfgIDList))  | 
|             GameWorld.Log("        allServerIDRangeList=%s" % (allServerIDRangeList))  | 
|             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)  | 
|                           | 
|             GameWorld.Log("        errorServerIDList=%s" % (errorServerIDList))  | 
|             if errorServerIDList:  | 
|                 return "%s exist errorServerIDList=%s in actGroupName(%s)" % (actName, errorServerIDList, actGroupName)  | 
|               | 
|     # ¼ì²éͨ¹ýºó½øÐÐÐÞ¸Ä  | 
|     sysnCrossActInfoDict = {}  | 
|     GameWorld.Log("    do change...")  | 
|     for actName, changInfo in changeInfoDict.items():  | 
|         for cfgID, changeServerIDRangeList in changInfo.items():  | 
|             if actName not in crossActInfoDict:  | 
|                 continue  | 
|             if cfgID not in crossActInfoDict[actName]:  | 
|                 continue  | 
|             actInfoDict = crossActInfoDict[actName][cfgID]  | 
|             beforeServerIDRangeList = actInfoDict[ShareDefine.ActKey_ServerIDRangeList]  | 
|             # Ö±½Ó¸²¸ÇÌæ»»  | 
|             actInfoDict[ShareDefine.ActKey_ServerIDRangeList] = changeServerIDRangeList  | 
|                           | 
|             GameWorld.Log("        actName=%s,cfgID=%s,beforeServerIDRangeList=%s -> %s"   | 
|                           % (actName, cfgID, beforeServerIDRangeList, changeServerIDRangeList))  | 
|               | 
|             if actName not in sysnCrossActInfoDict:  | 
|                 sysnCrossActInfoDict[actName] = {}  | 
|             sysnCrossActInfoDict[actName][cfgID] = actInfoDict  | 
|               | 
|     GameWorld.Log("    changeOK! crossActInfoDict=%s" % crossActInfoDict)  | 
|       | 
|     # Í¬²½×Ó·þÎñÆ÷  | 
|     serverGroupIDList = []  | 
|     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossActInfo, sysnCrossActInfoDict, serverGroupIDList)  | 
|     return ""  | 
|   |