From 40e191811bd44f1476f3d99ed5932605c4416e48 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期六, 01 六月 2019 22:25:06 +0800
Subject: [PATCH] 6603 【后端】【2.0】增加新版的sp和被动技能

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipWash.py |  320 +++++++++++++++++++++++++++-------------------------
 1 files changed, 167 insertions(+), 153 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipWash.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipWash.py
index 23f9e03..87d2866 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipWash.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipWash.py
@@ -22,75 +22,65 @@
 import PlayerControl
 import PlayerSuccess
 import IPY_GameWorld
+import DataRecordPack
+import PlayerActLogin
 import ShareDefine
 import ItemCommon
 import ChConfig
 import ChEquip
-import EventShell
 
 import random
 
 
-Def_EquipWashMaxType = 3 # 装备洗练最大归组类型
+Def_EquipWashMaxType = 2 # 装备洗练最大归组类型
 Def_EquipWashMaxAttrCount = 3 # 装备洗练最大洗练属性条数
+g_allIndexList = [] #可洗炼的部位缓存
 
-def OnEquipWashLogin(curPlayer):
-    Sycn_EquipWashInfo(curPlayer, isLogin=True)
-    return
+#def OnEquipWashLogin(curPlayer):
+#    Sycn_EquipWashInfo(curPlayer, isLogin=True)
+#    return
 
-def GetEquipWashMaxLV(curPlayer, equipPlace):
+def GetEquipWashMaxLV(curPlayer, equipPackindex, equipPlace):
     # @return: 0-未开放; >=1-该装备位最大可洗练等级
-    maxLVDict = IpyGameDataPY.GetFuncEvalCfg("EquipWashMaxLV", 1)
-    if not maxLVDict:
+    washType = GetEquipWashType(equipPlace)
+    if not washType:
         return 0
+    
     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
-    curEquip = equipPack.GetAt(equipPlace)
+    curEquip = equipPack.GetAt(equipPackindex)
     if not curEquip or curEquip.IsEmpty():
-        GameWorld.DebugLog("该装备位没有装备,无法洗练!equipPlace=%s" % (equipPlace))
+        GameWorld.DebugLog("该装备位没有装备,无法洗练!equipPackindex=%s" % (equipPackindex))
         return 0
-    equipClassLV = ItemCommon.GetItemClassLV(curEquip)
-    minClassLVCfg = min(maxLVDict)
-    if equipClassLV < minClassLVCfg:
-        GameWorld.DebugLog("该装备位装备阶级=%s < minClassLVCfg(%s),无法洗练!equipPlace=%s" 
-                           % (equipClassLV, minClassLVCfg, equipPlace))
+    
+    equipStar = ChEquip.GetEquipPartStarByRank(curPlayer, equipPackindex, curEquip)
+    ipyData = IpyGameDataPY.InterpolationSearch('ItemWashMax', 'Star', equipStar, {'Type':washType})
+    if not ipyData:
         return 0
-    if equipClassLV in maxLVDict:
-        maxWashLV = maxLVDict[equipClassLV]
-        if not maxWashLV:
-            GameWorld.DebugLog("该装备位装备阶级=%s,maxWashLV=%s,无法洗练!equipPlace=%s" 
-                               % (equipClassLV, maxWashLV, equipPlace))
-            return 0
-        return maxWashLV
-    maxClassLVCfg = max(maxLVDict)
-    if equipClassLV > maxClassLVCfg:
-        return maxLVDict[maxClassLVCfg]
-    # 默认返回当前部位洗练等级
-    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % equipPlace) + 1
+    return ipyData.GetLevelMax()
+    
+    
 
-def GetEquipWashPlaceList(washType):
-    ## 获取洗练类型对应的所有装备位
-    placeList = IpyGameDataPY.GetFuncEvalCfg("EquipWashGroup%s" % washType, 1)
-    if placeList:
-        return placeList
-    return []
 
 def GetEquipWashType(equipPlace):
     ## 获取装备位对应的洗练类型
