From c3935a93e6be5457f7d1e90bbe91845abf3943f4 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 05 九月 2025 17:37:18 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(去除0407通知;修复5011触发被动报错;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py |  529 ++++++++++++++++++++++++----------------------------------
 1 files changed, 223 insertions(+), 306 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..f4d4cca 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,20 +24,17 @@
 import ChConfig
 import ReadChConfig
 import ShareDefine
-import GameDataControl
 import ItemControler
 import DataRecordPack
 import EventReport
 import ChItem
 import IpyGameDataPY
-import Operate_EquipStone
-import Operate_EquipWash
-import FormulaControl
 import ChPyNetSendPack
 import NetPackCommon
 import PyGameData
 import ChEquip
 import SkillShell
+import PlayerHero
 import random
 import math
 import time
@@ -309,7 +306,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 +358,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 = [
+                        [ChConfig.AttrID_Atk, colorIpyData.GetAtkStep()],
+                        [ChConfig.AttrID_Def, colorIpyData.GetDefStep()],
+                        [ChConfig.AttrID_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):
@@ -375,182 +547,8 @@
     curItem.SetUserData(UserData, len(UserData))
     return
 
-def UpdateItemUserData(curItem, updateDict={}, delKeyList=[], isUpdateGS=False):
-    ''' 更新物品UserData数据
-    @param curItem: IPY_SingleItem 或  IPY_RoleItem
-    @param updateDict: 需要更新的数据 {key:value, key:valueList, ...}
-    @param delKeyList: 需要删除的数据 key列表[key, ...]
-    @param isUpdateGS: 是否更新评分
-    @note: UserData格式举例 {'17':['65','7','52'],'50':['0'],'19':['420','380','50'],'50':['1552728662']}
-    '''
-    
-    isRoleItem = False
-    if not hasattr(curItem, "SetUserData"):
-        item = curItem.GetItem()
-        isRoleItem = True
-    else:
-        item = curItem
-    userData = item.GetUserData()
-    if not userData:
-        userDataDict = {}
-    else:
-        userDataDict = eval(userData)
-        
-    for delKey in delKeyList:
-        userDataDict.pop(str(delKey), None)
-        
-    for key, value in updateDict.items():
-        if type(value) == int:
-            valueList = ['%s' % value]
-        elif type(value) == list:
-            valueList = ['%s' % v for v in value]
-        else:
-            continue
-        userDataDict['%s' % key] = valueList
-        
-    SetItemUserData(item, userDataDict)
-    if isUpdateGS:
-        MakeEquipGS(curItem)
-    elif isRoleItem:
-        curItem.SetCount(curItem.GetCount()) # 为了触发物品同步
-    return
-
 def MakeEquipGS(curItem):
-    if not CheckNoteEquipGS(curItem):
-        #GameWorld.DebugLog("不设置装备评分")
-        return
-    value = CalcEquipGS(curItem)
-    #GameWorld.DebugLog("设置装备评分: ItemID=%s,attrDict=%s,value=%s" % (curItem.GetItemTypeID(), attrDict, value))
-    SetEquipGearScore(curItem, value)
     return
-
-def CalcEquipGS(curItem):
-    '''计算装备评分
-        评分组成:装备基础 + 传奇属性
-    '''
-    if not CheckNoteEquipGS(curItem):
-        #GameWorld.DebugLog("不设置装备评分")
-        return 0
-    
-    attrDict = {}
-    #基础属性效果
-    for i in xrange(curItem.GetEffectCount()):
-        curEffect = curItem.GetEffectByIndex(i)
-        if not curEffect:
-            break
-        effectID = curEffect.GetEffectID()
-        if effectID == 0:
-            break
-        attrDict[effectID] = attrDict.get(effectID, 0) + curEffect.GetEffectValue(0)
-        
-    gsValueEx = 0
-    skillGSDict = IpyGameDataPY.GetFuncCfg("EquipGSFormula", 4)
-    itemSkillIDList = GetItemSkillIDList(curItem)
-    for addSkillID in itemSkillIDList:
-        gsValueEx += skillGSDict.get(str(addSkillID), 0)
-        
-    itemID = curItem.GetItemTypeID()
-    classLV = GetItemClassLV(curItem)
-    color = curItem.GetItemColor()
-    itemQuality = curItem.GetItemQuality()
-    isSuit = 1 if curItem.GetSuiteID() > 0 else 0
-    gsParamIpyData = IpyGameDataPY.GetIpyGameDataNotLog("EquipGSParam", classLV, color, isSuit, itemQuality)
-    # 传奇属性
-    legAttrIDList, legAttrValueList = ItemControler.GetEquipLegendAttrAll(curItem)
-    for i, legendAttrID in enumerate(legAttrIDList):
-        legendAttrValue = legAttrValueList[i]
-        attrDict[legendAttrID] = attrDict.get(legendAttrID, 0) + legendAttrValue
-        
-    lingQiIpyData = IpyGameDataPY.GetIpyGameDataNotLog("LingQiAttr", itemID)
-    if lingQiIpyData:
-        gsValueEx += lingQiIpyData.GetLingQiAttrScore()
-        
-    Atk = attrDict.get(ShareDefine.Def_Effect_Atk, 0)
-    MinAtk = attrDict.get(ShareDefine.Def_Effect_MinAtk, 0) + Atk
-    MaxAtk = attrDict.get(ShareDefine.Def_Effect_MaxAtk, 0) + Atk
-    MaxHP = attrDict.get(ShareDefine.Def_Effect_MaxHP, 0)
-    Def = attrDict.get(ShareDefine.Def_Effect_Def, 0)
-    ArmorDefPer = 0
-    IceAtk = attrDict.get(ShareDefine.Def_Effect_IceAtk, 0)
-    IceDef = attrDict.get(ShareDefine.Def_Effect_IceDef, 0)
-    FabaoHurt = attrDict.get(ShareDefine.Def_Effect_FabaoHurt, 0)
-    AtkBackHP = attrDict.get(ShareDefine.Def_Effect_AtkBackHP, 0)
-    
-    FinalHurt = attrDict.get(ShareDefine.Def_Effect_FinalHurt, 0)
-    FinalHurtReduce = attrDict.get(ShareDefine.Def_Effect_FinalHurtReduce, 0)
-    
-    BaseEquipMaxHPAddPer = attrDict.get(ShareDefine.Def_Effect_BaseEquipMaxHPAddPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetBaseEquipMaxHPAddPerC())
-    BaseEquipAtkAddPer = attrDict.get(ShareDefine.Def_Effect_BaseEquipAtkAddPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetBaseEquipAtkAddPerC())
-    AtkPer = attrDict.get(ShareDefine.Def_Effect_AddAtkByPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetAtkPerC())
-    DamagePer = 0#attrDict.get(ShareDefine.Def_Effect_DamagePer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamagePerC())
-    SuperHitRate = attrDict.get(ShareDefine.Def_Effect_SuperHitRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitRateC())
-    SuperHit = attrDict.get(ShareDefine.Def_Effect_SuperHit, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitC())
-    SuperHitPer = attrDict.get(ShareDefine.Def_Effect_SuperHitPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitPerC())
-    DamReducePer = 0#attrDict.get(ShareDefine.Def_Effect_DamReducePer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamReducePerC())
-    MaxHPPer = attrDict.get(ShareDefine.Def_Effect_MaxHPPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetMaxHPPerC())
-    DefPer = 0#attrDict.get(ShareDefine.Def_Effect_DefPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDefPerC())
-    LuckyHitRate = attrDict.get(ShareDefine.Def_Effect_LuckyHitRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetLuckyHitRateC())
-    LuckyHitRateReduce = attrDict.get(ShareDefine.Def_Effect_LuckyHitRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetLuckyHitRateReduceC())
-    LuckyHitPer = attrDict.get(ShareDefine.Def_Effect_LuckyHitPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetLuckyHitPerC())
-    LuckyHit = attrDict.get(ShareDefine.Def_Effect_LuckyHit, 0)
-    LuckyHitReduce = attrDict.get(ShareDefine.Def_Effect_LuckyHitReduce, 0)
-    LuckPer = attrDict.get(ShareDefine.Def_Effect_LuckPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetLuckPerC())
-    PetDamPer = attrDict.get(ShareDefine.Def_Effect_PetDamPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetPetDamPerC())
-    PerLVAtk = attrDict.get(ShareDefine.Def_Effect_PerLVAtk, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetPerLVAtkC())
-    MissRate = 0#attrDict.get(ShareDefine.Def_Effect_MissRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetMissRateC())
-    HitRate = 0#attrDict.get(ShareDefine.Def_Effect_HitRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetHitRateC())
-    DamBackPer = 0#attrDict.get(ShareDefine.Def_Effect_DamBackPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamBackPerC())
-    PerLVMaxHP = attrDict.get(ShareDefine.Def_Effect_PerLVMaxHP, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetPerLVMaxHPC())
-    DropEquipPer = attrDict.get(ShareDefine.Def_Effect_DropEquipPer, 0)# * (1 if not gsParamIpyData else gsParamIpyData.GetDropEquipPerC())
-    DropMoneyPer = attrDict.get(ShareDefine.Def_Effect_DropMoneyPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDropMoneyPerC())
-    IgnoreDefRateReduce = 0#attrDict.get(ShareDefine.Def_Effect_IgnoreDefRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetIgnoreDefRateReduceC())
-    DamChanceDef = 0#attrDict.get(ShareDefine.Def_Effect_DamChanceDef, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamChanceDefC())
-    SuperHitReduce = attrDict.get(ShareDefine.Def_Effect_SuperHitReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitReduceC())
-    SuperHitRateReduce = attrDict.get(ShareDefine.Def_Effect_SuperHitRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitRateReduceC())
-    SkillAtkRate = attrDict.get(ShareDefine.Def_Effect_SkillAtkRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAtkRateC())
-    SpeedPer = 0#attrDict.get(ShareDefine.Def_Effect_SpeedPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSpeedPerC())
-    SkillAtkRateReduce = attrDict.get(ShareDefine.Def_Effect_SkillAtkRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAtkRateReduceC())
-    Hit = attrDict.get(ShareDefine.Def_Effect_Hit, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetHitC())
-    Miss = attrDict.get(ShareDefine.Def_Effect_Miss, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetMissC())
-    SkillAddPerA = attrDict.get(ShareDefine.Def_Effect_SkillAddPer1, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer1C())
-    SkillAddPerB = attrDict.get(ShareDefine.Def_Effect_SkillAddPer2, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer2C())
-    SkillAddPerC = attrDict.get(ShareDefine.Def_Effect_SkillAddPer3, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer3C())
-    SkillAddPerD = attrDict.get(ShareDefine.Def_Effect_SkillAddPer4, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer4C())
-    SkillAddPerE = attrDict.get(ShareDefine.Def_Effect_SkillAddPer5, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer5C())
-    SkillAddPerF = attrDict.get(ShareDefine.Def_Effect_SkillAddPer6, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer6C())
-    SkillAddPerG = attrDict.get(ShareDefine.Def_Effect_SkillAddPer7, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer7C())
-    SkillReducePerA = attrDict.get(ShareDefine.Def_Effect_SkillReducePer1, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer1C())
-    SkillReducePerB = attrDict.get(ShareDefine.Def_Effect_SkillReducePer2, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer2C())
-    SkillReducePerC = attrDict.get(ShareDefine.Def_Effect_SkillReducePer3, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer3C())
-    SkillReducePerD = attrDict.get(ShareDefine.Def_Effect_SkillReducePer4, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer4C())
-    SkillReducePerE = attrDict.get(ShareDefine.Def_Effect_SkillReducePer5, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer5C())
-    SkillReducePerF = attrDict.get(ShareDefine.Def_Effect_SkillReducePer6, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer6C())
-    SkillReducePerG = attrDict.get(ShareDefine.Def_Effect_SkillReducePer7, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer7C())
-    
-    ReduceSkillCDPer = attrDict.get(ShareDefine.Def_Effect_ReduceSkillCDPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetReduceSkillCDPerC())
-    
-    FaintDefRate = attrDict.get(ShareDefine.Def_Effect_FaintDefRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetFaintDefRateC())
-    
-    IgnoreDefRate = attrDict.get(ShareDefine.Def_Effect_IgnoreDefRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetIgnoreDefRateC())
-    IgnoreDefRateReduce = attrDict.get(ShareDefine.Def_Effect_IgnoreDefRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetIgnoreDefRateReduceC())
-    ProDefPer = attrDict.get(ShareDefine.Def_Effect_ProDefHPPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetProDefPerC())
-    FinalHurtPerC = attrDict.get(ShareDefine.Def_Effect_FinalHurtPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetFinalHurtPerC())
-    FinalHurtReducePerC = attrDict.get(ShareDefine.Def_Effect_FinalHurtReducePer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetFinalHurtReducePerC())
-    
-    # 攻速不默认乘,仅作为参数提供策划使用
-    AtkSpeed = 0#attrDict.get(ShareDefine.Def_Effect_AtkSpeed, 0)
-    AtkSpeedC = 1#1 if not gsParamIpyData else gsParamIpyData.GetAtkSpeedC()
-    
-    OnlyFinalHurt = attrDict.get(ShareDefine.Def_Effect_OnlyFinalHurt, 0)
-    PVPAtkBackHP = attrDict.get(ShareDefine.Def_Effect_PVPAtkBackHP, 0)  
-    
-    if GetIsDogzEquip(curItem):
-        # 神兽装备用不同公式
-        value = eval(FormulaControl.GetCompileFormula("EquipGSFormula3", IpyGameDataPY.GetFuncCfg("EquipGSFormula", 3)))
-    else:
-        value = eval(FormulaControl.GetCompileFormula("EquipGSFormula", IpyGameDataPY.GetFuncCfg("EquipGSFormula")))
-    value += gsValueEx
-    return value
 
 #---------------------------------------------------------------------
 ## 通过效果ID,检查是否为指定物品 
@@ -775,6 +773,7 @@
 
 def GetPackInitCount(packType):
     ## 获取背包类型对应初始格子数
+    initCount = 0
     if packType == IPY_GameWorld.rptItem:
         initCount = IpyGameDataPY.GetFuncCfg("InitBagCellCount", 1)
     elif packType == IPY_GameWorld.rptWarehouse:
@@ -785,11 +784,48 @@
         initCount = IpyGameDataPY.GetFuncCfg("DogzPack", 1)
     elif packType == ShareDefine.rptDogzEquip:
         initCount = IpyGameDataPY.GetFuncCfg("DogzPack", 2)
-    else:
+        
+    if not initCount:
         bagInitCntDict = IpyGameDataPY.GetFuncEvalCfg("InitBagCellCount", 2, {})
         initCount = bagInitCntDict.get(str(packType), 0)
     GameWorld.DebugLog("背包类型初始格子数: packType=%s,initCount=%s" % (packType, initCount))
     return initCount
+
+def GetPackOpenItemCnt(curPlayer, packType):
+    ## 获取对应背包已购买的格子数
+    openCntDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 3, {})
+    if str(packType) not in openCntDict:
+        return 0
+    openCntList = openCntDict[str(packType)]
+    if not openCntList:
+        return 0
+    
+    buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType)
+    openCnt = sum(openCntList[:buyCnt])
+    if buyCnt > len(openCntList):
+        addCnt = (buyCnt - len(openCntList)) * openCntList[-1]
+        openCnt += addCnt
+        
+    return openCnt
+
+def SyncPackBuyCnt(curPlayer, packType=None):
+    ## 同步已购买格子次数信息
+    openCntDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 3, {})
+    if not openCntDict:
+        return
+    syncTypeList = [str(packType)] if packType else openCntDict.keys()
+    
+    clientPack = ChPyNetSendPack.tagSCPackBuyInfo()
+    clientPack.BuyInfoList = []
+    for packTypeStr in syncTypeList:
+        packType = int(packTypeStr)
+        buy = ChPyNetSendPack.tagSCPackBuy()
+        buy.PackType = packType
+        buy.BuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType)
+        clientPack.BuyInfoList.append(buy)
+    clientPack.Count = len(clientPack.BuyInfoList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
 
 ## 获得虚拟背包格子数
 #  @param packindex 背包索引
@@ -800,65 +836,6 @@
         return 0
     keyStr = ChConfig.Def_VPackCnt_Dict[packindex]
     return IpyGameDataPY.GetFuncCfg(keyStr)
-
-
-## 杀怪掉落提示
-#  @param curPlayer 当前玩家
-#  @return None
-def NotifyItemDropByKill(curPlayer, curItem, npcID, notifyMark='', mapID=0):
-    return #吕超说此处屏蔽
-
-def CacheNotifyEquipDetailInfo(curPlayer, curEquip):
-    ''' 缓存装备广播信息中的装备明细信息
-            因为本版本需要的查看的内容相对较多,为了减少全服广播流量消耗,所以先进行缓存,玩家点击查看时再进行查询
-    '''
-    
-    guid = curEquip.GetGUID()
-    packType = curEquip.GetItemPlaceType()
-    packIndex = curEquip.GetItemPlaceIndex()
-    if packType != IPY_GameWorld.rptEquip:
-        return guid
-    
-    classLV = GetItemClassLV(curEquip)
-    if not classLV:
-        return guid
-    
-    itemID = curEquip.GetItemTypeID()
-    #部位星级
-    equipStar = ChEquip.GetEquipPartStarByRank(curPlayer, packIndex, curEquip)
-    
-    #部位强化数据
-    plusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, packIndex)
-    plusEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, packIndex)
-    
-    #部位洗练数据
-    washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % packIndex)
-    washValueList = []
-    for attrNum in xrange(1, Operate_EquipWash.Def_EquipWashMaxAttrCount + 1):
-        value = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (packIndex, attrNum))
-        washValueList.append(value)
-        
-    #部位宝石数据
-    stoneIDList = Operate_EquipStone.GetEquipIndexStoneIDList(curPlayer, packIndex)
-    
-    #本阶已穿装备ID [[itemID,star], ...]
-    classItems = [] 
-    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True)
-    if ipyDataList:
-        equipPack = curPlayer.GetItemManager().GetPack(packType)
-        for ipyData in ipyDataList:
-            index = ipyData.GetGridIndex()
-            classEquip = equipPack.GetAt(index)
-            if not classEquip or classEquip.IsEmpty():
-                continue
-            equipID = classEquip.GetItemTypeID()
-            star = ChEquip.GetEquipPartStarByRank(curPlayer, index, classEquip)
-            classItems.append([equipID, star])
-            
-    cacheInfo = [guid, itemID, equipStar, plusLV, plusEvolveLV, washLV, washValueList, stoneIDList, classItems]
-    cacheInfo = json.dumps(cacheInfo, ensure_ascii=False)
-    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "NotifyEquipDetailInfo", cacheInfo, len(cacheInfo))
-    return guid
 
 ## 使用物品的特殊提示
 #  @param curPlayer 当前玩家
