From ba773b0ebfa18e9049234dba5bd16e791067ea84 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 06 一月 2026 16:11:16 +0800
Subject: [PATCH] 271 【内政】古宝系统-服务端(品质等级属性支持;效果层级调整为最大9999;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py |   24 ++++++++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py    |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py      |   31 ++++++++++++++-
 PySysDB/PySysDBPY.h                                                                       |   11 +++++
 4 files changed, 56 insertions(+), 12 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 6e63716..7288ff0 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -937,7 +937,6 @@
 	BYTE		SpecEffLayerMax;	//特殊效果最大层数
 	BYTE		SpecAttrID;	//特殊属性ID
 	DWORD		SpecAttrValue;	//特殊属性初始值
-	DWORD		SpecAttrPerLVAdd;	//特殊属性每级成长
 	DWORD		SpecAttrPerStarAdd;	//特殊属性每星成长
 };
 
@@ -978,6 +977,16 @@
 	list		LVUPNeedItemInfo;	//升级所需物品 [[物品ID,个数], ...]
 };
 
+//品质升级属性表
+
+struct GubaoLVAttr
+{
+	BYTE		_GubaoQuality;	//古宝品质
+	BYTE		_GubaoLV;	//古宝等级
+	list		SpecAttrIDList;	//特殊属性ID列表
+	list		SpecAttrValueList;	//特殊总属性值列表
+};
+
 //红颜表
 
 struct Beauty
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index edb273c..0b200ef 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -5412,7 +5412,7 @@
                   ("GubaoID", c_ushort),    
                   ("GubaoStar", c_ubyte),    
                   ("GubaoLV", c_ubyte),    
-                  ("EffLayer", c_ubyte),    # 该特殊效果累加层值
+                  ("EffLayer", c_ushort),    # 该特殊效果累加层值
                   ]
 
     def __init__(self):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 9f0122e..7ebe0c5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -785,7 +785,6 @@
                         ("BYTE", "SpecEffLayerMax", 0),
                         ("BYTE", "SpecAttrID", 0),
                         ("DWORD", "SpecAttrValue", 0),
-                        ("DWORD", "SpecAttrPerLVAdd", 0),
                         ("DWORD", "SpecAttrPerStarAdd", 0),
                         ),
 
@@ -812,6 +811,13 @@
                         ("BYTE", "GubaoQuality", 1),
                         ("BYTE", "LessEqualLV", 0),
                         ("list", "LVUPNeedItemInfo", 0),
+                        ),
+
+                "GubaoLVAttr":(
+                        ("BYTE", "GubaoQuality", 1),
+                        ("BYTE", "GubaoLV", 1),
+                        ("list", "SpecAttrIDList", 0),
+                        ("list", "SpecAttrValueList", 0),
                         ),
 
                 "Beauty":(
@@ -3339,8 +3345,7 @@
     def GetSpecEffLayerMax(self): return self.attrTuple[8] # 特殊效果最大层数 BYTE
     def GetSpecAttrID(self): return self.attrTuple[9] # 特殊属性ID BYTE
     def GetSpecAttrValue(self): return self.attrTuple[10] # 特殊属性初始值 DWORD
-    def GetSpecAttrPerLVAdd(self): return self.attrTuple[11] # 特殊属性每级成长 DWORD
-    def GetSpecAttrPerStarAdd(self): return self.attrTuple[12] # 特殊属性每星成长 DWORD
+    def GetSpecAttrPerStarAdd(self): return self.attrTuple[11] # 特殊属性每星成长 DWORD
 
 # 古宝共鸣属性表
 class IPY_GubaoResonanceAttr():
@@ -3386,6 +3391,18 @@
     def GetGubaoQuality(self): return self.attrTuple[0] # 古宝品质 BYTE
     def GetLessEqualLV(self): return self.attrTuple[1] # 小于等于等级 BYTE
     def GetLVUPNeedItemInfo(self): return self.attrTuple[2] # 升级所需物品 [[物品ID,个数], ...] list
+
+# 品质升级属性表
+class IPY_GubaoLVAttr():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetGubaoQuality(self): return self.attrTuple[0] # 古宝品质 BYTE
+    def GetGubaoLV(self): return self.attrTuple[1] # 古宝等级 BYTE
+    def GetSpecAttrIDList(self): return self.attrTuple[2] # 特殊属性ID列表 list
+    def GetSpecAttrValueList(self): return self.attrTuple[3] # 特殊总属性值列表 list
 
 # 红颜表
 class IPY_Beauty():
@@ -5721,6 +5738,7 @@
         self.__LoadFileData("GubaoResonance", onlyCheck)
         self.__LoadFileData("GubaoStar", onlyCheck)
         self.__LoadFileData("GubaoLV", onlyCheck)
+        self.__LoadFileData("GubaoLVAttr", onlyCheck)
         self.__LoadFileData("Beauty", onlyCheck)
         self.__LoadFileData("BeautyQualityLV", onlyCheck)
         self.__LoadFileData("BeautySkin", onlyCheck)
@@ -6598,6 +6616,13 @@
         self.CheckLoadData("GubaoLV")
         return self.ipyGubaoLVCache[index]
 
+    def GetGubaoLVAttrCount(self):
+        self.CheckLoadData("GubaoLVAttr")
+        return self.ipyGubaoLVAttrLen
+    def GetGubaoLVAttrByIndex(self, index):
+        self.CheckLoadData("GubaoLVAttr")
+        return self.ipyGubaoLVAttrCache[index]
+
     def GetBeautyCount(self):
         self.CheckLoadData("Beauty")
         return self.ipyBeautyLen
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 b35c897..1114e28 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
@@ -37,7 +37,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
 
@@ -257,6 +257,8 @@
         if not IsGubaoActivated(curPlayer, gubaoID):
             continue
         
+        quality = ipyData.GetGubaoQuality()
+        
         lv, star, layer = GetGubaoInfo(curPlayer, gubaoID)
         gubaoStarDict[gubaoID] = star
         
@@ -275,15 +277,23 @@
         # 特殊属性
         attrID = ipyData.GetSpecAttrID()
         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)
         
     # 共鸣
     for index in range(ipyDataMgr.GetGubaoResonanceCount()):

--
Gitblit v1.8.0