-    for washType in range(1, Def_EquipWashMaxType + 1):
-        placeList = GetEquipWashPlaceList(washType)
-        if equipPlace in placeList:
-            return washType
-    return
+    return IpyGameDataPY.GetFuncEvalCfg('EquipWashGroup', 1, {}).get(equipPlace)
+    
 
 def GetEquipWashData(washType, washLV):
     return IpyGameDataPY.GetIpyGameData("EquipWash", washType, washLV)
 
 def GetAllEquipWashPlace():
     # 获取所有可洗练的装备位
-    allPlaceList = []
-    for washType in range(1, Def_EquipWashMaxType + 1):
-        allPlaceList += GetEquipWashPlaceList(washType)
-    return allPlaceList
+    global g_allIndexList
+    if not g_allIndexList:
+        maxClasslv = IpyGameDataPY.GetFuncCfg('EquipMaxClasslv')
+        for equipPlace in IpyGameDataPY.GetFuncEvalCfg('EquipWashGroup', 1, {}):
+            for classLV in xrange(1, maxClasslv+1):
+                ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)
+                if not ipyData:
+                    continue
+                g_allIndexList.append(ipyData.GetGridIndex())
+    return g_allIndexList
 
 #// A3 25 装备洗炼 #tagCMEquipXLAttrChange
 #
@@ -105,20 +95,24 @@
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
     playerID = curPlayer.GetPlayerID()
     
-    equipPlace = clientData.EquipPlace
+    equipPackindex = clientData.EquipPlace
     checkUseGoldAttr = clientData.CheckUseGoldAttr
-    
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':equipPackindex})
+    if not ipyData:
+        return
+    equipPlace = ipyData.GetEquipPlace()
+    classLV = ipyData.GetClassLV()
     washType = GetEquipWashType(equipPlace)
-    maxWashLV = GetEquipWashMaxLV(curPlayer, equipPlace)
-    washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % equipPlace) + 1
-    GameWorld.DebugLog("装备洗练: equipPlace=%s,checkUseGoldAttr=%s,washType=%s,washLV=%s,maxWashLV=%s" 
-                       % (equipPlace, checkUseGoldAttr, washType, washLV, maxWashLV), playerID)
-    
     if washType is None:
         GameWorld.Log("该装备位无法洗练! equipPlace=%s" % (equipPlace), playerID)
         return
     
-    if maxWashLV < 1:
+    maxWashLV = GetEquipWashMaxLV(curPlayer, equipPackindex, equipPlace)
+    washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % equipPackindex)
+    GameWorld.DebugLog("装备洗练: classLV=%s,equipPlace=%s,checkUseGoldAttr=%s,washType=%s,washLV=%s,maxWashLV=%s" 
+                       % (classLV, equipPlace, checkUseGoldAttr, washType, washLV, maxWashLV), playerID)
+    
+    if maxWashLV < washLV:
         return
         
     washData = GetEquipWashData(washType, washLV)
@@ -129,11 +123,11 @@
     maxValueAttrNumList = [] # 已达到当前等级最大值的属性编号列表
     for attrNum in range(1, Def_EquipWashMaxAttrCount + 1):
         maxValue = getattr(washData, "GetAttrMax%s" % attrNum)()
-        washValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipPlace, attrNum))
-        washValueTemp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValueTemp % (equipPlace, attrNum))
+        washValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipPackindex, attrNum))
+        washValueTemp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValueTemp % (equipPackindex, attrNum))
         if washValueTemp != 0:
-            GameWorld.Log("还有未选择是否保存的洗练属性,不可洗练!equipPlace=%s,attrNum=%s,washValueTemp=%s" 
-                          % (equipPlace, attrNum, washValueTemp), playerID)
+            GameWorld.Log("还有未选择是否保存的洗练属性,不可洗练!equipPackindex=%s,attrNum=%s,washValueTemp=%s" 
+                          % (equipPackindex, attrNum, washValueTemp), playerID)
             return
         if washValue >= maxValue:
             maxValueAttrNumList.append(attrNum)
@@ -154,8 +148,8 @@
                            % (costItemID, costItemCount, bindCnt, unBindCnt), playerID)
         return
     