@@ -1116,13 +1093,7 @@
     return True
 
 def CheckNoteEquipGS(curItem):
-    if not CheckItemCanUse(curItem):
-        return False
-    
-    if curItem.GetType() not in IpyGameDataPY.GetFuncEvalCfg("EquipGSTypeForSort", 1):
-        return False
-    
-    return True
+    return False
 
 #---------------------------------------------------------------------
 ## 通过背包查找指定效果ID的指定数量物品
@@ -1801,6 +1772,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
@@ -1949,13 +1924,6 @@
             itemName = str(itemID) if not curItemData else  curItemData.GetName()
             itemName = "%s LV%s" % (itemName, plusLV + 1)
             isNeedRecord = curItemData and ItemControler.IsRuneItemNeedRecord(curItemData, plusLV)
-        if packIndex == ShareDefine.rptGatherSoul:
-            itemID = ItemControler.GetGatherSoulItemID(itemKeyData)
-            plusLV = ItemControler.GetGatherSoulItemPlusLV(itemKeyData)
-            curItemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
-            itemName = str(itemID) if not curItemData else  curItemData.GetName()
-            itemName = "%s LV%s" % (itemName, plusLV + 1)
-            isNeedRecord = curItemData and ItemControler.IsGatherSoulItemNeedRecord(curItemData, plusLV)
             
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_VPackItem % (packIndex, place), 0)
         if isNeedRecord:
