#!/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_FamilyID = 'familyID' 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