-    goldWashCostList = washData.GetGoldWashCostList()
-    if not goldWashCostList or len(goldWashCostList) != Def_EquipWashMaxAttrCount:
+    goldWashCostItemCountList = washData.GetGoldWashCostList() # 洗练必增条数消耗必增道具个数
+    if not goldWashCostItemCountList or len(goldWashCostItemCountList) != Def_EquipWashMaxAttrCount:
         return
     
     randAttrDict = {} # 随机变更值字典 {属性编号:随机值, ...}
@@ -166,7 +160,7 @@
         if attrNum in maxValueAttrNumList:
             continue
         
-        washValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipPlace, attrNum))
+        washValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipPackindex, attrNum))
         if checkUseGoldAttr & pow(2, attrNum - 1):
             useGoldAttrNumList.append(attrNum)
             randValueMin = getattr(washData, "GetAttrCostGoldMin%s" % attrNum)()
@@ -179,24 +173,47 @@
                     randValueMin, randValueMax = randRange
                     break
             if not randValueMin and not randValueMax:
-                GameWorld.ErrLog("找不到该装备位当前洗练值范围随机值!equipPlace=%s,washType=%s,washLV=%s,attrNum=%s,washValue=%s,randDict=%s" 
-                                 % (equipPlace, washType, washLV, attrNum, washValue, randDict))
+                GameWorld.ErrLog("找不到该装备位当前洗练值范围随机值!equipPackindex=%s,washType=%s,washLV=%s,attrNum=%s,washValue=%s,randDict=%s" 
+                                 % (equipPackindex, washType, washLV, attrNum, washValue, randDict))
                 return
         GameWorld.DebugLog("随机范围属性%s, washValue=%s, %s~%s" % (attrNum, washValue, randValueMin, randValueMax))
         randValue = random.randint(randValueMin, randValueMax)
+        for _ in xrange(50):
+            if randValue != 0:
+                break
+            randValue = random.randint(randValueMin, randValueMax)
+            #GameWorld.DebugLog("随机值0,重新随机!")
+        if randValue == 0:
+            randValue = 1
+            #GameWorld.DebugLog("随机值还是0,强制设置为1!")
         randAttrDict[attrNum] = randValue
         if randValue <= 0:
             negativeValueCnt += 1
         fixMaxValueDict[attrNum] = randValueMax
         
     checkUseGoldCnt = len(useGoldAttrNumList)
-    needGold = 0 if checkUseGoldCnt <= 0 else goldWashCostList[checkUseGoldCnt - 1]
+    needGold = 0
+    needMustID = IpyGameDataPY.GetFuncCfg("EquipWashMustID", 1)
+    needMustIDCount = 0 if checkUseGoldCnt <= 0 else goldWashCostItemCountList[checkUseGoldCnt - 1]
+    delMustIDCount = needMustIDCount
+    mustItemIndexList, mustBindCnt, mustUnBindCnt = [], 0, 0
+    if needMustIDCount:
+        mustItemIndexList, mustBindCnt, mustUnBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, needMustID, needMustIDCount)
+        mustItemLackCount = max(0, needMustIDCount - (mustBindCnt + mustUnBindCnt))
+        if mustItemLackCount > 0:
+            needGold = ItemCommon.GetAutoBuyItemNeedGold({needMustID:mustItemLackCount})
+            if needGold <= 0:
+                GameWorld.ErrLog("自动购买必增道具所需仙玉异常!needMustID=%s,mustItemLackCount=%s,needGold=%s" 
+                                 % (needMustID, mustItemLackCount, needGold), playerID)
+                return
+            delMustIDCount = needMustIDCount - mustItemLackCount
+            
     if needGold and not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, needGold):
         GameWorld.DebugLog("仙玉不足,无法洗练!checkUseGoldCnt=%s,needGold=%s" % (checkUseGoldCnt, needGold), playerID)
         return
     
     preWashData = None # 上一洗练等级数据
