| | |
| | | import IpyGameDataPY
|
| | | import PlayerWing
|
| | | import Operate_EquipStone
|
| | | import Operate_EquipSuitCompose
|
| | | import PassiveBuffEffMng
|
| | | import SkillCommon
|
| | | import PlayerMagicWeapon
|
| | |
| | |
|
| | | 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()))
|
| | | #---换装成功---
|
| | |
| | | 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
|
| | |
|
| | |
|
| | | ## 刷新装备对人物属性的改变
|
| | |
| | |
|
| | | 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
|
| | |
| | | # 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) #生效的星数
|
| | |
| | | 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)
|
| | |
| | | # @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)
|
| | |
| | | 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
|
| | |
|
| | |
|
| | |
| | | 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))
|
| | |
| | |
|
| | | def CalcEquipStarAttr(curPlayer, classlv, equipPlace, equipPartStar, allAttrListStar):
|
| | | ## 计算装备星数属性
|
| | | if not equipPartStar:
|
| | | return
|
| | | ipyData = IpyGameDataPY.GetIpyGameData('EquipStarUp', classlv, equipPlace, equipPartStar)
|
| | | if not ipyData:
|
| | | return
|
| | |
| | | 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):
|
| | |
| | |
|
| | | ## 获取公共部位强化星级, 因装备的最高可强化星级影响,用于算当前装备属性使用, 不影响全身星级
|
| | | 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)
|
| | |
|
| | |
|
| | |
| | | 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 = []
|
| | |
|
| | |
| | | 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)
|
| | |
| | | # 获取装备的强化类型
|
| | | 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):
|
| | |
| | | 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)
|
| | |
| | | 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)
|