From fd892c53d4c0f97b11713d9571f20b110dd2fece Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期五, 21 六月 2019 22:40:57 +0800
Subject: [PATCH] 6603 【后端】【2.0】增加新版的sp和被动技能 - 特殊技能不进入CD

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py |  849 +++++++++++++++++++++-----------------------------------
 1 files changed, 319 insertions(+), 530 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 5c450f6..c85f74e 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
@@ -29,7 +29,6 @@
 import DataRecordPack
 import EventReport
 import ChItem
-import PlayerMergeEvent
 import IpyGameDataPY
 import Operate_EquipStone
 import PlayerViewCacheTube
@@ -214,71 +213,6 @@
     return msgList
 
 
-## 提示超级装备
-#  @param curPlayer 当前玩家
-#  @param curItem 得到的物品
-#  @param notifyType 鉴定1 打造2 升星3 神器升星4 神器唤醒5 宠物装备合成6 丢宝箱装备7
-#  @param useItemID 使用的物品id
-#  @return None
-#  @remarks 函数详细说明.
-def Notify_SuperItem(curPlayer, curItem, notifyType, useItemID=0):
-#===============================================================================
-#Item_Link_Appraisal 鉴定出了一件惊世神装
-#Item_Link_Factory   打造出了一件惊世神装
-#S1 -> playID,S2 -> playname,S3 -> playname,s4 -> itemID,s5 -> start,s6 -> hole,s7-s15 stoneID,s16 -> 五行,
-#s17 -> 灵魂技能ID,s18 -> 当前耐久,s19 -> 最大耐久,s20 -> 绑定,s21 -> MakeID,s22 -> 物品名字
-#===============================================================================
-
-    
-    #升星及神器
-    if notifyType in [3]:
-#===============================================================================
-#        #升星的系统提示参数列表
-#        roleName = curPlayer.GetName()
-#                
-#        #S1 -> playID,S2 -> playname,S3 -> playname,
-#        msgList = ['%s' % curPlayer.GetID(), '%s' % roleName, '%s' % roleName]
-#        
-#        # 物品xml参数s4-s55
-#        msgList.extend(GetItemXMLMsg(curItem))
-#        
-# #        GameWorld.Log('升星,msgList = %s, %s'%(len(msgList), msgList))
-#        if notifyType == 3:
-#            msgList.extend(["%s" % curItem.GetItemStarLV()])  # 升星最后一个参数为星数
-#            #普通升星
-#            PlayerControl.WorldNotify(0, "Item_Link_UpGrade", msgList)
-#===============================================================================
-
-        return
-
-        
-    #---除升星外的系统提示参数列表---
-    msgList = ['%s' % curPlayer.GetID(), '%s' % curPlayer.GetName(), '%s' % curPlayer.GetName(),
-               '%s' % curItem.GetItemTypeID(),'%s' % curItem.GetIsBind(), '%s' % curItem.GetItemTypeID()
-               ]
-    #鉴定
-    if notifyType == 1:
-        PlayerControl.WorldNotify(0, "Item_Link_Appraisal", msgList)
-    #打造
-    elif notifyType == 2:
-        PlayerControl.WorldNotify(0, "Item_Link_Factory", msgList)
-    #宠物装备合成
-    elif notifyType == 6:
-        PlayerControl.WorldNotify(0, "Pet_liubo_436832", msgList)
-    # mu装备全服广播
-    elif notifyType == 7:
-        # 插入使用的物品名
-        if not useItemID:
-            return
-        msgList.insert(3, '%s' % useItemID)
-        msgList.insert(4, '%s' % useItemID)
-        itemInfo = GetNotifySuperItemInfo(curPlayer, curItem)
-        msgList = msgList[:5] + itemInfo
-        PlayerControl.WorldNotify(0, "GeRen_lhs_318691", msgList)
-    return
-#---------------------------------------------------------------------
-
-
 ## 清除按天过期物品
 #  @param curPlayer 玩家
 #  @return None
@@ -335,12 +269,14 @@
     GameWorld.DebugLog("物品过期时间" + timeStr)
     return GameWorld.ChangeTimeStrToNum(timeStr)
 
-
-## 创建物品
-#  @param itemID 物品ID
-#  @return curSingleItem
-#  @remarks 函数详细说明.
-def CreateSingleItem(itemID, itemCount=1, isBind=0):
+def CreateSingleItem(itemID, itemCount=1, isAuctionItem=False, expireTime=0):
+    ''' 创建物品
+    @param isAuctionItem: 是否拍品,默认非拍品
+    @param expireTime: 有效时间,时间单位由时效类型决定
+    '''
+    if itemCount < 1:
+        GameWorld.ErrLog("创建物品个数不能少于1! itemID=%s,itemCount=%s" % (itemID, itemCount))
+        return
     curSingleItem = GameWorld.GetItemFactory().CreateItem(itemID)
     if not curSingleItem:
         return
@@ -373,14 +309,60 @@
             return
         curSingleItem.SetRemainHour(outTimeServerDay)
         
-    if isBind:
-        curSingleItem.SetIsBind(1)
-        
+    if isAuctionItem:
+        if IpyGameDataPY.GetIpyGameDataNotLog("AuctionItem", itemID):
+            ItemControler.SetIsAuctionItem(curSingleItem, isAuctionItem)
+        else:
+            GameWorld.ErrLog("拍卖物品表不存在该ID!创建拍品失败,默认转为非拍品!itemID=%s" % itemID)
+            
     ItemControler.SetItemCount(curSingleItem, itemCount)
     
+    if expireTime > 0:
+        curSingleItem.SetUserAttr(ShareDefine.Def_IudetExpireTime, expireTime)
+        
     #这里返回的是SingleItem , 如果创建了,未使用,会找出C++内存泄露!!!
     return curSingleItem
 
