| | |
| | | import EventReport
|
| | | import ChItem
|
| | | import IpyGameDataPY
|
| | | import Operate_EquipStone
|
| | | import Operate_EquipWash
|
| | | import FormulaControl
|
| | | import ChPyNetSendPack
|
| | | import NetPackCommon
|
| | | import PyGameData
|
| | |
| | | GameWorld.DebugLog("物品过期时间" + timeStr)
|
| | | return GameWorld.ChangeTimeStrToNum(timeStr)
|
| | |
|
| | | def CreateSingleItem(itemID, itemCount=1, isAuctionItem=False, expireTime=0):
|
| | | def CreateSingleItem(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, setAttrDict=None):
|
| | | ''' 创建物品
|
| | | @param isAuctionItem: 是否拍品,默认非拍品
|
| | | @param expireTime: 有效时间,时间单位由时效类型决定
|
| | |
| | | # 英雄
|
| | | if curSingleItem.GetType() == ChConfig.Def_ItemType_Hero:
|
| | | PlayerHero.InitHeroItem(curSingleItem)
|
| | | |
| | | elif GetIsEquip(curSingleItem):
|
| | | setAttrDict = GetCreateEquipAttr(curSingleItem, curPlayer, setAttrDict)
|
| | | if setAttrDict == None:
|
| | | curSingleItem.Clear()
|
| | | return
|
| | | AddCreateItemAttr(curSingleItem, setAttrDict)
|
| | | |
| | | #这里返回的是SingleItem , 如果创建了,未使用,会找出C++内存泄露!!!
|
| | | return curSingleItem
|
| | |
|
| | | def AddCreateItemAttr(curItem, setAttrDict):
|
| | | ## 设置生成装备所有属性
|
| | | if not setAttrDict:
|
| | | return
|
| | | for key, value in setAttrDict.items():
|
| | | key = GameWorld.ToIntDef(key, key)
|
| | | # 需支持
|
| | | # 1. UserData格式: {'19': ['1889', '2034', '893', '927'], '50': ['1702622046'], '17': ['39', '33', '34', '9']}
|
| | | # 2. 自定义字典: {"key":value, ...} key支持自定义或与UserData的key,value支持数值或列表,列表元素支持字符串或数值,均默认转为数值
|
| | | # 数值类型的默认为UserData属性 |
| | | if isinstance(key, int):
|
| | | if key % 2 == 0: # 偶数是单数值
|
| | | v = 0
|
| | | if isinstance(value, int):
|
| | | v = value
|
| | | elif (isinstance(value, list) or isinstance(value, tuple)) and value:
|
| | | v = GameWorld.ToIntDef(value[0], 0)
|
| | | curItem.SetUserAttr(key, v)
|
| | | elif isinstance(value, list) or isinstance(value, tuple): # 单数一定是要列表
|
| | | curItem.ClearUserAttr(key)
|
| | | for v in value:
|
| | | v = GameWorld.ToIntDef(v, 0)
|
| | | curItem.AddUserAttr(key, v)
|
| | | # 其他指定字符串类型属性
|
| | | else:
|
| | | GameWorld.Log("###AddCreateItemAttr unknown key:%s, value:%s, itemID=%s" % (key, value, curItem.GetItemTypeID()))
|
| | | |
| | | #MakeEquipGS(curItem)
|
| | | return
|
| | |
|
| | | def GetCreateEquipAttr(curItem, curPlayer=None, setAttrDict=None):
|
| | | '''获取生成装备所有属性
|
| | | @param curPlayer: 可能为None
|
| | | @param setAttrDict: 直接设置物品的属性 {key:value, ...} key支持 ShareDefine.Def_IudetXXX字符串 或 自定key
|
| | | @return: None - 异常情况,物品实例需要clear
|
| | | equipAttrDict - 生成后的最新属性k:v字典,可直接用于 SetCreateEquipAttr
|
| | | '''
|
| | | if setAttrDict == None:
|
| | | setAttrDict = {}
|
| | | equipAttrDict = {}
|
| | | playerID = 0 if not curPlayer else curPlayer.GetPlayerID()
|
| | | itemID = curItem.GetItemTypeID()
|
| | | |
| | | appointID = setAttrDict.get(ShareDefine.Def_CItemKey_AppointID)
|
| | | # 定制属性ID
|
| | | if appointID > 0:
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("AppointItem", appointID)
|
| | | if not ipyData:
|
| | | return
|
| | | if ipyData.GetCancelUseLimit():
|
| | | equipAttrDict[str(ShareDefine.Def_IudetCancelUseLimit)] = 1
|
| | | equipAttrDict[str(ShareDefine.Def_IudetItemLV)] = ipyData.GetItemLV()
|
| | | equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = ipyData.GetBaseAttrID()
|
| | | equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = ipyData.GetBaseAttrValue()
|
| | | equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = ipyData.GetLegendAttrID()
|
| | | equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = ipyData.GetLegendAttrValue()
|
| | | GameWorld.DebugLog(" 装备定制属性: itemID=%s,appointID=%s,equipAttrDict=%s,setAttrDict=%s" % (itemID, appointID, equipAttrDict, setAttrDict), playerID)
|
| | | return equipAttrDict
|
| | | |
| | | # 主线装备
|
| | | if GetIsMainEquip(curItem):
|
| | | return GetCreateMainEquipAttr(curItem, curPlayer, setAttrDict)
|
| | | |
| | | return equipAttrDict
|
| | | |
| | | def GetCreateMainEquipAttr(curItem, curPlayer, setAttrDict=None):
|
| | | ## 生成主线装备属性
|
| | | |
| | | equipAttrDict = {}
|
| | | itemID = curItem.GetItemTypeID()
|
| | | itemColor = curItem.GetItemColor()
|
| | | equipPlace = curItem.GetEquipPlace()
|
| | | |
| | | if not curPlayer:
|
| | | return equipAttrDict
|
| | | |
| | | colorIpyData = IpyGameDataPY.GetIpyGameData("EquipColor", itemColor)
|
| | | placeIpyData = IpyGameDataPY.GetIpyGameData("EquipPlace", equipPlace)
|
| | | if not colorIpyData or not placeIpyData:
|
| | | return equipAttrDict
|
| | | |
| | | playerLV = curPlayer.GetLV()
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | randfloat = random.uniform # 随机一个ab区间的数 [a, b],ab支持小数
|
| | | |
| | | itemLV = setAttrDict.get(str(ShareDefine.Def_IudetItemLV), 0)
|
| | | if not itemLV:
|
| | | # 随机等级
|
| | | lowLV, highLV = IpyGameDataPY.GetFuncEvalCfg("MainEquipDrop", 3)
|
| | | randLVList = range(max(playerLV + lowLV, 1), playerLV + highLV)
|
| | | itemLV = random.choice(randLVList)
|
| | | equipAttrDict[str(ShareDefine.Def_IudetItemLV)] = itemLV
|
| | | |
| | | GameWorld.DebugLog("生成主线装备: itemID=%s,itemLV=%s,itemColor=%s,equipPlace=%s" % (itemID, itemLV, itemColor, equipPlace), playerID)
|
| | | |
| | | # 基础三维
|
| | | baseAttrIDList = setAttrDict.get(str(ShareDefine.Def_IudetBaseAttrID))
|
| | | baseAttrValueList = setAttrDict.get(str(ShareDefine.Def_IudetBaseAttrValue))
|
| | | # 这里注意None为未指定,支持当空列表[]时为不给该属性
|
| | | if baseAttrIDList != None and baseAttrValueList != None and len(baseAttrIDList) == len(baseAttrValueList):
|
| | | equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = baseAttrIDList
|
| | | equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = baseAttrValueList
|
| | | else:
|
| | | attrProportion = placeIpyData.GetBaseAttrProportion()
|
| | | attrInfoList = [
|
| | | [ChConfig.AttrID_Atk, colorIpyData.GetAtkStep()],
|
| | | [ChConfig.AttrID_Def, colorIpyData.GetDefStep()],
|
| | | [ChConfig.AttrID_MaxHP, colorIpyData.GetHPStep()],
|
| | | ]
|
| | | baseAttrIDList, baseAttrValueList = [], []
|
| | | for attrID, attrStep in attrInfoList:
|
| | | attrValue = eval(IpyGameDataPY.GetFuncCompileCfg("MainEquipDrop", 4))
|
| | | # int(itemLV*attrStep*attrProportion*randfloat(0.9,1.1))
|
| | | if not attrValue:
|
| | | continue
|
| | | baseAttrIDList.append(attrID)
|
| | | baseAttrValueList.append(attrValue)
|
| | | |
| | | if baseAttrIDList:
|
| | | equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = baseAttrIDList
|
| | | equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = baseAttrValueList
|
| | | GameWorld.DebugLog(" baseAttrIDList=%s,baseAttrValueList=%s" % (baseAttrIDList, baseAttrValueList), playerID)
|
| | | |
| | | # 战斗属性
|
| | | legendAttrIDList = setAttrDict.get(str(ShareDefine.Def_IudetLegendAttrID))
|
| | | legendAttrValueList = setAttrDict.get(str(ShareDefine.Def_IudetLegendAttrValue))
|
| | | if legendAttrIDList != None and legendAttrValueList != None and len(legendAttrIDList) == len(legendAttrValueList):
|
| | | equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = legendAttrIDList
|
| | | equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = legendAttrValueList
|
| | | else:
|
| | | legendAttrIDList = []
|
| | | legendAttrValueList = []
|
| | | |
| | | attrRangeDefault = colorIpyData.GetAttrRange()
|
| | | attrRangeDict = colorIpyData.GetAttrRangeDict() |
| | | libCntList = colorIpyData.GetAttrLibCntList()
|
| | | GameWorld.DebugLog(" libCntList=%s,attrRangeDict=%s, %s" % (libCntList, attrRangeDict, attrRangeDefault), playerID)
|
| | | for num, attrCnt in enumerate(libCntList, 1):
|
| | | if not hasattr(placeIpyData, "GetAttrLib%s" % num):
|
| | | continue
|
| | | libAttrList = getattr(placeIpyData, "GetAttrLib%s" % num)()
|
| | | if not libAttrList:
|
| | | continue
|
| | | random.shuffle(libAttrList)
|
| | | randAttrList = libAttrList[:attrCnt]
|
| | | for attrID in randAttrList:
|
| | | if attrID in legendAttrIDList:
|
| | | continue
|
| | | attrRange = attrRangeDict.get(attrID, attrRangeDefault)
|
| | | if not attrRange or len(attrRange) != 2:
|
| | | continue
|
| | | attrMin, attrMax = attrRange
|
| | | attrValue = random.randint(attrMin, attrMax)
|
| | | legendAttrIDList.append(attrID)
|
| | | legendAttrValueList.append(attrValue)
|
| | | GameWorld.DebugLog(" libNum=%s,attrID=%s,attrValue=%s(%s~%s)" % (num, attrID, attrValue, attrMin, attrMax), playerID)
|
| | | |
| | | if legendAttrIDList:
|
| | | equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = legendAttrIDList
|
| | | equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = legendAttrValueList
|
| | | GameWorld.DebugLog(" legendAttrIDList=%s,legendAttrValueList=%s" % (legendAttrIDList, legendAttrValueList), playerID)
|
| | | |
| | | GameWorld.DebugLog(" 装备最终属性: equipAttrDict=%s,setAttrDict=%s" % (equipAttrDict, setAttrDict), playerID)
|
| | | return equipAttrDict
|
| | |
|
| | | def SetItemUserData(curItem, dataInfo):
|
| | | if isinstance(dataInfo, dict):
|
| | |
| | | curItem.SetUserData(UserData, len(UserData))
|
| | | return
|
| | |
|
| | | 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
|
| | | |
| | | SetItemUserData(item, userDataDict)
|
| | | if isUpdateGS:
|
| | | MakeEquipGS(curItem)
|
| | | elif isRoleItem:
|
| | | curItem.SetCount(curItem.GetCount()) # 为了触发物品同步
|
| | | return
|
| | |
|
| | | def MakeEquipGS(curItem):
|
| | | if not CheckNoteEquipGS(curItem):
|
| | | #GameWorld.DebugLog("不设置装备评分")
|
| | | return
|
| | | value = CalcEquipGS(curItem)
|
| | | #GameWorld.DebugLog("设置装备评分: ItemID=%s,attrDict=%s,value=%s" % (curItem.GetItemTypeID(), attrDict, value))
|
| | | SetEquipGearScore(curItem, value)
|
| | | return
|
| | |
|
| | | def CalcEquipGS(curItem):
|
| | | '''计算装备评分
|
| | | 评分组成:装备基础 + 传奇属性
|
| | | '''
|
| | | if not CheckNoteEquipGS(curItem):
|
| | | #GameWorld.DebugLog("不设置装备评分")
|
| | | return 0
|
| | | |
| | | attrDict = {}
|
| | | #基础属性效果
|
| | | for i in xrange(curItem.GetEffectCount()):
|
| | | curEffect = curItem.GetEffectByIndex(i)
|
| | | if not curEffect:
|
| | | break
|
| | | effectID = curEffect.GetEffectID()
|
| | | if effectID == 0:
|
| | | break
|
| | | attrDict[effectID] = attrDict.get(effectID, 0) + curEffect.GetEffectValue(0)
|
| | | |
| | | gsValueEx = 0
|
| | | skillGSDict = IpyGameDataPY.GetFuncCfg("EquipGSFormula", 4)
|
| | | itemSkillIDList = GetItemSkillIDList(curItem)
|
| | | for addSkillID in itemSkillIDList:
|
| | | gsValueEx += skillGSDict.get(str(addSkillID), 0)
|
| | | |
| | | itemID = curItem.GetItemTypeID()
|
| | | classLV = GetItemClassLV(curItem)
|
| | | color = curItem.GetItemColor()
|
| | | itemQuality = curItem.GetItemQuality()
|
| | | isSuit = 1 if curItem.GetSuiteID() > 0 else 0
|
| | | gsParamIpyData = IpyGameDataPY.GetIpyGameDataNotLog("EquipGSParam", classLV, color, isSuit, itemQuality)
|
| | | # 传奇属性
|
| | | legAttrIDList, legAttrValueList = ItemControler.GetEquipLegendAttrAll(curItem)
|
| | | for i, legendAttrID in enumerate(legAttrIDList):
|
| | | legendAttrValue = legAttrValueList[i]
|
| | | attrDict[legendAttrID] = attrDict.get(legendAttrID, 0) + legendAttrValue
|
| | | |
| | | lingQiIpyData = IpyGameDataPY.GetIpyGameDataNotLog("LingQiAttr", itemID)
|
| | | if lingQiIpyData:
|
| | | gsValueEx += lingQiIpyData.GetLingQiAttrScore()
|
| | | |
| | | Atk = attrDict.get(ShareDefine.Def_Effect_Atk, 0)
|
| | | MinAtk = attrDict.get(ShareDefine.Def_Effect_MinAtk, 0) + Atk
|
| | | 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 = 0
|
| | | IceAtk = attrDict.get(ShareDefine.Def_Effect_IceAtk, 0)
|
| | | IceDef = attrDict.get(ShareDefine.Def_Effect_IceDef, 0)
|
| | | FabaoHurt = attrDict.get(ShareDefine.Def_Effect_FabaoHurt, 0)
|
| | | AtkBackHP = attrDict.get(ShareDefine.Def_Effect_AtkBackHP, 0)
|
| | | |
| | | FinalHurt = attrDict.get(ShareDefine.Def_Effect_FinalHurt, 0)
|
| | | FinalHurtReduce = attrDict.get(ShareDefine.Def_Effect_FinalHurtReduce, 0)
|
| | | |
| | | 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 = 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 = 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 = 0#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 = 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())
|
| | | LuckyHitRateReduce = attrDict.get(ShareDefine.Def_Effect_LuckyHitRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetLuckyHitRateReduceC())
|
| | | LuckyHitPer = attrDict.get(ShareDefine.Def_Effect_LuckyHitPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetLuckyHitPerC())
|
| | | 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 = 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 = 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())
|
| | | DropMoneyPer = attrDict.get(ShareDefine.Def_Effect_DropMoneyPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetDropMoneyPerC())
|
| | | 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())
|
| | | SuperHitRateReduce = attrDict.get(ShareDefine.Def_Effect_SuperHitRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSuperHitRateReduceC())
|
| | | SkillAtkRate = 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 = 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 = attrDict.get(ShareDefine.Def_Effect_SkillAddPer1, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer1C())
|
| | | SkillAddPerB = attrDict.get(ShareDefine.Def_Effect_SkillAddPer2, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer2C())
|
| | | SkillAddPerC = attrDict.get(ShareDefine.Def_Effect_SkillAddPer3, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer3C())
|
| | | SkillAddPerD = attrDict.get(ShareDefine.Def_Effect_SkillAddPer4, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer4C())
|
| | | SkillAddPerE = attrDict.get(ShareDefine.Def_Effect_SkillAddPer5, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer5C())
|
| | | SkillAddPerF = attrDict.get(ShareDefine.Def_Effect_SkillAddPer6, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer6C())
|
| | | SkillAddPerG = attrDict.get(ShareDefine.Def_Effect_SkillAddPer7, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillAddPer7C())
|
| | | SkillReducePerA = attrDict.get(ShareDefine.Def_Effect_SkillReducePer1, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer1C())
|
| | | SkillReducePerB = attrDict.get(ShareDefine.Def_Effect_SkillReducePer2, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer2C())
|
| | | SkillReducePerC = attrDict.get(ShareDefine.Def_Effect_SkillReducePer3, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer3C())
|
| | | SkillReducePerD = attrDict.get(ShareDefine.Def_Effect_SkillReducePer4, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer4C())
|
| | | SkillReducePerE = attrDict.get(ShareDefine.Def_Effect_SkillReducePer5, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer5C())
|
| | | SkillReducePerF = attrDict.get(ShareDefine.Def_Effect_SkillReducePer6, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer6C())
|
| | | SkillReducePerG = attrDict.get(ShareDefine.Def_Effect_SkillReducePer7, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetSkillReducePer7C())
|
| | | |
| | | ReduceSkillCDPer = attrDict.get(ShareDefine.Def_Effect_ReduceSkillCDPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetReduceSkillCDPerC())
|
| | | |
| | | FaintDefRate = attrDict.get(ShareDefine.Def_Effect_FaintDefRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetFaintDefRateC())
|
| | | |
| | | IgnoreDefRate = attrDict.get(ShareDefine.Def_Effect_IgnoreDefRate, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetIgnoreDefRateC())
|
| | | IgnoreDefRateReduce = attrDict.get(ShareDefine.Def_Effect_IgnoreDefRateReduce, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetIgnoreDefRateReduceC())
|
| | | ProDefPer = attrDict.get(ShareDefine.Def_Effect_ProDefHPPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetProDefPerC())
|
| | | FinalHurtPerC = attrDict.get(ShareDefine.Def_Effect_FinalHurtPer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetFinalHurtPerC())
|
| | | FinalHurtReducePerC = attrDict.get(ShareDefine.Def_Effect_FinalHurtReducePer, 0) * (1 if not gsParamIpyData else gsParamIpyData.GetFinalHurtReducePerC())
|
| | | |
| | | # 攻速不默认乘,仅作为参数提供策划使用
|
| | | AtkSpeed = 0#attrDict.get(ShareDefine.Def_Effect_AtkSpeed, 0)
|
| | | AtkSpeedC = 1#1 if not gsParamIpyData else gsParamIpyData.GetAtkSpeedC()
|
| | | |
| | | OnlyFinalHurt = attrDict.get(ShareDefine.Def_Effect_OnlyFinalHurt, 0)
|
| | | PVPAtkBackHP = attrDict.get(ShareDefine.Def_Effect_PVPAtkBackHP, 0) |
| | | |
| | | if GetIsDogzEquip(curItem):
|
| | | # 神兽装备用不同公式
|
| | | value = eval(FormulaControl.GetCompileFormula("EquipGSFormula3", IpyGameDataPY.GetFuncCfg("EquipGSFormula", 3)))
|
| | | else:
|
| | | value = eval(FormulaControl.GetCompileFormula("EquipGSFormula", IpyGameDataPY.GetFuncCfg("EquipGSFormula")))
|
| | | value += gsValueEx
|
| | | return value
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | ## 通过效果ID,检查是否为指定物品
|
| | |
| | |
|
| | | def GetPackInitCount(packType):
|
| | | ## 获取背包类型对应初始格子数
|
| | | initCount = 0
|
| | | if packType == IPY_GameWorld.rptItem:
|
| | | initCount = IpyGameDataPY.GetFuncCfg("InitBagCellCount", 1)
|
| | | elif packType == IPY_GameWorld.rptWarehouse:
|
| | |
| | | initCount = IpyGameDataPY.GetFuncCfg("DogzPack", 1)
|
| | | elif packType == ShareDefine.rptDogzEquip:
|
| | | initCount = IpyGameDataPY.GetFuncCfg("DogzPack", 2)
|
| | | else:
|
| | | |
| | | if not initCount:
|
| | | bagInitCntDict = IpyGameDataPY.GetFuncEvalCfg("InitBagCellCount", 2, {})
|
| | | initCount = bagInitCntDict.get(str(packType), 0)
|
| | | GameWorld.DebugLog("背包类型初始格子数: packType=%s,initCount=%s" % (packType, initCount))
|
| | | return initCount
|
| | |
|
| | | def GetPackOpenItemCnt(curPlayer, packType):
|
| | | ## 获取对应背包已购买的格子数
|
| | | openCntDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 3, {})
|
| | | if str(packType) not in openCntDict:
|
| | | return 0
|
| | | openCntList = openCntDict[str(packType)]
|
| | | if not openCntList:
|
| | | return 0
|
| | | |
| | | buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType)
|
| | | openCnt = sum(openCntList[:buyCnt])
|
| | | if buyCnt > len(openCntList):
|
| | | addCnt = (buyCnt - len(openCntList)) * openCntList[-1]
|
| | | openCnt += addCnt
|
| | | |
| | | return openCnt
|
| | |
|
| | | def SyncPackBuyCnt(curPlayer, packType=None):
|
| | | ## 同步已购买格子次数信息
|
| | | openCntDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 3, {})
|
| | | if not openCntDict:
|
| | | return
|
| | | syncTypeList = [str(packType)] if packType else openCntDict.keys()
|
| | | |
| | | clientPack = ChPyNetSendPack.tagSCPackBuyInfo()
|
| | | clientPack.BuyInfoList = []
|
| | | for packTypeStr in syncTypeList:
|
| | | packType = int(packTypeStr)
|
| | | buy = ChPyNetSendPack.tagSCPackBuy()
|
| | | buy.PackType = packType
|
| | | buy.BuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType)
|
| | | clientPack.BuyInfoList.append(buy)
|
| | | clientPack.Count = len(clientPack.BuyInfoList)
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|
| | | ## 获得虚拟背包格子数
|
| | | # @param packindex 背包索引
|
| | |
| | | return 0
|
| | | keyStr = ChConfig.Def_VPackCnt_Dict[packindex]
|
| | | return IpyGameDataPY.GetFuncCfg(keyStr)
|
| | |
|
| | |
|
| | | ## 杀怪掉落提示
|
| | | # @param curPlayer 当前玩家
|
| | | # @return None
|
| | | def NotifyItemDropByKill(curPlayer, curItem, npcID, notifyMark='', mapID=0):
|
| | | return #吕超说此处屏蔽
|
| | |
|
| | | def CacheNotifyEquipDetailInfo(curPlayer, curEquip):
|
| | | ''' 缓存装备广播信息中的装备明细信息
|
| | | 因为本版本需要的查看的内容相对较多,为了减少全服广播流量消耗,所以先进行缓存,玩家点击查看时再进行查询
|
| | | '''
|
| | | |
| | | guid = curEquip.GetGUID()
|
| | | packType = curEquip.GetItemPlaceType()
|
| | | packIndex = curEquip.GetItemPlaceIndex()
|
| | | if packType != IPY_GameWorld.rptEquip:
|
| | | return guid
|
| | | |
| | | classLV = GetItemClassLV(curEquip)
|
| | | if not classLV:
|
| | | return guid
|
| | | |
| | | itemID = curEquip.GetItemTypeID()
|
| | | #部位星级
|
| | | equipStar = ChEquip.GetEquipPartStarByRank(curPlayer, packIndex, curEquip)
|
| | | |
| | | #部位强化数据
|
| | | plusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, packIndex)
|
| | | plusEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, packIndex)
|
| | | |
| | | #部位洗练数据
|
| | | washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % packIndex)
|
| | | washValueList = []
|
| | | for attrNum in xrange(1, Operate_EquipWash.Def_EquipWashMaxAttrCount + 1):
|
| | | value = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (packIndex, attrNum))
|
| | | washValueList.append(value)
|
| | | |
| | | #部位宝石数据
|
| | | stoneIDList = Operate_EquipStone.GetEquipIndexStoneIDList(curPlayer, packIndex)
|
| | | |
| | | #本阶已穿装备ID [[itemID,star], ...]
|
| | | classItems = [] |
| | | ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True)
|
| | | if ipyDataList:
|
| | | equipPack = curPlayer.GetItemManager().GetPack(packType)
|
| | | for ipyData in ipyDataList:
|
| | | index = ipyData.GetGridIndex()
|
| | | classEquip = equipPack.GetAt(index)
|
| | | if not classEquip or classEquip.IsEmpty():
|
| | | continue
|
| | | equipID = classEquip.GetItemTypeID()
|
| | | star = ChEquip.GetEquipPartStarByRank(curPlayer, index, classEquip)
|
| | | classItems.append([equipID, star])
|
| | | |
| | | cacheInfo = [guid, itemID, equipStar, plusLV, plusEvolveLV, washLV, washValueList, stoneIDList, classItems]
|
| | | cacheInfo = json.dumps(cacheInfo, ensure_ascii=False)
|
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "NotifyEquipDetailInfo", cacheInfo, len(cacheInfo))
|
| | | return guid
|
| | |
|
| | | ## 使用物品的特殊提示
|
| | | # @param curPlayer 当前玩家
|
| | |
| | | return True
|
| | |
|
| | | def CheckNoteEquipGS(curItem):
|
| | | if not CheckItemCanUse(curItem):
|
| | | return False
|
| | | |
| | | if curItem.GetType() not in IpyGameDataPY.GetFuncEvalCfg("EquipGSTypeForSort", 1):
|
| | | return False
|
| | | |
| | | return True
|
| | | return False
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | ## 通过背包查找指定效果ID的指定数量物品
|
| | |
| | | def GetIsEquip(curItem):
|
| | | return curItem.GetType() in ChConfig.Def_EquipItemType
|
| | |
|
| | | def GetIsMainEquip(curItem):
|
| | | ## 是否主线装备
|
| | | return curItem.GetType() in ChConfig.Def_MainEquipType
|
| | |
|
| | | def GetIsDogzEquip(curItem):
|
| | | ## 返回是否神兽装备
|
| | | return curItem.GetType() in ChConfig.Def_DogzEquiipType
|
| | |
| | | itemName = str(itemID) if not curItemData else curItemData.GetName()
|
| | | itemName = "%s LV%s" % (itemName, plusLV + 1)
|
| | | isNeedRecord = curItemData and ItemControler.IsRuneItemNeedRecord(curItemData, plusLV)
|
| | | if packIndex == ShareDefine.rptGatherSoul:
|
| | | itemID = ItemControler.GetGatherSoulItemID(itemKeyData)
|
| | | plusLV = ItemControler.GetGatherSoulItemPlusLV(itemKeyData)
|
| | | curItemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
|
| | | itemName = str(itemID) if not curItemData else curItemData.GetName()
|
| | | itemName = "%s LV%s" % (itemName, plusLV + 1)
|
| | | isNeedRecord = curItemData and ItemControler.IsGatherSoulItemNeedRecord(curItemData, plusLV)
|
| | |
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_VPackItem % (packIndex, place), 0)
|
| | | if isNeedRecord:
|
| | |
| | | DR_DelItem(curPlayer, packIndex, "VPack_%s" % packIndex if not eventName else eventName, dataDict)
|
| | | ItemControler.Sync_VPackItem_Clear(curPlayer, packIndex, placeList)
|
| | | return
|
| | |
|
| | |
|
| | | ## 获取物品最高强化进化等级
|
| | | # @param itemType: 物品类型
|
| | | # @return 最大星级,0为不可强化
|
| | | def GetItemMaxPlusEvolveLV(curPlayer, equipPackindex, curItem):
|
| | | packType = IPY_GameWorld.rptEquip
|
| | | curPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, equipPackindex)
|
| | | 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()
|
| | |
|
| | | def GetWingLV(curItem):
|
| | | ## 获取翅膀代数等级
|
| | | wingLVDict = IpyGameDataPY.GetFuncEvalCfg("WingLV", 1)
|
| | | return wingLVDict.get(str(curItem.GetLV()), 0)
|
| | |
|
| | | ## 装备评分
|
| | | def GetEquipGearScore(curItem):
|
| | |
| | | @param alchemyDiffLV: 是否过滤掉大于X级的炼丹等级物品,0-不过滤,1-过滤且读默认配置,>1-特殊功能指定的过滤等级
|
| | | '''
|
| | | resultWeightList = []
|
| | | itemNeedPlayerLVDict = IpyGameDataPY.GetFuncEvalCfg("AlchemyDiffLV", 2, {})
|
| | | if alchemyDiffLV or itemNeedPlayerLVDict:
|
| | | playerLV = curPlayer.GetLV()
|
| | | # 如果有指定大于1的等级则取指定等级,没有的话取默认等级差
|
| | | if alchemyDiffLV == 1:
|
| | | alchemyDiffLV = IpyGameDataPY.GetFuncCfg("AlchemyDiffLV", 1)
|
| | | curAlchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
|
| | | for itemInfo in weightList:
|
| | | itemID = itemInfo[1][0]
|
| | | if itemID: # 支持配置ID为0时代表不产出
|
| | | itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
|
| | | if not itemData:
|
| | | continue
|
| | | if GetItemClassLV(itemData) > curAlchemyLV + alchemyDiffLV:
|
| | | continue
|
| | | if itemID in itemNeedPlayerLVDict:
|
| | | if playerLV < itemNeedPlayerLVDict[itemID]:
|
| | | continue
|
| | | resultWeightList.append(itemInfo)
|
| | | else:
|
| | | resultWeightList = weightList
|
| | | return resultWeightList
|
| | |
|
| | | ## =======================================================================================
|
| | |
|
| | | def SyncMakeItemAnswer(curPlayer, makeType, isSuccess, makeItemID):
|
| | | def SyncMakeItemAnswer(curPlayer, makeType, isSuccess, makeValue):
|
| | | makeItemAnswer = ChPyNetSendPack.tagMCMakeItemAnswer()
|
| | | makeItemAnswer.Clear()
|
| | | makeItemAnswer.MakeType = makeType
|
| | | makeItemAnswer.Result = isSuccess
|
| | | makeItemAnswer.MakeItemID = makeItemID
|
| | | makeItemAnswer.MakeValue = makeValue
|
| | | NetPackCommon.SendFakePack(curPlayer, makeItemAnswer)
|
| | | return
|
| | |
|