From 84f9abc7067dde4e6b504a1ba2e9f0600a6de46b Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 12 三月 2019 20:58:56 +0800
Subject: [PATCH] 4042 【后端】【2.0】邮件包含附件时不能删除邮件 -  服务端添加防范

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py |  258 +++++++++++++++++++--------------------------------
 1 files changed, 97 insertions(+), 161 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
index ae1eec5..16da2fa 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -34,7 +34,6 @@
 import IpyGameDataPY
 import PlayerWing
 import Operate_EquipStone
-import Operate_EquipSuitCompose
 import PassiveBuffEffMng
 import SkillCommon
 import PlayerMagicWeapon
@@ -117,7 +116,7 @@
     
     equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
     curEquip = equipPack.GetAt(equipPackIndex)
-    #SetEquipItemSuiteLVInfo(curPlayer, packEquipIndex, curEquip)
+
     if curEquip.GetUserAttr(ShareDefine.Def_IudetCreateTime) == 0:
         curEquip.SetUserAttr(ShareDefine.Def_IudetCreateTime, int(time.time()))
     #---换装成功---
@@ -151,35 +150,6 @@
     playControl.RefreshPlayerAttrState()
     return True
 
-
-def SetEquipItemSuiteLVInfo(curPlayer, equipIndex, curItem):
-    # 设置部位套装信息
-    if not curItem or curItem.IsEmpty():
-        return
-    
-    isSuitePart = False
-    equipSuitTypeDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitType')
-    for equipIndexList in equipSuitTypeDict.values():
-        if equipIndex in equipIndexList:
-            isSuitePart = True
-            break
-        
-    if not isSuitePart:
-        return
-          
-    suiteLVList = GetEquipPartSuiteLVList(curPlayer, equipIndex, curItem)
-    attrCount = curItem.GetUserAttrCount(ShareDefine.Def_IudetPartSuiteLV)
-    
-    if suiteLVList and len(suiteLVList) == attrCount:
-        for i, suiteLV in enumerate(suiteLVList):
-            if curItem.GetUserAttrByIndex(ShareDefine.Def_IudetPartSuiteLV, i) != suiteLV:
-                curItem.UpdataUserAttrByIndex(ShareDefine.Def_IudetPartSuiteLV, i, suiteLV)
-    else:
-        if attrCount:
-            curItem.ClearUserAttr(ShareDefine.Def_IudetPartSuiteLV)
-        for suiteLV in suiteLVList:
-            curItem.AddUserAttr(ShareDefine.Def_IudetPartSuiteLV, suiteLV)
-    return
 
     
 ## 刷新装备对人物属性的改变
@@ -455,10 +425,10 @@
     
     allAttrListStar = [{} for _ in range(4)]  # 星数属性
     #allAttrListEquip = [{} for _ in range(4)]  # 装备其他
-    #allAttrListPlusBase = [{} for _ in range(4)]  # 基础强化属性
+    allAttrListPlusBase = [{} for _ in range(4)]  # 基础强化属性
     allAttrListStone = [{} for _ in range(4)]  # 宝石属性
     allAttrListSuit = [{} for _ in range(4)]  # 套装属性
-    #allAttrListWash = [{} for _ in range(4)]  # 洗练属性
+    allAttrListWash = [{} for _ in range(4)]  # 洗练属性
     #allAttrListOutOfPrintEquip = [{} for _ in range(4)]  # 绝版装备属性 需在等级变化独立计算
     
     packType = IPY_GameWorld.rptEquip
@@ -510,15 +480,6 @@
 #                PlayerControl.CalcAttrDict_Type(effectID, effectValue, allAttrListEquip)
 #            baseEquipAttrDict[effectID] = baseEquipAttrDict.get(effectID, 0) + effectValue
             