+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
+        
+    UserData = str(userDataDict).replace(" ", "")
+    item.SetUserData(UserData, len(UserData))
+    if isUpdateGS:
+        MakeEquipGS(curItem)
+    elif isRoleItem:
+        curItem.SetCount(curItem.GetCount()) # 为了触发物品同步
+    return
 
 def MakeEquipGS(curItem):
     if not CheckNoteEquipGS(curItem):
@@ -393,7 +375,7 @@
 
 def CalcEquipGS(curItem):
     '''计算装备评分
-        评分组成:装备基础 + 传奇属性 + 绝版属性
+        评分组成:装备基础 + 传奇属性
     '''
     if not CheckNoteEquipGS(curItem):
         #GameWorld.DebugLog("不设置装备评分")
@@ -410,10 +392,19 @@
             break
         attrDict[effectID] = attrDict.get(effectID, 0) + curEffect.GetEffectValue(0)
         
+    gsValueEx = 0
+    skillGSDict = IpyGameDataPY.GetFuncCfg("EquipGSFormula", 4)
+    for i in xrange(curItem.GetAddSkillCount()):
+        addSkillID = curItem.GetAddSkill(i)
+        if not addSkillID:
+            break
+        gsValueEx += skillGSDict.get(str(addSkillID), 0)
+        
+    itemID = curItem.GetItemTypeID()
     classLV = GetItemClassLV(curItem)
     color = curItem.GetItemColor()
-    itemQuality = curItem.GetItemQuality()
-    gsParamIpyData = IpyGameDataPY.GetIpyGameData("EquipGSParam", classLV, color, itemQuality)
+    isSuit = 1 if curItem.GetSuiteID() > 0 else 0
+    gsParamIpyData = IpyGameDataPY.GetIpyGameDataNotLog("EquipGSParam", classLV, color, isSuit)
     # 传奇属性
     legendAttrIDCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrID)
     legendAttrValueCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrValue)
@@ -423,52 +414,69 @@
             attrValue = curItem.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrValue, i)
             attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
             
+    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 = attrDict.get(ShareDefine.Def_Effect_ArmorDefAddPer, 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)
     
-    AtkPer = attrDict.get(ShareDefine.Def_Effect_AddAtkByPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetAtkPerC())
-    DamagePer = 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())
+    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 = 0#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 = 0#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 = 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 = attrDict.get(ShareDefine.Def_Effect_DefPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDefPerC())
+    DamReducePer = 0#attrDict.get(ShareDefine.Def_Effect_DamReducePer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamReducePerC())
+    MaxHPPer = 0#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())
-    PetDamPer = attrDict.get(ShareDefine.Def_Effect_PetDamPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetPetDamPerC())
+    LuckyHitRateReduce = attrDict.get(ShareDefine.Def_Effect_LuckyHitRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetLuckyHitRateReduceC())
+    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 = 0#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 = attrDict.get(ShareDefine.Def_Effect_MissRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetMissRateC())
-    HitRate = attrDict.get(ShareDefine.Def_Effect_HitRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetHitRateC())
-    DamBackPer = attrDict.get(ShareDefine.Def_Effect_DamBackPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamBackPerC())
+    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())
+    DropEquipPer = 0#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 = attrDict.get(ShareDefine.Def_Effect_IgnoreDefRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetIgnoreDefRateReduceC())
-    DamChanceDef = attrDict.get(ShareDefine.Def_Effect_DamChanceDef, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDamChanceDefC())
+    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())
-    SkillAtkRate = attrDict.get(ShareDefine.Def_Effect_SkillAtkRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAtkRateC())
-    SpeedPer = 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())
+    SkillAtkRate = 0#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 = 0#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 = 0
+    SkillAddPerB = 0
+    SkillAddPerC = 0
+    SkillAddPerD = 0
+    SkillAddPerE = 0
+    SkillAddPerF = 0
+    SkillAddPerG = 0
+    SkillReducePerA = 0
+    SkillReducePerB = 0
+    SkillReducePerC = 0
+    SkillReducePerD = 0
+    SkillReducePerE = 0
+    SkillReducePerF = 0
+    SkillReducePerG = 0
     
     # 攻速不默认乘,仅作为参数提供策划使用
-    AtkSpeed = attrDict.get(ShareDefine.Def_Effect_AtkSpeed, 0)
-    AtkSpeedC = 1 if not gsParamIpyData else gsParamIpyData.GetAtkSpeedC()
-    
-    # 绝版
-    outOfPrintAttrIDCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetOutOfPrintAttrID)
-    outOfPrintAttrValueCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetOutOfPrintAttrValue)
-    if outOfPrintAttrIDCnt and outOfPrintAttrIDCnt == outOfPrintAttrValueCnt:
-        for i in xrange(legendAttrIDCnt):
-            attrID = curItem.GetUserAttrByIndex(ShareDefine.Def_IudetOutOfPrintAttrID, i)
-            attrValue = curItem.GetUserAttrByIndex(ShareDefine.Def_IudetOutOfPrintAttrValue, i)
-            attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
+    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)  
@@ -478,6 +486,7 @@
         value = eval(FormulaControl.GetCompileFormula("EquipGSFormula3", IpyGameDataPY.GetFuncCfg("EquipGSFormula", 3)))
     else:
         value = eval(FormulaControl.GetCompileFormula("EquipGSFormula", IpyGameDataPY.GetFuncCfg("EquipGSFormula")))
+    value += gsValueEx
     return value
 
 #---------------------------------------------------------------------
@@ -488,7 +497,7 @@
 #  @return True or False
 #  @remarks 函数详细说明.
 def CheckItemByEffectID(curPlayer, curItem, effectList):
-    if not CheckItemCanUse(curItem):
+    if not CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
         return False
     
     if not ItemControler.CheckItemUseLV(curPlayer, curItem, False):
@@ -549,7 +558,7 @@
     for i in range(backPack.GetCount()):
         curItem = backPack.GetAt(i)
         
