#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package GameWorldMixServerCampaign # # @todo:ºÏ·þ»î¶¯ # @author hxp # @date 2014-12-03 # @version 1.2 # # ÏêϸÃèÊö: ºÏ·þ»î¶¯ # @change: "2015-07-10 17:30" ljd ÅÅÐаñ¼ÓÍæ¼Òƽ̨²ÎÊýName2 # @change: "2016-11-21 10:30" xdh Ôö¼ÓÓʼþ²¹·¢ºÏ·þ½±Àø,Ôö¼ÓÕ½ÃË»÷ɱboss»î¶¯ # #--------------------------------------------------------------------- """Version = 2016-11-21 10:30""" import GameWorld import PlayerDBGSEvent import PlayerBillboard import DataRecordPack import ReadChConfig import ShareDefine #--------------------------------------------------------------------- #½±ÀøÅÅÐаñcopyÊý¾ÝÀ´Ô´ Def_MixAward_Billboard_Copy_Dict = { #ShareDefine.Def_BT_MixCampaign_PlayerBattle:ShareDefine.Def_BT_FightPower, # Õ½¶·Á¦ } #MixServerCampaign±í×ÖµäÖµÁбíö¾Ù ( Def_MixCampaign_Index_InterceptTime, # ½±ÀøÊý¾Ý½ØÈ¡Ê±¼ä Def_MixCampaign_Index_AwardTime, # Á콱ʱ¼ä Def_MixCampaign_Index_MaxPlace, # ǰ¼¸Ãû¿ÉÁì½± Def_MixCampaign_Index_Max, ) = range(0, 3 + 1) ## ÿÌì´¥·¢ # @param None # @return: None def MixServerOnDay(): # ¿ç·þ·þÎñÆ÷¹¦ÄÜÏÞÖÆ if GameWorld.IsCrossServer(): return isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer) # ÊÇ·ñºÏ·þ if not isMixServer: return sendMSCMailTypeList = UpdateMixServerCampaignState() mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) # ºÏ·þÌìÊý GameWorld.DebugLog("ºÏ·þ¹ýÌì mixServerDay=%s,sendMSCMailTypeList=%s" % (mixServerDay, sendMSCMailTypeList)) # for key, value in ShareDefine.Def_MixCampaign_Billboard_Dict.items(): # # #»î¶¯ÒѾ­½áÊø,ɾ³ýÅÅÐаñÊý¾Ý # if __IsClearMixCampaignBillboard(key): # billboardType = ShareDefine.Def_MixCampaign_Billboard_Dict.get(key) # # #Çå³ýÅÅÐаñÊý¾Ý # PlayerBillboard.ClearBillboardByIndex(billboardType) # continue # # if not __CanCopyMixCampaignBillboardData(key): # #²»ÊǽØÈ¡»î¶¯ÅÅÐаñʱ¼ä # GameWorld.DebugLog(" ²»ÊǽØÈ¡»î¶¯ÅÅÐаñʱ¼ä cType=%s" % key) # continue # # #¿½±´ÅÅÐаñ½±ÀøÓÃÓÚ½±Àø # copyBillboard = Def_MixAward_Billboard_Copy_Dict.get(value) # ʵʱ°ñ # GameWorld.DebugLog(" ¿½±´ÅÅÐаñ½±ÀøÓÃÓÚ½±Àø cType=%s,value=%s,copyBillboard=%s" # % (key, value, copyBillboard)) # # if not copyBillboard: # continue # # PlayerBillboard.CopyBillboard(value, copyBillboard) # DataRecordPack.DR_BillboardData(value, "MixCampaignBillboard", {"MixServerDay":mixServerDay}) # Áì½±½áÊøºó, ²¹·¢Î´ÁìÈ¡µÄ½±ÀøÓʼþ, ±ØÐëÔÚÊý¾Ý¿½±´Íê±Ïºó´¦Àí __SendMSCAwardMailOnOver(sendMSCMailTypeList) return def __SendMSCAwardMailOnOver(overTypeList): if not overTypeList: return playerManager = GameWorld.GetPlayerManager() for i in range(0, playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) if curPlayer == None or not curPlayer.GetInitOK(): continue resultName = '%s' % __GetMSCQueryMailAwardResult(curPlayer, [ShareDefine.Def_MSCGameServerQuery_MailAward, overTypeList]) curPlayer.MapServer_QueryPlayerResult(0, 0, 'MixServerCampaignAward', resultName, len(resultName)) return ## »ñÈ¡·¢ËͺϷþ»î¶¯Óʼþ½±ÀøËùÐèµÄÐÅÏ¢ def __GetMSCQueryMailAwardResult(curPlayer, msgList): #queryType = msgList[0] oscTypeList = msgList[1] queryResultList = [] # ²¹·¢ÓʼþµÄÀàÐÍÅúÁ¿´¦Àí for oscType in oscTypeList: queryResultList.append(__GetGiveCampaignAwardInfo(curPlayer, oscType)) msgList.append(queryResultList) GameWorld.DebugLog("ÇëÇó·¢ËͺϷþ»î¶¯Óʼþ: oscTypeList=%s,queryResultList=%s,msgList=%s" % (oscTypeList, queryResultList, msgList)) return msgList ## »ñÈ¡Áì½±ËùÐèµÄÐÅÏ¢ def __GetGiveCampaignAwardInfo(curPlayer, campaignType): if campaignType in ShareDefine.DoOnMapServerMixCampaignTypeList: GameWorld.DebugLog(" µØÍ¼·þÎñÆ÷µ¥¶À´¦ÀíµÄÀàÐÍ!") return [] curPlayerID = curPlayer.GetID() # ½±Àø°ñÏà¹Ø awardBillboardType = ShareDefine.Def_MixCampaign_Billboard_Dict.get(campaignType) if not awardBillboardType: return [] billBoard = GameWorld.GetBillboard().FindBillboard(awardBillboardType) if billBoard: memberLV = 0 # #Õ½ÃË»÷ɱbossÅÅÐÐ È¡Íæ¼ÒËùÔÚÕ½Ã˵ÄÅÅÃû if campaignType == ShareDefine.Def_MixCampaign_Type_FamilyKillBoss: familyID = curPlayer.GetFamilyID() if not familyID: GameWorld.DebugLog("__GetGiveCampaignAwardInfo ->Íæ¼ÒûÓмÒ×å" , curPlayerID) return [] billIndex = billBoard.IndexOfByID(familyID) if billIndex < 0: GameWorld.DebugLog("__GetGiveCampaignAwardInfo ->Íæ¼ÒËùÔÚ¼Ò×åûÃû´Î" , curPlayerID) return [] order = billIndex + 1 else: order = billBoard.IndexOfByID(curPlayerID) + 1 # Íæ¼ÒÔÚÅÅÐаñÖеÄÃû´Î GameWorld.DebugLog(" ½±Àø°ñ: awardBillboardType=%s,order=%s" % (awardBillboardType, order)) return [order, memberLV] return [] ## ¸üкϷþ»î¶¯×´Ì¬ # @param isSoonNotify:ÊÇ·ñÂíÉÏ֪ͨ # @return: None def UpdateMixServerCampaignState(isSoonNotify=False): dataStateChangeOverList = [] sendMSCMailTypeList = [] isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer) # ÊÇ·ñºÏ·þ mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) # ºÏ·þÌìÊý for campaignType in ShareDefine.Def_MixCampaign_Type_List: updSaveDataState = ShareDefine.Def_CampaignDataState_None campaignInfoList = __GetMixCampaignInfoList(campaignType) if len(campaignInfoList) != Def_MixCampaign_Index_Max: continue interceptTimeList = campaignInfoList[Def_MixCampaign_Index_InterceptTime] if isMixServer and interceptTimeList != []: if mixServerDay in interceptTimeList: updSaveDataState = ShareDefine.Def_CampaignDataState_Save elif mixServerDay > max(interceptTimeList): # ³¬¹ý×î´óµÄÓÐЧÊý¾ÝÌìÊýÔòΪ»î¶¯½áÊø updSaveDataState = ShareDefine.Def_CampaignDataState_Over # ͬ²½MapServerºÏ·þ»î¶¯±£´æÊý¾Ý½×¶Î saveDataKey = ShareDefine.Def_Notify_WorldKey_MixServerCampaignSaveData % campaignType curSaveState = GameWorld.GetGameWorld().GetDictByKey(saveDataKey) if __IsNeedNoticeMapServer(saveDataKey, updSaveDataState, isSoonNotify): GameWorld.SendMapServerMsgEx(saveDataKey, updSaveDataState) GameWorld.GetGameWorld().SetDict(saveDataKey, updSaveDataState) # ´ÓÓÐЧ״̬±äΪ½áÊø×´Ì¬ if curSaveState == ShareDefine.Def_CampaignDataState_Save and updSaveDataState == ShareDefine.Def_CampaignDataState_Over: dataStateChangeOverList.append(campaignType) awardTimeList = campaignInfoList[Def_MixCampaign_Index_AwardTime] updGetAwardState = ShareDefine.Def_CampaignAwardState_None if isMixServer and awardTimeList != []: if mixServerDay in awardTimeList: updGetAwardState = ShareDefine.Def_CampaignAwardState_Allow elif mixServerDay > max(awardTimeList): updGetAwardState = ShareDefine.Def_CampaignAwardState_Over # ͬ²½MapServerºÏ·þ»î¶¯Áì½±½×¶Î getAwardKey = ShareDefine.Def_Notify_WorldKey_MixServerCampaignGetAward % campaignType curAwardState = GameWorld.GetGameWorld().GetDictByKey(getAwardKey) if __IsNeedNoticeMapServer(getAwardKey, updGetAwardState, isSoonNotify): GameWorld.SendMapServerMsgEx(getAwardKey, updGetAwardState) GameWorld.GetGameWorld().SetDict(getAwardKey, updGetAwardState) # ´ÓÁì½±ÓÐЧ״̬±äΪ½áÊø×´Ì¬ or δÅäÖÃÁì½±ÁбíÇÒÓÐЧÊý¾Ý±äΪ½áÊø×´Ì¬ if (curAwardState == ShareDefine.Def_CampaignAwardState_Allow and updGetAwardState == ShareDefine.Def_CampaignAwardState_Over) or \ (not awardTimeList and campaignType in dataStateChangeOverList): sendMSCMailTypeList.append(campaignType) return sendMSCMailTypeList ## ÊÇ·ñÐèҪ֪ͨMapServer»î¶¯ÐÅÏ¢ # @param key:֪ͨÀàÐÍkey # @param noticeType:֪ͨÀàÐÍ # @param isSoonNotify:ÊÇ·ñÂíÉÏ֪ͨ # @return: None def __IsNeedNoticeMapServer(key, noticeType, isSoonNotify): curType = GameWorld.GetGameWorld().GetDictByKey(key) if noticeType != curType or isSoonNotify: return True return False ## »ñÈ¡»î¶¯ÐÅÏ¢ # @param campaignType: »î¶¯ÀàÐÍ # @return: »î¶¯ÐÅÏ¢ def __GetMixCampaignInfoList(campaignType): openServerCampaignDict = ReadChConfig.GetEvalChConfig("MixServerCampaign") campaignInfoList = openServerCampaignDict.get(campaignType, []) return campaignInfoList ## »ñÈ¡»î¶¯ÊÇ·ñÒѾ­½áÊø # @param campaignType: »î¶¯ÀàÐÍ # @return: »î¶¯ÊÇ·ñÒѾ­½áÊø def __IsClearMixCampaignBillboard(campaignType): if campaignType not in ShareDefine.Def_MixCampaign_Type_List: #»î¶¯ÀàÐÍ´íÎó return True campaignInfoList = __GetMixCampaignInfoList(campaignType) if len(campaignInfoList) != Def_MixCampaign_Index_Max: #»î¶¯ÐÅÏ¢±íÅäÖôíÎó return True awardTimeList = campaignInfoList[Def_MixCampaign_Index_AwardTime] if awardTimeList == []: return True mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) # ºÏ·þÌìÊý if mixServerDay == max(awardTimeList) + 1: #ÒѾ­¹ýÁËÁ콱ʱ¼ä, »î¶¯½áÊø return True return False ## ÊÇ·ñcopyÅÅÐаñÊý¾ÝÓÃÓÚ½±Àø # @param campaignType: »î¶¯ÀàÐÍ # @return: ÊÇ·ñcopyÅÅÐаñÊý¾ÝÓÃÓÚ½±Àø def __CanCopyMixCampaignBillboardData(campaignType): campaignInfoList = __GetMixCampaignInfoList(campaignType) if len(campaignInfoList) != Def_MixCampaign_Index_Max: #»î¶¯ÐÅÏ¢±íÅäÖôíÎó return False #½±ÀøÊý¾Ý½ØÈ¡Ê±¼ä interceptTimeList = campaignInfoList[Def_MixCampaign_Index_InterceptTime] if interceptTimeList == []: return False mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) # ºÏ·þÌìÊý if mixServerDay > max(interceptTimeList): #ÒѾ­½ØÈ¡ÅÅÐаñÊý¾Ý return False if mixServerDay not in interceptTimeList: #²»ÊǽØÈ¡ÅÅÐаñÊý¾Ýʱ¼ä return False return True ## ¿É·ñÁìÈ¡ºÏ·þÎñ»î¶¯½±Àø # @param curPlayer: Íæ¼ÒʵÀý # @param msgList: ½±ÀøÁìÈ¡ÐÅÏ¢[ÇëÇóÀàÐÍ, »î¶¯ÀàÐÍ, ÁìÈ¡Ë÷Òý, ¼Ò×åID] # @return: [²éѯÀàÐÍ, »î¶¯ÀàÐÍ, ²éѯ½±ÀøË÷Òý, Ãû´Î, ¼Ò×åµÈ¼¶, ¼Ò×åְλ] def CanGiveMixCampaignAward(curPlayer, msgList): queryType = msgList[0] # ÇëÇóÀàÐÍ(Áì½±, Óʼþ) if queryType == ShareDefine.Def_MSCGameServerQuery_MailAward: return __GetMSCQueryMailAwardResult(curPlayer, msgList) campaignType = msgList[1] # »î¶¯ÀàÐÍ awardIndex = msgList[2] # ÏëÒªÁìÈ¡µÄ½±ÀøË÷Òý familyID = msgList[3] # ¼Ò×åID mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) # ºÏ·þÌìÊý GameWorld.DebugLog("CanGiveMixCampaignAward: mixServerDay=%s,msgList=%s" % (mixServerDay, str(msgList))) if campaignType not in ShareDefine.Def_MixCampaign_Type_List: #ÁìÈ¡µÄ½±ÀøÀàÐÍ´íÎó GameWorld.ErrLog(" ÁìÈ¡µÄºÏ·þ½±ÀøÀàÐÍ´íÎó campaignType=%s" % (campaignType)) return [queryType, campaignType, awardIndex, 0, 0, 0] campaignInfoList = __GetMixCampaignInfoList(campaignType) if len(campaignInfoList) != Def_MixCampaign_Index_Max: #»î¶¯ÐÅÏ¢±íÅäÖôíÎó GameWorld.ErrLog(" MixServerCampaign: ºÏ·þ»î¶¯ÐÅÏ¢±íÅäÖôíÎó") return [queryType, campaignType, awardIndex, 0, 0, 0] awardTimeList = campaignInfoList[Def_MixCampaign_Index_AwardTime] if awardTimeList == []: GameWorld.ErrLog(" MixServerCampaign: awardTimeList is []") return [queryType, campaignType, awardIndex, 0, 0, 0] interceptTimeList = campaignInfoList[Def_MixCampaign_Index_InterceptTime] if interceptTimeList == []: GameWorld.ErrLog(" MixServerCampaign: interceptTimeList is []") return [queryType, mixServerDay, campaignType, awardIndex, 0, 0, 0] if mixServerDay not in awardTimeList: GameWorld.DebugLog(" MixServerCampaign: ·ÇÁ콱ʱ¼ä mixServerDay=%s,awardTimeList=%s" % (mixServerDay, str(awardTimeList))) return [queryType, campaignType, awardIndex, 0, 0, 0] curPlayerID = curPlayer.GetID() awardBillboardType = ShareDefine.Def_MixCampaign_Billboard_Dict.get(campaignType) if not awardBillboardType: GameWorld.DebugLog(" ÕÒ²»µ½Def_MixCampaign_Billboard_Dict¶ÔÓ¦ÅÅÐаñ %s" % campaignType) return [queryType, campaignType, awardIndex, 0, 0, 0] billBoard = GameWorld.GetBillboard().FindBillboard(awardBillboardType) if not billBoard: GameWorld.DebugLog(" ÕÒ²»µ½ÅÅÐаñÊý¾Ý") #ÕÒ²»µ½ÅÅÐаñÊý¾Ý return [queryType, campaignType, awardIndex, 0, 0, 0] maxPlace = campaignInfoList[Def_MixCampaign_Index_MaxPlace] # ¿ÉÁì½±Ãû´Î if campaignType == ShareDefine.Def_MixCampaign_Type_FamilyKillBoss: #Õ½ÃË»÷ɱbossÅÅÐÐ È¡Íæ¼ÒËùÔÚÕ½Ã˵ÄÅÅÃû billBoardIndex = billBoard.IndexOfByID(familyID) else: billBoardIndex = billBoard.IndexOfByID(curPlayerID) order = billBoardIndex + 1 # Íæ¼ÒÔÚÅÅÐаñÖеÄÃû´Î GameWorld.DebugLog(" billBoardIndex=%s,order=%s,maxPlace=%s" % (billBoardIndex, order, maxPlace)) if billBoardIndex < 0 or order > maxPlace: GameWorld.DebugLog(" ²»ÔÚ¿ÉÁìÃû´Î") return [queryType, campaignType, awardIndex, 0, 0, 0] return [queryType, campaignType, awardIndex, order, 0, 0] ##ºÏ·þ»î¶¯Õ½ÃË»÷ɱbossÅÅÐиüР# @param cmdList ¼Ç¼ÄÚÈÝ # @return ·µ»ØÖµÎÞÒâÒå def UpdMixCampaignFamiliyBossCnt(curPlayer, cmdList): isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer) # ÊÇ·ñºÏ·þ # ·ÇºÏ·þ²»´¦Àí if not isMixServer: GameWorld.DebugLog("·ÇºÏ·þ ²»¸üкϷþ»î¶¯Õ½ÃË»÷ɱbossÅÅÐÐ") return campaignType = ShareDefine.Def_MixCampaign_Type_FamilyKillBoss if not __CanCopyMixCampaignBillboardData(campaignType): GameWorld.DebugLog("²»ÊǸüÐÂʱ»ú ²»¸üкϷþ»î¶¯Õ½ÃË»÷ɱbossÅÅÐÐ") return addCnt = cmdList[0] curPlayerID = curPlayer.GetPlayerID() curFamily = curPlayer.GetFamily() if curFamily == None: GameWorld.DebugLog("UpdMixCampaignFamiliyBossCnt ->Íæ¼ÒûÓмÒ×å" , curPlayerID) return curMember = curFamily.FindMember(curPlayerID) if curMember == None: GameWorld.DebugLog("UpdMixCampaignFamiliyBossCnt ->Î޴˳ÉÔ±" , curPlayerID) return billboardIndex = ShareDefine.Def_BT_MixCampaign_FamilyKillBoss billboard = GameWorld.GetBillboard().FindBillboard(billboardIndex) if not billboard: GameWorld.ErrLog(" ÕÒ²»µ½Õ½ÃË»÷ɱbossÅÅÐаñ!!!") return familyID = curFamily.GetID() familyName = curFamily.GetName() familyLV = curFamily.GetLV() killCnt = 0 billboardCnt = billboard.GetCount() for index in range(0, billboardCnt): objBillboard = billboard.At(index) objID = objBillboard.GetID() if familyID != objID: continue killCnt = objBillboard.GetCmpValue() break newCnt = killCnt + addCnt PlayerBillboard.UpdatePlayerBillboard(familyID, familyName, 0, ShareDefine.Def_BT_MixCampaign_FamilyKillBoss, 0, 0, 0, newCnt, cmpValue2=familyLV) return