From ee4705284b8064b4f3964dfd13c22386b7d5c20f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 26 二月 2025 15:48:24 +0800
Subject: [PATCH] 10407 【越南】【英语】【BT】【GM】【砍树】周末BUG汇总(修复排行榜功能开启时同步开服活动榜数据异常bug;)

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py |  227 +++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 165 insertions(+), 62 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py
index 2e1255d..2c7442c 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py
@@ -26,10 +26,18 @@
 import CrossBillboard
 import PyDataManager
 import CrossRealmMsg
+import GameXiangong
+import GameWorship
 import GameWorld
 
-def OnActStart(actNum):
+def OnActStart(actNum, ipyData):
     ## 活动开启
+    if not ipyData:
+        return
+    personalTemplateID = ipyData.GetPersonalTemplateID()
+    if not personalTemplateID:
+        GameWorld.DebugLog("古宝养成活动没有榜单奖励,不处理OnActStart! actNum=%s" % (actNum))
+        return
     PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActGubaoAward % actNum, 0)
     PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_GubaoScore)
     return
@@ -44,6 +52,20 @@
     GameWorld.Log("=================================================================================")
     return
 
+def OnActInStateRefresh(actNum, ipyData):
+    ## 活动中刷新,每次都需要刷新的逻辑,包含重读配置等
+    if not ipyData:
+        return
+    personalTemplateID = ipyData.GetPersonalTemplateID()
+    if not personalTemplateID:
+        return
+    orderRuleList = GetOrderRuleList(personalTemplateID)
+    
+    billboardMgr = PlayerBillboard.GetBillboardMgr()
+    billboardObj = billboardMgr.GetBillboardObj(ShareDefine.Def_BT_GubaoScore)
+    billboardObj.SetOrderRuleList(orderRuleList)
+    return
+
 def OnActJoinEnd(actNum, ipyData, dayIndex):
     ## 活动参与结束
     __OnEndAward(actNum, ipyData, dayIndex)
@@ -54,6 +76,10 @@
     if not ipyData:
         return
     cfgID = ipyData.GetCfgID()
+    personalTemplateID = ipyData.GetPersonalTemplateID()
+    if not personalTemplateID:
+        GameWorld.DebugLog("古宝养成活动没有榜单奖励,不结算榜单奖励! actNum=%s" % (actNum))
+        return
     awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActGubaoAward % actNum)
     if awardState:
         #已经结算过该活动
@@ -76,36 +102,55 @@
     if not templateID:
         GameWorld.Log("本次活动没有个人榜奖励!")
         return
-    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", templateID)
-    if not tempIpyDataList:
+    billboardDataCount = billBoard.GetCount()
+    billBoard.Sort()
+    
+    GameWorld.Log("结算个人榜单奖励: billboardType=%s,templateID=%s,billboardDataCount=%s" % (billboardType, templateID, billboardDataCount))
+    
+    orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", templateID)
+    if not orderIpyDataList:
         return
     
-    rankAwardDict = {}
-    for tempIpyData in tempIpyDataList:
-        rankAwardDict[tempIpyData.GetRank()] = tempIpyData.GetAwardItemList()
+    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
         