-        if not CheckItemCanUse(curItem):
+        if not CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
             continue
         
         if curItem.GetItemTypeID() != findItemID:
@@ -678,48 +687,6 @@
         return 0
     keyStr = ChConfig.Def_VPackCnt_Dict[packindex]
     return IpyGameDataPY.GetFuncCfg(keyStr)
-#---------------------------------------------------------------------
-## 获得物品信息提示
-#  @param curPlayer 当前玩家
-#  @param useItemID 使用物品
-#  @param singleItem 通知的物品对象
-#  @return None
-#  @remarks 函数详细说明.
-def NeedNotifyItem(curPlayer, useItemID , singleItem):
-    #需要提示的物品列表
-    #===========================================================================
-    # itemIDDict = ReadChConfig.GetEvalChConfig('need_notify_id_dict')
-    # if useItemID not in itemIDDict.keys():
-    #    return
-    # 
-    # notifyList = itemIDDict.get(useItemID, [])
-    # 
-    # if not notifyList:
-    #    GameWorld.Log("NeedNotifyItem() need_notify_id_dict.txt error useItemID=%s not data" % (useItemID))
-    #    return
-    # 
-    # isQualityNotify = notifyList[0] # 卓越是否提示
-    # notifyStarLV = notifyList[1] # 通知的强化星级
-    # itemIdList = notifyList[2:] # 去除星级通知的,其他的为具体id通知
-    # 
-    # curItemID = singleItem.GetItemTypeID()
-    # curItemCount = singleItem.GetCount()
-    # # 如果是指定标的物
-    # if (curItemID, curItemCount) in itemIdList:
-    #    PlayerControl.WorldNotify(0, "itemuse_chenxin_0", [curPlayer.GetPlayerName(),
-    #                             useItemID, useItemID, curItemID, curItemID, curItemCount])
-    #    return
-    # 
-    # # 其他的装备判断
-    # itemQuality = singleItem.GetItemQuality()
-    # isSuite = singleItem.GetIsSuite()
-    # plusLV = singleItem.GetItemStarLV()
-    # # 卓越广播,套装广播,星级广播
-    # if (isQualityNotify and itemQuality) or isSuite or plusLV >= notifyStarLV:
-    #    Notify_SuperItem(curPlayer, singleItem, 7, useItemID)
-    #===========================================================================
-    
-    return
 
 
 ## 杀怪掉落提示
@@ -727,94 +694,58 @@
 #  @return None
 def NotifyItemDropByKill(curPlayer, curItem, npcID, notifyMark='', mapID=0):
     return #吕超说此处屏蔽
-    #需要提示的物品列表
-    itemIDDict = ReadChConfig.GetEvalChConfig('need_notify_id_dict')
 
