From 63f6f44ec2a38eaec9f39bbe26edb07daed49b49 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 16 九月 2025 17:36:50 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(王元姬技能,弹射待处理;支持被动变更伤害倍值;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py |  100 +++++++++++++++++++++++++++++++-------------------
 1 files changed, 62 insertions(+), 38 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
index 4db9ac3..6d4e4b1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
@@ -29,6 +29,7 @@
 import PlayerActYunshi
 import PlayerActTask
 import ItemCommon
+import PlayerHero
 import ChConfig
 
 import random
@@ -45,11 +46,6 @@
 TreasureType_HeroComm = 11 # 英雄招募 - 普通
 TreasureType_HeroHigh = 12 # 英雄招募 - 高级
 TreasureType_HeroScore = 13 # 英雄招募 - 积分
-
-def DoTreasureOpen(curPlayer):
-    ## 寻宝开启
-    Sync_TreasureInfo(curPlayer)
-    return
 
 def OnTreasureLogin(curPlayer):
     Sync_TreasureInfo(curPlayer)
@@ -218,19 +214,16 @@
         GameWorld.ErrLog("找不到该等级对应寻宝库配置!treasureType=%s,curLV=%s" % (treasureType, curPlayer.GetLV()), playerID)
         return
     
-    luckyItemRateList = ipyData.GetLuckyItemRateList()
-    luckyGridNumList = []
-    if luckyItemRateList:
-        for _, gridNum in luckyItemRateList:
-            luckyGridNumList.append(gridNum)
-    elif setIpyData.GetLuckyGridNum():
-        luckyGridNumList = [setIpyData.GetLuckyGridNum()]
-    GameWorld.DebugLog("luckyGridNumList=%s, %s" % (luckyGridNumList, luckyItemRateList), playerID)
+    setLuckyGridNum = setIpyData.GetLuckyGridNum() # 标的格子
+    luckyItemRateInfo = ipyData.GetLuckyItemRateInfo()
+    luckyItemRateDict = {int(k):v for k, v in luckyItemRateInfo.items()}
+    luckyValueList = sorted(luckyItemRateDict.keys())
+    luckyGridNumList = [] # 幸运格子编号列表
     luckFormula = setIpyData.GetLuckyRateFormat() # 幸运物品概率公式
     addLuck = setIpyData.GetOnceLucky() # 增加幸运值
-    maxLuck = setIpyData.GetFullLucky() # 满幸运值
-    curLuck = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (treasureType)) # 当前幸运值
-    updLuck = curLuck
+    maxLuck = max(luckyValueList) if luckyValueList else 0 # 满幸运值
+    updLuck = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureLuck % (treasureType)) # 当前幸运值
+    GameWorld.DebugLog("updLuck=%s,maxLuck=%s,setLuckyGridNum=%s,luckyItemRateDict=%s" % (updLuck, maxLuck, setLuckyGridNum, luckyItemRateDict), playerID)
     
     curTreasureCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureCount % (treasureType)) # 当前已寻宝次数
     updTreasureCount = curTreasureCount
@@ -253,41 +246,43 @@
     getGridResult = []
     for tIndex in range(treasureCount):
         updLuck = min(updLuck + addLuck, maxLuck)
+        stageLuck, luckItemRateList = __getLuckyRateInfo(updLuck, luckyItemRateDict, luckyValueList)
+        luckyGridNumList = []
+        for _, gridNum in luckItemRateList:
+            luckyGridNumList.append(gridNum)
+            
         updTreasureCount += 1
