#!/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 ""
|
|