-    notifyList = itemIDDict.get(0, [])
-    if not notifyList:
-        #GameWorld.Log("NotifyItemDropByKill() need_notify_id_dict.txt error useItemID=0")
-        return
-    
-    playerName = curPlayer.GetPlayerName()
-    notifyQuality = notifyList[0] # 需要提示的品质等级
-    notifyStarLV = notifyList[1] # 通知的强化星级
-    itemIdList = notifyList[2:] # 去除星级通知的,其他的为具体id通知
-    
-    curItemID = curItem.GetItemTypeID()
-    curItemCount = curItem.GetCount()
-    mapID = GameWorld.GetMap().GetMapID() if not mapID else mapID
-    # 如果是指定标的物
-    if (curItemID, curItemCount) in itemIdList:
-        itemIDMarkDict = ReadChConfig.GetEvalChConfig('need_notify_id_mark_dict')
-        notifyMark = itemIDMarkDict.get(curItemID, "GeRen_admin_272921")
-        PlayerControl.WorldNotify(0, notifyMark, [playerName, mapID, npcID, curItemID, curItemID])
-        return
-    
-    # 其他的装备判断
-#    itemQuality = curItem.GetItemQuality()
-#    isSuite = curItem.GetIsSuite()
-#    plusLV = curItem.GetItemStarLV()
-#    # 卓越广播,套装广播,星级广播
-#    if not ((itemQuality >= notifyQuality) or isSuite or plusLV >= notifyStarLV):
-#        return
-    
-    msgList = ['%s' % playerName, 
-               '%s' % mapID, 
-               '%s' % npcID,
-               #'%s' % 0,
-               ] + GetNotifySuperItemInfo(curPlayer, curItem)
-    
-    notifyMark = notifyMark if notifyMark else "GeRen_admin_671654"
-    PlayerControl.WorldNotify(0, notifyMark , msgList)
-    return
-
-def GetNotifySuperItemInfo(curPlayer, curItem, place=None):
-    '''装备提示超链接信息汇总
-    <a><Word info=item id=%s0/>|showitem=%s0 isbind=%s1 itemcnt=%s2 stone=%s3 userdata=%s4 place=%s5 equippartsuite=%s6 strengthenlv=%s7 equipwash=%s8 equipitems=%s9</a>
-    isbind:是否绑定
-    itemcnt:物品数量
-    stone:宝石信息 [stoneItemID, ...]
-    userdata:传奇属性
-    place:装备位
-    equippartsuite:套装信息 同查看玩家
-    strengthenlv:强化等级
-    equipwash:洗练信息 同查看玩家,单部位
-    equipitems:各部位物品id [[装备位,物品id] ...]
+def CacheNotifyEquipDetailInfo(curPlayer, curEquip):
+    ''' 缓存装备广播信息中的装备明细信息
+            因为本版本需要的查看的内容相对较多,为了减少全服广播流量消耗,所以先进行缓存,玩家点击查看时再进行查询
     '''
-    if place == None:
-        place = curItem.GetEquipPlace()
+    
+    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.GetEquipPartPlusLVByRank(curPlayer, packType, packIndex, curEquip)
+    plusEvolveLV = ChEquip.GetEquipPartPlusEvolveLVByEquip(curPlayer, packType, packIndex, curEquip)
+    
+    #部位洗练数据
+    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)
         
-    notifyList = [""] * 10
-    notifyList[0] = curItem.GetItemTypeID()
-    notifyList[1] = curItem.GetIsBind()
-    notifyList[2] = curItem.GetCount()
-    notifyList[3] = "%s" % Operate_EquipStone.GetEquipIndexStoneIDList(curPlayer, place)
-    userData = curItem.GetUserData()
-    notifyList[4] = userData if (userData and userData != "{}") else ""
-    notifyList[5] =  place
-    suiteInfo = PlayerViewCacheTube.__GetEquipPartSuiteInfo(curPlayer)
-    notifyList[6] = "" if not suiteInfo else json.dumps(suiteInfo, ensure_ascii=False)
-    notifyList[7] = ChEquip.GetEquipPartStarLV(curPlayer, IPY_GameWorld.rptEquip, place)
+    #部位宝石数据
+    stoneIDList = Operate_EquipStone.GetEquipIndexStoneIDList(curPlayer, packIndex)
     
-    # 单部位洗练信息
-    washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % place) + 1
-    valueList = [curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (place, attrNum)) \
-                    for attrNum in xrange(1, Operate_EquipWash.Def_EquipWashMaxAttrCount + 1)]
-    notifyList[8] = "%s" % {"Place":place, "LV":washLV, "Value":valueList}
-    
-    # 身上所穿装备ID信息
-    equipItems = []
-    playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
-    for equipIndex in xrange(playerEquip.GetCount()):
-        if equipIndex not in ShareDefine.RoleEquipType :
-            continue
-        curEquip = playerEquip.GetAt(equipIndex)
-        if not curEquip or curEquip.IsEmpty():
-            continue
-        equipItems.append([curEquip.GetItemPlaceIndex(), curEquip.GetItemTypeID()])
-    notifyList[9] = "%s" % equipItems
-    
-    return notifyList
+    #本阶已穿装备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 当前玩家
@@ -835,32 +766,15 @@
     return
 
 #---------------------------------------------------------------------
-#此函数验证当前职业阶可用(向下兼容),同CheckJob区分使用
-def JobUseable(curPlayer, curItem):
-    '''判断物品是否职业可用
-        物品表中职业限制规则: 0为通用;非0百位代表职业,十位和个位为职业阶数, 职业阶向下兼容,高阶可使用低阶物品
-    '''
-    itemJobLimit = curItem.GetJobLimit()
-    if not itemJobLimit:
-        return True
-    
-    # 取消限制的物品
-    if curItem.GetUserAttr(ShareDefine.Def_IudetCancelUseLimit) == 1:
-        return CheckJob(curPlayer, curItem)
-    
-    if curPlayer.GetJob() == itemJobLimit / 100 and PlayerControl.GetJobRank(curPlayer) >= itemJobLimit % 100:
-        return True
-    return False
-
-#此函数验证当前职业系可用,同JobUseable区分使用
+#此函数验证当前职业系可用
 def CheckJob(curPlayer, curItem):
     '''判断物品是否职业系可用
