From dc0b92c1e2fe9f3d24c183b325dad54d088735c1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 10 七月 2025 17:01:24 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_ServerCode

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py |  183 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 181 insertions(+), 2 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 6a80703..a9f3756 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
@@ -24,7 +24,6 @@
 import ChConfig
 import ReadChConfig
 import ShareDefine
-import GameDataControl
 import ItemControler
 import DataRecordPack
 import EventReport
@@ -38,6 +37,7 @@
 import PyGameData
 import ChEquip
 import SkillShell
+import PlayerHero
 import random
 import math
 import time
@@ -309,7 +309,7 @@
     GameWorld.DebugLog("物品过期时间" + timeStr)
     return GameWorld.ChangeTimeStrToNum(timeStr)
 
-def CreateSingleItem(itemID, itemCount=1, isAuctionItem=False, expireTime=0):
+def CreateSingleItem(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, setAttrDict=None):
     ''' 创建物品
     @param isAuctionItem: 是否拍品,默认非拍品
     @param expireTime: 有效时间,时间单位由时效类型决定
@@ -361,8 +361,183 @@
     if expireTime > 0:
         curSingleItem.SetUserAttr(ShareDefine.Def_IudetExpireTime, expireTime)
         
+    # 英雄
+    if curSingleItem.GetType() == ChConfig.Def_ItemType_Hero:
+        PlayerHero.InitHeroItem(curSingleItem)
+    elif GetIsEquip(curSingleItem):
+        setAttrDict = GetCreateEquipAttr(curSingleItem, curPlayer, setAttrDict)
+        if setAttrDict == None:
+            curSingleItem.Clear()
+            return
+    AddCreateItemAttr(curSingleItem, setAttrDict)
+    
     #这里返回的是SingleItem , 如果创建了,未使用,会找出C++内存泄露!!!
     return curSingleItem
+
+def AddCreateItemAttr(curItem, setAttrDict):
+    ## 设置生成装备所有属性
+    if not setAttrDict:
+        return
+    for key, value in setAttrDict.items():
+        key = GameWorld.ToIntDef(key, key)
+        # 需支持
+        # 1. UserData格式: {'19': ['1889', '2034', '893', '927'], '50': ['1702622046'], '17': ['39', '33', '34', '9']}
+        # 2. 自定义字典: {"key":value, ...} key支持自定义或与UserData的key,value支持数值或列表,列表元素支持字符串或数值,均默认转为数值
+        # 数值类型的默认为UserData属性 
+        if isinstance(key, int):
+            if key % 2 == 0: # 偶数是单数值
+                v = 0
+                if isinstance(value, int):
+                    v = value
+                elif (isinstance(value, list) or isinstance(value, tuple)) and value:
+                    v = GameWorld.ToIntDef(value[0], 0)
+                curItem.SetUserAttr(key, v)
+            elif isinstance(value, list) or isinstance(value, tuple): # 单数一定是要列表
+                curItem.ClearUserAttr(key)
+                for v in value:
+                    v = GameWorld.ToIntDef(v, 0)
+                    curItem.AddUserAttr(key, v)
+        # 其他指定字符串类型属性
+        else:
+            GameWorld.Log("###AddCreateItemAttr unknown key:%s, value:%s, itemID=%s" % (key, value, curItem.GetItemTypeID()))
+            
+    #MakeEquipGS(curItem)
+    return
+
+def GetCreateEquipAttr(curItem, curPlayer=None, setAttrDict=None):
+    '''获取生成装备所有属性
+    @param curPlayer: 可能为None
+    @param setAttrDict: 直接设置物品的属性 {key:value, ...} key支持  ShareDefine.Def_IudetXXX字符串 或 自定key
+    @return: None - 异常情况,物品实例需要clear
+            equipAttrDict - 生成后的最新属性k:v字典,可直接用于 SetCreateEquipAttr
+    '''
+    if setAttrDict == None:
+        setAttrDict = {}
+    equipAttrDict = {}
+    playerID = 0 if not curPlayer else curPlayer.GetPlayerID()
+    itemID = curItem.GetItemTypeID()
+    
+    appointID = setAttrDict.get(ShareDefine.Def_CItemKey_AppointID)
+    # 定制属性ID
+    if appointID > 0:
+        ipyData = IpyGameDataPY.GetIpyGameData("AppointItem", appointID)
+        if not ipyData:
+            return
+        if ipyData.GetCancelUseLimit():
+            equipAttrDict[str(ShareDefine.Def_IudetCancelUseLimit)] = 1
+        equipAttrDict[str(ShareDefine.Def_IudetItemLV)] = ipyData.GetItemLV()
+        equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = ipyData.GetBaseAttrID()
+        equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = ipyData.GetBaseAttrValue()
+        equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = ipyData.GetLegendAttrID()
+        equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = ipyData.GetLegendAttrValue()
+        GameWorld.DebugLog("    装备定制属性: itemID=%s,appointID=%s,equipAttrDict=%s,setAttrDict=%s" % (itemID, appointID, equipAttrDict, setAttrDict), playerID)
+        return equipAttrDict
+    
+    # 主线装备
+    if GetIsMainEquip(curItem):
+        return GetCreateMainEquipAttr(curItem, curPlayer, setAttrDict)
+    
+    return equipAttrDict
+    
+def GetCreateMainEquipAttr(curItem, curPlayer, setAttrDict=None):
+    ## 生成主线装备属性
+    
+    equipAttrDict = {}
+    itemID = curItem.GetItemTypeID()
+    itemColor = curItem.GetItemColor()
+    equipPlace = curItem.GetEquipPlace()
+    
+    if not curPlayer:
+        return equipAttrDict
+    
+    colorIpyData = IpyGameDataPY.GetIpyGameData("EquipColor", itemColor)
+    placeIpyData = IpyGameDataPY.GetIpyGameData("EquipPlace", equipPlace)
+    if not colorIpyData or not placeIpyData:
+        return equipAttrDict
+    
+    playerLV = curPlayer.GetLV()
+    playerID = curPlayer.GetPlayerID()
+    randfloat = random.uniform # 随机一个ab区间的数 [a, b],ab支持小数
+    
+    itemLV = setAttrDict.get(str(ShareDefine.Def_IudetItemLV), 0)
+    if not itemLV:
+        # 随机等级
+        lowLV, highLV = IpyGameDataPY.GetFuncEvalCfg("MainEquipDrop", 3)
+        randLVList = range(max(playerLV + lowLV, 1), playerLV + highLV)
+        itemLV = random.choice(randLVList)
+    equipAttrDict[str(ShareDefine.Def_IudetItemLV)] = itemLV
+    
+    GameWorld.DebugLog("生成主线装备: itemID=%s,itemLV=%s,itemColor=%s,equipPlace=%s" % (itemID, itemLV, itemColor, equipPlace), playerID)
+    
+    # 基础三维
+    baseAttrIDList = setAttrDict.get(str(ShareDefine.Def_IudetBaseAttrID))
+    baseAttrValueList = setAttrDict.get(str(ShareDefine.Def_IudetBaseAttrValue))
+    # 这里注意None为未指定,支持当空列表[]时为不给该属性
+    if baseAttrIDList != None and baseAttrValueList != None and len(baseAttrIDList) == len(baseAttrValueList):
+        equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = baseAttrIDList
+        equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = baseAttrValueList
+    else:
+        attrProportion = placeIpyData.GetBaseAttrProportion()
+        attrInfoList = [
+                        [ShareDefine.Def_Effect_Atk, colorIpyData.GetAtkStep()],
+                        [ShareDefine.Def_Effect_Def, colorIpyData.GetDefStep()],
+                        [ShareDefine.Def_Effect_MaxHP, colorIpyData.GetHPStep()],
+                        ]
+        baseAttrIDList, baseAttrValueList = [], []
+        for attrID, attrStep in attrInfoList:
+            attrValue = eval(IpyGameDataPY.GetFuncCompileCfg("MainEquipDrop", 4))
+            # int(itemLV*attrStep*attrProportion*randfloat(0.9,1.1))
+            if not attrValue:
+                continue
+            baseAttrIDList.append(attrID)
+            baseAttrValueList.append(attrValue)
+            
+        if baseAttrIDList:
+            equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = baseAttrIDList
+            equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = baseAttrValueList
+        GameWorld.DebugLog("    baseAttrIDList=%s,baseAttrValueList=%s" % (baseAttrIDList, baseAttrValueList), 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:
+        legendAttrIDList = []
+        legendAttrValueList = []
+        
+        attrRangeDefault = colorIpyData.GetAttrRange()
+        attrRangeDict = colorIpyData.GetAttrRangeDict()        
+        libCntList = colorIpyData.GetAttrLibCntList()
+        GameWorld.DebugLog("    libCntList=%s,attrRangeDict=%s, %s" % (libCntList, attrRangeDict, attrRangeDefault), playerID)
+        for num, attrCnt in enumerate(libCntList, 1):
+            if not hasattr(placeIpyData, "GetAttrLib%s" % num):
+                continue
+            libAttrList = getattr(placeIpyData, "GetAttrLib%s" % num)()
+            if not libAttrList:
+                continue
+            random.shuffle(libAttrList)
+            randAttrList = libAttrList[:attrCnt]
+            for attrID in randAttrList:
+                if attrID in legendAttrIDList:
+                    continue
+                attrRange = attrRangeDict.get(attrID, attrRangeDefault)
+                if not attrRange or len(attrRange) != 2:
+                    continue
+                attrMin, attrMax = attrRange
+                attrValue = random.randint(attrMin, attrMax)
+                legendAttrIDList.append(attrID)
+                legendAttrValueList.append(attrValue)
+                GameWorld.DebugLog("        libNum=%s,attrID=%s,attrValue=%s(%s~%s)" % (num, attrID, attrValue, attrMin, attrMax), playerID)
+                
+        if legendAttrIDList:
+            equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = legendAttrIDList
+            equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = legendAttrValueList
+        GameWorld.DebugLog("    legendAttrIDList=%s,legendAttrValueList=%s" % (legendAttrIDList, legendAttrValueList), playerID)
+        
+    GameWorld.DebugLog("    装备最终属性: equipAttrDict=%s,setAttrDict=%s" % (equipAttrDict, setAttrDict), playerID)
+    return equipAttrDict
 
 def SetItemUserData(curItem, dataInfo):
     if isinstance(dataInfo, dict):
@@ -1801,6 +1976,10 @@
 def GetIsEquip(curItem):
     return curItem.GetType() in ChConfig.Def_EquipItemType
 
+def GetIsMainEquip(curItem):
+    ## 是否主线装备
+    return curItem.GetType() in ChConfig.Def_MainEquipType
+
 def GetIsDogzEquip(curItem):
     ## 返回是否神兽装备
     return curItem.GetType() in ChConfig.Def_DogzEquiipType

--
Gitblit v1.8.0