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