@@ -1963,40 +1931,10 @@
             DR_DelItem(curPlayer, packIndex, "VPack_%s" % packIndex if not eventName else eventName, dataDict)
     ItemControler.Sync_VPackItem_Clear(curPlayer, packIndex, placeList)
     return
-
-
-## 获取物品最高强化进化等级
-#  @param itemType: 物品类型
-#  @return 最大星级,0为不可强化
-def GetItemMaxPlusEvolveLV(curPlayer, equipPackindex, curItem):
-    packType = IPY_GameWorld.rptEquip
-    curPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, equipPackindex)
-    equipPlace = curItem.GetEquipPlace()
-    ipyData = IpyGameDataPY.InterpolationSearch('EquipPlusEvolve', 'NeedPlusLV', curPlusLV, {'EquipPlace':equipPlace})
-    if not ipyData:
-        return 0
-    return ipyData.GetEvolveLV()
     
-
-## 获取物品最高星数
-#  @param itemType: 物品类型
-#  @return 最大星级,0为不可强化
-def GetItemMaxStar(curItem):
-    itemColor = curItem.GetItemColor()
-    maxStarDict = IpyGameDataPY.GetFuncEvalCfg('EquipPartStar', 1)
-    if str(itemColor) not in maxStarDict:
-        return 0
-    classLV = GetItemClassLV(curItem)
-    return maxStarDict[str(itemColor)].get(str(classLV), 0)
-
 ## 获取物品阶级或品级
 def GetItemClassLV(curItem):
     return curItem.GetLV()
