hxp
2018-11-06 369e52f7a7b980c882ca322615b1995796fe9223
4595 【1.2】【后端】装备战力、评分优化(角色装备、神兽装备 )
8个文件已修改
123 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/CalcNoLineEffect.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_550.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4257,7 +4257,9 @@
Def_CalcAttrFunc_MagicWeaponSoul, # 法宝之魂属性34
Def_CalcAttrFunc_Dogz, # 神兽35
Def_CalcAttrFunc_DogzBattleSkill, # 助战神兽技能36
) = range(37)
Def_CalcAttrFunc_DogzEquip, # 神兽装备37
Def_CalcAttrFunc_DogzEquipPlus, # 神兽装备强化38
) = range(39)
# 在此列表中的功能属性,不享受百分比加成,--属性参与战力计算
@@ -4272,9 +4274,11 @@
#战斗力分组类型对应功能点属性分类索引列表,并不是一一对应的,有些战斗力类型可由多个功能点组成
MFPTypeAttrFuncIndexDict = {ShareDefine.Def_MFPType_Role:[Def_CalcAttrFunc_RoleBase],
                            ShareDefine.Def_MFPType_Equip:[Def_CalcAttrFunc_EquipBaseWeapon, Def_CalcAttrFunc_EquipBaseRelics,
                                                           Def_CalcAttrFunc_EquipBaseArmor, Def_CalcAttrFunc_Equip,
                                                           Def_CalcAttrFunc_EquipOutOfPrint, Def_CalcAttrFunc_EquipAllStars],
# 因为装备评分和实际战力一直出现不匹配的情况,所以装备战力修改为直接由装备评分做为参数计算战力,所以装备评分计算的所有属性不列入战力计算,祥见评分计算函数 ItemCommom.CalcEquipGS
#                            ShareDefine.Def_MFPType_Equip:[Def_CalcAttrFunc_EquipBaseWeapon, Def_CalcAttrFunc_EquipBaseRelics,
#                                                           Def_CalcAttrFunc_EquipBaseArmor, Def_CalcAttrFunc_Equip,
#                                                           Def_CalcAttrFunc_EquipOutOfPrint, Def_CalcAttrFunc_EquipAllStars],
                            ShareDefine.Def_MFPType_Equip:[Def_CalcAttrFunc_EquipAllStars],
                            ShareDefine.Def_MFPType_Plus:[Def_CalcAttrFunc_PlusBase, Def_CalcAttrFunc_PlusEx],
                            ShareDefine.Def_MFPType_Stone:[Def_CalcAttrFunc_Stone],
                            ShareDefine.Def_MFPType_Suit:[Def_CalcAttrFunc_Suit],
@@ -4294,7 +4298,8 @@
                            ShareDefine.Def_MFPType_MagicWeapon3:[Def_CalcAttrFunc_MagicWeapon3, Def_CalcAttrFunc_Stove, Def_CalcAttrFunc_VIP],
                            ShareDefine.Def_MFPType_StoveYao:[Def_CalcAttrFunc_StoveYao],
                            ShareDefine.Def_MFPType_MagicWeaponSoul:[Def_CalcAttrFunc_MagicWeaponSoul],
                            ShareDefine.Def_MFPType_Dogz:[Def_CalcAttrFunc_Dogz],
                            # 神兽战力同装备模块战力一致,受评分影响,装备评分相关的战力另外算
                            ShareDefine.Def_MFPType_Dogz:[Def_CalcAttrFunc_Dogz, Def_CalcAttrFunc_DogzEquipPlus],
                            ShareDefine.Def_MFPType_Other:[Def_CalcAttrFunc_Success, Def_CalcAttrFunc_FamilyTech, Def_CalcAttrFunc_EquipDecompose],
                            }
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -452,6 +452,7 @@
    equipPlaceList = [] # 有穿戴装备的装备位列表
    suitCntDict = {} #套装数量字典
    legendAttrDict = {} #所有传奇属性
    equipScoreTotal = 0 #为解决装备评分、战力不一致的情况,装备战力改为由评分作为参数计算战力
    
    #玩家当前可装备的装备类型
    for equipIndex in xrange(playerEquip.GetCount()):
