From 5e5ceb375b230198c7a1a2e63be7ebb075122da8 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 27 十月 2020 16:19:09 +0800
Subject: [PATCH] 8577 【主干】【长尾】【BT】【后端】支持给宠物表配置的技能学习在玩家身上; 修复灵宠技能刷战力bug;

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py       |   75 +++++++++++++++++++++++--------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintSkill.py |    3 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py   |    2 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py               |    4 +
 4 files changed, 52 insertions(+), 32 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 70203af..87ac492 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -5184,7 +5184,8 @@
 Def_SkillFuncType_ZhuXian,     #13 诛仙技能
 Def_SkillFuncType_SuiteSkill,     #14 套装技能
 Def_SkillFuncType_PassiveSkillWithSP,     #15 可有专精的被动技能
-) = range(16)
+Def_SkillFuncType_PetOwnerSkill,     #16 宠物主人技能
+) = range(17)
 
 # 受技能效果完全影响的怪, 对应 Def_BattleRelationType_CommNoBoss
 Def_SkillAttack_NPCIsBoss = [ Def_NPCType_Ogre_Normal     ,  #平凡小怪 0    # c++ 定义为普通NPC视野刷新
@@ -5215,6 +5216,7 @@
                            
                            Def_SkillFuncType_HorseSkill:ShareDefine.Def_MFPType_Horse,
                            Def_SkillFuncType_PetSkill:ShareDefine.Def_MFPType_Pet,
+                           Def_SkillFuncType_PetOwnerSkill:ShareDefine.Def_MFPType_Pet,
                            Def_SkillFuncType_GWSkill:ShareDefine.Def_MFPType_Prestige,
                            Def_SkillFuncType_SuiteSkill:ShareDefine.Def_MFPType_Equip,
                            }
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintSkill.py
index 7da936f..116e74a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintSkill.py
@@ -46,7 +46,7 @@
                 3 : "法宝专精",
                 4 : "天赋",
                 5 : "坐骑技能",
-                6 : "神兵技能",
+                6 : "灵宠技能",
                 7 : "人族法宝",
                 8 : "普攻",
                 9 : "无",
@@ -56,6 +56,7 @@
                 13 : "诛仙技能",
                 14 : "套装技能",
                 15 : "可有专精的被动技能",
+                16 : "灵宠主人技能",
                 }
     
     for funcType, skillList in skillDict.items():
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 6ad330b..ea7c8fc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -4976,8 +4976,6 @@
             skillMFP = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MFPSkill % mfpType)
             curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPSkill % mfpType, skillMFP + curSkill.GetFightPower())
         
-        #宠物数据挂在物品上,单独计算
-        PlayerPet.SetPetSkillFightPower(curPlayer) 
         return
     
     ## 技能升级刷属性战斗力处理
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
index 39e1e37..fa12d39 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
@@ -39,6 +39,7 @@
 import PlayerMagicWeapon
 import PlayerWeekParty
 import CalcNoLineEffect
+import PassiveBuffEffMng
 import CrossPlayerData
 import CalcLineEffect
 import PlayerActivity
@@ -123,9 +124,37 @@
         limitPetClassLV = petSkillUnLockList[i] # 学习此技能所需宠物阶级
         if initClass < limitPetClassLV:
             continue
+        curSkilData = GameWorld.GetGameData().GetSkillBySkillID(skillid)
+        if not curSkilData:
+            continue
+        if curSkilData.GetFuncType() == ChConfig.Def_SkillFuncType_PetOwnerSkill:
+            __GiveOwnerSkill(curPlayer, skillid)
+            continue
         newPetItem.AddUserAttr(ShareDefine.Def_IudetPet_Skill, skillid)
     
     return newPetItem
+
+# 从称号获得技能
+def __GiveOwnerSkill(curPlayer, skillResID):
+    GameWorld.DebugLog("给灵宠主人技能: skillResID=%s" % skillResID)
+    skillData = GameWorld.GetGameData().FindSkillByType(skillResID, 1)
+    if skillData == None:
+        GameWorld.DebugLog("    not find skill(%s)" % skillResID)
+        return
+    if not SkillCommon.CheckSkillJob(curPlayer, skillData):
+        return
+    if not SkillShell.CheckLearnSkillCondition(curPlayer, skillData):
+        GameWorld.DebugLog("    learn skill condition isn't enough! skillResID=%s" % skillResID)
+        return
+    skillManager = curPlayer.GetSkillManager()
+    if skillManager.FindSkillBySkillTypeID(skillResID):
+        GameWorld.DebugLog("    have learned skill(%s)" % skillResID)
+        return
+    
+    skillManager.LVUpSkillBySkillTypeID(skillResID)
+    PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer, skillResID)    
+    PlayerControl.PlayerControl(curPlayer).RefreshSkillFightPowerEx(skillResID, 0)
+    return
 
 ## 获取宠物实例对应的宠物数据物品
 def GetPetDataItem(curPetOwner, rolePet):
@@ -411,25 +440,6 @@
             
     learnSkillIDList = [max(a) for a in learnSkillDict.values()]
     return learnSkillIDList, passiveSkillList