-
-def GetWingLV(curItem):
-    ## 获取翅膀代数等级
-    wingLVDict = IpyGameDataPY.GetFuncEvalCfg("WingLV", 1)
-    return wingLVDict.get(str(curItem.GetLV()), 0)
 
 ## 装备评分
 def GetEquipGearScore(curItem):
@@ -2102,37 +2040,16 @@
     @param alchemyDiffLV: 是否过滤掉大于X级的炼丹等级物品,0-不过滤,1-过滤且读默认配置,>1-特殊功能指定的过滤等级
     '''
     resultWeightList = []
-    itemNeedPlayerLVDict = IpyGameDataPY.GetFuncEvalCfg("AlchemyDiffLV", 2, {})
-    if alchemyDiffLV or itemNeedPlayerLVDict:
-        playerLV = curPlayer.GetLV()
-        # 如果有指定大于1的等级则取指定等级,没有的话取默认等级差
-        if alchemyDiffLV == 1:
-            alchemyDiffLV = IpyGameDataPY.GetFuncCfg("AlchemyDiffLV", 1)
-        curAlchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
-        for itemInfo in weightList:
-            itemID = itemInfo[1][0]
-            if itemID: # 支持配置ID为0时代表不产出
-                itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
-                if not itemData:
-                    continue
-                if GetItemClassLV(itemData) > curAlchemyLV + alchemyDiffLV:
-                    continue
-                if itemID in itemNeedPlayerLVDict:
-                    if playerLV < itemNeedPlayerLVDict[itemID]:
-                        continue
-            resultWeightList.append(itemInfo)
-    else:
-        resultWeightList = weightList
     return resultWeightList
 
 ## =======================================================================================
 
-def SyncMakeItemAnswer(curPlayer, makeType, isSuccess, makeItemID):
+def SyncMakeItemAnswer(curPlayer, makeType, isSuccess, makeValue):
     makeItemAnswer = ChPyNetSendPack.tagMCMakeItemAnswer()
     makeItemAnswer.Clear()
     makeItemAnswer.MakeType = makeType
     makeItemAnswer.Result = isSuccess
-    makeItemAnswer.MakeItemID = makeItemID
+    makeItemAnswer.MakeValue = makeValue
     NetPackCommon.SendFakePack(curPlayer, makeItemAnswer)
     return
 

--
Gitblit v1.8.0