@@ -471,6 +472,7 @@
            continue
        
        equipPlaceList.append(equipIndex)
        equipScoreTotal += ItemCommon.GetEquipGearScore(curEquip)
        
        #基础属性效果
        for i in range(0, curEquip.GetEffectCount()):
@@ -542,15 +544,10 @@
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Wash, allAttrListWash)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipOutOfPrint, allAttrListOutOfPrintEquip)
    
    #计算装备基础属性附加战力
    LV = curPlayer.GetLV()
    Atk = baseEquipAttrDict.get(ShareDefine.Def_Effect_Atk, 0)
    MinAtk = baseEquipAttrDict.get(ShareDefine.Def_Effect_MinAtk, 0) + Atk
    MaxAtk = baseEquipAttrDict.get(ShareDefine.Def_Effect_MaxAtk, 0) + Atk
    MaxHP = baseEquipAttrDict.get(ShareDefine.Def_Effect_MaxHP, 0)
    Def = baseEquipAttrDict.get(ShareDefine.Def_Effect_Def, 0)
    fightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2))
    curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Equip, fightPowerEx)
    #计算装备基础属性附加战力 (目前组成: 评分战力 + ...)
    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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
@@ -392,7 +392,9 @@
    return
def CalcEquipGS(curItem):
    ##计算装备评分
    '''计算装备评分
        评分组成:装备基础 + 传奇属性 + 绝版属性
    '''
    if not CheckNoteEquipGS(curItem):
        #GameWorld.DebugLog("不设置装备评分")
        return 0
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -687,8 +687,21 @@
    itemManager = curPlayer.GetItemManager()
    
    for packIndex in ChConfig.Def_PlayerLoginInitPackIndexList:
        itemManager.GetPack(packIndex).Sync_Refresh()
        rolePack = itemManager.GetPack(packIndex)
        rolePack.Sync_Refresh()
        # 刷下装备评分,仓库可以暂不处理,取出装备后登录触发刷新
        for i in xrange(rolePack.GetCount()):
            curItem = rolePack.GetAt(i)
            if curItem.IsEmpty():
                continue
            newScore = ItemCommon.CalcEquipGS(curItem)
            hisScore = ItemCommon.GetEquipGearScore(curItem)
            if hisScore != newScore:
                ItemCommon.SetEquipGearScore(curItem, newScore)
                GameWorld.Log("登录更新装备评分: packType=%s,i=%s,hisScore=%s,newScore=%s,itemID=%s,guid=%s"
                              % (packIndex, i, hisScore, newScore, curItem.GetItemTypeID(), curItem.GetGUID()), curPlayer.GetPlayerID())
    for packIndex in ChConfig.Def_VPackCnt_Dict.keys():
        ItemControler.Sync_VPackItem_Refresh(curPlayer, packIndex)
        
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -3395,8 +3395,7 @@
    
    __AttrName = "%s" # 参数为ChConfig.Def_Calc_AllAttrType_MAX对应所有属性列表索引
    __AttrNameNoline = "Noline_%s" # 参数为ChConfig.Def_Calc_AllAttrType_MAX对应所有属性列表索引
    __NolineAttrList = [ChConfig.TYPE_Calc_AttrSpeed, ChConfig.TYPE_Calc_AttrATKMin, ChConfig.TYPE_Calc_AttrATKMax,
                        ChConfig.TYPE_Calc_AttrMaxHP] # 需要记录的非线性战斗属性
    __NolineAttrList = [ChConfig.TYPE_Calc_AttrSpeed] # 需要记录的非线性战斗属性
    
    ## 初始化
    #  @param self 类实例