-    if washLV > 1:
+    if washLV > 0:
         preWashData = GetEquipWashData(washType, washLV - 1)
         if not preWashData:
             GameWorld.ErrLog("找不到上一级洗练数据,无法洗练!preWashLV=%s" % (washLV - 1))
@@ -204,8 +221,11 @@
         
     # 扣除消耗
     ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, costItemCount, "EquipWash")
+    if delMustIDCount:
+        ItemCommon.DelCostItemByBind(curPlayer, mustItemIndexList, mustBindCnt, mustUnBindCnt, delMustIDCount, "EquipWash")
+        
     if needGold:
-        infoDict = {"EquipPlace":equipPlace, "WashType":washType, "WashLV":washLV, "CheckUseGoldCnt":checkUseGoldCnt}
+        infoDict = {'classLV':classLV, "EquipPlace":equipPlace, "WashType":washType, "WashLV":washLV, "CheckUseGoldCnt":checkUseGoldCnt}
         PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, needGold, ChConfig.Def_Cost_EquipWash, infoDict)
         
     GameWorld.DebugLog("随机洗练: randAttrDict=%s,fixMaxValueDict=%s" % (randAttrDict, fixMaxValueDict), playerID)
@@ -214,7 +234,7 @@
         minPer = 1
         minPerAttrNum = 1
         for attrNum in range(1, Def_EquipWashMaxAttrCount + 1):
-            washValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipPlace, attrNum))
+            washValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipPackindex, attrNum))
             preMaxValue = 0 if not preWashData else getattr(preWashData, "GetAttrMax%s" % attrNum)()
             curMaxValue = getattr(washData, "GetAttrMax%s" % attrNum)()
             curPer = (washValue - preMaxValue) / float(curMaxValue - preMaxValue)
@@ -232,7 +252,7 @@
     # 最终洗练值确认
     isRefreshAttr = False
     for attrNum, randValue in randAttrDict.items():
-        washValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipPlace, attrNum))
+        washValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipPackindex, attrNum))
         tempValue = washValue + randValue
         preMaxValue = 0 if not preWashData else getattr(preWashData, "GetAttrMax%s" % attrNum)()
         maxValue = getattr(washData, "GetAttrMax%s" % attrNum)()
@@ -252,20 +272,22 @@
         # 使用钻石洗练的直接更新,不用确认
         if attrNum in useGoldAttrNumList:
             isRefreshAttr = True
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipWashValue % (equipPlace, attrNum), tempValue)
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipWashValue % (equipPackindex, attrNum), tempValue)
+            dataDict = {'classLV':classLV, 'equipPlace':equipPlace,'attrNum':attrNum,'oldValue':washValue,'newValue':tempValue}
+            DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_EquipWash, dataDict)
             GameWorld.DebugLog("    勾选洗练,直接更新数值: %s" % tempValue, playerID)
         else:
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipWashValueTemp % (equipPlace, attrNum), tempValue)
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipWashValueTemp % (equipPackindex, attrNum), tempValue)
             
     #屏蔽自动升级
 #    if isRefreshAttr and washLV < maxWashLV:
 #        CheckEquipWashLVUp(curPlayer, equipPlace, washLV, washData)
         
-    Sycn_EquipWashInfo(curPlayer, equipPlace)
+    Sycn_EquipWashInfo(curPlayer, equipPackindex)
     
     if isRefreshAttr:
-        RefreshEquipWashAttr(curPlayer)
-        
+        RefreshEquipWashAttr(curPlayer, classLV)
+    PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_EquipWash, 1)
     return
 
 
@@ -281,18 +303,27 @@
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
     playerID = curPlayer.GetPlayerID()
     
-    equipPlace = clientData.EquipPlace
+    equipPackindex = clientData.EquipPlace
     isSave = clientData.IsSave