-        物品表中职业限制规则: 0为通用;非0百位代表职业,十位和个位为职业阶数, 职业阶向下兼容,高阶可使用低阶物品
+        物品表中职业限制规则: 0为通用;非0百位代表职业
     '''
     itemJobLimit = curItem.GetJobLimit()
     if not itemJobLimit:
         return True
-    if curPlayer.GetJob() == itemJobLimit / 100:
+    if curPlayer.GetJob() == itemJobLimit:
         return True
     
     return False
@@ -881,40 +795,56 @@
 # 特殊判定根据时效时间判定物品是否可以使用
 # 过期物品不能使用或装备但是可以出售续费
 def CheckItemCanUseByExpireTime(curItem):
-    curItemCreateTime = curItem.GetCreateTime()
-    curItemExpireTime = curItem.GetExpireTime()
-    curItemPastTime = GameWorld.GetPastSeconds(curItemCreateTime)
+#    curItemCreateTime = curItem.GetCreateTime()
+#    curItemExpireTime = curItem.GetExpireTime()
+#    curItemPastTime = GameWorld.GetPastSeconds(curItemCreateTime)
+#    
+#    reduceType = curItem.GetEndureReduceType()
+#    if reduceType == ChConfig.Def_EquipReduceType_RTimeItem and \
+#    curItemPastTime >= curItemExpireTime:
+#        # 过期了
+#        return False
+#    
+#    if reduceType == ChConfig.Def_EquipReduceType_Time:
+#        # 开始装备时间
+#        startTime = curItem.GetUserAttr(ShareDefine.Def_IudetCreateTime)
+#        if startTime == 0:
+#            return True
+#        if time.time() - startTime > curItemExpireTime:
+#            return False
     
-    reduceType = curItem.GetEndureReduceType()
-    if reduceType == ChConfig.Def_EquipReduceType_RTimeItem and \
-    curItemPastTime >= curItemExpireTime:
-        # 过期了
-        return False
-    
-    if reduceType == ChConfig.Def_EquipReduceType_Time:
-        # 开始装备时间
-        startTime = curItem.GetUserAttr(ShareDefine.Def_IudetCreateTime)
-        if startTime == 0:
-            return True
-        if time.time() - startTime > curItemExpireTime:
+    isExpireItem, expireTime = GetItemRemainingTime(curItem)
+    if isExpireItem:
+        if expireTime <= 0:
             return False
     return True
 
-##检查该物品是否合法,类型验证
-# @param curItem 物品实例
-# @param checkType 物品类型 
-# @return 布尔值(物品是否合法)
-# @remarks 检查该物品是否合法,类型验证
-def CheckItemByType(curItem, checkType):
-    #验证材料
-    if not CheckItemCanUse(curItem):
-        return False
+def GetItemRemainingTime(curItem):
+    ''' 获取物品剩余时间,秒
+    @return: 是否时效物品, 剩余时间 
+    '''
     
-    #类型不符合
-    if curItem.GetType() != checkType:
-        return False
+    isExpireItem = False
+    reduceType = curItem.GetEndureReduceType()
+    remainingTime = 0
     
-    return True
+    if reduceType in [ChConfig.Def_EquipReduceType_Time, ChConfig.Def_EquipReduceType_RTimeItem]:
+        isExpireItem = True
+        # 装备后开始计时
+        curItemExpireTime = curItem.GetUserAttr(ShareDefine.Def_IudetExpireTime)
+        if not curItemExpireTime:
+            curItemExpireTime = curItem.GetExpireTime()
+            
+        # 开始装备时间
+        startTime = curItem.GetUserAttr(ShareDefine.Def_IudetCreateTime)
+        if startTime == 0:
+            remainingTime = curItemExpireTime
+        else:
+            curItemPastTime = max(0, int(time.time()) - startTime)
+            remainingTime = max(0, curItemExpireTime - curItemPastTime)
+        return isExpireItem, remainingTime
+    
+    return isExpireItem, remainingTime
 
 ## 检查装备是否有镶嵌宝石
 #  @param curItem 装备对象
@@ -1092,7 +1022,7 @@
     for i in range(curItemPack.GetCount()):
         findItem = curItemPack.GetAt(i)
         
-        if not CheckItemCanUse(findItem):
+        if not CheckItemCanUse(findItem) or ItemControler.GetIsAuctionItem(findItem):
             continue
         
         #不使用绑定的材料
@@ -1135,7 +1065,7 @@
     for i in range(curItemPack.GetCount()):
         curItem = curItemPack.GetAt(i)
         
-        if not CheckItemCanUse(curItem):
+        if not CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
             continue
         
         #不使用绑定的材料
@@ -1174,7 +1104,7 @@
     for i in range(curItemPack.GetCount()):
         curItem = curItemPack.GetAt(i)
         
-        if not CheckItemCanUse(curItem):
+        if not CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
             continue
         
         if curItem.GetItemTypeID() != findItemID:
@@ -1216,7 +1146,7 @@
     for i in range(itemPack.GetCount()):
         curItem = itemPack.GetAt(i)
         #过滤不符合其他条件的物品
-        if not CheckItemCanUse(curItem):
+        if not CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
             continue
         
         if curItem.GetItemTypeID() != findItemID:
@@ -1258,7 +1188,7 @@
     for i in range(itemPack.GetCount()):
         curItem = itemPack.GetAt(i)
         #过滤不符合其他条件的物品
-        if not CheckItemCanUse(curItem):
+        if not CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
             continue
         
         if curItem.GetItemTypeID() != findItemID:
@@ -1304,7 +1234,7 @@
     for i in range(itemPack.GetCount()):
         curItem = itemPack.GetAt(i)
         #过滤不符合其他条件的物品
-        if not CheckItemCanUse(curItem):
+        if not CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
             continue
         
         if curItem.GetItemTypeID() != findItemID:
@@ -1337,7 +1267,7 @@
     return hasEnough, itemIndexList, findItemIsBind, needCnt
 
 
-def GetPackItemBindStateIndexInfo(curPlayer, itemID, needCount=0):
+def GetPackItemBindStateIndexInfo(curPlayer, itemID, needCount=0, packType=IPY_GameWorld.rptItem):
     ''' 获取背包消耗道具绑定及未绑定索引情况
     @param needCount: 所需个数, 默认绑定优先,当找到已经足够的个数后不再遍历,减少无用遍历
     @return: 可消耗物品列表[[绑定物品索引], [不绑定物品索引]], 绑定个数, 未绑定个数
@@ -1345,10 +1275,10 @@
     consumeItemIndexList = [[], []] # 可消耗物品列表[[绑定物品索引], [不绑定物品索引]]
     bindCnt, unBindCnt = 0, 0
     
-    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+    curPack = curPlayer.GetItemManager().GetPack(packType)
     for i in range(0, curPack.GetCount()):
         curItem = curPack.GetAt(i)
-        if not curItem:
+        if not CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
             continue
         
         if curItem.GetItemTypeID() != itemID:
@@ -1423,11 +1353,6 @@
     #系统提示 LostRes 失去物品
     #if needSysmsg:
     #    PlayerControl.NotifyCode(curPlayer, 'LostRes', [itemTypeID, totalUseCnt])
-        
-    #添加跨服服务器中使用物品事件
-    if itemTypeID in ReadChConfig.GetEvalChConfig("MergeServerCanUseItemID"):
-        eventInfo = [itemTypeID, totalUseCnt, makeItemBind, eventName, saveDataDict]
-        PlayerMergeEvent.AddMSPlayerEvent(curPlayer.GetPlayerID(), PlayerMergeEvent.Def_MSPEvent_DelItem, eventInfo)
     return makeItemBind
 
 def GetCostItemIndexList(costItemInfo, itemPack, bindFirst=True):
@@ -1456,7 +1381,7 @@
     for i in xrange(itemPack.GetCount()):
         curItem = itemPack.GetAt(i)
         #过滤不符合其他条件的物品
-        if not CheckItemCanUse(curItem):
+        if not CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
             continue
         curItemID = curItem.GetItemTypeID()
         if curItemID not in costItemDict:
@@ -1560,7 +1485,7 @@
     for index in range(0, itemPack.GetCount()):
         item = itemPack.GetAt(index)
         
-        if not CheckItemCanUse(item):
+        if not CheckItemCanUse(item) or ItemControler.GetIsAuctionItem(item):
             continue
         
         itemTypeID = item.GetItemTypeID()
@@ -1591,19 +1516,20 @@
 #  @remarks 函数详细说明.
 def DoLogic_ItemBindType(curPlayer, curItem, bindType):
     #固定不绑定