-#        groupType = GetEquipPartSuiteGroupType(curPlayer, equipIndex)
-#        for suiteType in range(1, maxSuiteType + 1):
-#            suitelv = GetEquipPartSuiteLV(curPlayer, equipIndex, suiteType)
-#            if suitelv:
-#                maxSuiteLV = Operate_EquipSuitCompose.GetEquipCanDoMaxSuiteLV(curPlayer, curEquip, suiteType, groupType)
-#                suiteLV = min(suitelv, maxSuiteLV)
-#                if suiteLV:
-#                    suiteKey = '%s_%s_%s' % (groupType, suiteType, suitelv)
-#                    suitCntDict[suiteKey] = suitCntDict.get(suiteKey, 0) + 1
         
         #星数属性
         equipPartStar = GetEquipPartStarByRank(curPlayer, equipIndex, curEquip) #生效的星数
@@ -532,20 +493,19 @@
                 suitCntDict[suiteID] = []
             suitCntDict[suiteID].append(equipPartStar)
         
-        #物品强化属性,佩饰强化不同要区分
-#        if equipIndex in equipPartStarIndexList:
-#            equipPartStarLV = GetEquipPartPlusLVByRank(curPlayer, packType, equipIndex, curEquip)
-#            CalcAttr_ItemPlus(curPlayer, curEquip, allAttrListPlusBase, equipPartStarLV)
+        #物品强化属性
+        equipPartPlusLV = GetEquipPartPlusLVByRank(curPlayer, packType, equipIndex, curEquip)
+        equipPartPlusEvolveLV = GetEquipPartPlusEvolveLVByEquip(curPlayer, packType, equipIndex, curEquip)
+        CalcAttr_ItemPlus(curPlayer, curEquip, allAttrListPlusBase, equipPartPlusLV, equipPartPlusEvolveLV)
         
         #传奇属性
         #CalcAttr_LegendAttr(curPlayer, curEquip, allAttrListEquip, legendAttrDict)
         #绝世属性
         #CalcAttr_OutOfPrintAttr(curPlayer, curEquip, allAttrListOutOfPrintEquip)
         #洗练属性
-        #Operate_EquipWash.CalcAttr_EquipWash(curPlayer, equipIndex, allAttrListWash)
+        Operate_EquipWash.CalcAttr_EquipWash(curPlayer, equipIndex, equipPlace, allAttrListWash)
     
-    #洗练套装属性
-    #Operate_EquipWash.CalcAttr_EquipWashSpec(curPlayer, equipPlaceList, allAttrListWash)
+
     #套装属性
     CalcEquipSuiteAttr(curPlayer, suitCntDict, allAttrListSuit)
     #GameWorld.DebugLog("所有传奇属性: %s" % legendAttrDict)
@@ -655,7 +615,7 @@
 #  @param curPlayer 当前玩家
 #  @param curPlayer allAttrList 属性缓存
 #  @return None
-def CalcAttr_ItemPlus(curPlayer, curEquip, allAttrList, equipPartStarLV=None):
+def CalcAttr_ItemPlus(curPlayer, curEquip, allAttrList, equipPartStarLV, equipPartPlusEvolveLV):
     if not equipPartStarLV:
         return
     plusType = GetEquipPlusType(curEquip)
@@ -668,6 +628,14 @@
     attrTypeList, attrValueList = ipyData.GetAttrType(), ipyData.GetAttrValue()
     for i, attrID in enumerate(attrTypeList):
         PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)
+    
+    #进化属性
+    equipPlace = curEquip.GetEquipPlace()
+    ipyData = IpyGameDataPY.GetIpyGameData('EquipPlusEvolve', equipPlace, equipPartPlusEvolveLV)
+    if not ipyData:
+        return
+    for attrID, attrValue in ipyData.GetAttr().items():
+        PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
     return
 
 
@@ -752,23 +720,25 @@
             continue
         for ipyData in ipyDataList:
             suiteCnt = ipyData.GetSuiteCnt()
-            star = ipyData.GetStar()
+            needStar = ipyData.GetStar()
             skillID = ipyData.GetSkillID()
-            if starList.count(star) >= suiteCnt:
+            if [1 if star >= needStar else 0 for star in starList].count(1) >= suiteCnt:
                 for attrID, attrValue in ipyData.GetAttrInfo().items():
                     PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListSuit)
                 #技能
                 if skillID and not skillManager.FindSkillBySkillTypeID(skillID):
                     learnSkillList.append(skillID)
