From 89cd1373014cea5337624c82d25fa6f84c7fe7c7 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期四, 25 四月 2019 17:38:48 +0800
Subject: [PATCH] 6607 【2.0】【后端】技能升级功能改版

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py |  521 +++++++++++++++++++++++----------------------------------
 1 files changed, 208 insertions(+), 313 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 1ba3c18..709d0fe 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
@@ -334,12 +334,14 @@
     GameWorld.DebugLog("物品过期时间" + timeStr)
     return GameWorld.ChangeTimeStrToNum(timeStr)
 
-
-## 创建物品
-#  @param itemID 物品ID
-#  @return curSingleItem
-#  @remarks 函数详细说明.
-def CreateSingleItem(itemID, itemCount=1, isBind=0, expireTime=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
@@ -372,9 +374,12 @@
             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:
@@ -383,6 +388,46 @@
     #这里返回的是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):
@@ -414,8 +459,8 @@
         
     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.GetIpyGameData("EquipGSParam", classLV, color, isSuit)
     # 传奇属性
     legendAttrIDCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrID)
     legendAttrValueCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrValue)
@@ -430,38 +475,59 @@
     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)
     
-    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#attrDict.get(ShareDefine.Def_Effect_SkillAddPer1, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer1C())
+    SkillAddPerB = 0#attrDict.get(ShareDefine.Def_Effect_SkillAddPer2, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer2C())
+    SkillAddPerC = 0#attrDict.get(ShareDefine.Def_Effect_SkillAddPer3, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer3C())
+    SkillAddPerD = 0#attrDict.get(ShareDefine.Def_Effect_SkillAddPer4, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer4C())
+    SkillAddPerE = 0#attrDict.get(ShareDefine.Def_Effect_SkillAddPer5, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer5C())
+    SkillAddPerF = 0#attrDict.get(ShareDefine.Def_Effect_SkillAddPer6, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer6C())
+    SkillAddPerG = 0#attrDict.get(ShareDefine.Def_Effect_SkillAddPer7, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer7C())
+    SkillReducePerA = 0#attrDict.get(ShareDefine.Def_Effect_SkillReducePer1, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer1C())
+    SkillReducePerB = 0#attrDict.get(ShareDefine.Def_Effect_SkillReducePer2, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer2C())
+    SkillReducePerC = 0#attrDict.get(ShareDefine.Def_Effect_SkillReducePer3, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer3C())
+    SkillReducePerD = 0#attrDict.get(ShareDefine.Def_Effect_SkillReducePer4, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer4C())
+    SkillReducePerE = 0#attrDict.get(ShareDefine.Def_Effect_SkillReducePer5, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer5C())
+    SkillReducePerF = 0#attrDict.get(ShareDefine.Def_Effect_SkillReducePer6, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer6C())
+    SkillReducePerG = 0#attrDict.get(ShareDefine.Def_Effect_SkillReducePer7, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer7C())
     
     # 攻速不默认乘,仅作为参数提供策划使用
-    AtkSpeed = attrDict.get(ShareDefine.Def_Effect_AtkSpeed, 0)
-    AtkSpeedC = 1 if not gsParamIpyData else gsParamIpyData.GetAtkSpeedC()
+    AtkSpeed = 0#attrDict.get(ShareDefine.Def_Effect_AtkSpeed, 0)
+    AtkSpeedC = 1#1 if not gsParamIpyData else gsParamIpyData.GetAtkSpeedC()
     
     # 绝版
     outOfPrintAttrIDCnt = curItem.GetUserAttrCount(ShareDefine.Def_IudetOutOfPrintAttrID)
@@ -486,7 +552,15 @@
 
 def GetZhuXianEquipTotalGS(curPlayer):
     ##诛仙装备总评分
-    return 10000000
+    equipScoreTotal = 0
+    zhuXianEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptZhuXianEquip)
+    for equipIndex in xrange(zhuXianEquipPack.GetCount()):
+        curEquip = zhuXianEquipPack.GetAt(equipIndex)            
+        if curEquip.IsEmpty():
+            continue
+        equipScoreTotal += GetEquipGearScore(curEquip)
+    return equipScoreTotal
+
 #---------------------------------------------------------------------
 ## 通过效果ID,检查是否为指定物品 
 #  @param curPlayer 当前玩家
@@ -495,7 +569,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):
@@ -556,7 +630,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:
@@ -799,9 +873,8 @@
     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)
+    notifyList[6] = "" 
+    notifyList[7] = ChEquip.GetEquipPartPlusLV(curPlayer, IPY_GameWorld.rptEquip, place)
     
     # 单部位洗练信息
     washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % place) + 1
@@ -842,32 +915,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
@@ -938,22 +994,6 @@
         return isExpireItem, remainingTime
     
     return isExpireItem, remainingTime
-
-##检查该物品是否合法,类型验证
-# @param curItem 物品实例
-# @param checkType 物品类型 
-# @return 布尔值(物品是否合法)
-# @remarks 检查该物品是否合法,类型验证
-def CheckItemByType(curItem, checkType):
-    #验证材料
-    if not CheckItemCanUse(curItem):
-        return False
-    
-    #类型不符合
-    if curItem.GetType() != checkType:
-        return False
-    
-    return True
 
 ## 检查装备是否有镶嵌宝石
 #  @param curItem 装备对象
