#!/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.decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding()) 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 if actName not in ShareDefine.CrossActLockServerGroupIDList: errInfo = "%s ²»ÔÊÐíÐ޸ģ¬¿ÉÒÔÖ±½ÓÐ޸ĻÅäÖÃ±í½øÐÐÈȸü£¡" % actName return errInfo 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 ""