+                #广播
+                notifyMark = ipyData.GetIsNotify()
+                if notifyMark and not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark):
+                    PlayerControl.WorldNotify(0, 'AllStarLevelUp', [playerName, suiteID, suiteCnt, needStar])
+                    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark, 1)
+
             else:
                 if skillID and skillManager.FindSkillBySkillTypeID(skillID):
                     delSkillID.append(skillID)
                     skillManager.DeleteSkillBySkillTypeID(skillID)
-            notifyMark = ipyData.GetIsNotify()
-            if notifyMark and not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark):
-                PlayerControl.WorldNotify(0, 'AllStarLevelUp', [playerName, suiteID, suiteCnt, star])
-                GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteNotify, notifyMark, 1)
-                
+                            
             
     for skillID in learnSkillList:
         GameWorld.DebugLog('    激活套装技能 skillResID=%s' % (skillID))
@@ -832,6 +802,8 @@
 
 def CalcEquipStarAttr(curPlayer, classlv, equipPlace, equipPartStar, allAttrListStar):
     ## 计算装备星数属性
+    if not equipPartStar:
+        return
     ipyData = IpyGameDataPY.GetIpyGameData('EquipStarUp', classlv, equipPlace, equipPartStar)
     if not ipyData:
         return
@@ -886,19 +858,40 @@
     oldEquipShowSwitch = curPlayer.GetEquipShowSwitch()
     if updEquipShowSwitch == oldEquipShowSwitch:
         return
+    classLV, isSuite = updEquipShowSwitch/10, updEquipShowSwitch%10
+    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
+    #验证套装
+    realSuit=True
+    for place in ChConfig.Def_SuitEquipPlaceList:
+        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, place)
+        if not ipyData:
+            realSuit = False
+            break
+        gridIndex = ipyData.GetGridIndex()
+        curEquip = equipPack.GetAt(gridIndex)
+        if not ItemCommon.CheckItemCanUse(curEquip):
+            realSuit = False
+            break
+        if not curEquip.GetSuiteID():
+            realSuit = False
+            break
+    if realSuit != isSuite:
+        GameWorld.DebugLog('SetEquipShowSwitch 前端发的isSuite 和实际不一致!')
+        return
     
     #通知外观装备
     updFaceEquipIndex = 0
     equipIndexList = []
+    
     for equipPlace in [ShareDefine.retWeapon, ShareDefine.retWeapon2, ShareDefine.retClothes]:
-        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', 1, equipPlace)
+        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)
         if not ipyData:
             continue
         gridIndex = ipyData.GetGridIndex()
         updFaceEquipIndex = updFaceEquipIndex * 1000 + gridIndex
         equipIndexList.append(gridIndex)
     PlayerControl.SetFaceEquipIndex(curPlayer, updFaceEquipIndex)
-    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
+    
     for equipPackIndex in equipIndexList:
         curEquip = equipPack.GetAt(equipPackIndex)
         if not ItemCommon.CheckItemCanUse(curEquip):
@@ -927,7 +920,7 @@
 
 ## 获取公共部位强化星级, 因装备的最高可强化星级影响,用于算当前装备属性使用, 不影响全身星级
 def GetEquipPartPlusLVByRank(curPlayer, packType, index, curEquip):
-    maxStarLV = ItemCommon.GetItemMaxPlusLV(curEquip)
+    maxStarLV = ItemCommon.GetItemMaxPlusLV(curPlayer, index, curEquip)
     return min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusLV % (packType, index)), maxStarLV)
 
 
@@ -950,9 +943,27 @@
     return
 
 
+## 获取公共部位强化进化等级, 用于算当前装备属性使用, 不影响全身星级
+def GetEquipPartPlusEvolveLVByEquip(curPlayer, packType, index, curEquip):
+    maxEvolveLV = ItemCommon.GetItemMaxPlusEvolveLV(curPlayer, index, curEquip)
+    return min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index)), maxEvolveLV)
+
+
+## 获取公共部位强化进化等级
+def GetEquipPartPlusEvolveLV(curPlayer, packType, index):
+    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index))
+
+
+## 设置公共部位强化进化等级
+def SetEquipPartPlusEvolveLV(curPlayer, packType, index, evolveLV):
+    if GetEquipPartPlusEvolveLV(curPlayer, packType, index) == evolveLV:
+        return
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index), evolveLV)
+    return
+
 ## 通知公共部位强化等级
 def NotifyEquipPartPlusLV(curPlayer, packType=None, index=None):
