#!/usr/bin/python # -*- coding: GBK -*- # ##@package E:/GameSVN/U3DGame/ProjectSServer/ServerPython/CoreServerGroup/GameServer/Script/GM/GMShell.py # @todo: # # @author: Alee # @date 2017-9-8 ÉÏÎç11:28:31 # @version 1.0 # # @note: # #--------------------------------------------------------------------- # @change: "2017-04-26 16:30" hxp ת»¯±àÂë¸ñʽ´¦Àíµ¥ÒýºÅ #--------------------------------------------------------------------- #"""Version = 2017-04-26 16:30""" #--------------------------------------------------------------------- import ChConfig import GameWorld import Commands import IPY_GameServer import CrossRealmMsg import PyGameData import traceback import GMCommon import ShareDefine import os #--------------------------------------------------------------------- g_broadCastList = [] ## µ¼ÈëGMÈ«²¿ÃüÁî # @param importDir ·¾¶Ãû # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ImportCommandAll(importDir): curPath = ChConfig.GetAppPath() + "Script\\GM" for root, dirs, files in os.walk("%s\\%s"%(curPath, importDir)): for file in files: fileName = os.path.join(root, file) fileName = fileName.replace(curPath, "") fileName = fileName[1:len(fileName)] if fileName.find("__init__") >= 0: continue curFileList = fileName.split(".") fileName = curFileList[0] ext = curFileList[1] if ext not in ChConfig.TYPE_Load_Module_Ext: continue fileName = fileName.replace("\\",".") __import__(fileName) ImportCommandAll("Commands") ## Ö´ÐÐGMÃüÁî # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def MapServer_RecvGMCMD(index,tick): GameWorld.GetPsycoFunc(__Func_MapServer_RecvGMCMD)(index, tick) return ## Ö´ÐÐGMÃüÁî # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __Func_MapServer_RecvGMCMD(index, tick): try: gmCmd = IPY_GameServer.IPY_GGMCmd() inputStr = gmCmd.GetMsg() alist = inputStr.split() if len(alist) == 0: return curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) callFunName = alist[0] # ÌØÊâµÄÃüÁî²»ÑéÖ¤GMµÈ¼¶£¬ÔÚMapServerÒÑÑéÖ¤Õ˺Šif callFunName.startswith("@"): callFunName = "GMS_%s" % (callFunName[1:].capitalize()) #ÅжÏÍæ¼ÒÊÇ·ñΪGM elif curPlayer.GetGMLevel() == 0: GameWorld.Log("###ʹÓÃGMÃüÁî = %s´íÎó,Íæ¼Ò²»ÊÇGM"%(callFunName), curPlayer.GetPlayerID()) return #°ÑÊ£Óà²ÎÊýת»»ÎªÕûÐÍ for i in range(0, len(alist)): if i == 0: continue value = GameWorld.ToIntDef(alist[i], None) if value == None: #GameWorld.DebugAnswer(curPlayer, "²ÎÊý´íÎó, ²ÎÊý%s±ØÐëΪ´¿Êý×Ö!" % (i + 1)) continue alist[i] = value #·Ç¿ç·þ·þÎñÆ÷ÏÂʹÓÿç·þGMÃüÁÔò·¢Ë͵½¿ç·þ if not GameWorld.IsCrossServer(): callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(callFunName, "OnGetMergeParam")) if callFunc != None: extendParamList = callFunc(curPlayer) CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_GMCMD, alist + extendParamList) callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(callFunName, "OnExec")) if callFunc == None: #ûÓдËÃüÁî GameWorld.Log("###ʹÓÃGMÃüÁî = %s, ûÓиÃÃüÁî!" % callFunName, curPlayer.GetPlayerID()) GameWorld.DebugAnswer(curPlayer, 'no cmd !!!') return callFunc(curPlayer, alist[1:]) except BaseException: GameWorld.DebugAnswer(curPlayer, "Ö´ÐÐGMÃüÁî´íÎó, Çë²é¿´GameServerÈÕÖ¾!") errorMsg = str(traceback.format_exc()) GameWorld.ErrLog('GMÃüÁî´íÎó - > %s'%(errorMsg) , curPlayer.GetPlayerID()) #======================================================================= # if GameWorld.GetGameWorld().GetDebugLevel(): # raise BaseException(errorMsg) #======================================================================= return #--------------------------------------------------------------------- #=============================================================================== #DBGMCommon # int GetCmdIndex() #ÐòÁкŠ# int GetPostTime() #Ìύʱ¼ä # char * GetGMAcc() #GMÕʺŠ# int GetCMDLen() #GMÃüÁ¶È # char * GetCMD() #»ñȡִÐеÄGMÃüÁî #=============================================================================== ## Ö´ÐÐÊý¾Ý¿âÖеÄGMÃüÁî # @param dBGMCommon # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def DoLogic_DBGMCommon(dBGMCommon): # callList = dBGMCommon.GetCMD() # callList = callList.split() # #cmd²ÎÊýË÷Òý # cmdIndex = dBGMCommon.GetCmdIndex() # # try: # callName = callList[0] # except BaseException: # GameWorld.Log( '###¶ÁÈ¡Êý¾Ý¿âGMÃüÁîʧ°Ü,¸ñʽ´íÎó = %s'%(callList) ) # GMCommon.Send_DataServer_GMCommandResult( cmdIndex, ChConfig.Def_GMTool_Fail ) # return # # callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(callName, "OnExec")) # if not callFunc: # GameWorld.Log( '###¶ÁÈ¡Êý¾Ý¿âGMÃüÁîÒì³££¬ÎÞ´ËGMÃüÁî = %s'%(callName) ) # GMCommon.Send_DataServer_GMCommandResult( cmdIndex, ChConfig.Def_GMTool_Fail ) # return # # del callList[0] # # sameList = [ cmdIndex , dBGMCommon.GetGMAcc() ] # callList = sameList + callList # # #²ÎÊý0:cmdIndex,²ÎÊý1:GMAcc,²ÎÊý2..:GMÃüÁîÐèÒªµÄ²ÎÊý # try: # callFunc(None, callList) # except BaseException , e: # GameWorld.Log( '###¶ÁÈ¡Êý¾Ý¿âGMÃüÁî´íÎó, = %s , %s'%(e , callList) ) # GMCommon.Send_DataServer_GMCommandResult( cmdIndex, ChConfig.Def_GMTool_Fail ) # return ## Ö´ÐÐGM¹¤¾ßÃüÁî # @param index Íæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def GMTool_RecvCMD(index, tick): gmToolCMD = IPY_GameServer.IPY_GGMToolCommand() cmd = gmToolCMD.GetCmd() orderId = gmToolCMD.GetOrderId() try: # »ñµÃgmÃüÁîÐÅÏ¢ gmCmdDict = eval(cmd) gmType = gmCmdDict.get(GMCommon.Def_GMKey_Type, '') if gmType == None: GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_GMCmdNone) return callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(gmType, "OnExec")) if callFunc == None: #gmÃüÁî²»¿ÉʹÓà GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_GMCmdNone) return # ת»»±àÂë¸ñʽ cmdDict = ChangeEncodIng(gmCmdDict) if cmdDict == {}: GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_EncodeFail) return callFunc(orderId, cmdDict) except BaseException: GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_GMGSEntranceFail) GameWorld.RaiseException('GMÃüÁî´íÎó\r\n%s'%(traceback.format_exc())) return return ## ת»»±àÂë¸ñʽ # @param gmCmdDict: gmÃüÁîÊý¾Ý # @return None def ChangeEncodIng(gmCmdDict): cmdDict = {} coding = gmCmdDict.get('coding', '') if coding == '': return cmdDict for key, value in gmCmdDict.items(): if not isinstance(value, str): continue # Ôö¼Óu try: value = value.replace("\r\n", "`r") value = value.replace("\'", "\\'") translateStr = eval("u'%s'"%value) translateStr = translateStr.encode(coding) except: GameWorld.Log('translateStr error! srcStr = %s '%repr(value)) return {} cmdDict[key] = translateStr return cmdDict ## ÊÕµ½×Ó·þÎñÆ÷·¢Ë͵ÄGMÃüÁî def ClientServerMsg_GMCMD(cmdMsgList, tick): if len(cmdMsgList) == 0: return callName = "%s.%s" % (cmdMsgList[0], "OnMergeServerExec") callFunc = GameWorld.GetExecFunc(Commands, callName) if callFunc == None: GameWorld.ErrLog("ÕÒ²»µ½´ËGMÃüÁî´¦Àíº¯Êý%s" % callName) return GameWorld.Log("Ö´ÐÐ×Ó·þÇëÇóµÄGMÃüÁ%s" % str(cmdMsgList)) #Ö»½«Êµ¼Ê²ÎÊý´«Èë callFunc(cmdMsgList[1:], tick) return def AddOfflinePlayerGMTInfo(orderId, queryType, playerFind, gmCmdDict): # Íæ¼Ò²»ÔÚÏߣ¬ÏȼǼ£¬µÈÍæ¼ÒÉÏÏߺó´¦Àí£¬¿ª¹Ø·þºóÎÞЧ key = (queryType, playerFind) ctgInfoList = PyGameData.g_gmtOfflinePlayerInfo.get(key, []) ctgInfoList.append(gmCmdDict) PyGameData.g_gmtOfflinePlayerInfo[key] = ctgInfoList GameWorld.Log("ÀëÏßÍæ¼ÒÌí¼ÓGMT: g_gmtOfflinePlayerInfo=%s" % str(PyGameData.g_gmtOfflinePlayerInfo)) GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_Success, "Player is off line.") return def OnPlayerLogin(curPlayer): gmtList = [] nameKey = (ChConfig.queryType_sqtPlayerByName, curPlayer.GetName()) if nameKey in PyGameData.g_gmtOfflinePlayerInfo: gmtList += PyGameData.g_gmtOfflinePlayerInfo.pop(nameKey) accIDKey = (ChConfig.queryType_sqtPlayerByAccID, curPlayer.GetAccID()) if accIDKey in PyGameData.g_gmtOfflinePlayerInfo: gmtList += PyGameData.g_gmtOfflinePlayerInfo.pop(accIDKey) if not gmtList: return tagMapID = curPlayer.GetRealMapID() GameWorld.Log("ÀëÏßÍæ¼ÒÉÏÏßGMT: tagMapID=%s, %s" % (tagMapID, gmtList), curPlayer.GetPlayerID()) if not tagMapID: return for gmCmdDict in gmtList: pack_type = gmCmdDict.get("pack_type") if not pack_type: continue callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(pack_type, "OnOfflineCTGInfo")) if callFunc: GameWorld.Log("Íæ¼ÒÉÏÏßÖ´ÐÐGMT: %s, tagMapID=%s, %s" % (pack_type, tagMapID, gmCmdDict), curPlayer.GetPlayerID()) callFunc(curPlayer, tagMapID, gmCmdDict) return