-    
-    washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % equipPlace) + 1
-    maxWashLV = GetEquipWashMaxLV(curPlayer, equipPlace)
-    GameWorld.DebugLog("确认洗练结果: equipPlace=%s,isSave=%s,washLV=%s,maxWashLV=%s" 
-                       % (equipPlace, isSave, washLV, maxWashLV), playerID)
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':equipPackindex})
+    if not ipyData:
+        return
+    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
+    curEquip = curPack.GetAt(equipPackindex)
+    if not curEquip or curEquip.IsEmpty():
+        GameWorld.DebugLog("OnEquipWashAttrChangeOK() equip is empty")
+        return
+    equipPlace = ipyData.GetEquipPlace()
+    classLV = ipyData.GetClassLV()
+    washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % equipPackindex)
+    maxWashLV = GetEquipWashMaxLV(curPlayer, equipPackindex, equipPlace)
+    GameWorld.DebugLog("确认洗练结果: classLV=%s, equipPlace=%s,isSave=%s,washLV=%s,maxWashLV=%s" 
+                       % (classLV, equipPlace, isSave, washLV, maxWashLV), playerID)
     
     washType = GetEquipWashType(equipPlace)
     if washType is None:
         return
-    if maxWashLV < 1:
+    if maxWashLV < 0:
         return
     washData = GetEquipWashData(washType, washLV)
     if not washData:
@@ -303,82 +334,87 @@
         if washLV >= maxWashLV:
             GameWorld.DebugLog("已达到最大洗练等级,不可升级!", playerID)
             return
-        if CheckEquipWashLVUp(curPlayer, equipPlace, washLV, washData):
-            RefreshEquipWashAttr(curPlayer)
-            Sycn_EquipWashInfo(curPlayer, equipPlace)
+        if CheckEquipWashLVUp(curPlayer, curEquip, equipPackindex, washLV, washData):
+            RefreshEquipWashAttr(curPlayer, classLV)
+            Sycn_EquipWashInfo(curPlayer, equipPackindex)
             EquipWashSuccess(curPlayer)
         else:
             GameWorld.DebugLog("升级失败,有属性未达到最大值,无法升级!", playerID)
         return
     
     for attrNum in range(1, Def_EquipWashMaxAttrCount + 1):
-        tempValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValueTemp % (equipPlace, attrNum))
+        tempValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValueTemp % (equipPackindex, attrNum))
         if not tempValue:
             continue
         
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipWashValueTemp % (equipPlace, attrNum), 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipWashValueTemp % (equipPackindex, attrNum), 0)
         if isSave == 1:
-            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipWashValue % (equipPlace, attrNum), tempValue)
-            GameWorld.DebugLog("保存洗练数据: equipPlace=%s,attrNum=%s,tempValue=%s" % (equipPlace, attrNum, tempValue), playerID)
+            oldValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipPackindex, attrNum))
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipWashValue % (equipPackindex, attrNum), tempValue)
+            dataDict = {'classLV':classLV, 'equipPlace':equipPlace,'attrNum':attrNum,'oldValue':oldValue,'newValue':tempValue}
+            DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_EquipWash, dataDict)
+            GameWorld.DebugLog("保存洗练数据: classLV=%s, equipPlace=%s,attrNum=%s,tempValue=%s" % (classLV, equipPlace, attrNum, tempValue), playerID)
             
     if isSave == 1:
-        RefreshEquipWashAttr(curPlayer)
+        RefreshEquipWashAttr(curPlayer, classLV)
     #屏蔽自动升级
 #        if washLV < maxWashLV:
 #            CheckEquipWashLVUp(curPlayer, equipPlace, washLV, washData)
-    Sycn_EquipWashInfo(curPlayer, equipPlace)
+    Sycn_EquipWashInfo(curPlayer, equipPackindex)
     return
 
-def CheckEquipWashLVUp(curPlayer, equipPlace, washLV, washData):
+def CheckEquipWashLVUp(curPlayer, curEquip, equipPackindex, washLV, washData):
     # 检查洗练类型升级
     
     for attrNum in range(1, Def_EquipWashMaxAttrCount + 1):
-        tempValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipPlace, attrNum))
+        tempValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipPackindex, attrNum))
         # 只要有未达到本级最大值的,则不能升级
         if tempValue < getattr(washData, "GetAttrMax%s" % attrNum)():
             return
     washLV += 1
