From e41e926bbbd0255acde8b4b62d5558a025b83a02 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 11 六月 2025 17:18:27 +0800
Subject: [PATCH] 10263 【越南】【BT】增加后台执行命令清除本服榜单某个玩家ID数据: ClearBillboardData

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py |  528 ++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 349 insertions(+), 179 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
index b97f0b2..6be7dd4 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
@@ -18,6 +18,7 @@
 import ShareDefine
 import DataRecordPack
 import PlayerCompensation
+import PlayerDBGSEvent
 import PlayerBillboard
 import IpyGameDataPY
 import GameWorld
@@ -26,9 +27,12 @@
 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)
     
@@ -43,137 +47,205 @@
 
 def OnActEnd(actNum, ipyData, dayIndex):
     ## 活动结束
-    OnGiveFamilyOrderAwawrd(actNum, ipyData, dayIndex)
     cfgID = ipyData.GetCfgID() if ipyData else 0
-    # 发放排行奖励
-    GameWorld.Log("=== boss历练活动结束!发放本服个人榜单奖励! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
-    if not cfgID:
-        return
-    BillboardType = ShareDefine.Def_BT_BossTrialSubmit
-    billBoard = GameWorld.GetBillboard().FindBillboard(BillboardType)
-    if not billBoard:
-        return
-    templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex)
-    if not templateID:
-        GameWorld.Log("本次活动没有个人榜奖励!")
-        return
-    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID)
-    if not tempIpyDataList:
-        return
+    GameWorld.Log("=== boss历练活动结束! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
     
-    rankAwardDict = {}
-    for tempIpyData in tempIpyDataList:
-        rankAwardDict[tempIpyData.GetRank()] = tempIpyData.GetAwardItemList()
-        
-    GameWorld.Log("    templateID=%s,rankAwardDict=%s" % (templateID, rankAwardDict))
-    billBoard.Sort()
-    for index in xrange(billBoard.GetCount()):
-        billBoardData = billBoard.At(index)
-        if not billBoardData:
-            continue
-        
-        rank = index + 1
-        
-        awardItemList = GameWorld.GetOrderValueByDict(rankAwardDict, rank, False)
-        if not awardItemList:
-            break
-        
-        playerID = billBoardData.GetID()
-        name2 = billBoardData.GetName2()
-        cmpValue = billBoardData.GetCmpValue()
-        
-        GameWorld.Log("    发放boss历练个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s" 
-                      % (rank, playerID, cmpValue, awardItemList, name2))
-        
-        PlayerCompensation.SendMailByKey("BossTrialMail10", [playerID], awardItemList, [rank])
-        
-    DataRecordPack.DR_BillboardData(BillboardType, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex, "templateID":templateID})
-    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitBak, BillboardType)
-    PlayerBillboard.ClearBillboardByIndex(BillboardType)
+    __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 OnGiveFamilyOrderAwawrd(actNum, ipyData, dayIndex):
-    cfgID = ipyData.GetCfgID() if ipyData else 0
-    # 发放排行奖励
-    GameWorld.Log("=== boss历练活动结束!发放本服仙盟榜单奖励! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
-    if not cfgID:
+def OnActInStateRefresh(actNum, ipyData, dayIndex):
+    ## 活动中刷新,每次都需要刷新的逻辑,包含重读配置等
+    if not ipyData:
         return
-    BillboardType = ShareDefine.Def_BT_BossTrialSubmitFamily
-    billBoard = GameWorld.GetBillboard().FindBillboard(BillboardType)
+    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
-    templateIDList = ipyData.GetFamilyTemplateIDList()
-    templateID = templateIDList[-1] if dayIndex >= len(templateIDList) else templateIDList[dayIndex]
     if not templateID:
-        GameWorld.Log("本次活动没有仙盟榜奖励!")
+        GameWorld.Log("本次活动没有个人榜奖励!")
         return
-    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID)
-    if not tempIpyDataList:
-        return
-    
-    rankAwardDict = {}
-    for tempIpyData in tempIpyDataList:
-        rankAwardDict[tempIpyData.GetRank()] = [tempIpyData.GetAwardItemList(), tempIpyData.GetMemAwardItemList()]
-        
-    GameWorld.Log("    templateID=%s,rankAwardDict=%s" % (templateID, rankAwardDict))
+    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()
-    for index in xrange(billBoard.GetCount()):
-        billBoardData = billBoard.At(index)
-        if not billBoardData:
-            continue
+    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
         