-
-## 设置宠物的技能战力
-def SetPetSkillFightPower(curPlayer):
-    petPackIndex = ShareDefine.rptPet
-    petPack = curPlayer.GetItemManager().GetPack(petPackIndex)
-    
-    allFightPower = 0
-    for i in range(petPack.GetCount()):
-        petItem = petPack.GetAt(i)
-        if petItem.IsEmpty():
-            continue
-        for i in range(petItem.GetUserAttrCount(ShareDefine.Def_IudetPet_Skill)):
-            skillID = petItem.GetUserAttrByIndex(ShareDefine.Def_IudetPet_Skill, i)
-            curSkilData = GameWorld.GetGameData().GetSkillBySkillID(skillID)
-            if not curSkilData:
-                continue
-            allFightPower += curSkilData.GetFightPower()
-            
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPSkill % ShareDefine.Def_MFPType_Pet, allFightPower)
     
 #===============================================================================
 #// A7 02 宠物激活 #tagCMActivatePet
@@ -504,7 +514,6 @@
             learnSkillList, passiveSkillList = GetPetLearnSkill(curPlayer)
             PetControl.DoLogic_PlayerPetLearnSkillList(rolePet, learnSkillList)
     RefreshPetItemAddAttr(curPlayer, True)
-    SetPetSkillFightPower(curPlayer)    # 技能战力重算
     
     # 开服活动数据
     OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_PetLV, GetTotalPetLV(curPlayer))
@@ -542,7 +551,6 @@
     
     if not ItemControler.PlayerItemControler(curPlayer).PutInItem(petPackIndex, newPetItem):
         return
-    SetPetSkillFightPower(curPlayer)    # 技能战力重算
     petItemIndex = GetPetDataItemIndexByNPCID(curPlayer, petNPCID)
     DoChangePetState(curPlayer, petItemIndex, ShareDefine.Def_PetState_Fight)
     RefreshPetItemAddAttr(curPlayer, True)
@@ -703,8 +711,13 @@
             # 未达到所需阶级
             if updClassLV + 1 < limitPetClassLV:
                 continue
-            petDataItem.AddUserAttr(ShareDefine.Def_IudetPet_Skill, skillid)
             curSkilData = GameWorld.GetGameData().GetSkillBySkillID(skillid)
+            if not curSkilData:
+                continue
+            if curSkilData.GetFuncType() == ChConfig.Def_SkillFuncType_PetOwnerSkill:
+                __GiveOwnerSkill(curPlayer, skillid)
+                continue
+            petDataItem.AddUserAttr(ShareDefine.Def_IudetPet_Skill, skillid)
             if not SkillCommon.isPassiveAttr(curSkilData):
                 #被动技能不学
                 learnSkillList.append(skillid)
@@ -720,8 +733,7 @@
         fightPet = curPlayer.GetPetMgr().GetFightPet()
         if learnSkillList and fightPet:
             PetControl.DoLogic_PlayerPetLearnSkillList(fightPet, learnSkillList)
-    
-        SetPetSkillFightPower(curPlayer)    # 技能战力重算
+            
         RefreshPetItemAddAttr(curPlayer, True)
         
         # 开服活动数据
@@ -861,18 +873,25 @@
     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSkill, skillAttrList)
     
     #初始战力
-    initFPAdd = 0
+    fpExTotal = 0
     petPackIndex = ShareDefine.rptPet
     petPack = curPlayer.GetItemManager().GetPack(petPackIndex)
     for i in range(petPack.GetCount()):
         petItem = petPack.GetAt(i)
         if petItem.IsEmpty():
-            continue 
+            continue
+        # 物品上的技能战力,主人上的另算
+        for i in range(petItem.GetUserAttrCount(ShareDefine.Def_IudetPet_Skill)):
+            skillID = petItem.GetUserAttrByIndex(ShareDefine.Def_IudetPet_Skill, i)
+            curSkilData = GameWorld.GetGameData().GetSkillBySkillID(skillID)
+            if not curSkilData:
+                continue
+            fpExTotal += curSkilData.GetFightPower()
         petItemNPCID = petItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
         petIpyData = GetPetIpydata(petItemNPCID)
         if not petIpyData:
             continue
-        initFPAdd += petIpyData.GetInitFightPower()
+        fpExTotal += petIpyData.GetInitFightPower() # 初始战力
         #觉醒战力
         skinData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinData % (2, petItemNPCID), 0)
         skinIpyData = IpyGameDataPY.GetIpyGameDataNotLog('HorsePetSkin', 2, petItemNPCID, skinData/100)
@@ -880,7 +899,7 @@
             for attrID, attrValue in skinIpyData.GetAttrInfo().items():
                 PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListPetSkin)
     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSkin, allAttrListPetSkin)
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Pet, initFPAdd)
+    curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Pet, fpExTotal)
 #    GameWorld.DebugLog("宠物榜NPCID: %s, petDict=%s" % (billPetNPCID, str(billPetDict)))
     return
 

--
Gitblit v1.8.0