@@ -3504,21 +3503,10 @@
        #其他需作为公式参数的系数
        AtkSpeedParameter = fpParam.GetCftAtkSpeed()
        LuckyHitParameter = fpParam.GetCftLuckyHit()
        fpEx = 0
        #装备模块特殊处理
        if self.mfpType == ShareDefine.Def_MFPType_Equip:
            AtkPer = getattr(self, self.__AttrNameNoline % ChConfig.TYPE_Calc_AttrATKMax) * fpParam.GetCftAtkPer() # 攻击百分比系数
            MaxHPPer = getattr(self, self.__AttrNameNoline % ChConfig.TYPE_Calc_AttrMaxHP) * fpParam.GetCftMaxHPPer() # 生命百分比系数
            fpEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 3))
            GameWorld.DebugLog("装备模块攻击生命百分比传奇属性战力: fpEx=%s" % fpEx)
        else:
            AtkPer = 0
            MaxHPPer = 0
            
        #获取策划配置的表格
        FightpowerFormula = IpyGameDataPY.GetFuncCfg("FightpowerFormula")
        totalFightPower = eval(FormulaControl.GetCompileFormula("FightpowerFormula", FightpowerFormula)) + fpEx
        totalFightPower = eval(FormulaControl.GetCompileFormula("FightpowerFormula", FightpowerFormula))
        
        #GameWorld.DebugLog("MfpType=%s,FightPower=%s, %s" % (self.mfpType, totalFightPower, self.GetMFPAttrStr()))
        if totalFightPower > ShareDefine.Def_UpperLimit_DWord:
@@ -6655,12 +6643,24 @@
def GetCalcAttrListValue(curPlayer, funcIndex):
    ## 获取功能点预先计算的所加属性值
    attrList = [{} for _ in range(4)]
    for attrIndex, attrDict in enumerate(attrList):
        for i in xrange(Def_MaxAddAttrTypeCnt):
            attrType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcAddAttrType % (funcIndex, attrIndex, i))
            if attrType == 0:
                break
            attrDict[attrType] = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcAddAttrValue % (funcIndex, attrIndex, i))
    if isinstance(funcIndex, int):
        funcIndexList = [funcIndex]
    elif isinstance(funcIndex, list):
        funcIndexList = funcIndex
    else:
        return attrList
    for funcIndex in funcIndexList:
        for attrIndex, attrDict in enumerate(attrList):
            for i in xrange(Def_MaxAddAttrTypeCnt):
                attrType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcAddAttrType % (funcIndex, attrIndex, i))
                if attrType == 0:
                    break
                attrValue = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcAddAttrValue % (funcIndex, attrIndex, i))
                if attrType in attrDict:
                    attrDict[attrType] = attrValue + attrDict[attrType]
                else:
                    attrDict[attrType] = attrValue
    return attrList
## 刷属性时累加功能事先计算好的属性值
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py
@@ -510,6 +510,9 @@
    totalPlusLv = 0 #出战神兽装备总强化等级
    fightPowerEx = 0
    allAttrList = [{} for _ in range(4)]
    allAttrListEquip = [{} for _ in range(4)]
    allAttrListEquipPlus = [{} for _ in range(4)]
    equipScoreTotal = 0 #为解决装备评分、战力不一致的情况,装备战力改为由评分作为参数计算战力
    
    dogzEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
    equipPackCount = dogzEquipPack.GetCount()
@@ -540,6 +543,8 @@
            if curEquip.IsEmpty():
                continue
            
            equipScoreTotal += ItemCommon.GetEquipGearScore(curEquip)
            #itemID = curEquip.GetItemTypeID()
            # 装备基础属性
            for effIndex in xrange(curEquip.GetEffectCount()):
@@ -550,8 +555,8 @@
                if not effID or effID == ChConfig.Def_Effect_DogzEquipPlusExp:
                    continue
                effValue = curEffect.GetEffectValue(0)
                PlayerControl.CalcAttrDict_Type(effID, effValue, allAttrList)
                #GameWorld.DebugLog("    装备基础: itemID=%s,effID=%s,effValue=%s, %s" % (itemID, effID, effValue, allAttrList))
                PlayerControl.CalcAttrDict_Type(effID, effValue, allAttrListEquip)
                #GameWorld.DebugLog("    装备基础: itemID=%s,effID=%s,effValue=%s, %s" % (itemID, effID, effValue, allAttrListEquip))
                
            # 强化属性
            curPlusLV = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetDogzEquipPlus, 0)