-        familyRank = index + 1
-        awardInfo = GameWorld.GetOrderValueByDict(rankAwardDict, familyRank, False)
-        if not awardInfo:
-            break
-        leaderAwardItemList, memAwardItemList = awardInfo
-                
-        familyID = billBoardData.GetID()
-        cmpValue = billBoardData.GetCmpValue()
-        
-        family = familyManager.FindFamily(familyID)
-        if not family:
-            continue
-        
-        familyActionData = GetFamilyBossTrialSubmitActionData(familyID, False)
-        if not familyActionData:
-            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:
+        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
-            awardMemIDList.append(memPlayerID)
             
-        paramList = [familyRank]
-        if not leaderAwardItemList:
-            awardMemIDList.append(leaderID)
-        else:
-            PlayerCompensation.SendMailByKey("BossTrialFamilyLeader", [leaderID], leaderAwardItemList, paramList)
+            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)
             
-        PlayerCompensation.SendMailByKey("BossTrialFamilyMember", awardMemIDList, memAwardItemList, paramList)
-        GameWorld.Log("发放boss历练活动仙盟榜单奖励本服: familyID=%s,名次=%s,总提交个数=%s,updAwardState=%s,awardMemIDList=%s,memSubCountDict=%s" 
-                      % (familyID, familyRank, cmpValue, updAwardState, awardMemIDList, memSubCountDict))
-        
-    DataRecordPack.DR_BillboardData(BillboardType, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex, "templateID":templateID})
-    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitFamilyBak, BillboardType)
-    PlayerBillboard.ClearBillboardByIndex(BillboardType)
-    GameWorld.Log("=================================================================================")
+            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):
@@ -199,6 +271,8 @@
     accID = curPlayer.GetAccID()
     playerName = curPlayer.GetName()
     job = curPlayer.GetJob()
+    face = curPlayer.GetFace()
+    facePic = curPlayer.GetFacePic()
     realmLV = curPlayer.GetOfficialRank()
     familyID = curPlayer.GetFamilyID()
     submitCount, updSubmitCount = dataMsg
@@ -214,7 +288,7 @@
         
     #同步跨服
     playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV,
-                  "playerSubmitTotal":updSubmitCount}
+                  "playerSubmitTotal":updSubmitCount, "face":face, "facePic":facePic}
     SyncBossTrialSubmitToCrossServer(curPlayer, playerInfo, familyBillInfo)
     return
 
@@ -322,6 +396,7 @@
         
         familyActionData = GetFamilyBossTrialSubmitActionData(familyID, False)
         if not familyActionData:
+            GameWorld.ErrLog("该仙盟没有提交凭证ActionData! familyID=%s" % familyID)
             continue
         awardState = GetFamilyAwardState(familyActionData)
         awardIndex = 1 #跨服奖励状态索引
@@ -368,27 +443,41 @@
     if not actInfo or not actInfo[ShareDefine.ActKey_State]:
         GameWorld.ErrLog("跨服boss历练非活动中,无法提交! cfgID=%s, zoneID=%s" % (cfgID, zoneID))
         return
-    if not actInfo[ShareDefine.ActKey_StateJoin]:
+    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 = ipyData.GetRankLimitList()
-    
+    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"]
+    face = playerInfo.get("face", 0)
+    facePic = playerInfo.get("facePic", 0)
     
     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)
+                                         name2, type2, value1, value2, playerSubmitTotal, value3=face, value4=facePic)
         
     if familyInfo and familyInfo.get("familySubmitTotal", 0) >= familyLimit:
         familySubmitTotal = familyInfo["familySubmitTotal"]
@@ -396,107 +485,187 @@
         
     return
 
-def OnCrossActIDChange(cfgID, state):
-    ## 活动ID变更
-    
-    # 先结算活动
-    zoneID = 0
-    ipyData = IpyGameDataPY.GetIpyGameData("CrossActBossTrial", cfgID)
-    if ipyData:
-        zoneID = ipyData.GetZoneID()
-        
-        PersonalTemplateID = ipyData.GetPersonalTemplateID()
-        FamilyTemplateID = ipyData.GetFamilyTemplateID()
-        
-        if PersonalTemplateID:
-            __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID)
-            
-        if FamilyTemplateID:
-            __GiveCrossOrderAwardFamily(cfgID, zoneID, FamilyTemplateID)
-            
-    # 如果有新活动,处理新活动
-    if not state:
-        return
-    
-    if zoneID:
-        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() # 新活动重置榜单数据
-        
+def OnCrossActIDChange(cfgID, zoneID, ipyData, state):
+    ## 跨服活动ID变更
+    if state:
+        OnCrossActStart(cfgID, zoneID, ipyData)
+    else:
+        OnCrossActEnd(cfgID, zoneID, ipyData)
     return
