| #!/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.IsMergeServer():  | 
|         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  | 
|   |