-    if bindType == ChConfig.Def_BindType_NoBind:
-        return
-    
-    #不处理已经绑定的物品
-    if curItem.GetIsBind():
-        return
-    #不是这个功能的绑定类型
-    if curItem.GetBindType() != bindType:
-        return
-    if curItem.GetBindType() == ChConfig.Def_BindType_DoEquipBind:
-        pass
-                
-    ItemControler.SetItemIsBind(curItem, True)
+    #拍品去除绑定逻辑,暂屏蔽
+#    if bindType == ChConfig.Def_BindType_NoBind:
+#        return
+#    
+#    #不处理已经绑定的物品
+#    if curItem.GetIsBind():
+#        return
+#    #不是这个功能的绑定类型
+#    if curItem.GetBindType() != bindType:
+#        return
+#    if curItem.GetBindType() == ChConfig.Def_BindType_DoEquipBind:
+#        pass
+#                
+#    ItemControler.SetItemIsBind(curItem, True)
     return True
 
 #---------------------------------------------------------------------
@@ -1658,7 +1584,7 @@
 #  @remarks 函数详细说明.
 def SwitchItem(curPlayer, curItem, switchItem, putInPackIndex):
     ##物品绑定字段判定 -> 装备绑定
-    if putInPackIndex == IPY_GameWorld.rptEquip:
+    if putInPackIndex in [IPY_GameWorld.rptEquip]:
         DoLogic_ItemBindType(curPlayer, switchItem, ChConfig.Def_BindType_DoEquipBind)
         
     # 装备技能书、坐骑装备绑定
@@ -1683,7 +1609,7 @@
         return
     
     ##物品绑定字段判定 -> 装备绑定
-    if putInPackIndex == IPY_GameWorld.rptEquip:
+    if putInPackIndex in [IPY_GameWorld.rptEquip]:
         DoLogic_ItemBindType(curPlayer, switchItem, ChConfig.Def_BindType_DoEquipBind)
     
     # 装备技能书、坐骑装备绑定
@@ -1709,13 +1635,6 @@
 def GetIsDogzEquip(curItem):
     ## 返回是否神兽装备
     return curItem.GetType() in ChConfig.Def_DogzEquiipType
-
-## 返回是否武器
-#  @param curItem 当前物品
-#  @return None
-#  @remarks 函数详细说明.
-def GetIsWeapon(curItem):
-    return curItem.GetType() in ChConfig.Def_WeaponItemType
 
 #---------------------------------------------------------------------
 ##遍历数据库查找合适的物品, 通过 效果ID + 效果A值确定物品
@@ -1763,7 +1682,7 @@
         curItem = curItemPack.GetAt(i)
         
         #检查物品
-        if not CheckItemCanUse(curItem):
+        if not CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
             continue
         
         effect = curItem.GetEffectByIndex(0)
@@ -1823,11 +1742,6 @@
     ItemControler.SetItemCount(curItem, curItemCnt - delCnt,
                                curPlayer.GetPlayerID(), curPlayer.GetAccID(),
                                curPlayer.GetPlayerName())
-    
-    #添加跨服服务器中使用物品事件
-    if curItemTypeID in ReadChConfig.GetEvalChConfig("MergeServerCanUseItemID"):
-        eventInfo = [curItemTypeID, delCnt, curItemBind, recordName, saveDataDict]
-        PlayerMergeEvent.AddMSPlayerEvent(curPlayer.GetPlayerID(), PlayerMergeEvent.Def_MSPEvent_DelItem, eventInfo)
     return
 
 def DelVPackItem(curPlayer, packIndex, placeList, eventName=""):
@@ -1849,6 +1763,13 @@
             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:
@@ -1857,34 +1778,45 @@
     ItemControler.Sync_VPackItem_Clear(curPlayer, packIndex, placeList)
     return
 
-## 获取物品最高强化星级
+## 获取物品最高强化等级
 #  @param itemType: 物品类型
 #  @return 最大星级,0为不可强化
-def GetItemMaxStarLV(curItem):
-    equipPlace = curItem.GetEquipPlace()
-    plusMaxTypeDict = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelLimit", 1)
-    if not plusMaxTypeDict:
-        GameWorld.ErrLog("GetItemMaxStarLV没有强化类型映射表")
+def GetItemMaxPlusLV(curPlayer, equipPackindex, curItem):
+    findType = ChEquip.GetEquipPlusType(curItem)
+    if not findType:
         return 0
-    
-    if equipPlace not in plusMaxTypeDict:
-        return 0
-    findType = plusMaxTypeDict[equipPlace]
-    #仙器特殊取固定值
-    if equipPlace in [ShareDefine.retFairyCan, ShareDefine.retFairyCan2]:
-        rank = 0
-        itemColor = 0
-    else:
-        rank = GetItemClassLV(curItem)
-        itemColor = curItem.GetItemColor()
-    ipyData = IpyGameDataPY.GetIpyGameData("ItemPlusMax", findType, rank, itemColor)
+    equipStar = ChEquip.GetEquipPartStarByRank(curPlayer, equipPackindex, curItem)
+    ipyData = IpyGameDataPY.InterpolationSearch('ItemPlusMax', 'Star', equipStar, {'Type':findType})
     if not ipyData:
-        GameWorld.ErrLog("找不到装备强化等级上限表数据配置! rank = %s, %s" % (rank , curItem.GetItemQuality()))
-        return
-    
+        return 0
     return ipyData.GetLevelMax()
+    
 
-## 获取物品阶级
+## 获取物品最高强化进化等级
+#  @param itemType: 物品类型
+#  @return 最大星级,0为不可强化
+def GetItemMaxPlusEvolveLV(curPlayer, equipPackindex, curItem):
+    packType = IPY_GameWorld.rptEquip
+    curPlusLV = ChEquip.GetEquipPartPlusLVByRank(curPlayer, packType, equipPackindex, curItem)
+    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()
 