@@ -1131,7 +1171,7 @@
     for i in range(curItemPack.GetCount()):
         findItem = curItemPack.GetAt(i)
         
-        if not CheckItemCanUse(findItem):
+        if not CheckItemCanUse(findItem) or ItemControler.GetIsAuctionItem(findItem):
             continue
         
         #不使用绑定的材料
@@ -1174,7 +1214,7 @@
     for i in range(curItemPack.GetCount()):
         curItem = curItemPack.GetAt(i)
         
-        if not CheckItemCanUse(curItem):
+        if not CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
             continue
         
         #不使用绑定的材料
@@ -1213,7 +1253,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:
@@ -1255,7 +1295,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:
@@ -1297,7 +1337,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:
@@ -1343,7 +1383,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:
@@ -1376,7 +1416,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: 可消耗物品列表[[绑定物品索引], [不绑定物品索引]], 绑定个数, 未绑定个数
@@ -1384,10 +1424,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:
@@ -1490,7 +1530,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:
@@ -1594,7 +1634,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()
@@ -1625,19 +1665,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
 
 #---------------------------------------------------------------------
@@ -1692,11 +1733,11 @@
 #  @remarks 函数详细说明.
 def SwitchItem(curPlayer, curItem, switchItem, putInPackIndex):
     ##物品绑定字段判定 -> 装备绑定
-    if putInPackIndex == IPY_GameWorld.rptEquip:
+    if putInPackIndex in [IPY_GameWorld.rptEquip, ShareDefine.rptZhuXianEquip]:
         DoLogic_ItemBindType(curPlayer, switchItem, ChConfig.Def_BindType_DoEquipBind)
         
     # 装备技能书、坐骑装备绑定
-    if putInPackIndex in [IPY_GameWorld.rptHorseEquip]:
+    if putInPackIndex in [IPY_GameWorld.rptHorseEquip, ShareDefine.rptZhuXianEquip]:
         DoLogic_ItemBindType(curPlayer, curItem, ChConfig.Def_BindType_DoEquipBind)
     
     #交换装备
@@ -1717,11 +1758,11 @@
         return
     
     ##物品绑定字段判定 -> 装备绑定
-    if putInPackIndex == IPY_GameWorld.rptEquip:
+    if putInPackIndex in [IPY_GameWorld.rptEquip, ShareDefine.rptZhuXianEquip]:
         DoLogic_ItemBindType(curPlayer, switchItem, ChConfig.Def_BindType_DoEquipBind)
     
     # 装备技能书、坐骑装备绑定
-    if putInPackIndex in [IPY_GameWorld.rptHorseEquip]:
+    if putInPackIndex in [IPY_GameWorld.rptHorseEquip, ShareDefine.rptZhuXianEquip]:
         DoLogic_ItemBindType(curPlayer, emptyItem, ChConfig.Def_BindType_DoEquipBind)
 
     if switchItem.GetGameWorldItemType() == IPY_GameWorld.gwitRoleItem:
@@ -1747,13 +1788,6 @@
 def GetIsZhuXianEquip(curItem):
     ## 返回是否诛仙装备
     return curItem.GetType() in ChConfig.Def_ZhuXianEquiipType
-
-## 返回是否武器
-#  @param curItem 当前物品
-#  @return None
-#  @remarks 函数详细说明.
-def GetIsWeapon(curItem):
-    return curItem.GetType() in ChConfig.Def_WeaponItemType
 
 #---------------------------------------------------------------------
 ##遍历数据库查找合适的物品, 通过 效果ID + 效果A值确定物品
@@ -1801,7 +1835,7 @@
         curItem = curItemPack.GetAt(i)
         
         #检查物品
-        if not CheckItemCanUse(curItem):
+        if not CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
             continue
         
         effect = curItem.GetEffectByIndex(0)
@@ -1897,34 +1931,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()
 
@@ -1940,6 +1985,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()
 ## 每周可使用次数, 预留,暂不实现
@@ -1950,13 +2002,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)
@@ -1980,7 +2034,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()
@@ -1992,10 +2046,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):
@@ -2005,7 +2059,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: #物品实例
@@ -2016,187 +2070,28 @@
         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:
-                    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
+def GetWeightItemListByAlchemyDiffLV(curPlayer, weightList, alchemyDiffLV):
+    ## 根据炼丹等级差异等级过滤权重列表中不满足的物品,返回新的权重列表
+    resultWeightList = []
+    if alchemyDiffLV:
+        curAlchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
+        for itemInfo in weightList:
+            itemID = itemInfo[1][0]
+            itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
+            if not itemData:
+                continue
+            if GetItemClassLV(itemData) > curAlchemyLV + alchemyDiffLV:
+                continue
+            resultWeightList.append(itemInfo)
+    else:
+        resultWeightList = weightList
+    return resultWeightList
 
 ## =======================================================================================
 

--
Gitblit v1.8.0