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