-        GameWorld.DebugLog("%s,累计次数=%s,幸运=%s" % (tIndex + 1, updTreasureCount, updLuck), playerID)
+        GameWorld.DebugLog("%s,累计次数=%s,幸运=%s,阶段幸运=%s,幸运饼图=%s" % (tIndex + 1, updTreasureCount, updLuck, stageLuck, luckItemRateList), playerID)
         if gridNumMaxLimitInfo:
             GameWorld.DebugLog("    gridNumMaxLimitInfo=%s,gridNumCountInfo=%s" % (gridNumMaxLimitInfo, gridNumCountInfo), playerID)
         baseRateList, commItemRateList = GetUpdLuckyItemRateList(ipyData, luckyGridNumList, updLuck, luckFormula, costType) # 常规产出物品格子饼图,幸运物品概率已变更
         commItemRateList = GetRemoveLimitGridRateList(commItemRateList, gridNumCountInfo, gridNumMaxLimitInfo)        
-        GameWorld.DebugLog("    基础饼图=%s" % baseRateList, playerID)
-        GameWorld.DebugLog("    常规饼图=%s" % commItemRateList, playerID)
+        GameWorld.DebugLog("    基础产出饼图=%s" % baseRateList, playerID)
         
         curRateList = [] # 可能会改变饼图,每次抽奖使用新的饼图对象,不要改变配置的饼图概率
         
         # 满幸运必出
-        if maxLuck and updLuck >= maxLuck and luckyGridNumList:
-            if luckyItemRateList:
-                curRateList = GetRemoveLimitGridRateList(luckyItemRateList, gridNumCountInfo, gridNumMaxLimitInfo)
-            else:
-                curRateList = GetRemoveLimitGridRateList([(10000, luckyGridNumList[0])], gridNumCountInfo, gridNumMaxLimitInfo)
-            GameWorld.DebugLog("    【满幸运饼图】: %s" % curRateList)
+        if stageLuck and updLuck >= stageLuck and luckItemRateList:
+            curRateList = GetRemoveLimitGridRateList(luckItemRateList, gridNumCountInfo, gridNumMaxLimitInfo)
+            GameWorld.DebugLog("    【满幸运必出饼图】: %s" % curRateList, playerID)
             
         # 次数必出
         if not curRateList and updTreasureCount in beSureCountDict:
             besureGridRateList = beSureCountDict[updTreasureCount]
             curRateList = GetRemoveLimitGridRateList(besureGridRateList, gridNumCountInfo, gridNumMaxLimitInfo)
-            GameWorld.DebugLog("    【第%s次数必出饼图】: %s" % (updTreasureCount, curRateList))
+            GameWorld.DebugLog("    【第%s次数必出饼图】: %s" % (updTreasureCount, curRateList), playerID)
             
         # 满次数必出
         if not curRateList and ensureCount and updTreasureCount % ensureCount == 0 and ensureRateList:
             curRateList = GetRemoveLimitGridRateList(ensureRateList, gridNumCountInfo, gridNumMaxLimitInfo)
-            GameWorld.DebugLog("    【满%s次数必出饼图】: %s" % (ensureCount, curRateList))
+            GameWorld.DebugLog("    【满%s次数必出饼图】: %s" % (ensureCount, curRateList), playerID)
             
         doCount = 0
         while doCount <= 50: # 限制最大次数
             doCount += 1
             if doCount > 1 or not curRateList: # 重新随机的默认使用常规饼图
                 curRateList = commItemRateList
+                GameWorld.DebugLog("    使用常规饼图=%s" % curRateList, playerID)
                 
             gridNum = GameWorld.GetResultByRandomList(curRateList)
             if gridNum in luckyGridNumList and gridNum in getGridResult:
@@ -302,8 +297,11 @@
             getGridResult.append(gridNum)
             GameWorld.DebugLog("    本次产出: gridNum=%s, %s" % (gridNum, getGridResult), playerID)
             if gridNum in luckyGridNumList:
-                updLuck = 0
-                GameWorld.DebugLog("    【产出幸运格子】: gridNum=%s" % (gridNum), playerID)
+                if gridNum == setLuckyGridNum or updLuck >= maxLuck:
+                    updLuck = 0
+                else:
+                    updLuck = stageLuck # 直接切换到下一阶段幸运
+                GameWorld.DebugLog("    【产出幸运格子】: gridNum=%s,updLuck=%s" % (gridNum, updLuck), playerID)
             if gridNum in gridNumCountInfo:
                 gridNumCountInfo[gridNum] = gridNumCountInfo[gridNum] + 1
                 GameWorld.DebugLog("    【更新产出次数】: gridNum=%s, %s" % (gridNum, gridNumCountInfo), playerID)
@@ -336,9 +334,7 @@
                 canRandItemList = []
                 randItemIDList = randItemIDDict[itemID]
                 for randItemID in randItemIDList:
-                    itemData = GameWorld.GetGameData().GetItemByTypeID(randItemID)
-                    if itemData.GetType() == ChConfig.Def_ItemType_Rune and not PlayerRune.GetIsOpenByRuneID(curPlayer, randItemID):
-                        GameWorld.DebugLog("未解锁的符印不产出!itemID=%s,randItemID=%s" % (itemID, randItemID), playerID)
+                    if not __checkItemCanTreasure(curPlayer, treasureType, randItemID):
                         continue
                     canRandItemList.append(randItemID)
                 if not canRandItemList:
@@ -355,8 +351,9 @@
             itemWeightList = []
             for libItem in libItemList:
                 itemWeight, itemID, itemCount = libItem.GetItemWeight(), libItem.GetItemID(), libItem.GetItemCount()
-                itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
-                if not itemData:
+                if not itemWeight:
+                    continue
+                if not __checkItemCanTreasure(curPlayer, treasureType, itemID):
                     continue
                 itemWeightList.append([itemWeight, [itemID, itemCount]])
             if not itemWeightList:
@@ -388,10 +385,6 @@
     # 加数据
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCountToday % (treasureType), updTreasureCountToday)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCount % (treasureType), updTreasureCount)
-    for luckyGridNum in luckyGridNumList:
-        if luckyGridNum in getGridResult:
-            updLuck = 0
-            break
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureLuck % (treasureType), updLuck)
     for gridNum, updCount in gridNumCountInfo.items():
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureGridCnt % (treasureType, gridNum), updCount)
@@ -453,6 +446,37 @@
     Sync_TreasureInfo(curPlayer, [treasureType])
     return
 
+def __getLuckyRateInfo(curLuck, luckyItemRateDict, luckyValueList):
+    if not luckyItemRateDict or not luckyValueList:
+        return 0, []
+    for luck in luckyValueList:
+        if curLuck <= luck:
+            return luck, luckyItemRateDict[luck]
+    lastLuck = luckyValueList[-1]
+    return lastLuck, luckyItemRateDict[lastLuck]
+
+def __checkItemCanTreasure(curPlayer, treasureType, itemID):
+    ## 检查物品ID是否可寻宝产出
+    itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
+    if not itemData:
+        return
+    
+    playerID = curPlayer.GetPlayerID()
+    if itemData.GetType() == ChConfig.Def_ItemType_Hero:
+        heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", itemID)
+        if not heroIpyData:
+            return
+        if heroIpyData.GetRecruitBySelf() and not PlayerHero.GetHeroActivite(curPlayer, itemID):
+            GameWorld.DebugLog("武将未激活不产出!itemID=%s" % itemID, playerID)
+            return
+        
+    elif itemData.GetType() == ChConfig.Def_ItemType_Rune:
+        if not PlayerRune.GetIsOpenByRuneID(curPlayer, itemID):
+            GameWorld.DebugLog("未解锁的符印不产出!itemID=%s" % itemID, playerID)
+            return
+        
+    return True
+
 def GetRemoveLimitGridRateList(srcGridNumRateList, gridNumCountInfo, gridNumMaxLimitInfo):
     ## 获取移除限制产出的格子后的饼图列表
     # @param srcGridNumRateList: 原始概率 [(概率, 格子编号), ...]

--
Gitblit v1.8.0