-    ePartStarLVPack = ChPyNetSendPack.tagMCEquipPartStarLVInfo()
+    ePartStarLVPack = ChPyNetSendPack.tagMCEquipPartPlusInfo()
     ePartStarLVPack.Clear()
     ePartStarLVPack.InfoList = []
     
@@ -966,12 +977,13 @@
                 if index != None and index != i:
                     continue
             
-            ePartStarLV = ChPyNetSendPack.tagMCEquipPartStarLV()
+            ePartStarLV = ChPyNetSendPack.tagMCEquipPartPlusLV()
             ePartStarLV.Clear()
             ePartStarLV.PackType = pType
             ePartStarLV.EquipIndex = i
             ePartStarLV.EquipPartStarLV = GetEquipPartPlusLV(curPlayer, pType, i)
             ePartStarLV.Proficiency = GetEquipPartProficiency(curPlayer, pType, i)
+            ePartStarLV.EvolveLV = GetEquipPartPlusEvolveLV(curPlayer, pType, i)
             ePartStarLVPack.InfoList.append(ePartStarLV)
             
     ePartStarLVPack.Count = len(ePartStarLVPack.InfoList)
@@ -998,109 +1010,33 @@
 # 获取装备的强化类型
 def GetEquipPlusType(curEquip):
     equipPlace = curEquip.GetEquipPlace()
-    plusTypeDict = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelLimit", 2)
+    plusTypeDict = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelLimit", 1)
     if not plusTypeDict:
         GameWorld.ErrLog("没有强化类型映射表")
-        return -1
+        return
     
-    return plusTypeDict.get(equipPlace, -1)
-
-
-def SetEquipPartSuiteLV(curPlayer, index, suiteType, suiteLV):
-    #设置公共部位套装等级
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartSuiteLV % (index, suiteType), suiteLV)
-    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
-    SetEquipItemSuiteLVInfo(curPlayer, index, equipPack.GetAt(index))
-    return
-
-
-def GetEquipPartSuiteLV(curPlayer, index, suiteType):
-    #获取公共部位套装等级
-    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartSuiteLV % (index, suiteType))
-
-
-def GetEquipPartSuiteGroupType(curPlayer, equipIndex):
-    #获取公共部位套装组合类型
-    findGroupType = 0
-    equipSuitTypeDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitType')
-    for groupType, indexList in equipSuitTypeDict.items():
-        if equipIndex in indexList:
-            findGroupType = int(groupType)
-            break
-    return findGroupType
+    return plusTypeDict.get(equipPlace)
 
 
 #  获取满套装化的最低阶数,如5件套,4件5级,1件3级,则返回3
 def GetEquipSuitsLVByType(curPlayer, suitType, groupType):
-    suiteLV = 999
-    equipSuitTypeDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitType')
-    if groupType not in equipSuitTypeDict:
-        return 0
-    maxCnt = len(equipSuitTypeDict[groupType])
-    cnt = 0
-    for equipPlace in equipSuitTypeDict[groupType]:
-        curSuiteLV = GetEquipPartSuiteLV(curPlayer, equipPlace, suitType)
-        if curSuiteLV > 0:
-            cnt += 1
-        suiteLV = min(curSuiteLV, suiteLV)
-        
-    if cnt != maxCnt:
-        return 0
-    return 0 if suiteLV == 999 else suiteLV
+    return 0
+#    suiteLV = 999
+#    equipSuitTypeDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitType')
+#    if groupType not in equipSuitTypeDict:
+#        return 0
+#    maxCnt = len(equipSuitTypeDict[groupType])
+#    cnt = 0
+#    for equipPlace in equipSuitTypeDict[groupType]:
+#        curSuiteLV = GetEquipPartSuiteLV(curPlayer, equipPlace, suitType)
+#        if curSuiteLV > 0:
+#            cnt += 1
+#        suiteLV = min(curSuiteLV, suiteLV)
+#        
+#    if cnt != maxCnt:
+#        return 0
+#    return 0 if suiteLV == 999 else suiteLV
 
