From dbf479ac2d1d2a1587fd9a984ac84a16ad0bb3d6 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 07 一月 2026 12:04:02 +0800
Subject: [PATCH] 271 【内政】古宝系统-服务端(增加特殊效果类型3~6;新增特权效果支持,增加特权效果类型1、2;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py |   74 ++++++++++++++++++++++++++++---------
 1 files changed, 56 insertions(+), 18 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
index a9c21b0..3b63218 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
@@ -25,10 +25,18 @@
 import ItemControler
 import PlayerOnline
 import ChConfig
-import ObjPool
 
+# 特殊效果类型
 GubaoEffType_GoldRush = 1 # 参与淘金
 GubaoEffType_Arena = 2 # 参与演武场
+GubaoEffType_Tianzi = 3 # 每参加1次天子的考验
+GubaoEffType_MainLevelBoss = 4 # 每击败1只主线BOSS
+GubaoEffType_Zhanchui = 5 # 每完成1次白骨盈野
+GubaoEffType_Travel = 6 # 每游历1次(消耗体力)
+
+# 特权效果类型
+GubaoPowerType_TravelMultiRate = 1 # 游历双倍奖励概率
+GubaoPowerType_InvestMonthAwardPer = 2 # 月卡领取额外奖励
 
 def GetGubaoInfo(curPlayer, gubaoID):
     info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoInfo % gubaoID)
@@ -38,7 +46,7 @@
     return lv, star, layer
 def SetGubaoInfo(curPlayer, gubaoID, lv, star, layer):
     ## 特殊效果层*100000 + 等级*100 + 星级
-    info = min(layer, 99) * 100000 + min(lv, 999) * 100 + min(star, 99)
+    info = min(layer, 9999) * 100000 + min(lv, 999) * 100 + min(star, 99)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoInfo % gubaoID, info)
     return
 
@@ -248,6 +256,7 @@
     
     playerID = curPlayer.GetPlayerID()
     attrDict = {}
+    powerDict = {}
     
     gubaoStarDict = {}
     ipyDataMgr = IpyGameDataPY.IPY_Data()
@@ -257,6 +266,8 @@
         
         if not IsGubaoActivated(curPlayer, gubaoID):
             continue
+        
+        quality = ipyData.GetGubaoQuality()
         
         lv, star, layer = GetGubaoInfo(curPlayer, gubaoID)
         gubaoStarDict[gubaoID] = star
@@ -270,22 +281,40 @@
             perStarAdd = BaseAttrPerStarAddList[bIndex]
             attrValue = baseValue + perStarAdd * star
             attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
-        GameWorld.DebugLog("古宝基础属性! gubaoID=%s,star=%s,addAttr=%s,v:%s,perStar:%s,%s" 
-                           % (gubaoID, star, BaseAttrIDList, BaseAttrValueList, BaseAttrPerStarAddList, attrDict), playerID)
+        #GameWorld.DebugLog("古宝基础属性! gubaoID=%s,star=%s,addAttr=%s,v:%s,perStar:%s,%s" 
+        #                   % (gubaoID, star, BaseAttrIDList, BaseAttrValueList, BaseAttrPerStarAddList, attrDict), playerID)
         
         # 特殊属性
         attrID = ipyData.GetSpecAttrID()
-        effType = ipyData.GetSpecEffType()
+        #effType = ipyData.GetSpecEffType()
+        layerMax = ipyData.GetSpecEffLayerMax()
         SpecAttrValue = ipyData.GetSpecAttrValue()
-        SpecAttrPerLVAdd = ipyData.GetSpecAttrPerLVAdd()
         SpecAttrPerStarAdd = ipyData.GetSpecAttrPerStarAdd()
-        attrValue = SpecAttrValue + SpecAttrPerLVAdd *  max(lv - 1, 0) + SpecAttrPerStarAdd * star
-        if effType: # 有特殊效果类型的
-            attrValue *= layer
+        specLVAttr = 0
+        lvAttrIpyData = IpyGameDataPY.GetIpyGameData("GubaoLVAttr", quality, lv)
+        if lvAttrIpyData:
+            specAttrIDList = lvAttrIpyData.GetSpecAttrIDList()
+            specAttrValueList = lvAttrIpyData.GetSpecAttrValueList()
+            for sIndex in range(min(len(specAttrIDList), len(specAttrValueList))):
+                if specAttrIDList[sIndex] == attrID:
+                    specLVAttr = specAttrValueList[sIndex]
+        if not layerMax:
+            layer, layerMax = 1, 1 # 无层级限制的默认1层
+        attrValue = int((SpecAttrValue + SpecAttrPerStarAdd * star + specLVAttr / float(layerMax)) * layer)
         attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