-    # 字典存储的从0开始,0代表1级,所以实际存进去的值需减1
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipWashLV % (equipPlace), washLV - 1)
-    GameWorld.DebugLog("装备洗练等级升级: equipPlace=%s,washLV=%s" % (equipPlace, washLV), curPlayer.GetPlayerID())
+    SetEquipWashLV(curPlayer, equipPackindex, washLV)
     
     # 洗练广播
-    PlayerControl.WorldNotify(0, "WashCongratulation", [curPlayer.GetPlayerName(), curPlayer.GetPlayerID(), equipPlace, washLV])
-    for washType in range(1, Def_EquipWashMaxType + 1):
-        placeList = GetEquipWashPlaceList(washType)
-        if equipPlace not in placeList:
-            continue
-        
-        minWashLV = 999
-        for equipPlace in placeList:
-            minWashLV = min(minWashLV, curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % equipPlace) + 1)
-        
-        if minWashLV == washLV:
-            # 有精确命中数据等级,代表刚好达成该洗练套装
-            washSpecLVIpyData = IpyGameDataPY.GetIpyGameDataNotLog("EquipWashSpec", washType, washLV)
-            if washSpecLVIpyData:
-                PlayerControl.WorldNotify(0, "WashMasterCongratulation", [curPlayer.GetPlayerName(), curPlayer.GetPlayerID(), washType, washLV])
-        EventShell.EventRespons_EquipWash(curPlayer, washType, washLV)
-        break
+    itemID = curEquip.GetItemTypeID()
+    userData = curEquip.GetUserData()
+    guid = ItemCommon.CacheNotifyEquipDetailInfo(curPlayer, curEquip)
+    msgParamList = [curPlayer.GetPlayerName(), itemID, userData, guid, washLV]
+    PlayerControl.WorldNotify(0, "WashCongratulation", msgParamList)
     return True
 
+def SetEquipWashLV(curPlayer, index, setWashLV):
+    befWashLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % index)
+    if befWashLV == setWashLV:
+        return
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipWashLV % (index), setWashLV)
+    
+    # 同步更新洗练总等级
+    befTotalWashLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalEquipWashLV)
+    updTotalWashLV = max(0, befTotalWashLV + setWashLV - befWashLV)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalEquipWashLV, updTotalWashLV)
+    GameWorld.DebugLog("设置洗练等级: index=%s,befWashLV=%s,setWashLV=%s,befTotalWashLV=%s,updTotalWashLV=%s" 
+                       % (index, befWashLV, setWashLV, befTotalWashLV, updTotalWashLV))
+    return
 
-def Sycn_EquipWashInfo(curPlayer, equipPlace=-1, isLogin=False):
+## 全身洗练总等级
+def GetTotalEquipWashLV(curPlayer): return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalEquipWashLV)
+
+def Sycn_EquipWashInfo(curPlayer, equipPackindex=-1, isLogin=False):
     hasValue = False
     
     pack = ChPyNetSendPack.tagMCEquipPartXLAttrInfo()
     pack.Clear()
     pack.InfoList = []
     
-    if equipPlace == -1:
+    if equipPackindex == -1:
         syncPlaceList = GetAllEquipWashPlace()
     else:
-        syncPlaceList = [equipPlace]
+        syncPlaceList = [equipPackindex]
         
     for place in syncPlaceList:
         equipPart = ChPyNetSendPack.tagMCEquipPartXLAttr()
         equipPart.EquipPlace = place
-        equipPart.XLAttrLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % place) + 1
+        equipPart.XLAttrLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % place)
         equipPart.XLAttrList = []
         for attrNum in range(1, Def_EquipWashMaxAttrCount + 1):
             washValue = ChPyNetSendPack.tagMCEquipPartXLAttrValue()
@@ -400,16 +436,18 @@
     NetPackCommon.SendFakePack(curPlayer, pack)
     return
 
-def RefreshEquipWashAttr(curPlayer):
-    ChEquip.RefreshPlayerEquipAttribute(curPlayer)
+def RefreshEquipWashAttr(curPlayer, classLV):
+    ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV)
     #刷新所有属性
     playControl = PlayerControl.PlayerControl(curPlayer)
     playControl.RefreshPlayerAttrState()
     return
 