@@ -1900,6 +1832,13 @@
 def SetEquipGearScore(curItem, value):
     return curItem.SetGearScore(value)
 
+def GetEquipPackIndex(curItem):
+    ## 根据物品获取对应的可装备背包位置
+    ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', GetItemClassLV(curItem), curItem.GetEquipPlace())
+    if not ipyData:
+        return -1
+    return ipyData.GetGridIndex()
+
 ## 每日可使用次数
 def GetCanUseCountDaily(curItem): return curItem.GetMaxAddSkillCnt()
 ## 每周可使用次数, 预留,暂不实现
@@ -1910,13 +1849,15 @@
     if not curItem or curItem.IsEmpty():
         return {}
     
+    isAuctionItem = ItemControler.GetIsAuctionItem(curItem)
     if not CheckItemIsEquip(curItem):
-        return [curItem.GetItemTypeID(), curItem.GetCount(), curItem.GetIsBind()]
+        return [curItem.GetItemTypeID(), curItem.GetCount(), isAuctionItem]
     
     addItemDict = {}
     addItemDict['ItemID'] = curItem.GetItemTypeID()
     addItemDict['Count'] = curItem.GetCount()
-    addItemDict['IsBind'] = int(curItem.GetIsBind())
+    addItemDict['IsAuctionItem'] = isAuctionItem
+    #addItemDict['IsBind'] = int(curItem.GetIsBind())
     #addItemDict['EquipGS'] = GetEquipGearScore(curItem)
     #addItemDict['ItemStarLV'] = curItem.GetItemStarLV()
     #addItemDict['CurDurg'] = GameWorld.GetIntUpper(curItem.GetCurDurg(), ChConfig.Def_EndureRepairParameter)
@@ -1940,7 +1881,7 @@
     #addItemDict['EquipMaxAtkValue'] = curItem.GetEquipMaxAtkValue()
     #addItemDict['FitLV'] = curItem.GetFitLV()
     #addItemDict['Proficiency'] = curItem.GetProficiency()
-    addItemDict['IsSuite'] = int(curItem.GetIsSuite())
+    #addItemDict['IsSuite'] = int(curItem.GetIsSuite())
     #addItemDict['BaseHP'] = curItem.GetBaseHP()
     #addItemDict['BaseMagicDef'] = curItem.GetBaseMagicDef()
     #addItemDict['MaxAddSkillCnt'] = curItem.GetMaxAddSkillCnt()
@@ -1952,10 +1893,10 @@
 
 def GetJsonItem(itemInfo):
     '''获取物品信息对应的json信息
-    @param itemInfo: 支持列表 [itemID, itemCount, isBind], 支持动态列表长度,索引代表属性固定
+    @param itemInfo: 支持列表 [itemID, itemCount, isAuctionItem], 支持动态列表长度,索引代表属性固定
                         支持物品实例, 如果是示例时必须在给玩家之前先获取出来,防止给玩家后该物品实例被清空
                         
-    @return: {"ItemID":101, "Count":10, "IsBind":1, "IsSuite":1, "UserData":"自定义属性字符串"}
+    @return: {"ItemID":101, "Count":10, "IsAuctionItem":1, "UserData":"自定义属性字符串"}
     '''
     itemDict = {}
     if isinstance(itemInfo, list) or isinstance(itemInfo, tuple):
@@ -1965,7 +1906,7 @@
         if infolen > 1 and itemInfo[1] > 1:
             itemDict["Count"] = itemInfo[1]
         if infolen > 2 and itemInfo[2]:
-            itemDict["IsBind"] = int(itemInfo[2])
+            itemDict["IsAuctionItem"] = int(itemInfo[2])
     elif isinstance(itemInfo, int):
         itemDict["ItemID"] = itemInfo
     else: #物品实例
@@ -1976,187 +1917,35 @@
         itemDict["ItemID"] = itemInfo.GetItemTypeID()
         if itemInfo.GetCount() > 1:
             itemDict["Count"] = itemInfo.GetCount()
-        if itemInfo.GetIsBind():
-            itemDict["IsBind"] = int(itemInfo.GetIsBind())
-        if itemInfo.GetIsSuite():
-            itemDict["IsSuite"] = int(itemInfo.GetIsSuite())
+        if ItemControler.GetIsAuctionItem(itemInfo):
+            itemDict["IsAuctionItem"] = 1
         if itemInfo.GetUserData():
             itemDict["UserData"] = itemInfo.GetUserData()
     return itemDict
 
