#!/usr/bin/python # -*- coding: GBK -*- #--------------------------------------------------------------------- # #--------------------------------------------------------------------- ##@package GMShell # GMÃüÁî¹ÜÀíÆ÷ # # @author Panwei # @date 2010-4-21 # @version 1.7 # # @change: "2010-09-09 16:40" panwei ÖØ¶Á½Å±¾ÐÞ¸Ä # @change: "2011-04-07 14:30" panwei PsycoÓÅ»¯ # @change: "2015-06-16 12:30" hxp Ôö¼ÓȨÏÞ¿ØÖÆÅä±í£»Ê¹ÓÃÃüÁîÁ÷Ïò¼Ç¼ # @change: "2015-07-13 14:00" hxp Á÷ÏòÔö¼ÓÍæ¼Ò²ÎÊý # @change: "2016-03-27 15:00" hxp PlayerControlÍæ¼ÒÀ©Õ¹ÊôÐÔGet Set # @change: "2016-11-03 16:00" hxp Ôö¼ÓÌØÊâÃüÁîÖ§³Ö£¬Ö»ÑéÖ¤Õ˺Š# @change: "2017-02-28 17:30" hxp Ôö¼ÓÄÚÍøIPÖ¸¶¨ÕËºÅÆ½Ì¨¿ÉÔÚÏß±ä¸üGMµÈ¼¶ #--------------------------------------------------------------------- #"""Version = 2017-02-28 17:30""" #--------------------------------------------------------------------- import ChConfig import GameWorld import Commands import IPY_GameWorld import DataRecordPack import PlayerControl import ReadChConfig import traceback import FBLogic import GameObj #--------------------------------------------------------------------- #--------------------------------------------------------------------- #µ¼ÈëGMÈ«²¿ÃüÁî GameWorld.ImportAll("Script\\GM\\" , "Commands") GameWorld.ImportAll("Script\\GM\\" , "") #--------------------------------------------------------------------- ## ÖØÐµ¼ÈëGMÈ«²¿ÃüÁî # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def ReloadGMCmd(tick): scriptPath = ChConfig.GetAppPath() + "Script\\GM\\Commands" GameWorld.ReloadScript(scriptPath, "Commands") scriptPath = ChConfig.GetAppPath() + "Script\\GM" GameWorld.ReloadScript(scriptPath, "") return #--------------------------------------------------------------------- ## Íæ¼Ò´¥·¢GMÃüÁî # @param curPlayer µ±Ç°Íæ¼Ò # @param inputStr ÃüÁî×Ö·û´® # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def OnGMCMD(curPlayer, inputStr): try: inputList = inputStr.split() if len(inputList) == 0: return callFunName = inputList[0] #ÑéÖ¤ÌØÊâGMÃüÁîȨÏÞ if callFunName.startswith("@"): if callFunName == "@SetGM": if len(inputList) != 2: return gmLV = GameWorld.ToIntDef(inputList[1]) playerPF = GameWorld.GetPlatform() # curIP = curPlayer.GetIP() # if (curIP.find('10.30.') == 0 or curIP.find('192.168.') == 0) and playerPF == "173on_lan": #²âÊÔÐÞ¸Ä if GameWorld.IsTestPlatform(playerPF): curPlayer.SetGMLevel(gmLV) GameWorld.DebugAnswer(curPlayer, "SetGMLevel %s" % gmLV) else: GameWorld.ErrLog("·ÇÄÚÍøIP»òÄÚÍøÕËºÅÆ½Ì¨(test)²»¿ÉÉèÖÃGMµÈ¼¶!", curPlayer.GetPlayerID()) return specGMCMDDict = ReadChConfig.GetEvalChConfig("SpecialGMCMD") if callFunName not in specGMCMDDict: GameWorld.Log('###ʹÓÃGMÃüÁî = %s, ²»´æÔÚ¸ÃÃüÁî!' % callFunName, curPlayer.GetPlayerID()) return canUseAccIDList = specGMCMDDict[callFunName] gameAccID = curPlayer.GetAccID() platAccID = GameWorld.GetPlatformAccID(gameAccID) if platAccID not in canUseAccIDList and gameAccID not in canUseAccIDList: GameWorld.Log('###ʹÓÃGMÃüÁî = %s, ûÓиÃÃüÁîȨÏÞ!' % callFunName, curPlayer.GetPlayerID()) return callFunName = "GMS_%s" % (callFunName[1:].capitalize()) #Ñé֤ȨÏÞʧ°Ü elif not CheckGMLV(curPlayer , callFunName): return callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(callFunName, "OnExec")) if callFunc: #ɾ³ýÃüÁֻ½«²ÎÊý´«Èë del inputList[0] #°ÑÊ£Óà²ÎÊýת»»ÎªÕûÐÍ for i in range(0, len(inputList)): value = GameWorld.ToNumDef(inputList[i], None) if value == None: #GameWorld.DebugAnswer(curPlayer, "²ÎÊý´íÎó, ±ØÐëΪ´¿Êý×Ö!") continue inputList[i] = value isSendGameServer = callFunc(curPlayer, inputList) DR_UseGMCMD(curPlayer, inputStr) if isSendGameServer: curPlayer.GameServer_GMCmd(inputStr) return # GameObj µÄ Get¡¢Setº¯Êý if hasattr(GameObj, callFunName): callObj = getattr(GameObj, callFunName) argcount = callObj.func_code.co_argcount # º¯Êý²ÎÊý¸öÊý if argcount == 1 and callFunName.startswith("Get"): value = callObj(curPlayer) elif argcount >= 2 and callFunName.startswith("Set"): if len(inputList) < 2: GameWorld.DebugAnswer(curPlayer, "±ØÐëÉ趨һ¶¨²ÎÊýÖµ") return value = GameWorld.ToIntDef(inputList[1], None) if value == None: GameWorld.DebugAnswer(curPlayer, "²ÎÊý´íÎó, ±ØÐëΪ´¿Êý×Ö!") return callObj(curPlayer, value) else: GameWorld.DebugAnswer(curPlayer, "²»Ö§³Ö¸ÃÃüÁî!GameObj.%s" % callFunName) return GameWorld.DebugAnswer(curPlayer, "%s : %s" % (callFunName, value)) DR_UseGMCMD(curPlayer, inputStr) return # PlayerControl µÄ Get¡¢Setº¯Êý if hasattr(PlayerControl, callFunName): callObj = getattr(PlayerControl, callFunName) argcount = callObj.func_code.co_argcount # º¯Êý²ÎÊý¸öÊý if argcount == 1 and callFunName.startswith("Get"): value = callObj(curPlayer) elif argcount == 2 and callFunName.startswith("Set"): if len(inputList) < 2: GameWorld.DebugAnswer(curPlayer, "±ØÐëÉ趨һ¶¨²ÎÊýÖµ") return value = GameWorld.ToIntDef(inputList[1], None) if value == None: GameWorld.DebugAnswer(curPlayer, "²ÎÊý´íÎó, ±ØÐëΪ´¿Êý×Ö!") return callObj(curPlayer, value) else: GameWorld.DebugAnswer(curPlayer, "²»Ö§³Ö¸ÃÃüÁî!PlayerControl.%s" % callFunName) return GameWorld.DebugAnswer(curPlayer, "%s : %s" % (callFunName, value)) DR_UseGMCMD(curPlayer, inputStr) return # curPlayer µÄ Get¡¢Setº¯Êý if hasattr(curPlayer, callFunName): callObj = getattr(curPlayer, callFunName) argcount = callObj.func_code.co_argcount # º¯Êý²ÎÊý¸öÊý if argcount == 1 and callFunName.startswith("Get"): # Õâ¸öµÃµ½µÄ²ÎÊý¸öÊý¾¹È»ÊÇ1£¡£¡£¡ÔÝʱÏÈÕâÑùд value = callObj() elif argcount == 1 and callFunName.startswith("Set"): if len(inputList) < 2: GameWorld.DebugAnswer(curPlayer, "±ØÐëÉ趨һ¶¨²ÎÊýÖµ") return value = GameWorld.ToIntDef(inputList[1], None) if value == None: GameWorld.DebugAnswer(curPlayer, "²ÎÊý´íÎó, ±ØÐëΪ´¿Êý×Ö!") return callObj(value) else: GameWorld.DebugAnswer(curPlayer, "²»Ö§³Ö¸ÃÃüÁî!curPlayer.%s" % callFunName) return GameWorld.DebugAnswer(curPlayer, "%s : %s" % (callFunName, value)) DR_UseGMCMD(curPlayer, inputStr) return curPlayer.GameServer_GMCmd(inputStr) except BaseException: GameWorld.DebugAnswer(curPlayer, "Ö´ÐÐGMÃüÁî´íÎó, Çë²é¿´ËùÔÚµØÍ¼ÈÕÖ¾!") errorMsg = str(traceback.format_exc()) GameWorld.ErrLog('GMÃüÁî´íÎó - > %s' % errorMsg, curPlayer.GetPlayerID()) #if GameWorld.GetGameWorld().GetDebugLevel(): # raise Exception(errorMsg) return ## ʹÓÃGMÃüÁîÁ÷Ïò # @param curPlayer: Íæ¼ÒʵÀý # @return: None def DR_UseGMCMD(curPlayer, inputStr): dataDict = {'PlayerID':curPlayer.GetPlayerID(), 'PlayerName':curPlayer.GetPlayerName(), 'AccID':curPlayer.GetAccID(), 'PlayerLV':curPlayer.GetLV(), 'GMCMD':inputStr} #·¢ËÍ·â°ü DataRecordPack.SendEventPack("UseGMCMD", dataDict, curPlayer) return #--------------------------------------------------------------------- ## ¼à²âGMµÈ¼¶ # @param curPlayer µ±Ç°Íæ¼Ò # @param callFunName gmÃüÁî # @return None or True # @remarks º¯ÊýÏêϸ˵Ã÷. def CheckGMLV(curPlayer , callFunName): curPlayer_GMLV = curPlayer.GetGMLevel() if curPlayer_GMLV == 0: GameWorld.Log("###ʹÓÃGMÃüÁî = %s´íÎó,Íæ¼Ò²»ÊÇGM"%(callFunName) , curPlayer.GetPlayerID()) return if curPlayer_GMLV == 90: #ÄÚ²¿²âÊÔÈËÔ±,²»ÏÞÖÆ return True GMLVPowerDict = ReadChConfig.GetEvalChConfig("GMLVPower") if curPlayer_GMLV in GMLVPowerDict: powerList = GMLVPowerDict[curPlayer_GMLV] if not powerList or callFunName in powerList: return True #Ñé֤ȨÏÞ if callFunName in ChConfig.Def_GMPower_Disc: gmPowerList = ChConfig.Def_GMPower_Disc[callFunName] if curPlayer_GMLV not in gmPowerList: #GMµÈ¼¶Òì³£ GameWorld.Log("###ʹÓÃGMÃüÁî = %s,GMµÈ¼¶ = %sÒì³£"%(callFunName , curPlayer_GMLV) , curPlayer.GetPlayerID()) return if not gmPowerList[curPlayer_GMLV]: GameWorld.Log("###ʹÓÃGMÃüÁî = %s,ȨÏÞ = %s²»×ã"%(callFunName , curPlayer_GMLV) , curPlayer.GetPlayerID()) return #ÄÚ²¿²âÊÔÓÃGMÃüÁî else: GameWorld.Log("###·ÇÄÚ²¿ÈËÔ±, ʹÓõ÷ÊÔGMÃüÁî = %s,ȨÏÞ = %s²»×ã"%(callFunName , curPlayer_GMLV) , curPlayer.GetPlayerID()) return return True #--------------------------------------------------------------------- ## Ö´ÐÐGMÃüÁ½âÎöÊÕ°ü£© # @param index ·¢³ögmÃüÁîµÄÍæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def RecvGMCMD(index, tick): GameWorld.GetPsycoFunc(__Func_RecvGMCMD)(index, tick) return #--------------------------------------------------------------------- ## Ö´ÐÐGMÃüÁ½âÎöÊÕ°ü£© # @param index ·¢³ögmÃüÁîµÄÍæ¼ÒË÷Òý # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def __Func_RecvGMCMD(index , tick): gmCmd = IPY_GameWorld.IPY_CGMCMD() inputStr = gmCmd.GetCmd() inputList = inputStr.split() GameWorld.DebugLog("__Func_RecvGMCMD---%s"%inputStr) #¿ÕµÄÃüÁî if len(inputList) == 0: return curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) if not curPlayer.GetMapLoadOK(): GameWorld.DebugLog(" δ¶ÁÈ¡µØÍ¼³É¹¦,²»ÈÃÓÃ") return #ÅжÏFBÖÐÊÇ·ñ¿ÉʹÓÃGMÃüÁî if FBLogic.OnGMCommand(curPlayer, inputStr, tick): return GameWorld.Log("ÎÒ -> %s , GMµÈ¼¶ = %s, ʹÓÃÁËGMÃüÁî: %s !!!"%(curPlayer.GetPlayerName(), curPlayer.GetGMLevel(), inputStr) , curPlayer.GetPlayerID()) OnGMCMD(curPlayer, inputStr) return