-def CalcAttr_EquipWash(curPlayer, equipPlace, allAttrList):
+def CalcAttr_EquipWash(curPlayer, equipIndex, equipPlace, allAttrList):
     ## 装备位洗练属性
-    washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % equipPlace) + 1
+    washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % equipIndex)
+    maxWashLV = GetEquipWashMaxLV(curPlayer, equipIndex, equipPlace)
+    washLV = min(washLV, maxWashLV)
     washType = GetEquipWashType(equipPlace)
     if washType is None:
         return
@@ -419,49 +457,25 @@
     #GameWorld.DebugLog("装备位属性: equipPlace=%s,washLV=%s" % (equipPlace, washLV))
     for attrNum in range(1, Def_EquipWashMaxAttrCount + 1):
         attrID = getattr(washData, "GetAttrType%s" % attrNum)()
-        attrValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipPlace, attrNum))
+        maxValue = getattr(washData, "GetAttrMax%s" % attrNum)()
+        attrValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (equipIndex, attrNum))
+        attrValue = min(attrValue, maxValue)
         #GameWorld.DebugLog("    attrNum=%s,attrID=%s, attrValue=%s" % (attrNum, attrID, attrValue))
         if attrValue:
             PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
     return
 
-def CalcAttr_EquipWashSpec(curPlayer, equipPlaceList, allAttrList):
-    ## 装备洗练类型等级对应特殊套属性
-    for washType in range(1, Def_EquipWashMaxType + 1):
-        washTypeLV = 999
-        placeList = GetEquipWashPlaceList(washType)
-        for equipPlace in placeList:
-            if equipPlace not in equipPlaceList:
-                washTypeLV = 0 # 需穿戴装备才有效
-                break
-            washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % equipPlace) + 1
-            washTypeLV = min(washTypeLV, washLV)
-        #GameWorld.DebugLog("洗练套装属性: washType=%s,washTypeLV=%s" % (washType, washTypeLV))
-        if not washTypeLV:
-            continue
-        washSpecData = IpyGameDataPY.InterpolationSearch("EquipWashSpec", "WashLVNeed", washTypeLV, {"WashTypeNeed":washType})
-        if not washSpecData:
-            continue
-        
-        attrTypeList = washSpecData.GetAddAttrType()
-        attrValueList = washSpecData.GetAddAttrValue()
-        for i, attrID in enumerate(attrTypeList):
-            PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)
-            #GameWorld.DebugLog("    EquipWashSpec attrID=%s, attrValue=%s" % (attrID, attrValueList[i]))
-            
-    return
-
 def EquipWashSuccess(curPlayer):
-    succList = [ShareDefine.SuccType_EquipWashLV1,ShareDefine.SuccType_EquipWashLV2,ShareDefine.SuccType_EquipWashLV3]
-    for washType in range(1, Def_EquipWashMaxType + 1):
-        washTypeLV = 999
-        placeList = GetEquipWashPlaceList(washType)
-        for equipPlace in placeList:
-            washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % equipPlace) + 1
-            washTypeLV = min(washTypeLV, washLV)
-        
-        if not washTypeLV:
-            continue
-        PlayerSuccess.DoAddSuccessProgress(curPlayer, succList[washType-1], 1, [washTypeLV])
+#    succList = [ShareDefine.SuccType_EquipWashLV1,ShareDefine.SuccType_EquipWashLV2,ShareDefine.SuccType_EquipWashLV3]
+#    for washType in range(1, Def_EquipWashMaxType + 1):
+#        washTypeLV = 999
+#        placeList = GetEquipWashPlaceList(washType)
+#        for equipPlace in placeList:
+#            washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % equipPlace)
+#            washTypeLV = min(washTypeLV, washLV)
+#        
+#        if not washTypeLV:
+#            continue
+#        PlayerSuccess.DoAddSuccessProgress(curPlayer, succList[washType-1], 1, [washTypeLV])
     return
 

--
Gitblit v1.8.0