-## 将物品列表重复物品堆叠起来返回整理后的列表
-#  @param itemlist
-#  @return 整理后的物品列表
-def GetSimpleItemList(itemlist):
-    sItemList = []
-    sItemDict = {}
-    for item in itemlist:
-        maxPackCount = item.GetPackCount()
-        if maxPackCount == 0:
-            return itemlist
-        itemCnt = item.GetCount()
-        if itemCnt > maxPackCount:
-            return itemlist
-        itemid = item.GetItemTypeID()
-        isBind = item.GetIsBind()
-        key = (itemid,isBind)
-        if key in sItemDict:
-            for sitem in sItemDict[key]:
-                if sitem.GetCount() >= maxPackCount:
+def GetWeightItemListByAlchemyDiffLV(curPlayer, weightList, alchemyDiffLV):
+    ''' 根据炼丹等级差异等级过滤权重列表中不满足的物品,返回新的权重列表
+    @param weightList: 物品权重信息列表
+    @param alchemyDiffLV: 是否过滤掉大于X级的炼丹等级物品,0-不过滤,1-过滤且读默认配置,>1-特殊功能指定的过滤等级
+    '''
+    resultWeightList = []
+    if alchemyDiffLV:
+        # 如果有指定大于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
-                totalCnt = item.GetCount()+ sitem.GetCount()
-                
-                if totalCnt > maxPackCount:
-                    ItemControler.SetItemCount(sitem, maxPackCount)
-                    ItemControler.SetItemCount(item, totalCnt - maxPackCount)
-                    sItemList.append(item)
-                    sItemDict[key].append(item)
-                    break
-                ItemControler.SetItemCount(sitem, totalCnt)
-                item.Clear()
-        else:
-            sItemList.append(item)
-            sItemDict[key] = [item]
-            
-    
-    return sItemList
-
-## =======================================================================================
-##根据活动类型配置随机装备品质
-# @param itemType 
-# @return 品质
-def GetRandEquipQualityByTable(itemType, tableName):
-    qualityRandDict = ReadChConfig.GetEvalChConfig(tableName)
-    qualityRandList = qualityRandDict.get(itemType, [])
-    if qualityRandList == []:
-        qualityRandList = qualityRandDict[-1]
-        
-    return GameWorld.GetResultByRandomList(qualityRandList, 0)
-
-## 随机卓越装备,根据规则从数据库中筛选出,等级职业
-#  @param equipType 装备类型
-#  @return 抽奖是否成功 
-def RandGreateEquip(curPlayer, equipType, isBind, tableName, quality=1):
-    equipList = GameDataControl.GetItemDataListByType(equipType)
-    equipLVRandList, lvFormulaStr, lvRange, jobRand, luckyShotRand, greateNumRand, \
-    broadcastList, plusRand, addAttrRand = ReadChConfig.GetEvalChConfig(tableName)
-    
-    playerLV = curPlayer.GetLV()
-    step = GameWorld.GetResultByRandomList(equipLVRandList, 0)
-    getLVMin = eval(lvFormulaStr)
-    getLVMax = getLVMin + lvRange
-    checkJob = GameWorld.CanHappen(jobRand)
-    
-    randList = []
-    findItem = None
-    
-    for item in equipList:
-        if item.GetUseLV() < getLVMin or item.GetUseLV() > getLVMax:
-            continue
-        
-        if item.GetItemQuality() != quality:
-            continue
-        
-        if checkJob:
-            if JobUseable(curPlayer, item):
-                findItem = item
-                break
-            continue
-        
-        randList.append(item)
-    
-    if randList:
-        findItem = random.choice(randList)
-    
-    if findItem == None:
-        return None, False
-    
-    return CreateGreateItem(findItem, luckyShotRand, greateNumRand, broadcastList,
-                     plusRand, addAttrRand, isBind)
-
-
-## 生成抽奖的卓越装备
-#  @param 各属性
-#  @return 生成的物品,是否广播 
-def CreateGreateItem(findItem, luckyShotRand, greateNumRand, broadcastList,
-                     plusRand, addAttrRand, isBind):
-    itemID = findItem.GetItemTypeID()
-    equipItem = CreateSingleItem(itemID)
-    
-    tmpEquipData = ItemControler.SingleEquipTmpData()
-    
-    tmpEquipData.starLV = random.randint(plusRand[0], plusRand[1])
-    tmpEquipData.holeCnt = 3
-    tmpEquipData.isBind = isBind
-    tmpEquipData.isSuite = 0
-    
-    # 装备附加属性
-    ChItem.EquipAddAdditionEx(equipItem, tmpEquipData)
-    
-    broadcast = False
-        
-    return equipItem, broadcast
-
-
-## 随机普通装备,根据规则从数据库中筛选出,等级职业
-#  @param equipType 装备类型
-#  @return 抽奖是否成功 
-def RandNormalEquip(curPlayer, equipType, isBind, tableName):
-    equipList = GameDataControl.GetItemDataListByType(equipType)
-    equipLVRandList, lvFormulaStr, lvRange, jobRand, luckyShotRand, \
-    plusRand, addAttrRand, skillRand = ReadChConfig.GetEvalChConfig(tableName)
-    
-    playerLV = curPlayer.GetLV()
-    step = GameWorld.GetResultByRandomList(equipLVRandList, 0)
-    getLVMin = eval(lvFormulaStr)
-    getLVMax = getLVMin + lvRange
-    checkJob = GameWorld.CanHappen(jobRand)
-    
-    randList = []
-    findItem = None
-    
-    for item in equipList:
-        if item.GetUseLV() < getLVMin or item.GetUseLV() > getLVMax:
-            continue
-        
-        if item.GetItemQuality() != 0:
-            continue
-        
-        if checkJob:
-            if JobUseable(curPlayer, item):
-                findItem = item
-                break
-            continue
-        
-        randList.append(item)
-    
-    if randList:
-        findItem = random.choice(randList)
-    
-    if findItem == None:
-        return None
-    
-    return CreateNormalItem(findItem, luckyShotRand, plusRand, addAttrRand, isBind, skillRand)
-
-
-## 生成抽奖的卓越装备
-#  @param 各属性
-#  @return 生成的物品
-def CreateNormalItem(findItem, luckyShotRand, plusRand, addAttrRand, isBind, skillRand):
-    itemID = findItem.GetItemTypeID()
-    equipItem = CreateSingleItem(itemID)
-    
-    tmpEquipData = ItemControler.SingleEquipTmpData()
-    
-    tmpEquipData.starLV = random.randint(plusRand[0], plusRand[1])
-    tmpEquipData.holeCnt = 3
-    tmpEquipData.isBind = isBind
-    tmpEquipData.isSuite = 0
-    
-    # 装备附加属性
-    ChItem.EquipAddAdditionEx(equipItem, tmpEquipData)
-    
-    return equipItem
+                if GetItemClassLV(itemData) > curAlchemyLV + alchemyDiffLV:
+                    continue
+            resultWeightList.append(itemInfo)
+    else:
+        resultWeightList = weightList
+    return resultWeightList
 
 ## =======================================================================================
 

--
Gitblit v1.8.0