From 369e52f7a7b980c882ca322615b1995796fe9223 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 06 十一月 2018 21:38:13 +0800
Subject: [PATCH] 4595 【1.2】【后端】装备战力、评分优化(角色装备、神兽装备 )

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_550.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py             |   15 ++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py  |    4 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py        |   24 ++++++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py          |   17 +++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py     |   40 ++++++------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/CalcNoLineEffect.py   |    6 --
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                 |   15 +++-
 8 files changed, 73 insertions(+), 50 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 14b2ba6..d4a9ccf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/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],
                             }
 
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 49cd1c6..03ace23 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
+++ b/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
 
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
index 7c94fdb..4a9bff8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index 8cd64f1..0108dab 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/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)
         
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index bb43579..4ee7cda 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/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
 
 ## 刷属性时累加功能事先计算好的属性值
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py
index a4adcd0..79917ff 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py
+++ b/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获取
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/CalcNoLineEffect.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/CalcNoLineEffect.py
index 67fea1e..ca8511d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/CalcNoLineEffect.py
+++ b/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 # 相对增加值
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_550.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_550.py
index dd1f9d1..e9b5042 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_550.py
+++ b/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

--
Gitblit v1.8.0