+
+def OnCrossActStart(cfgID, zoneID, ipyData):
+    ## 跨服活动开启
     
-def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID):
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAwardC % zoneID, 0)
     
     groupValue1 = zoneID
-    billboardType = ShareDefine.Def_CBT_BossTrialSubmit
+    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,cfgID=%s,zoneID=%s,templateID=%s" % (billboardType, cfgID, zoneID, templateID))
+        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,cfgID=%s,zoneID=%s,templateID=%s,billboardDataCount=%s" 
-                  % (billboardType, cfgID, zoneID, templateID, billboardDataCount))
+    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
-        orderCount = 0
         
         for index in xrange(billboardIndex, billboardDataCount):
-            if orderCount >= orderCountTotal:
+            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
             
-            playerRank = index + 1
-            GameWorld.Log("    发放boss历练个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s" 
-                          % (rank, playerID, cmpValue, awardItemList, name2))
-            PlayerCompensation.SendMailByKey("BossTrialCrossPlayer", [playerID], awardItemList, [playerRank], crossMail=True)
+            awardItemExList = []
+            for scoreEx in scoreAwardExList:
+                if cmpValue < scoreEx:
+                    break
+                awardItemExList = scoreAwardEx[scoreEx] # 取最大满足条件的一档
+            finalAwardItemList = awardItemList + awardItemExList
             
-            orderCount += 1
+            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
             
-    # 结算完备份、清除榜单数据
-    CrossBillboard.CopyBillboard(billboardType, ShareDefine.Def_CBT_BossTrialSubmitBak)
-    billboardObj.ClearData()
+            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):
+def __GiveCrossOrderAwardFamily(cfgID, zoneID, templateID, billboardType):
     
     groupValue1 = zoneID
-    billboardType = ShareDefine.Def_CBT_BossTrialSubmitFamily
+    #billboardType = ShareDefine.Def_CBT_BossTrialSubmitFamily
     billboardMgr = PyDataManager.GetCrossBillboardManager()
     billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1)
     billboardDataCount = billboardObj.GetCount()
     if not billboardDataCount:
-        GameWorld.Log("跨服Boss凭证仙盟排行数据为空! billboardType=%s,cfgID=%s,zoneID=%s,templateID=%s" % (billboardType, cfgID, zoneID, templateID))
+        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,cfgID=%s,zoneID=%s,templateID=%s,billboardDataCount=%s" 
-                  % (billboardType, cfgID, zoneID, templateID, billboardDataCount))
+    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:
@@ -507,32 +676,33 @@
     billboardIndex = 0
     for ipyData in orderIpyDataList:
         rank = ipyData.GetRank()
+        needScore = ipyData.GetNeedScore()
         leaderAwardItemList = ipyData.GetAwardItemList()
         memAwardItemList = ipyData.GetMemAwardItemList()
         orderCountTotal = rank - rankPre # 奖励名次数量
         rankPre = rank
-        orderCount = 0
         
         for index in xrange(billboardIndex, billboardDataCount):
-            if orderCount >= orderCountTotal:
+            if orderCountTotal <= 0:
                 break
             
             billboardData = billboardObj.At(index)
             familyID = billboardData.ID
             familySubmitTotal = billboardData.CmpValue
             
-            familyRank = index + 1
-            GameWorld.Log("    familyID=%s,名次=%s,总提交个数=%s" % (familyID, familyRank, familySubmitTotal))
+            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])
-            orderCount += 1
+            
+            orderCountTotal -= 1
             billboardIndex += 1
             
     # 广播子服发放奖励
     sendMsg = {"cfgID":cfgID, "zoneID":zoneID, "templateID":templateID, "awardFamilyList":awardFamilyList}
     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossTrialFamilyAward, sendMsg)
-    
-    # 结算完备份、清除榜单数据
-    CrossBillboard.CopyBillboard(billboardType, ShareDefine.Def_CBT_BossTrialSubmitFamilyBak)
-    billboardObj.ClearData()
     return
 

--
Gitblit v1.8.0