-        GameWorld.DebugLog("古宝特殊属性! gubaoID=%s,lv=%s,star=%s,effType=%s,layer=%s,attrID=%s,v=%s,perLV=%s,perStar=%s,attrValue=%s,%s" 
-                           % (gubaoID, lv, star, effType, layer, attrID, SpecAttrValue, SpecAttrPerLVAdd, SpecAttrPerStarAdd, attrValue, attrDict), playerID)
+        #GameWorld.DebugLog("古宝特殊属性! gubaoID=%s,quality=%s,lv=%s,star=%s,effType=%s,layer=%s/%s,attrID=%s,v=%s,perStar=%s,specLVAttr=%s,attrValue=%s,%s" 
+        #                   % (gubaoID, quality, lv, star, effType, layer, layerMax, attrID, SpecAttrValue, SpecAttrPerStarAdd, specLVAttr, attrValue, attrDict), playerID)
         
+        # 特权
+        powerType = ipyData.GetPowerType()
+        if powerType:
+            powerTypeValue = ipyData.GetPowerTypeValue()
+            powerValue = ipyData.GetPowerValue()
+            powerPerStarAdd = ipyData.GetPowerPerStarAdd()
+            powerValueTotal = powerValue + powerPerStarAdd * star
+            powerKey = (powerType, powerTypeValue)
+            powerDict[powerKey] = powerDict.get(powerKey, 0) + powerValueTotal
+            
     # 共鸣
     for index in range(ipyDataMgr.GetGubaoResonanceCount()):
         ipyData = ipyDataMgr.GetGubaoResonanceByIndex(index)
@@ -308,7 +337,7 @@
             resonanceAttrIpyData = attrIpyData
             
         if not resonanceAttrIpyData:
-            GameWorld.DebugLog("没有古宝共鸣属性! resonanceID=%s,minStar=%s,starList=%s" % (resonanceID, minStar, starList), playerID)
+            #GameWorld.DebugLog("没有古宝共鸣属性! resonanceID=%s,minStar=%s,starList=%s" % (resonanceID, minStar, starList), playerID)
             continue
         
         resonanceAttrIDList = resonanceAttrIpyData.GetResonanceAttrIDList()
@@ -316,14 +345,23 @@
         for i, attrID in enumerate(resonanceAttrIDList):
             attrValue = resonanceAttrValueList[i]
             attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
-        GameWorld.DebugLog("古宝共鸣: resonanceID=%s,resonanceStar=%s,starList=%s,addAttr=%s,%s,%s" 
-                           % (resonanceID, resonanceAttrIpyData.GetResonanceStar(), starList, 
-                              resonanceAttrIDList, resonanceAttrValueList, attrDict), playerID)
+        #GameWorld.DebugLog("古宝共鸣: resonanceID=%s,resonanceStar=%s,starList=%s,addAttr=%s,%s,%s" 
+        #                   % (resonanceID, resonanceAttrIpyData.GetResonanceStar(), starList, 
+        #                      resonanceAttrIDList, resonanceAttrValueList, attrDict), playerID)
         
     # 保存计算值
     GameWorld.DebugLog("古宝属性: %s" % attrDict, playerID)
-    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_Gubao, attrDict)
+    GameWorld.DebugLog("古宝特权: %s" % powerDict, playerID)
+    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_Gubao, attrDict, powerDict)
     return
+
+def GetGubaoPowerValue(curPlayer, powerType, powerTypeValue=0):
+    ## 获取古宝特权值
+    powerDict = PlayerOnline.GetOnlinePlayer(curPlayer).GetCalcSpecInfo(ChConfig.Def_CalcAttr_Gubao)
+    powerKey = (powerType, powerTypeValue)
+    if powerKey not in powerDict:
+        return 0
+    return powerDict[powerKey]
 
 def AddGubaoSpecEffLayer(curPlayer, effType, addLayer):
     ## 增加古宝特殊效果属性层级
@@ -433,7 +471,7 @@
             # 没有指定时只同步激活的
             continue
         lv, star, layer = GetGubaoInfo(curPlayer, gubaoID)
-        gubao = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagMCGubao)
+        gubao = ChPyNetSendPack.tagMCGubao()
         gubao.GubaoID = gubaoID
         gubao.GubaoLV = lv
         gubao.GubaoStar = star
@@ -443,7 +481,7 @@
     if not gubaoInfoList:
         return
     
-    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagMCGubaoInfo)
+    clientPack = ChPyNetSendPack.tagMCGubaoInfo()
     clientPack.GubaoInfoList = gubaoInfoList
     clientPack.Count = len(clientPack.GubaoInfoList)
     NetPackCommon.SendFakePack(curPlayer, clientPack)

--
Gitblit v1.8.0