|  |  | 
 |  |  | import PlayerMagicWeapon
 | 
 |  |  | import time
 | 
 |  |  | import json
 | 
 |  |  | import FormulaControl
 | 
 |  |  | #---------------------------------------------------------------------
 | 
 |  |  | 
 | 
 |  |  | ##检查玩家是否可以换装
 | 
 |  |  | 
 |  |  |     
 | 
 |  |  |     if not ItemCommon.CheckItemCanUseByExpireTime(curItem):
 | 
 |  |  |         # 过期
 | 
 |  |  |         GameWorld.DebugLog("装备已过期!")
 | 
 |  |  |         return False
 | 
 |  |  |     
 | 
 |  |  |     changeItemEquipPlace = curItem.GetEquipPlace()
 | 
 |  |  | 
 |  |  |     changeItemHoleCnt = 0#curItem.GetCanPlaceStoneCount()
 | 
 |  |  |     changeItemUseData = curItem.GetUserData()
 | 
 |  |  |     itemQuality = curItem.GetItemQuality()
 | 
 |  |  |     endureReduceType = curItem.GetEndureReduceType()
 | 
 |  |  |     #changeItemIsHorse = (curItem.GetType() == ChConfig.Def_Item_Type_Horse)
 | 
 |  |  |     
 | 
 |  |  |     #执行换装动作
 | 
 |  |  | 
 |  |  |         #通知客户端交换物品
 | 
 |  |  |         curPlayer.ChangeEquip(changeItemID, equipPlace, changeItemStarLV, changeItemHoleCnt, changeItemStoneCnt, changeItemUseData)
 | 
 |  |  |         
 | 
 |  |  |      | 
 |  |  |     if not endureReduceType:
 | 
 |  |  |         EventShell.EventRespons_EquipByPlace(curPlayer, equipPlace)
 | 
 |  |  |     #记录橙装、红装
 | 
 |  |  |     #===========================================================================
 | 
 |  |  |     # if itemQuality in [ChConfig.Def_Quality_Orange, ChConfig.Def_Quality_Red]:
 | 
 |  |  | 
 |  |  | ## 计算装备对基本属性的改变 
 | 
 |  |  | #  @return None
 | 
 |  |  | def __CalcEquips_Effect(curPlayer):
 | 
 |  |  |     baseEquipAttrDict = {}
 | 
 |  |  |     baseEquipAttr_Weapon = [{} for _ in range(4)] # 武器基础, 物品表装备基础效果属性
 | 
 |  |  |     baseEquipAttr_Armor = [{} for _ in range(4)] # 防具基础, 物品表装备基础效果属性
 | 
 |  |  |     baseEquipAttr_Relics = [{} for _ in range(4)] # 圣器基础, 物品表装备基础效果属性
 | 
 |  |  | 
 |  |  |     equipPlaceList = [] # 有穿戴装备的装备位列表
 | 
 |  |  |     suitCntDict = {} #套装数量字典
 | 
 |  |  |     legendAttrDict = {} #所有传奇属性
 | 
 |  |  |     equipScoreTotal = 0 #为解决装备评分、战力不一致的情况,装备战力改为由评分作为参数计算战力
 | 
 |  |  |     
 | 
 |  |  |     #玩家当前可装备的装备类型
 | 
 |  |  |     for equipIndex in xrange(playerEquip.GetCount()):
 | 
 |  |  | 
 |  |  |             continue
 | 
 |  |  |         
 | 
 |  |  |         equipPlaceList.append(equipIndex)
 | 
 |  |  |         equipScoreTotal += ItemCommon.GetEquipGearScore(curEquip)
 | 
 |  |  |         
 | 
 |  |  |         #基础属性效果
 | 
 |  |  |         for i in range(0, curEquip.GetEffectCount()):
 | 
 |  |  | 
 |  |  |             #其他非基础部位的
 | 
 |  |  |             else:
 | 
 |  |  |                 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)
 | 
 |  |  | 
 |  |  |     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Suit, allAttrListSuit)
 | 
 |  |  |     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Wash, allAttrListWash)
 | 
 |  |  |     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipOutOfPrint, allAttrListOutOfPrintEquip)
 | 
 |  |  |      | 
 |  |  |     #计算装备基础属性附加战力 (目前组成: 评分战力 + ...)
 | 
 |  |  |     equipFightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2))
 | 
 |  |  |     #GameWorld.DebugLog("装备评分战力: equipScoreTotal=%s,equipFightPowerEx=%s" % (equipScoreTotal, equipFightPowerEx))
 | 
 |  |  |     curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Equip, equipFightPowerEx)
 | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | 
 |  |  |         return
 | 
 |  |  |     
 | 
 |  |  |     lv = curPlayer.GetLV()
 | 
 |  |  |     OutOfPrintAttrFormatDict = IpyGameDataPY.GetFuncEvalCfg("OutOfPrintValue", 2, {})
 | 
 |  |  |     for i, attrID in enumerate(OutOfPrintAttrIDList):
 | 
 |  |  |         if str(attrID) not in OutOfPrintAttrFormatDict:
 | 
 |  |  |             continue
 | 
 |  |  |         attrFormat = OutOfPrintAttrFormatDict[str(attrID)]
 | 
 |  |  |         maxOOPValue = OutOfPrintAttrValueList[i]
 | 
 |  |  |         value = eval(IpyGameDataPY.GetFuncCompileCfg("OutOfPrintValue", 1))
 | 
 |  |  |         value = eval(FormulaControl.GetCompileFormula("OutOfPrintAttrFormat_%s" % attrID, attrFormat))
 | 
 |  |  |         GameWorld.DebugLog("加绝版属性: %s +%s" % (attrID, value))
 | 
 |  |  |         PlayerControl.CalcAttrDict_Type(attrID, value, allAttrListOutOfPrintEquip)
 | 
 |  |  |         
 | 
 |  |  | 
 |  |  |     for suiteKey, cnt in suitCntDict.items():
 | 
 |  |  |         groupType,suiteType,suiteLV = suiteKey.split('_')
 | 
 |  |  |         suiteLV = int(suiteLV)
 | 
 |  |  |         job = 0 if groupType == '2' else myjob #仙器组合默认职业0
 | 
 |  |  |         job = 0 if groupType == ChConfig.EquipGroupType_Relics else myjob #仙器组合默认职业0
 | 
 |  |  |         ipyData = IpyGameDataPY.GetIpyGameData('EquipSuitAttr', int(groupType), int(suiteType), int(suiteLV), job)
 | 
 |  |  |         if not ipyData:
 | 
 |  |  |             continue
 | 
 |  |  | 
 |  |  |         paramList= [name, cnt, suiteLV, groupType, suiteType]
 | 
 |  |  |         notifyRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartSuiteNotify % (groupType, suiteType, cnt))
 | 
 |  |  |         if not notifyRecord & pow(2, suiteLV):
 | 
 |  |  |             if groupType == '1':
 | 
 |  |  |             if groupType == ChConfig.EquipGroupType_Armor:
 | 
 |  |  |                 if cnt >=5:
 | 
 |  |  |                     PlayerControl.WorldNotify(0, 'EquipSuit5', paramList)
 | 
 |  |  |                     notifyRecord |= pow(2, suiteLV)
 | 
 |  |  | 
 |  |  |             break
 | 
 |  |  |     return findGroupType
 | 
 |  |  | 
 | 
 |  |  | #  获取满套装化的最低阶数,如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
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | ## 通知公共部位套装等级
 | 
 |  |  | def NotifyEquipPartSuiteLV(curPlayer, index=None):
 |