@@ -563,18 +568,25 @@
                if plusAttrTypeList and len(plusAttrTypeList) == len(plusAttrValueList):
                    for plusIndex, plusAttrID in enumerate(plusAttrTypeList):
                        plusAttrValue = plusAttrValueList[plusIndex]
                        PlayerControl.CalcAttrDict_Type(plusAttrID, plusAttrValue, allAttrList)
                        #GameWorld.DebugLog("    装备强化: itemID=%s,plusAttrID=%s, plusAttrValue=%s, %s" % (itemID, plusAttrID, plusAttrValue, allAttrList))
                        PlayerControl.CalcAttrDict_Type(plusAttrID, plusAttrValue, allAttrListEquipPlus)
                        #GameWorld.DebugLog("    装备强化: itemID=%s,plusAttrID=%s, plusAttrValue=%s, %s" % (itemID, plusAttrID, plusAttrValue, allAttrListEquipPlus))
                        
            # 传奇属性
            ChEquip.CalcAttr_LegendAttr(curPlayer, curEquip, allAttrList)
            #GameWorld.DebugLog("    装备传奇: itemID=%s,%s" % (itemID, allAttrList))
            ChEquip.CalcAttr_LegendAttr(curPlayer, curEquip, allAttrListEquip)
            #GameWorld.DebugLog("    装备传奇: itemID=%s,%s" % (itemID, allAttrListEquip))
            
        # 附加战力
        fightPowerEx += ipyData.GetFightPowerEx()
        
    # 保存计算值
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Dogz, allAttrList)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_DogzEquip, allAttrListEquip)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_DogzEquipPlus, allAttrListEquipPlus)
    #计算装备基础属性附加战力 (目前组成: 评分战力 + ...)
    equipFightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2))
    #GameWorld.DebugLog("神兽装备评分战力: equipScoreTotal=%s,equipFightPowerEx=%s" % (equipScoreTotal, equipFightPowerEx))
    fightPowerEx += equipFightPowerEx
    curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Dogz, fightPowerEx)
    
    # 技能属性,从Def_CalcAttrFunc_Dogz获取
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/CalcNoLineEffect.py
@@ -21,7 +21,6 @@
import ChConfig
import EffGetSet
import GameWorld
import ShareDefine
#---------------------------------------------------------------------
## 给玩家添加非线性Buff效果 
@@ -69,11 +68,6 @@
            for mfpObj, attrDict in mfpObjAttrDict.items():
                #if not attrDict.has_key(key): # 如果该模块没有增加该属性,则跳过
                if key not in attrDict: # 如果该模块没有增加该属性,则跳过
                    continue
                #装备模块攻击、生命非线性属性提升的属性不计算战力,战力另外算
                if mfpObj.mfpType == ShareDefine.Def_MFPType_Equip \
                    and key in [ChConfig.TYPE_Calc_AttrATKMin, ChConfig.TYPE_Calc_AttrATKMax, ChConfig.TYPE_Calc_AttrMaxHP]:
                    GameWorld.DebugLog("装备模块某些属性不计入战力计算: key=%s,value=%s" % (key, attrDict[key]))
                    continue
                curMValue = attrDict[key]
                curMAddValue = curValue * curMValue / ChConfig.Def_MaxRateValue # 相对增加值
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_550.py
@@ -22,7 +22,7 @@
#  @return None
def OnCalcBuffEx(defender, curEffect, calcDict, curBuff):
    attrType = curEffect.GetEffectValue(1)
    attrList = PlayerControl.GetCalcAttrListValue(defender, ChConfig.Def_CalcAttrFunc_Dogz)
    attrList = PlayerControl.GetCalcAttrListValue(defender, [ChConfig.Def_CalcAttrFunc_Dogz, ChConfig.Def_CalcAttrFunc_DogzEquip, ChConfig.Def_CalcAttrFunc_DogzEquipPlus])
    value = int(attrList[2].get(attrType, 0)*curEffect.GetEffectValue(0)*1.0/ChConfig.Def_MaxRateValue)
    calcDict[attrType] = calcDict.get(attrType, 0) + value