-
-## 通知公共部位套装等级
-def NotifyEquipPartSuiteLV(curPlayer, index=None):
-    ePartSuitePack = ChPyNetSendPack.tagMCEquipPartSuiteLVInfo()
-    ePartSuitePack.Clear()
-    ePartSuitePack.InfoList = []
-    
-    equipSuitTypeDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitType')
-    for equipIndexList in equipSuitTypeDict.values():
-        for i in equipIndexList:
-            if index != None and index != i:
-                continue
-            ePartSuiteInfo = ChPyNetSendPack.tagMCEquipPartSuiteLV()
-            ePartSuiteInfo.Clear()
-            ePartSuiteInfo.EquipIndex = i
-            suiteInfo = GetSuiteInfoByPlace(curPlayer, i)
-            ePartSuiteInfo.SuiteLVInfo = json.dumps(suiteInfo, ensure_ascii=False)
-            ePartSuiteInfo.Len = len(ePartSuiteInfo.SuiteLVInfo)
-            ePartSuitePack.InfoList.append(ePartSuiteInfo)
-            
-    ePartSuitePack.Count = len(ePartSuitePack.InfoList)
-    NetPackCommon.SendFakePack(curPlayer, ePartSuitePack)
-    return
-
-
-def GetSuiteInfoByPlace(curPlayer, equipPlace, curEquip=None):
-    suiteInfo = {}  #{套装类型:等级}
-    groupType = GetEquipPartSuiteGroupType(curPlayer, equipPlace)
-    maxSuiteType = IpyGameDataPY.GetFuncCfg('EquipSuitColorStar', 2)
-    for suiteType in range(1, maxSuiteType + 1):
-        suiteLV = GetEquipPartSuiteLV(curPlayer, equipPlace, suiteType)
-        if suiteLV:
-            if curEquip:
-                maxSuiteLV = Operate_EquipSuitCompose.GetEquipCanDoMaxSuiteLV(curPlayer, curEquip, suiteType, groupType)
-                suiteLV = min(suiteLV, maxSuiteLV)
-            suiteInfo[suiteType] = suiteLV
-    return suiteInfo
-
-
-def GetEquipPartSuiteLVList(curPlayer, equipPlace, curEquip=None):
-    ## 部位套装等级列表
-    groupType = GetEquipPartSuiteGroupType(curPlayer, equipPlace)
-              
-    suiteLVList = []
-    maxSuiteType = IpyGameDataPY.GetFuncCfg('EquipSuitColorStar', 2)
-    for suiteType in xrange(1, maxSuiteType + 1):
-        suiteLV = GetEquipPartSuiteLV(curPlayer, equipPlace, suiteType)
-        if curEquip and suiteLV:
-            maxSuiteLV = Operate_EquipSuitCompose.GetEquipCanDoMaxSuiteLV(curPlayer, curEquip, suiteType, groupType)
-            suiteLV = min(suiteLV, maxSuiteLV)
-        
-        suiteLVList.append(suiteLV)
-    return suiteLVList
 
 
 def SetEquipPartStar(curPlayer, equipPackindex, star):
@@ -1164,8 +1100,8 @@
     activeCnt = clientData.Cnt
     if activeType == 0:
         key = ChConfig.Def_PDict_EquipActiveStarLV
-    elif activeType == 1:
-        key = ChConfig.Def_PDict_EquipActiveStars
+#    elif activeType == 1:
+#        key = ChConfig.Def_PDict_EquipActiveStars
     else:
         return
     curCnt = curPlayer.NomalDictGetProperty(key)
@@ -1196,8 +1132,8 @@
             continue
         if aType == 0:
             key = ChConfig.Def_PDict_EquipActiveStarLV
-        elif aType == 1:
-            key = ChConfig.Def_PDict_EquipActiveStars
+#        elif aType == 1:
+#            key = ChConfig.Def_PDict_EquipActiveStars
         else:
             return
         curCnt = curPlayer.NomalDictGetProperty(key)

--
Gitblit v1.8.0