#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package PlayerActBossTrial # # @todo:bossÀúÁ· # @author hxp # @date 2023-10-20 # @version 1.0 # # ÏêϸÃèÊö: bossÀúÁ· # #------------------------------------------------------------------------------- #"""Version = 2023-10-20 16:00""" #------------------------------------------------------------------------------- import ShareDefine import DataRecordPack import PlayerCompensation import PlayerDBGSEvent import PlayerBillboard import IpyGameDataPY import GameWorld import CrossRealmMsg import CrossActionControl import CrossBillboard import PlayerFamily import PyDataManager import GameXiangong import GameWorship def OnActStart(actNum): ## »î¶¯¿ªÆô PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAward % actNum, 0) PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_BossTrialSubmit) PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_BossTrialSubmitFamily) familyActionMgr = GameWorld.GetFamilyActionManager() familyManager = GameWorld.GetFamilyManager() for i in range(0, familyManager.GetCount()): family = familyManager.GetAt(i) familyID = family.GetID() familyActionMgr.DelFamilyAction(familyID, ShareDefine.Def_ActionType_BossTrialSubmit) return def OnActEnd(actNum, ipyData, dayIndex): ## »î¶¯½áÊø cfgID = ipyData.GetCfgID() if ipyData else 0 GameWorld.Log("=== bossÀúÁ·»î¶¯½áÊø£¡ === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex)) __OnEndAward(actNum, ipyData, dayIndex) # ¼æÈݻûÓÐÅäÖòÎÓëʱ¼ä¶ÎµÄÔڻ½áÊø²¹´¥·¢½áËã½±Àø PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitFamilyBak, ShareDefine.Def_BT_BossTrialSubmitFamily) PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitBak, ShareDefine.Def_BT_BossTrialSubmit) GameWorld.Log("=================================================================================") return def OnActInStateRefresh(actNum, ipyData, dayIndex): ## »î¶¯ÖÐˢУ¬Ã¿´Î¶¼ÐèҪˢеÄÂß¼­£¬°üº¬ÖضÁÅäÖÃµÈ if not ipyData: return cfgID = ipyData.GetCfgID() templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex) familyTemplateID = GameWorld.GetTemplateIDByList(ipyData.GetFamilyTemplateIDList(), dayIndex) billboardMgr = PlayerBillboard.GetBillboardMgr() if templateID: orderRuleList = GetOrderRuleList(templateID) billboardObj = billboardMgr.GetBillboardObj(ShareDefine.Def_BT_BossTrialSubmit) billboardObj.SetOrderRuleList(orderRuleList) if familyTemplateID: orderRuleList = GetOrderRuleList(familyTemplateID) billboardObj = billboardMgr.GetBillboardObj(ShareDefine.Def_BT_BossTrialSubmitFamily) billboardObj.SetOrderRuleList(orderRuleList) return def OnActJoinEnd(actNum, ipyData, dayIndex): ## »î¶¯²ÎÓë½áÊø __OnEndAward(actNum, ipyData, dayIndex) return def __OnEndAward(actNum, ipyData, dayIndex): ## ½áËã½±Àø if not ipyData: return cfgID = ipyData.GetCfgID() awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAward % actNum) if awardState: #ÒѾ­½áËã¹ý¸Ã»î¶¯ GameWorld.Log("bossÀúÁ·»î¶¯ÒѾ­½áËã¹ý½±ÀøÁË! actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex)) return PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAward % actNum, 1) GameWorld.Log("=== ±¾·þbossÀúÁ·»î¶¯·¢·Å°ñµ¥½±Àø£¡ === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex)) familyTemplateID = GameWorld.GetTemplateIDByList(ipyData.GetFamilyTemplateIDList(), dayIndex) __OnEndAward_Family(familyTemplateID, ShareDefine.Def_BT_BossTrialSubmitFamily) templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex) __OnEndAward_Personal(templateID, ShareDefine.Def_BT_BossTrialSubmit) # Á÷Ïò±¸·Ý DataRecordPack.DR_BillboardData(ShareDefine.Def_BT_BossTrialSubmitFamily, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex}) DataRecordPack.DR_BillboardData(ShareDefine.Def_BT_BossTrialSubmit, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex}) GameWorld.Log("=================================================================================") return def __OnEndAward_Personal(templateID, billboardType): billBoard = GameWorld.GetBillboard().FindBillboard(billboardType) if not billBoard: return if not templateID: GameWorld.Log("±¾´Î»î¶¯Ã»ÓиöÈ˰ñ½±Àø!") return billboardDataCount = billBoard.GetCount() billBoard.Sort() GameWorld.Log("½áËã¸öÈ˰ñµ¥½±Àø: billboardType=%s,templateID=%s,billboardDataCount=%s" % (billboardType, templateID, billboardDataCount)) orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID) if not orderIpyDataList: return rankPre = 0 billboardIndex = 0 for ipyData in orderIpyDataList: rank = ipyData.GetRank() needScore = ipyData.GetNeedScore() scoreAwardEx = ipyData.GetScoreAwardEx() scoreAwardExList = scoreAwardEx.keys() scoreAwardExList.sort() awardItemList = ipyData.GetAwardItemList() orderCountTotal = rank - rankPre # ½±ÀøÃû´ÎÊýÁ¿ rankPre = rank for index in xrange(billboardIndex, billboardDataCount): if orderCountTotal <= 0: break billBoardData = billBoard.At(index) playerID = billBoardData.GetID() name2 = billBoardData.GetName2() cmpValue = billBoardData.GetCmpValue() if cmpValue < needScore: GameWorld.Log(" »ý·Ö²»×ã¸Ã°ñµ¥ËùÐè»ý·Ö£¬Ìø¹ý¸ÃÃû´Î: index=%s,rank=%s,playerID=%s,cmpValue=%s < %s" % (index, rank, playerID, cmpValue, needScore)) break awardItemExList = [] for scoreEx in scoreAwardExList: if cmpValue < scoreEx: break awardItemExList = scoreAwardEx[scoreEx] # È¡×î´óÂú×ãÌõ¼þµÄÒ»µµ finalAwardItemList = awardItemList + awardItemExList playerRank = rank - orderCountTotal + 1 GameWorld.Log(" ·¢·ÅbossÀúÁ·¸öÈ˰ñµ¥½±Àø: index=%s,rank=%s,playerRank=%s,playerID=%s,cmpValue=%s,awardItemList=%s,scoreAwardEx=%s,finalAwardItemList=%s, %s" % (index, rank, playerRank, playerID, cmpValue, awardItemList, scoreAwardEx, finalAwardItemList, name2)) PlayerCompensation.SendMailByKey("BossTrialMail10", [playerID], finalAwardItemList, [playerRank]) orderCountTotal -= 1 billboardIndex += 1 return def __OnEndAward_Family(familyTemplateID, billboardType): billBoard = GameWorld.GetBillboard().FindBillboard(billboardType) if not billBoard: return if not familyTemplateID: GameWorld.Log("±¾´Î»î¶¯Ã»ÓÐÏÉÃ˰ñ½±Àø!") return billboardDataCount = billBoard.GetCount() billBoard.Sort() GameWorld.Log("½áËãÏÉÃ˰ñµ¥½±Àø: billboardType=%s,familyTemplateID=%s,billboardDataCount=%s" % (billboardType, familyTemplateID, billboardDataCount)) orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", familyTemplateID) if not orderIpyDataList: return familyManager = GameWorld.GetFamilyManager() rankPre = 0 billboardIndex = 0 for ipyData in orderIpyDataList: rank = ipyData.GetRank() needScore = ipyData.GetNeedScore() leaderAwardItemList = ipyData.GetAwardItemList() memAwardItemList = ipyData.GetMemAwardItemList() orderCountTotal = rank - rankPre # ½±ÀøÃû´ÎÊýÁ¿ rankPre = rank for index in xrange(billboardIndex, billboardDataCount): if orderCountTotal <= 0: break billBoardData = billBoard.At(index) familyID = billBoardData.GetID() cmpValue = billBoardData.GetCmpValue() if cmpValue < needScore: GameWorld.Log(" ²»×ã¸Ã°ñµ¥ËùÐèÌá½»Êý£¬Ìø¹ý¸ÃÃû´Î: index=%s,rank=%s,familyID=%s,cmpValue=%s < %s" % (index, rank, familyID, cmpValue, needScore)) break familyRank = rank - orderCountTotal + 1 orderCountTotal -= 1 billboardIndex += 1 family = familyManager.FindFamily(familyID) if not family: continue familyActionData = GetFamilyBossTrialSubmitActionData(familyID, False) if not familyActionData: GameWorld.ErrLog("¸ÃÏÉÃËûÓÐÌύƾ֤ActionData! familyID=%s" % familyID) continue awardState = GetFamilyAwardState(familyActionData) awardIndex = 0 # ±¾·þ½±Àø×´Ì¬Ë÷Òý if awardState&pow(2, awardIndex): GameWorld.ErrLog("¸ÃÏÉÃ˱¾·þ°ñ½±ÀøÒÑ·¢·Å! familyID=%s" % familyID) continue updAwardState = awardState|pow(2, awardIndex) SetFamilyAwardState(familyActionData, updAwardState) memSubCountDict = GetFamilyMemSubCountDict(familyActionData) leaderID = family.GetLeaderID() awardMemIDList = [] for index in xrange(family.GetCount()): member = family.GetAt(index) memPlayerID = member.GetPlayerID() if memPlayerID == leaderID: continue awardMemIDList.append(memPlayerID) paramList = [familyRank] if not leaderAwardItemList: awardMemIDList.append(leaderID) else: PlayerCompensation.SendMailByKey("BossTrialFamilyLeader", [leaderID], leaderAwardItemList, paramList) PlayerCompensation.SendMailByKey("BossTrialFamilyMember", awardMemIDList, memAwardItemList, paramList) GameWorld.Log("·¢·ÅbossÀúÁ·»î¶¯ÏÉÃ˰ñµ¥½±Àø±¾·þ: index=%s,rank=%s,familyID=%s,Ãû´Î=%s,×ÜÌá½»¸öÊý=%s,updAwardState=%s,awardMemIDList=%s,memSubCountDict=%s" % (index, rank, familyID, familyRank, cmpValue, updAwardState, awardMemIDList, memSubCountDict)) return def MapServer_BossTrial(curPlayer, msgList): mapID = curPlayer.GetRealMapID() playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("MapServer_BossTrial mapID=%s,msgList=%s" % (mapID, msgList), playerID) if not msgList: return msgType, dataMsg = msgList ret = None if msgType == "BossTrialSubmit": ret = __OnBossTrialSubmit(curPlayer, dataMsg) if ret == None: return return msgList + (ret if isinstance(ret, list) else [ret]) def __OnBossTrialSubmit(curPlayer, dataMsg): ## µØÍ¼Ìá½»bossƾ֤ playerID = curPlayer.GetPlayerID() accID = curPlayer.GetAccID() playerName = curPlayer.GetName() job = curPlayer.GetJob() realmLV = curPlayer.GetOfficialRank() familyID = curPlayer.GetFamilyID() submitCount, updSubmitCount = dataMsg curFamily, familySubmitTotal = __DoBossTrialSubmitFamilyAction(curPlayer, submitCount) familyBillInfo = {} #¸üб¾·þÏÉÃËÌá½»°ñµ¥ if familyID and curFamily and familySubmitTotal: familyBillInfo = PlayerFamily.GetFamilyBillboardInfo(curFamily) familyBillInfo["familySubmitTotal"] = familySubmitTotal PlayerBillboard.UpdateFamilyBillboard(ShareDefine.Def_BT_BossTrialSubmitFamily, familyBillInfo, familySubmitTotal) #ͬ²½¿ç·þ playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV, "playerSubmitTotal":updSubmitCount} SyncBossTrialSubmitToCrossServer(curPlayer, playerInfo, familyBillInfo) return def __DoBossTrialSubmitFamilyAction(curPlayer, submitCount): ## Ö´ÐÐÌύƾ֤µ½ÏÉÃËActionÊý¾Ý curFamily = None familySubmitTotal = 0 playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() if not familyID: return curFamily, familySubmitTotal familyManager = GameWorld.GetFamilyManager() curFamily = familyManager.FindFamily(familyID) if not curFamily: return curFamily, familySubmitTotal familyActionData = GetFamilyBossTrialSubmitActionData(familyID, True) familySubmitTotal = GetFamilySubmitTotal(familyActionData) + submitCount SetFamilySubmitTotal(familyActionData, familySubmitTotal) memSubCountDict = GetFamilyMemSubCountDict(familyActionData) memSubCountDict[playerID] = memSubCountDict.get(playerID, 0) + submitCount SetFamilyMemSubCountDict(familyActionData, memSubCountDict) return curFamily, familySubmitTotal def GetFamilyBossTrialSubmitActionData(familyID, isAdd=False): ## »ñÈ¡ÏÉÃËbossƾ֤Ìá½» familyActionObj = None actionType = ShareDefine.Def_ActionType_BossTrialSubmit familyAction = GameWorld.GetFamilyActionManager().GetFamilyAction(familyID, actionType) if not familyAction.Count(): if isAdd: familyActionObj = familyAction.AddAction() familyActionObj.SetFamilyId(familyID) familyActionObj.SetActionType(actionType) else: familyActionObj = familyAction.At(0) return familyActionObj def GetFamilySubmitTotalByID(familyID): ## »ñÈ¡ÏÉÃËÌá½»µÄƾ֤×ÜÊý familyActionData = GetFamilyBossTrialSubmitActionData(familyID, False) if not familyActionData: return 0 return GetFamilySubmitTotal(familyActionData) def GetFamilySubmitTotal(familyActionData): return familyActionData.GetValue1() def SetFamilySubmitTotal(familyActionData, submitTotal): familyActionData.SetValue1(submitTotal) def GetFamilyAwardState(familyActionData): return familyActionData.GetValue2() def SetFamilyAwardState(familyActionData, state): return familyActionData.SetValue2(state) def GetFamilyMemSubCountDict(familyActionData): memSubCountDict = {} useData = familyActionData.GetUseData() if useData: try: memSubCountDict = eval(useData) except: memSubCountDict = {} return memSubCountDict def SetFamilyMemSubCountDict(familyActionData, memSubCountDict): useData = str(memSubCountDict).replace(" ", "") familyActionData.SetUseData(useData, len(useData)) return def SyncBossTrialSubmitToCrossServer(curPlayer, playerInfo, familyInfo): ## ͬ²½bossƾ֤Ìá½»×ÜÊýµ½¿ç·þ·þÎñÆ÷ actInfo = CrossActionControl.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_BossTrial) if not actInfo.get(ShareDefine.ActKey_State): return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {}) if not ipyDataDict: return zoneID = ipyDataDict.get("ZoneID") if not cfgID or not zoneID: return dataMsg = {"cfgID":cfgID, "zoneID":zoneID, "playerInfo":playerInfo, "familyInfo":familyInfo} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_BossTrialSubmit, dataMsg) return def CrossServerMsg_CrossBossTrialFamilyAward(msgData): ## ÊÕµ½¿ç·þ֪ͨ - ½áËã¿ç·þÏÉÃ˰ñ½±Àø cfgID = msgData["cfgID"] zoneID = msgData["zoneID"] templateID = msgData["templateID"] awardFamilyList = msgData["awardFamilyList"] GameWorld.Log("ÊÕµ½¿ç·þͬ²½µÄ½áËãbossÀúÁ·»î¶¯¿ç·þÏÉÃ˰ñ½±Àø: cfgID=%s,zoneID=%s,templateID=%s" % (cfgID, zoneID, templateID)) familyManager = GameWorld.GetFamilyManager() for familyInfo in awardFamilyList: familyID, familyRank, familySubmitTotal, leaderAwardItemList, memAwardItemList = familyInfo family = familyManager.FindFamily(familyID) if not family: GameWorld.DebugLog("·Ç±¾·þÏÉÃË»òÒѽâÉ¢! familyID=%s" % familyID) continue familyActionData = GetFamilyBossTrialSubmitActionData(familyID, False) if not familyActionData: GameWorld.ErrLog("¸ÃÏÉÃËûÓÐÌύƾ֤ActionData! familyID=%s" % familyID) continue awardState = GetFamilyAwardState(familyActionData) awardIndex = 1 #¿ç·þ½±Àø×´Ì¬Ë÷Òý if awardState&pow(2, awardIndex): GameWorld.ErrLog("¸ÃÏÉÃË¿ç·þ°ñ½±ÀøÒÑ·¢·Å! familyID=%s" % familyID) continue updAwardState = awardState|pow(2, awardIndex) SetFamilyAwardState(familyActionData, updAwardState) memSubCountDict = GetFamilyMemSubCountDict(familyActionData) leaderID = family.GetLeaderID() awardMemIDList = [] for index in xrange(family.GetCount()): member = family.GetAt(index) memPlayerID = member.GetPlayerID() if memPlayerID == leaderID: continue awardMemIDList.append(memPlayerID) paramList = [familyRank] if not leaderAwardItemList: awardMemIDList.append(leaderID) else: PlayerCompensation.SendMailByKey("BossTrialCrossFamilyLeader", [leaderID], leaderAwardItemList, paramList) PlayerCompensation.SendMailByKey("BossTrialCrossFamilyMember", awardMemIDList, memAwardItemList, paramList) GameWorld.Log("·¢·ÅbossÀúÁ·»î¶¯ÏÉÃ˰ñµ¥½±Àø¿ç·þ: familyID=%s,Ãû´Î=%s,×ÜÌá½»¸öÊý=%s,updAwardState=%s,awardMemIDList=%s,memSubCountDict=%s" % (familyID, familyRank, familySubmitTotal, updAwardState, awardMemIDList, memSubCountDict)) return ##------------------------------------------ ¿ç·þbossÀúÁ·»î¶¯ --------------------------------------- def ClientServerMsg_BossTrialSubmit(serverGroupID, msgData): ## ÊÕµ½×Ó·þ - Ìá½»bossƾ֤ cfgID = msgData["cfgID"] zoneID = msgData["zoneID"] playerInfo = msgData["playerInfo"] familyInfo = msgData["familyInfo"] actInfo = CrossActionControl.GetCrossActInfoByCfgID(ShareDefine.CrossActName_BossTrial, cfgID, zoneID) if not actInfo or not actInfo[ShareDefine.ActKey_State]: GameWorld.ErrLog("¿ç·þbossÀúÁ··Ç»î¶¯ÖУ¬ÎÞ·¨Ìá½»! cfgID=%s, zoneID=%s" % (cfgID, zoneID)) return if actInfo[ShareDefine.ActKey_StateJoin] != ShareDefine.ActStateJoin_Start: GameWorld.ErrLog("¿ç·þbossÀúÁ··Ç¿É²ÎÓë״̬£¬ÎÞ·¨Ìá½»! cfgID=%s, zoneID=%s" % (cfgID, zoneID)) return ipyData = IpyGameDataPY.GetIpyGameData("CrossActBossTrial", cfgID) if not ipyData: return personlLimit, familyLimit = 0, 0 PersonalTemplateID = ipyData.GetPersonalTemplateID() pRankIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", PersonalTemplateID) if PersonalTemplateID else None if pRankIpyDataList: lastRankIpyData = pRankIpyDataList[-1] # È¡×îºóÒ»¸öΪ×îµÍÉϰñ»ý·ÖÏÞÖÆ personlLimit = lastRankIpyData.GetNeedScore() FamilyTemplateID = ipyData.GetFamilyTemplateID() fRankIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", FamilyTemplateID) if FamilyTemplateID else None if fRankIpyDataList: lastRankIpyData = fRankIpyDataList[-1] # È¡×îºóÒ»¸öΪ×îµÍÉϰñ»ý·ÖÏÞÖÆ familyLimit = lastRankIpyData.GetNeedScore() playerID = playerInfo["playerID"] playerName = playerInfo["playerName"] job = playerInfo["job"] accID = playerInfo["accID"] realmLV = playerInfo["realmLV"] playerSubmitTotal = playerInfo["playerSubmitTotal"] groupValue1 = zoneID if playerSubmitTotal >= personlLimit: name2, type2, value1, value2 = accID, job, realmLV, 0 CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmit, groupValue1, playerID, playerName, name2, type2, value1, value2, playerSubmitTotal) if familyInfo and familyInfo.get("familySubmitTotal", 0) >= familyLimit: familySubmitTotal = familyInfo["familySubmitTotal"] CrossBillboard.UpdCrossBillboardFamily(ShareDefine.Def_CBT_BossTrialSubmitFamily, groupValue1, familyInfo, familySubmitTotal) return def OnCrossActIDChange(cfgID, zoneID, ipyData, state): ## ¿ç·þ»î¶¯ID±ä¸ü if state: OnCrossActStart(cfgID, zoneID, ipyData) else: OnCrossActEnd(cfgID, zoneID, ipyData) return def OnCrossActStart(cfgID, zoneID, ipyData): ## ¿ç·þ»î¶¯¿ªÆô PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAwardC % zoneID, 0) groupValue1 = zoneID billboardMgr = PyDataManager.GetCrossBillboardManager() billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmit, groupValue1) billboardObj.ClearData() # ÐÂ»î¶¯ÖØÖðñµ¥Êý¾Ý billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmitFamily, groupValue1) billboardObj.ClearData() # ÐÂ»î¶¯ÖØÖðñµ¥Êý¾Ý return def OnCrossActEnd(cfgID, zoneID, ipyData): ## ¿ç·þ»î¶¯½áÊø groupValue1 = zoneID GameWorld.Log("=== ¿ç·þbossÀúÁ·»î¶¯½áÊø£¡ === cfgID=%s,zoneID=%s" % (cfgID, zoneID)) __OnCrossEndAward(cfgID, zoneID, ipyData) # ±¸·Ý¡¢Çå³ý°ñµ¥Êý¾Ý billboardMgr = PyDataManager.GetCrossBillboardManager() billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmit, groupValue1) CrossBillboard.CopyBillboardEx(ShareDefine.Def_CBT_BossTrialSubmit, ShareDefine.Def_CBT_BossTrialSubmitBak, groupValue1) billboardObj.ClearData() billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmitFamily, groupValue1) CrossBillboard.CopyBillboardEx(ShareDefine.Def_CBT_BossTrialSubmitFamily, ShareDefine.Def_CBT_BossTrialSubmitFamilyBak, groupValue1) billboardObj.ClearData() GameWorld.Log("=================================================================================") return def OnCrossActInStateRefresh(cfgID, zoneID, ipyData): ## »î¶¯ÖÐˢУ¬Ã¿´Î¶¼ÐèҪˢеÄÂß¼­£¬°üº¬ÖضÁÅäÖÃµÈ if not ipyData: return PersonalTemplateID = ipyData.GetPersonalTemplateID() FamilyTemplateID = ipyData.GetFamilyTemplateID() orderRuleList = GetOrderRuleList(PersonalTemplateID) orderRuleListFamily = GetOrderRuleList(FamilyTemplateID) groupValue1 = zoneID billboardMgr = PyDataManager.GetCrossBillboardManager() billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmit, groupValue1) billboardObj.SetOrderRuleList(orderRuleList) billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmitFamily, groupValue1) billboardObj.SetOrderRuleList(orderRuleListFamily) return def GetOrderRuleList(templateID): orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID) if not orderIpyDataList: return orderRuleList = [] for ipyData in orderIpyDataList: orderRuleList.append([ipyData.GetRank(), ipyData.GetNeedScore()]) return orderRuleList def OnCrossActJoinEnd(cfgID, zoneID, ipyData): ## ¿ç·þ»î¶¯²ÎÓë½áÊø __OnCrossEndAward(cfgID, zoneID, ipyData) return def __OnCrossEndAward(cfgID, zoneID, ipyData): ## ½áËã¿ç·þ½±Àø awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAwardC % zoneID) if awardState: #ÒѾ­½áËã¹ý¸Ã»î¶¯ GameWorld.Log("¿ç·þbossÀúÁ·»î¶¯ÒѾ­½áËã¹ý½±ÀøÁË! cfgID=%s,zoneID=%s" % (cfgID, zoneID)) return PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAwardC % zoneID, 1) GameWorld.Log("=== ¿ç·þbossÀúÁ·»î¶¯·¢·Å°ñµ¥½±Àø£¡ === cfgID=%s,zoneID=%s" % (cfgID, zoneID)) PersonalTemplateID = ipyData.GetPersonalTemplateID() FamilyTemplateID = ipyData.GetFamilyTemplateID() serverIDRangeList = ipyData.GetServerIDRangeList() __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_BossTrialSubmit, serverIDRangeList) __GiveCrossOrderAwardFamily(cfgID, zoneID, FamilyTemplateID, ShareDefine.Def_CBT_BossTrialSubmitFamily) GameWorld.Log("=================================================================================") return def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID, billboardType, serverIDRangeList): groupValue1 = zoneID #billboardType = ShareDefine.Def_CBT_BossTrialSubmit #°ñµ¥ÀàÐ͸ÄΪ²ÎÊý´«È룬Òì³£Çé¿öÏ¿ÉÌØÊâ´¦ÀíÓñ¸·Ý°ñµ¥·¢½±Àø billboardMgr = PyDataManager.GetCrossBillboardManager() billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1) billboardDataCount = billboardObj.GetCount() if not billboardDataCount: GameWorld.Log("¿ç·þBossƾ֤¸öÈËÅÅÐÐÊý¾ÝΪ¿Õ! billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s" % (billboardType, zoneID, cfgID, templateID)) return # ½áËãʱÅÅÐò²¢±£´æ°ñµ¥Êý¾ÝÁ÷Ïò billboardObj.SortData() billboardObj.SaveDRData("BossTrial", {"cfgID":cfgID, "zoneID":zoneID}) GameWorld.Log("½áËã¿ç·þBossƾ֤¸öÈËÅÅÐн±Àø: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s" % (billboardType, zoneID, cfgID, templateID, billboardDataCount)) orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID) if not orderIpyDataList: return worshipType = ShareDefine.Def_WorshipType_CrossBossTrial syncNewWorshipList = [] syncNewXiangongDict = {} rankPre = 0 billboardIndex = 0 for ipyData in orderIpyDataList: rank = ipyData.GetRank() needScore = ipyData.GetNeedScore() scoreAwardEx = ipyData.GetScoreAwardEx() scoreAwardExList = scoreAwardEx.keys() scoreAwardExList.sort() awardItemList = ipyData.GetAwardItemList() xiangongID = ipyData.GetXiangongID() orderCountTotal = rank - rankPre # ½±ÀøÃû´ÎÊýÁ¿ rankPre = rank for index in xrange(billboardIndex, billboardDataCount): if orderCountTotal <= 0: break billboardData = billboardObj.At(index) playerID = billboardData.ID name2 = billboardData.Name2 cmpValue = billboardData.CmpValue if cmpValue < needScore: GameWorld.Log(" »ý·Ö²»×ã¸Ã°ñµ¥ËùÐè»ý·Ö£¬Ìø¹ý¸ÃÃû´Î: index=%s,rank=%s,playerID=%s,cmpValue=%s < %s" % (index, rank, playerID, cmpValue, needScore)) break awardItemExList = [] for scoreEx in scoreAwardExList: if cmpValue < scoreEx: break awardItemExList = scoreAwardEx[scoreEx] # È¡×î´óÂú×ãÌõ¼þµÄÒ»µµ finalAwardItemList = awardItemList + awardItemExList playerRank = rank - orderCountTotal + 1 GameWorld.Log(" ·¢·ÅbossÀúÁ·¸öÈ˰ñµ¥½±Àø: index=%s,rank=%s,playerRank=%s,playerID=%s,cmpValue=%s,awardItemList=%s,scoreAwardEx=%s,finalAwardItemList=%s, %s" % (index, rank, playerRank, playerID, cmpValue, awardItemList, scoreAwardEx, finalAwardItemList, name2)) PlayerCompensation.SendMailByKey("BossTrialCrossPlayer", [playerID], finalAwardItemList, [playerRank], crossMail=True) orderCountTotal -= 1 billboardIndex += 1 GameXiangong.AddXiangongPlayer(xiangongID, playerID, serverIDRangeList, playerRank, syncNewXiangongDict) GameWorship.AddWorshipPlayer(worshipType, playerRank, playerID, serverIDRangeList, syncList=syncNewWorshipList) GameWorship.SendNewWorshipPlayer(syncNewWorshipList) GameXiangong.SendNewXiangongPlayerToClientServer(syncNewXiangongDict) return def __GiveCrossOrderAwardFamily(cfgID, zoneID, templateID, billboardType): groupValue1 = zoneID #billboardType = ShareDefine.Def_CBT_BossTrialSubmitFamily billboardMgr = PyDataManager.GetCrossBillboardManager() billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1) billboardDataCount = billboardObj.GetCount() if not billboardDataCount: GameWorld.Log("¿ç·þBossƾ֤ÏÉÃËÅÅÐÐÊý¾ÝΪ¿Õ! billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s" % (billboardType, zoneID, cfgID, templateID)) return # ½áËãʱÅÅÐò²¢±£´æ°ñµ¥Êý¾ÝÁ÷Ïò billboardObj.SortData() billboardObj.SaveDRData("BossTrial", {"cfgID":cfgID, "zoneID":zoneID}) GameWorld.Log("½áËã¿ç·þBossƾ֤ÏÉÃËÅÅÐн±Àø: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s" % (billboardType, zoneID, cfgID, templateID, billboardDataCount)) orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID) if not orderIpyDataList: return awardFamilyList = [] rankPre = 0 billboardIndex = 0 for ipyData in orderIpyDataList: rank = ipyData.GetRank() needScore = ipyData.GetNeedScore() leaderAwardItemList = ipyData.GetAwardItemList() memAwardItemList = ipyData.GetMemAwardItemList() orderCountTotal = rank - rankPre # ½±ÀøÃû´ÎÊýÁ¿ rankPre = rank for index in xrange(billboardIndex, billboardDataCount): if orderCountTotal <= 0: break billboardData = billboardObj.At(index) familyID = billboardData.ID familySubmitTotal = billboardData.CmpValue if familySubmitTotal < needScore: GameWorld.Log(" ²»×ã¸Ã°ñµ¥ËùÐèÌá½»Êý£¬Ìø¹ý¸ÃÃû´Î: index=%s,rank=%s,familyID=%s,familySubmitTotal=%s < %s" % (index, rank, familyID, familySubmitTotal, needScore)) break familyRank = rank - orderCountTotal + 1 GameWorld.Log(" index=%s,rank=%s,familyID=%s,Ãû´Î=%s,×ÜÌá½»¸öÊý=%s" % (index, rank, familyID, familyRank, familySubmitTotal)) awardFamilyList.append([familyID, familyRank, familySubmitTotal, leaderAwardItemList, memAwardItemList]) orderCountTotal -= 1 billboardIndex += 1 # ¹ã²¥×Ó·þ·¢·Å½±Àø sendMsg = {"cfgID":cfgID, "zoneID":zoneID, "templateID":templateID, "awardFamilyList":awardFamilyList} CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossTrialFamilyAward, sendMsg) return