From 7a88478e06c7384d90b6808a317a1dbc2bb98710 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 19 一月 2026 19:27:06 +0800
Subject: [PATCH] 423 【内政】命格系统-服务端(命格额外属性条数修改为由感悟层级决定;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py |  128 +++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 125 insertions(+), 3 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
index b83966e..427b682 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
@@ -94,7 +94,8 @@
     if PyGameData.AutoTransformCountItemIDList:
         GameWorld.Log("自动转化为物品个数的物品ID列表: %s" % PyGameData.AutoTransformCountItemIDList)
     GameWorld.Log("货币类型1个数量对应物品ID: %s" % PyGameData.MoneyItemIDDict)
-    
+    if not PyGameData.MoneyItemIDDict:
+        GameWorld.SendGameErrorEx("InitPyItemError", "启动加载物品数据异常! itemCount=%s" % gameData.GetItemCount())
     PyGameData.InitPyItem = True
     return
 
@@ -321,7 +322,7 @@
     @param isAuctionItem: 是否拍品,默认非拍品
     @param expireTime: 有效时间,时间单位由时效类型决定
     '''
-    if itemCount < 1:
+    if itemCount < 1 or not itemID:
         GameWorld.ErrLog("创建物品个数不能少于1! itemID=%s,itemCount=%s" % (itemID, itemCount))
         return
     curSingleItem = GameWorld.GetItemFactory().CreateItem(itemID)
@@ -376,6 +377,11 @@
         if setAttrDict == None:
             curSingleItem.Clear()
             return
+    elif GetIsMGGuayu(curSingleItem):
+        setAttrDict = GetCreateMGGuayuAttr(curSingleItem, curPlayer, setAttrDict)
+        if setAttrDict == None:
+            curSingleItem.Clear()
+            return
     AddCreateItemAttr(curSingleItem, setAttrDict)
     
     #这里返回的是SingleItem , 如果创建了,未使用,会找出C++内存泄露!!!
@@ -416,7 +422,7 @@
     @param curPlayer: 可能为None
     @param setAttrDict: 直接设置物品的属性 {key:value, ...} key支持  ShareDefine.Def_IudetXXX字符串 或 自定key
     @return: None - 异常情况,物品实例需要clear
-            equipAttrDict - 生成后的最新属性k:v字典,可直接用于 SetCreateEquipAttr
+            equipAttrDict - 生成后的最新属性k:v字典,可直接用于 AddCreateItemAttr
     '''
     if setAttrDict == None:
         setAttrDict = {}
@@ -544,6 +550,118 @@
         GameWorld.DebugLog("    legendAttrIDList=%s,legendAttrValueList=%s" % (legendAttrIDList, legendAttrValueList), playerID)
         
     GameWorld.DebugLog("    装备最终属性: equipAttrDict=%s,setAttrDict=%s" % (equipAttrDict, setAttrDict), playerID)
+    return equipAttrDict
+
+def GetCreateMGGuayuAttr(curItem, curPlayer=None, setAttrDict=None):
+    '''获取生成命格卦玉所有属性
+    @param curPlayer: 可能为None
+    @param setAttrDict: 直接设置物品的属性 {key:value, ...} key支持  ShareDefine.Def_IudetXXX字符串 或 自定key
+    @return: None - 异常情况,物品实例需要clear
+            equipAttrDict - 生成后的最新属性k:v字典,可直接用于 AddCreateItemAttr
+    '''
+    if setAttrDict == None:
+        setAttrDict = {}
+    playerID = 0 if not curPlayer else curPlayer.GetPlayerID()
+    itemID = curItem.GetItemTypeID()
+    itemType = curItem.GetType()
+    itemColor = curItem.GetItemColor()
+    equipAttrDict = {}
+        
+    # 定制属性,如有需要可扩展
+    
+    if not curPlayer:
+        return
+    
+    gwLV = max(1, curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MGGanwuLV))
+    gwIpyData = IpyGameDataPY.GetIpyGameData("MGGanwuLV", gwLV)
+    colorIpyData = IpyGameDataPY.GetIpyGameData("MGGuayuQuality", itemColor)
+    typeIpyData = IpyGameDataPY.GetIpyGameData("MGGuayuType", itemType)
+    if not gwIpyData or not colorIpyData or not typeIpyData:
+        return
+    
+    # 四维基础值、加成值
+    baseAttrDict = {ChConfig.AttrID_Atk:[gwIpyData.GetAtkBase(), colorIpyData.GetAtkPlus()],
+                    ChConfig.AttrID_Def:[gwIpyData.GetDefBase(), colorIpyData.GetDefPlus()],
+                    ChConfig.AttrID_MaxHP:[gwIpyData.GetHPBase(), colorIpyData.GetHPPlus()],
+                    ChConfig.AttrID_AtkSpeed:[gwIpyData.GetAtkSpeedBase(), colorIpyData.GetAtkSpeedPlus()],
+                    }
+    batAttrBaseDict = gwIpyData.GetBatAttrBaseDict() # 其他战斗属性基础值字典,{属性ID:基础值, ...}
+    
+    # 四维占比
+    attrProportion = typeIpyData.GetBaseAttrProportion()
+    
+    randfloat = random.uniform # 随机一个ab区间的数 [a, b],ab支持小数
+    
+    itemLV = setAttrDict.get(str(ShareDefine.Def_IudetItemLV), 0)
+    if not itemLV:
+        # 随机等级
+        lowLV, highLV = IpyGameDataPY.GetFuncEvalCfg("MinggeTY", 2)
+        randLVList = range(max(gwLV + lowLV, 1), gwLV + highLV)
+        itemLV = random.choice(randLVList)
+    equipAttrDict[str(ShareDefine.Def_IudetItemLV)] = itemLV
+    
+    GameWorld.DebugLog("生成命格卦玉: gwLV=%s,itemID=%s,itemLV=%s,itemColor=%s,itemType=%s" % (gwLV, itemID, itemLV, itemColor, itemType), playerID)
+    legendAttrIDList = setAttrDict.get(str(ShareDefine.Def_IudetLegendAttrID))
+    legendAttrValueList = setAttrDict.get(str(ShareDefine.Def_IudetLegendAttrValue))
+    if legendAttrIDList != None and legendAttrValueList != None and len(legendAttrIDList) == len(legendAttrValueList):
+        equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = legendAttrIDList
+        equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = legendAttrValueList
+    else:
+        fixedAttrID = typeIpyData.GetFixedAttrID() # 固定属性
+        attrIDLib = typeIpyData.GetAttrIDLib() # 随机属性库
+        libAttrCnt = 0 # 随机属性个数
+        libAttrCntNeedLVList = IpyGameDataPY.GetFuncEvalCfg("MinggeCfg", 1)
+        for needGWLV in libAttrCntNeedLVList:
+            if gwLV >= needGWLV:
+                libAttrCnt += 1
+            else:
+                break
+        attrRangeDefault = colorIpyData.GetAttrRange()
+        attrRangeDict = colorIpyData.GetAttrRangeDict()
+        
+        random.shuffle(attrIDLib)
+        randAttrList = attrIDLib[:libAttrCnt]
+        attrIDList = [fixedAttrID] + randAttrList
+        GameWorld.DebugLog("    attrIDList=%s,libAttrCnt=%s,%s" % (attrIDList, libAttrCnt, attrIDLib), playerID)
+        
+        legendAttrIDList = []
+        legendAttrValueList = []
+        for attrID in attrIDList:
+            
+            # 基础四维计算
+            if attrID in baseAttrDict:
+                baseValue, plusValue = baseAttrDict[attrID]
+                attrValue = eval(IpyGameDataPY.GetFuncCompileCfg("MinggeTY", 3))
+                GameWorld.DebugLog("        attrID=%s,attrValue=%s,baseValue=%s,plusValue=%s,attrProportion=%s" 
+                                   % (attrID, attrValue, baseValue, plusValue, attrProportion), playerID)
+                
+            # 其他战斗属性
+            else:
+                baseValue = batAttrBaseDict.get(attrID, 0)
+                attrRange = attrRangeDict.get(attrID, attrRangeDefault)
+                if not attrRange or len(attrRange) != 2:
+                    continue
+                attrMin, attrMax = attrRange
+                plusValue = random.randint(attrMin, attrMax)
+                attrValue = baseValue + plusValue
+                GameWorld.DebugLog("        attrID=%s,attrValue=%s,baseValue=%s,plusValue=%s,(%s~%s)" % (attrID, attrValue, baseValue, plusValue, attrMin, attrMax), playerID)
+                
+            legendAttrIDList.append(attrID)
+            legendAttrValueList.append(attrValue)
+            
+        if legendAttrIDList:
+            equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = legendAttrIDList
+            equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = legendAttrValueList
+            
+    # 意象技能
+    if itemType in IpyGameDataPY.GetFuncEvalCfg("MinggeTY", 4):
+        yxSkillTypeIDList = IpyGameDataPY.GetFuncEvalCfg("MinggeTY", 5)
+        randSkillTypeID = random.choice(yxSkillTypeIDList) if yxSkillTypeIDList else 0
+        if randSkillTypeID:
+            equipAttrDict[str(ShareDefine.Def_IudetAddSkillID)] = [randSkillTypeID]
+            GameWorld.DebugLog("        itemType=%s,randSkillTypeID=%s" % (itemType, randSkillTypeID), playerID)
+            
+    GameWorld.DebugLog("    卦玉最终属性: equipAttrDict=%s,setAttrDict=%s" % (equipAttrDict, setAttrDict), playerID)
     return equipAttrDict
 
 def SetItemUserData(curItem, dataInfo):
@@ -1782,6 +1900,10 @@
     ## 返回是否神兽装备
     return curItem.GetType() in ChConfig.Def_DogzEquiipType
 
+def GetIsMGGuayu(curItem):
+    ## 是否命格卦玉
+    return curItem.GetType() in ChConfig.Def_MGGuayuType
+
 #---------------------------------------------------------------------
 ##遍历数据库查找合适的物品, 通过 效果ID + 效果A值确定物品
 # @param itemType 物品类型

--
Gitblit v1.8.0