#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#---------------------------------------------------------------------
|
#
|
#---------------------------------------------------------------------
|
##@package GMCommon
|
# GMÃüÁÓú¯Êý
|
#
|
# @author panwei
|
# @date 2010-3-31
|
# @version 1.4
|
#
|
# @change: "2013-03-13 17:00" wdb ɾ³ý·â°ü
|
# @change: "2014-09-26 12:00" hxp È¥³ýÈ«·þ¶à±¶¾Ñé½±Àø»î¶¯¿ª¹ØÌáÐÑ£¬È«²¿ÓÉÅä±íÖÐÈ¡
|
# @change: "2014-12-02 11:30" hxp Ôö¼ÓÇ¿ÖÆË¢Ð»¿ØÖÆ£¬·½±ã²âÊÔ
|
# @change: "2015-10-28 14:00" hxp ·µ»Ø¸ñʽʹÓÃjson
|
#---------------------------------------------------------------------
|
"""Version = 2015-10-28 14:00"""
|
#---------------------------------------------------------------------
|
#µ¼Èë
|
import GameWorld
|
import GameWorldProcess
|
import ChConfig
|
import IPY_GameServer
|
import ReadChConfig
|
import traceback
|
import ChPyNetSendPack
|
import NetPackCommon
|
import GMShell
|
import GameWorldActionControl
|
|
import json
|
#---------------------------------------------------------------------
|
#È«¾Ö±äÁ¿
|
#---------------------------------------------------------------------
|
Def_MaxBroadCast = 10 # ¹ã²¥×î´ó´æ´¢ÊýÁ¿
|
|
#gm¹¤¾ß·µ»Ø½á¹ûÀàÐÍ
|
(
|
Def_Success, #0 ÃüÁîÖ´ÐÐ
|
Def_ParamErr, # 1²ÎÊý´íÎó
|
Def_GMCmdNone, # 2ÎÞ¸ÃGMÃüÁî
|
Def_NoTag, # 3ÎÞ·¨ÕÒµ½Ä¿±ê
|
Def_PlayerOfLine, # 4Íæ¼Ò²»ÔÚÏß
|
Def_Unknow, # 5δ֪´íÎó
|
Def_NoNeed, # 6ÒÑ´¦ÓÚ¸Ã״̬
|
Def_InsertFail, # 7²åÈëÊý¾Ýʧ°Ü
|
Def_MaxLimit, # 8ÊýÁ¿¹ý´ó
|
Def_TimeConflict, # 9ʱ¼ä³åÍ»
|
Def_InvalidTime, # 10ʱ¼ä²»ÕýÈ·
|
Def_MakeNewCardFail, # 11Éú³ÉÐÂÊÖ¿¨³ö´í
|
Def_EncodeFail, # 12±àÂëʱ³ö´í
|
Def_GMDBEntranceFail, # 13GMÃüÁîDBÈë¿Ú½âÎöÖ´Ðгö´í
|
Def_GMGSEntranceFail, # 14GMÃüÁîGameServerÈë¿Ú½âÎöÖ´Ðгö´í
|
Def_DeleteIPFail, # 15ɾ³ý½ûÑÔIPʧ°Ü
|
Def_MoneyTypeErr, # 16½ðÇ®ÀàÐÍ´íÎó
|
Def_MsgMaxLenLimit, # 17³¤¶È¹ý´ó
|
Def_InvalidEvent, # 18ÈÎÎñid²»¿ÉÓÃ
|
Def_ChoseNothing, # 19ûÓÐÑ¡Ôñ¿ªÆôµÄ»î¶¯
|
Def_AddNumError, # 20¼Ó³ÉÖ»ÄÜΪ´óÓÚ0µÄÕûÊý
|
Def_PriceIsNull, #21½±ÀøÐÅϢΪ¿Õ
|
Def_TypeNumErr, #22ÀàÐÍ´íÎó
|
Def_NotOpenAction, #23 »î¶¯Î´¿ªÆô
|
Def_ActionOpening, #24 »î¶¯¿ªÆôÖÐ
|
Def_TimeIsNone, #25ûÓÐÉèÖÃʱ¼ä
|
Def_TimeStarGreaterEnd, #26¿ªÊ¼Ê±¼ä´óÓÚ½áÊøÊ±¼ä
|
Def_CurTimeGreaterStarTime, #27µ±Ç°Ê±¼ä´óÓÚµÈÓÚ¿ªÊ¼Ê±¼ä
|
Def_CurTimeGreaterEndTime, # 28µ±Ç°Ê±¼ä´óÓÚ½áÊøÊ±¼ä
|
Def_ActionAllreadyOpen, #29 »î¶¯ÒѾÉèÖùýÁË
|
Def_GMForbidMergeWar, #30 gmÉèÖÃÕâ¸ö·þ²»²Î¼Ó¿ç·þÈû
|
Def_IsNotCrossServer, #31 ¸Ã·þ²»ÊÇ¿ç·þ·þÎñÆ÷
|
Def_ServerAlreadyOpen, #32 ÒѾÕýʽ¿ª·þ¹ý
|
Def_ServerClose, #33 ·þÎñÆ÷ά»¤ÖÐ
|
Def_ServerOpen, #34 ·þÎñÆ÷Õý³£
|
Def_ResultTypeMax,
|
) = range(36)
|
|
Def_GMKey_Type = 'pack_type'
|
Def_GMKey_ResultType = 'ResultType'
|
Def_GMKey_ResultMsg = 'ResultMsg'
|
Def_GMKey_PlayerName = 'playerName'
|
Def_GMKey_PlayerAccID = 'accID'
|
Def_GMKey_FamilyName = 'familyName'
|
Def_GMKey_PackIndex = 'packIndex'
|
Def_GMKey_IP = 'IP'
|
Def_GMKey_QueryType = 'queryType'
|
Def_GMKey_BroadCastMsg = 'msg'
|
|
Def_GMKey_StartTime = 'startTime'
|
Def_GMKey_EndTime = 'endTime'
|
Def_GMKey_StartDate = 'startDate'
|
Def_GMKey_EndDate = 'endDate'
|
|
Def_GMKey_Interval = 'interval'
|
Def_GMKey_IsDelOthers = 'isDelOthers'
|
Def_GMKey_PlayerFind = 'playerFind'
|
|
Def_GMKey_FuncKey = 'funcKey'
|
#---------------------------------------------------------------------
|
#Â߼ʵÏÖ
|
## ¹Ø±ÕÒѾ¼¤»îµÄ»î¶¯
|
# @param eventID »î¶¯ID
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def CloseProcessingEvent(eventID):
|
eventManager = GameWorld.GetGameWorldEventManager()
|
event = eventManager.FindActiveEvent(eventID)
|
if not event:
|
#Î޴˻
|
return
|
|
if not event.GetIsProcessing():
|
#δ¼¤»î,²»´¦Àí
|
return
|
|
GameWorldProcess.DoLogic_ProcessEvent_Close(eventID)
|
|
return
|
#---------------------------------------------------------------------
|
## »ñÈ¡gm»î¶¯Ìáʾkey
|
# @param ÎÞ²ÎÊý
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def GetGameServer_GM_GameID():
|
gmStarActionList = ReadChConfig.GetEvalChConfig("GmStarAction")
|
gameIdList = []
|
|
for gameIdInfo in gmStarActionList:
|
gameIdList.append(gameIdInfo[0])
|
|
return gameIdList
|
|
|
## »ñÈ¡gm»î¶¯ÈÎÎñ¿ªÆôµÄÌáʾÐÅÏ¢
|
# @param missionId:ÈÎÎñID
|
# @return Ìáʾmark
|
# @remarks
|
def GetGameServer_GM_GameOpen_Msg(missionId):
|
#if missionId == ChConfig.Def_GY_GM_Game_DoubleExp:
|
# return "Activity_Entire_Two"
|
|
gmStarActionList = ReadChConfig.GetEvalChConfig("GmStarAction")
|
|
for gameIdInfo in gmStarActionList:
|
if gameIdInfo[0] != missionId:
|
continue
|
|
if gameIdInfo[1] == "-":
|
return ""
|
|
return gameIdInfo[1]
|
|
return ""
|
|
|
## »ñÈ¡gm»î¶¯ÈÎÎñ¹Ø±ÕµÄÌáʾÐÅÏ¢
|
# @param missionId:ÈÎÎñID
|
# @return Ìáʾmark
|
# @remarks
|
def GetGameServer_GM_GameClose_Msg(missionId):
|
#if missionId == ChConfig.Def_GY_GM_Game_DoubleExp:
|
# return "Activity_Entire_Two01"
|
|
gmStarActionList = ReadChConfig.GetEvalChConfig("GmStarAction")
|
|
for gameIdInfo in gmStarActionList:
|
if gameIdInfo[0] != missionId:
|
continue
|
|
if gameIdInfo[2] == "-":
|
return ""
|
|
return gameIdInfo[2]
|
|
return ""
|
|
|
#---------------------------------------------------------------------
|
## Ö´ÐÐGM²Ù×÷ÐÅÏ¢
|
# @param findPlayerType ²éÕÒÍæ¼ÒÀàÐÍ
|
# @param findPlayerID ²éÕÒÍæ¼ÒID
|
# @param cmdIndex Êý¾Ý¿âÖÐGMÃüÁîË÷Òý
|
# @param sendCallName µØÍ¼·þÎñÆ÷Ö´ÐеÄÇëÇóÃüÁî
|
# @param sendCMD ÇëÇóÃüÁî²ÎÊýÁбí
|
# @param doResult ÊÇ·ñ֪ͨ³É¹¦
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def Send_MapServer_Query(findPlayerType , findPlayerID , cmdIndex , sendCallName, sendCMD , doResult = True):
|
playerManager = GameWorld.GetPlayerManager()
|
#Ä¿±êÍæ¼Ò
|
tagPlayer = None
|
|
if findPlayerType == ChConfig.queryType_sqtPlayerByAccID:
|
#GameWorld.Log('ÕË»§²éѯ = %s'%(findPlayerID))
|
tagPlayer = playerManager.FindPlayerByAccID(str(findPlayerID))
|
|
elif findPlayerType == ChConfig.queryType_sqtPlayerByName:
|
#GameWorld.Log('ÐÕÃû²éѯ = %s'%(findPlayerID))
|
tagPlayer = playerManager.FindPlayerByName(str(findPlayerID))
|
|
elif findPlayerType == ChConfig.queryType_sqtPlayer:
|
tagPlayer = playerManager.FindPlayerByID(int(findPlayerID))
|
|
if not tagPlayer:
|
#·µ»ØÏûÏ¢,Ö´ÐÐʧ°Ü
|
Send_DataServer_GMCommandResult(cmdIndex, ChConfig.Def_GMTool_Fail)
|
return
|
|
tagMapID = GameWorld.GetQueryPlayerMapID(tagPlayer)
|
|
if not tagMapID:
|
#GameWorld.Log('#·µ»ØÏûÏ¢,Ö´ÐÐʧ°Ü')
|
#·µ»ØÏûÏ¢,Ö´ÐÐʧ°Ü
|
Send_DataServer_GMCommandResult(cmdIndex, ChConfig.Def_GMTool_Fail)
|
return
|
|
#GameWorld.Log('#·µ»ØÏûÏ¢,Ö´Ðгɹ¦')
|
playerManager.MapServer_QueryPlayer(0, 0, tagPlayer.GetPlayerID(),
|
tagMapID, sendCallName, '%s'%sendCMD, len(sendCMD), tagPlayer.GetRouteServerIndex())
|
|
if doResult:
|
#·µ»ØÏûÏ¢,Ö´Ðгɹ¦
|
Send_DataServer_GMCommandResult(cmdIndex, ChConfig.Def_GMTool_Succeed)
|
|
GameWorld.Log('Ö´ÐÐGMÃüÁî³É¹¦, = %s,%s'%(sendCallName, sendCMD))
|
return
|
#---------------------------------------------------------------------
|
## ±¨¸æÊý¾Ý¿âµ±Ç°GM²Ù×÷ÊÇ·ñ³É¹¦
|
# @param cmdIndex gmÃüÁîË÷Òý
|
# @param result Ö´Ðнá¹û
|
# @param strMsg ÏûÏ¢¼Ç¼
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def Send_DataServer_GMCommandResult(cmdIndex, result, strMsg = ''):
|
GameWorld.GetGameWorld().GetDBGMCommandListManager().DataServer_GMCommandResult(cmdIndex , result , strMsg)
|
return
|
#---------------------------------------------------------------------
|
## ÍÑ»ú¹¤¾ßÇëÇó²éѯ·µ»Ø
|
# @param callName µ÷Óõĺ¯Êý
|
# @param cmdIndex ÃüÁîË÷Òý
|
# @param sendCMD ÃüÁî
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def DoLogic_sqtDataServer_GMCommand(callName , cmdIndex , sendCMD):
|
result = ChConfig.Def_GMTool_Succeed
|
strMsg = ''
|
#»ñÈ¡ÃÜÂëºÍ»ñÈ¡¾Ñé±¶ÂÊÌØÊâ´¦Àí
|
if callName in ['GetWarehousePsw', 'GetPlayerExpRate']:
|
strMsg = sendCMD
|
|
#ÉèÖÃÎïÆ·°ó¶¨,½â³ýÎïÆ·°ó¶¨£¬É¾³ýÎïÆ·
|
elif callName in ['SetItemLock' , 'SetItemUnLock' , 'SetItemDelete']:
|
strMsg = sendCMD
|
|
if strMsg != 'True':
|
result = ChConfig.Def_GMTool_Fail
|
|
Send_DataServer_GMCommandResult(cmdIndex, result, strMsg)
|
return
|
#---------------------------------------------------------------------
|
## Ö´Ðзâ±ÕIPÁÐ±í¹¦ÄÜ
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def DoLogic_GMForbidIP(curPlayer , tick):
|
playerManager = GameWorld.GetPlayerManager()
|
ipManager = GameWorld.GetGameWorld().GetAllDBIPManage()
|
|
for index in range(ipManager.GetCount()):
|
ipForbid = ipManager.GetAt(index)
|
if curPlayer.GetIP() != ipForbid.GetIP():
|
continue
|
|
gmOper = ipForbid.GetOper()
|
#Ö´ÐвÙ×÷
|
if gmOper == IPY_GameServer.gmForbidTalk:
|
playerManager.MapServer_QueryPlayer(0, 0, curPlayer.GetPlayerID(), curPlayer.GetRealMapID(),
|
'ForbidTalkByIP', '', 0, curPlayer.GetRouteServerIndex())
|
|
elif gmOper == IPY_GameServer.gmForbidAcc:
|
curPlayer.Kick(IPY_GameServer.disGMKick)
|
return
|
|
return
|
|
#---------------------------------------------------------------------
|
## Ö´ÐÐGM²Ù×÷ÐÅÏ¢
|
# @param findPlayerType ²éÕÒÍæ¼ÒÀàÐÍ
|
# @param findPlayerID ²éÕÒÍæ¼ÒID
|
# @param cmdIndex Êý¾Ý¿âÖÐGMÃüÁîË÷Òý
|
# @param sendCallName µØÍ¼·þÎñÆ÷Ö´ÐеÄÇëÇóÃüÁî
|
# @param sendCMD ÇëÇóÃüÁî²ÎÊýÁбí
|
# @param doResult ÊÇ·ñ֪ͨ³É¹¦
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def GMTool_MapServer_Query(findPlayerType, orderId, findPlayerID,
|
gmCmdDict, sendCallName, sendCMD, doResult=True):
|
playerManager = GameWorld.GetPlayerManager()
|
#Ä¿±êÍæ¼Ò
|
tagPlayer = None
|
|
if findPlayerType == ChConfig.queryType_sqtPlayerByAccID:
|
tagPlayer = playerManager.FindPlayerByAccID(str(findPlayerID))
|
|
elif findPlayerType == ChConfig.queryType_sqtPlayerByName:
|
tagPlayer = playerManager.FindPlayerByName(str(findPlayerID))
|
|
elif findPlayerType == ChConfig.queryType_sqtPlayer:
|
tagPlayer = playerManager.FindPlayerByID(int(findPlayerID))
|
|
if not tagPlayer:
|
#·µ»ØÏûÏ¢,Ö´ÐÐʧ°Ü
|
GMCommandResult(orderId, gmCmdDict, Def_NoTag)
|
return
|
|
tagMapID = GameWorld.GetQueryPlayerMapID(tagPlayer)
|
if not tagMapID:
|
#·µ»ØÏûÏ¢,Ö´ÐÐʧ°Ü
|
GMCommandResult(orderId, gmCmdDict, Def_NoTag)
|
return
|
|
#GameWorld.Log('#·µ»ØÏûÏ¢,Ö´Ðгɹ¦')
|
cmdStr = '%s'%sendCMD
|
playerManager.MapServer_QueryPlayer(0, 0, tagPlayer.GetPlayerID(),
|
tagMapID, sendCallName, cmdStr, len(cmdStr), tagPlayer.GetRouteServerIndex())
|
|
if doResult:
|
#·µ»ØÏûÏ¢,Ö´Ðгɹ¦
|
GMCommandResult(orderId, gmCmdDict, Def_Success)
|
|
GameWorld.Log('Ö´ÐÐGM²éѯ³É¹¦, = %s,%s'%(sendCallName, sendCMD))
|
return
|
|
#---------------------------------------------------------------------
|
## ±¨¸æÊý¾Ý¿âµ±Ç°GM²Ù×÷ÊÇ·ñ³É¹¦
|
# @param cmdIndex gmÃüÁîË÷Òý
|
# @param result Ö´Ðнá¹û
|
# @param strMsg ÏûÏ¢¼Ç¼
|
# @return None
|
# @remarks º¯ÊýÏêϸ˵Ã÷.
|
def GMCommandResult(orderId, gmCmdDict, resultType, strMsg=None, userData=''):
|
|
resultDict = {
|
Def_GMKey_ResultType:resultType,
|
Def_GMKey_ResultMsg:strMsg,
|
Def_GMKey_Type:gmCmdDict.get(Def_GMKey_Type, ''), # gmÃüÁîÀàÐÍ
|
}
|
|
resultMsg = json.dumps(resultDict, ensure_ascii=False)
|
GameWorld.Log('GMT_LOG::' + resultMsg + 'orderid:%s'%orderId)
|
GameWorld.GetGameWorld().SendToDBGMCommandResult(len(orderId), orderId, len(resultMsg),
|
resultMsg, len(userData), userData)
|
return
|
|
|
## ÉèÖù㲥ÐÅÏ¢
|
# @param startTime: ¿ªÊ¼Ê±¼ä
|
# @param endTime: ½áÊøÊ±¼ä
|
# @param interval: ʱ¼ä¼ä¸ô
|
# @param msg: ¹ã²¥ÄÚÈÝ
|
# @return None
|
def SetBroadCastInfo(startTime, endTime, interval, msg, isDelOthers):
|
|
# ¹ã²¥ÉèÖÃ
|
broadCastDict = {
|
Def_GMKey_StartTime:startTime,
|
Def_GMKey_EndTime:endTime,
|
Def_GMKey_Interval:interval,
|
Def_GMKey_BroadCastMsg:msg,
|
}
|
# Ìí¼Ó¹ã²¥
|
GMShell.g_broadCastList.append(broadCastDict)
|
|
if len(GMShell.g_broadCastList) > Def_MaxBroadCast:
|
GMShell.g_broadCastList = GMShell.g_broadCastList[-Def_MaxBroadCast:]
|
|
# È«·þ֪ͨ
|
playerManager = GameWorld.GetPlayerManager()
|
for i in range(0, playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(i)
|
|
if curPlayer == None or not curPlayer.GetInitOK():
|
continue
|
# ֪ͨ¿Í»§¶Ë£¬¹ã²¥ÄÚÈÝ
|
SendBroadMsg(curPlayer, startTime, endTime, interval, msg, isDelOthers)
|
return
|
|
|
## ·¢ËÍËùÓй㲥¸ø¿Í»§¶Ë
|
# @param curPlayer: Íæ¼Ò
|
# @return None
|
def SendBroadCastToClient(curPlayer):
|
|
if GMShell.g_broadCastList == []:
|
return
|
|
# ÅжÏʱ¼ä»ò»¹Ê£ÓàµÄ¹ã²¥
|
tempList = []
|
|
curTime = GameWorld.GetServerTime()
|
for msgDict in GMShell.g_broadCastList:
|
|
endTime = msgDict.get(Def_GMKey_EndTime, 0)
|
dateTime = GameWorld.ChangeTimeNumToDatetime(endTime)
|
|
if (dateTime - curTime).days < 0:
|
continue
|
# ÐèÒª´æ´¢µÄ¹ã²¥
|
tempList.append(msgDict)
|
|
startTime = msgDict.get(Def_GMKey_StartTime, 0)
|
interval = msgDict.get(Def_GMKey_Interval, 0)
|
msg = msgDict.get(Def_GMKey_BroadCastMsg, 0)
|
# ֪ͨ¿Í»§¶Ë£¬¹ã²¥ÄÚÈÝ
|
SendBroadMsg(curPlayer, startTime, endTime, interval, msg)
|
|
# ¸üй㲥Áбí
|
GMShell.g_broadCastList = tempList[:]
|
return
|
|
|
## ɾ³ý֮ǰµÄ´æ´¢µÄ¹ã²¥
|
# @param param: None
|
# @return None
|
def DelAllBroadCast():
|
|
GMShell.g_broadCastList = []
|
return
|
|
|
## ֪ͨ¿Í»§¶Ë£¬¹ã²¥ÄÚÈÝ
|
# @param curPlayer: Íæ¼Ò
|
# @param startTime: ¿ªÊ¼Ê±¼ä
|
# @param endTime: ½áÊøÊ±¼ä
|
# @param interval: ʱ¼ä¼ä¸ô
|
# @param msg: ¹ã²¥ÄÚÈÝ
|
# @param isDelOthers: ÊÇ·ñɾ³ý֮ǰµÄ¹ã²¥
|
# @return None
|
def SendBroadMsg(curPlayer, startTime, endTime, interval, msg, isDelOthers=False):
|
|
packData = ChPyNetSendPack.tagBroadCastInfo()
|
packData.Clear()
|
GameWorld.Log(str((startTime, endTime, interval, msg, isDelOthers)))
|
packData.IsDelOthers = isDelOthers
|
packData.StartTime = startTime
|
packData.EndTime = endTime
|
packData.Interval = interval
|
packData.Msg = msg
|
packData.MsgLen = len(msg)
|
NetPackCommon.SendFakePack(curPlayer, packData)
|
return
|
|
## »î¶¯¿ØÖÆË¢ÐÂ
|
# @param curPlayer: Íæ¼Ò
|
# @return None
|
def ActionControlRefresh(tick):
|
worldMgr = GameWorld.GetGameWorld()
|
actionControlTickList = [ChConfig.TYPE_ActionOpenAndClose, ChConfig.TYPE_ActionOpenAndCloseByDayCount,
|
ChConfig.TYPE_ActionNotify, ChConfig.TYPE_ActionGoOn,
|
ChConfig.TYPE_ActionOpenAndCloseByDayCountGoOn]
|
for acKey in actionControlTickList:
|
worldMgr.SetTickByType(acKey, 0)
|
|
GameWorld.GetGameWorld().SetDict(ChConfig.Def_WorldKey_ProcessMinute, 0)
|
#´¦ÀíÖØ¿ª·þÎñÆ÷ºó, »î¶¯¼ÌÐø¿ªÆôÂß¼¸ù¾ÝÌìÊý
|
#GameWorldActionControl.Dispose_Action_GoOn_ByDay(tick)
|
return
|
|
def GMS_Answer(curPlayer, msg):
|
''' ÌØÊâGMÃüÁî»Ø¸´¿Í»§¶ËÐÅÏ¢ '''
|
GameWorld.DebugAnswer(curPlayer, "@GMSA@%s" % msg)
|
return
|