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