From b3c6d36f5ae851f09a3c2e73494ff19956b06fb0 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 11 四月 2025 16:56:14 +0800
Subject: [PATCH] 10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(跨服仙盟支持;后台查询区服仙盟支持;活动时间流程支持;攻城战主活动功能完整流程:公示、分组、战备、战斗、榜单、竞猜、领奖等;)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py |   92 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 92 insertions(+), 0 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
index d7ad0ea..31bad23 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
@@ -1223,6 +1223,98 @@
     # 找不到的默认取最后一名
     return orderDict[orderList[-1]] if isDefaultLast else defaultValue
 
+def GetActBillboardTempAward(playerID, billID, billRank, awardTemplateID, billValue=None, fmLV=None):
+    '''获取玩家活动榜单领奖奖励
+    @param playerID: 领奖玩家ID
+    @param billID: 上榜ID,不一定是玩家ID,比如仙盟ID
+    @param billRank: 上榜名次
+    @param awardTemplateID: 活动奖励模版ID
+    @param billValue: 榜单上榜值,None时不处理
+    @param fmLV: 活动时的仙盟成员等级,None时不处理
+    '''
+    playerAwardItemList = []
+    if not billRank:
+        return playerAwardItemList
+    ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActBillboardAwardTemp", awardTemplateID)
+    if not ipyDataList:
+        ErrLog("活动榜单奖励模版找不到模版! billID=%s,billRank=%s,awardTemplateID=%s,billValue=%s,fmLV=%s" 
+               % (billID, billRank, awardTemplateID, billValue, fmLV), playerID)
+        return playerAwardItemList
+    
+    for ipyData in ipyDataList:
+        rank = ipyData.GetRank()
+        if billRank > rank:
+            continue
+        needValue = ipyData.GetNeedValue()
+        if needValue and billValue != None and billValue < needValue:
+            continue
+        
+        awardItemList = ipyData.GetAwardItemList()
+        leaderAwardItemList = ipyData.GetLeaderAwardItemList()
+        eliteAwardItemList = ipyData.GetEliteAwardItemList()
+        
+        if fmLV != None and fmLV == IPY_GameServer.fmlLeader and leaderAwardItemList:
+            playerAwardItemList += leaderAwardItemList
+        elif fmLV != None and fmLV > IPY_GameServer.fmlMember and eliteAwardItemList:
+            playerAwardItemList += eliteAwardItemList
+        else:
+            playerAwardItemList += awardItemList
+            
+        valueAwardEx = ipyData.GetValueAwardEx()
+        if valueAwardEx and billValue != None:
+            valueAwardExList = valueAwardEx.keys()
+            valueAwardExList.sort()
+            awardItemExList = []
+            for valueEx in valueAwardExList:
+                if billValue < valueEx:
+                    break
+                awardItemExList = valueAwardEx[valueEx] # 取最大满足条件的一档
+            playerAwardItemList += awardItemExList
+            
+        return playerAwardItemList
+    
+    ErrLog("活动榜单奖励模版找不到奖励! billID=%s,billRank=%s,awardTemplateID=%s,billValue=%s,fmLV=%s" 
+           % (billID, billRank, awardTemplateID, billValue, fmLV), playerID)
+    return playerAwardItemList
+
+def GetActGuessRightRankAwardIDDict(guessTemplateID):
+    ## 获取活动竞猜默认猜中名次对应奖励ID信息
+    # @return: {(名次, ...):awardID, ...} 用于 StatActGuessRet 统计竞猜结果
+    rightRankAwardIDDict = {}
+    guessIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGuess", guessTemplateID)
+    if guessIpyDataList:
+        for ipyData in guessIpyDataList:
+            awardID = ipyData.GetAwardID()
+            rightRankList = ipyData.GetRightRankList()
+            rightRankAwardIDDict[tuple(rightRankList)] = awardID
+    return rightRankAwardIDDict
+
+def StatActGuessRet(playerID, playerGuessIDList, finalRankIDList, rightRankAwardIDDict, statGuessRetDict, actName=""):
+    '''统计活动竞猜结果
+    @param playerID: 参与竞猜的玩家ID
+    @param playerGuessIDList: 玩家竞猜选择的ID顺序列表
+    @param finalRankIDList: 活动最终排名顺序列表
+    @param rightRankAwardIDDict: GetActGuessRightRankAwardIDDict 返回值
+    @param statGuessRetDict: 统计结果 {awardID:[猜中的玩家ID, ...], ...}
+    @param actName: 活动名称,可选参数,输出日志用
+    '''
+    rightRankList = [] # 玩家猜中的名次列表
+    for index, finalID in enumerate(finalRankIDList):
+        rank = index + 1
+        guessID = playerGuessIDList[index] if len(playerGuessIDList) > index else 0
+        if guessID == finalID:
+            rightRankList.append(rank)
+            
+    rightRankTuple = tuple(rightRankList)
+    awardID = rightRankAwardIDDict.get(rightRankTuple, 0)
+    if awardID not in statGuessRetDict:
+        statGuessRetDict[awardID] = []
+    rightPlayerIDList = statGuessRetDict[awardID]
+    rightPlayerIDList.append(playerID)
+    DebugLog("    %s统计玩家竞猜结果: playerID=%s,rightRankTuple=%s,awardID=%s,%s" 
+             % (actName, playerID, rightRankTuple, awardID, len(rightPlayerIDList)))
+    return
+
 ##概率相关, 这个事件是否能够出现
 # @param rate 基础几率
 # @param maxRate 最大几率

--
Gitblit v1.8.0