| #!/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 PlayerTJG  | 
| import FBLogic  | 
| import GameObj  | 
| #---------------------------------------------------------------------  | 
|   | 
| #---------------------------------------------------------------------  | 
| #µ¼ÈëGMÈ«²¿ÃüÁî  | 
| GameWorld.ImportAll("Script\\GM\\" , "Commands")  | 
| GameWorld.ImportAll("Script\\GM\\" , "")  | 
|   | 
| TestPlatformList = ["test", "yun"]  | 
| #---------------------------------------------------------------------  | 
| ## ÖØÐµ¼Èë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 playerPF in TestPlatformList:  | 
|                     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.ToIntDef(inputList[i], None)  | 
|                 if value == None:  | 
|                     #GameWorld.DebugAnswer(curPlayer, "²ÎÊý´íÎó, ±ØÐëΪ´¿Êý×Ö!")  | 
|                     continue  | 
|                 inputList[i] = value  | 
|                   | 
|             callFunc(curPlayer, inputList)  | 
|             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  | 
|                 if callFunName == "SetHappyPoint":  | 
|                     PlayerTJG.SetTJGTime(curPlayer, value)  | 
|                 else:  | 
|                     callObj(value)  | 
|             else:  | 
|                 GameWorld.DebugAnswer(curPlayer, "²»Ö§³Ö¸ÃÃüÁî!curPlayer.%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  | 
|           | 
|         # 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  | 
|           | 
|         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  |