-    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("    发放古宝养成个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s" 
-                      % (rank, playerID, cmpValue, awardItemList, name2))
-        
-        PlayerCompensation.SendMailByKey("ActGubaoPlayer", [playerID], awardItemList, [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("    发放古宝养成个人榜单奖励: 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("ActGubaoPlayer", [playerID], finalAwardItemList, [playerRank])
+            
+            orderCountTotal -= 1
+            billboardIndex += 1
+            
     return
 
 def MapServer_Gubao(curPlayer, msgList):
@@ -131,13 +176,18 @@
     accID = curPlayer.GetAccID()
     playerName = curPlayer.GetName()
     job = curPlayer.GetJob()
+    face = curPlayer.GetFace()
+    facePic = curPlayer.GetFacePic()
     realmLV = curPlayer.GetOfficialRank()
-    _, updScore = dataMsg
+    _, updScore, isRelationCrossAct = dataMsg
     
-    #同步跨服
-    playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV,
-                  "playerScore":updScore}
-    SyncGubaoToCrossServer(curPlayer, playerInfo)
+    # 仙盟榜...
+    
+    if isRelationCrossAct:
+        #同步跨服
+        playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV,
+                      "playerScore":updScore, "face":face, "facePic":facePic}
+        SyncGubaoToCrossServer(curPlayer, playerInfo)
     return
 
 def SyncGubaoToCrossServer(curPlayer, playerInfo):
@@ -175,7 +225,12 @@
     ipyData = IpyGameDataPY.GetIpyGameData("CrossActGubao", cfgID)
     if not ipyData:
         return
-    personlLimit = ipyData.GetRankLimitPersonal()
+    PersonalTemplateID = ipyData.GetPersonalTemplateID()
+    rankIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", PersonalTemplateID)
+    if not rankIpyDataList:
+        return
+    lastRankIpyData = rankIpyDataList[-1] # 取最后一个为最低上榜积分限制
+    personlLimit = lastRankIpyData.GetNeedScore()
     
     playerID = playerInfo["playerID"]
     playerName = playerInfo["playerName"]
@@ -183,13 +238,15 @@
     accID = playerInfo["accID"]
     realmLV = playerInfo["realmLV"]
     playerScore = playerInfo["playerScore"]
+    face = playerInfo.get("face", 0)
+    facePic = playerInfo.get("facePic", 0)
     
     groupValue1 = zoneID
     
     if playerScore >= personlLimit:
         name2, type2, value1, value2 = accID, job, realmLV, 0
         CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_GubaoScore, groupValue1, playerID, playerName, 
-                                         name2, type2, value1, value2, playerScore)
+                                         name2, type2, value1, value2, playerScore, autoSort=False, value3=face, value4=facePic)
     return
 
 def OnCrossActIDChange(cfgID, zoneID, ipyData, state):
@@ -226,6 +283,28 @@
     GameWorld.Log("=================================================================================")
     return
 
+def OnCrossActInStateRefresh(cfgID, zoneID, ipyData):
+    ## 活动中刷新,每次都需要刷新的逻辑,包含重读配置等
+    if not ipyData:
+        return
+    PersonalTemplateID = ipyData.GetPersonalTemplateID()
+    orderRuleList = GetOrderRuleList(PersonalTemplateID)
+    
+    groupValue1 = zoneID
+    billboardMgr = PyDataManager.GetCrossBillboardManager()
+    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_GubaoScore, groupValue1)
+    billboardObj.SetOrderRuleList(orderRuleList)
+    return
+
+def GetOrderRuleList(templateID):
+    orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", 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)
@@ -243,12 +322,13 @@
     GameWorld.Log("=== 跨服古宝养成活动发放榜单奖励! === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
     
     PersonalTemplateID = ipyData.GetPersonalTemplateID()
+    serverIDRangeList = ipyData.GetServerIDRangeList()
     
-    __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_GubaoScore)
+    __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_GubaoScore, serverIDRangeList)
     GameWorld.Log("=================================================================================")
     return
     
-def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID, billboardType):
+def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID, billboardType, serverIDRangeList):
     
     groupValue1 = zoneID
     billboardMgr = PyDataManager.GetCrossBillboardManager()
@@ -266,32 +346,55 @@
                   % (billboardType, zoneID, cfgID, templateID, billboardDataCount))
     
     orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", templateID)
-    if orderIpyDataList:
-        rankPre = 0
-        billboardIndex = 0
-        for ipyData in orderIpyDataList:
-            rank = ipyData.GetRank()
-            awardItemList = ipyData.GetAwardItemList()
-            orderCountTotal = rank - rankPre # 奖励名次数量
-            rankPre = rank
-            orderCount = 0
+    if not orderIpyDataList:
+        return
+    
+    worshipType = ShareDefine.Def_WorshipType_CrossGubaoTrain
+    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
             
-            for index in xrange(billboardIndex, billboardDataCount):
-                if orderCount >= orderCountTotal:
+            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
-                
-                billboardData = billboardObj.At(index)
-                playerID = billboardData.ID
-                name2 = billboardData.Name2
-                cmpValue = billboardData.CmpValue
-                
-                playerRank = index + 1
-                GameWorld.Log("    发放古宝养成个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s" 
-                              % (rank, playerID, cmpValue, awardItemList, name2))
-                PlayerCompensation.SendMailByKey("ActGubaoCrossPlayer", [playerID], awardItemList, [playerRank], crossMail=True)
-                
-                orderCount += 1
-                billboardIndex += 1
-                
+                awardItemExList = scoreAwardEx[scoreEx] # 取最大满足条件的一档
+            finalAwardItemList = awardItemList + awardItemExList
+            
+            playerRank = rank - orderCountTotal + 1
+            GameWorld.Log("    发放古宝养成个人榜单奖励: 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("ActGubaoCrossPlayer", [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
 

--
Gitblit v1.8.0