From a8d160566fcad719e98b6ac1ad6354fb6ddb1dc5 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期四, 20 九月 2018 15:28:05 +0800
Subject: [PATCH] 3428 子 【开发】神兽技能 / 【后端】神兽技能

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IPY_PlayerDefine.py                    |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4516.py  |   21 +++
 ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerDefine.py                                         |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4005.py |    9 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py     |    8 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IPY_ClientToServer.py                  |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_551.py            |  102 ++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py             |  120 ++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_550.py            |   41 +++++
 ServerPython/CoreServerGroup/GameServer/Script/IPY_Recv.py                                                 |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py                   |   36 +++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                            |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4052.py |   25 +++
 13 files changed, 368 insertions(+), 10 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerDefine.py
index e0bc6be..d738ed7 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IPY_PlayerDefine.py
@@ -269,6 +269,8 @@
 psFemale = _IPY_PlayerDefine.psFemale
 gitNormal = _IPY_PlayerDefine.gitNormal
 gitFreeSDK = _IPY_PlayerDefine.gitFreeSDK
+gitMRGame = _IPY_PlayerDefine.gitMRGame
+gitSPGame = _IPY_PlayerDefine.gitSPGame
 gitFaceBook = _IPY_PlayerDefine.gitFaceBook
 gitToken = _IPY_PlayerDefine.gitToken
 gitMax = _IPY_PlayerDefine.gitMax
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IPY_Recv.py b/ServerPython/CoreServerGroup/GameServer/Script/IPY_Recv.py
index 461d5b6..36dca4d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IPY_Recv.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IPY_Recv.py
@@ -372,6 +372,8 @@
     def GetPhone(self): return _IPY_Recv.IPY_CPlayerLogin_GetPhone(self)
     def GetServerID(self): return _IPY_Recv.IPY_CPlayerLogin_GetServerID(self)
     def GetAdult(self): return _IPY_Recv.IPY_CPlayerLogin_GetAdult(self)
+    def GetExtraLen(self): return _IPY_Recv.IPY_CPlayerLogin_GetExtraLen(self)
+    def GetExtra(self): return _IPY_Recv.IPY_CPlayerLogin_GetExtra(self)
     def __init__(self): 
         this = _IPY_Recv.new_IPY_CPlayerLogin()
         try: self.this.append(this)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index 60ee246..967058e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -1547,7 +1547,6 @@
         
         # 血盾 
         hurtValue = CalcBloodShield(atkObj, defObj, hurtValue)
-        
         remainHP = min(dMaxHP, max(0, dHP - hurtValue)) # 剩余血量
     
     remainHP = int(remainHP)    #防范
@@ -1569,6 +1568,12 @@
     else:
         GameWorld.ErrLog('计算伤血值时,防守方类型错误:defObjType = %s' % (defObjType))
         return resultHurtType
+
+    if GameObj.GetHP(defObj) > 0:
+        # 被攻击者将部分伤害转化为血量, 返回转化的百分比(小数点)
+        changePer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ChangeHurtToHP)
+        if changePer:
+            SkillCommon.SkillAddHP(defObj, 0, int(changePer*hurtValue))
     
     lostValue = dHP - GameObj.GetHP(defObj) # 实际掉血量
     resultHurtType.LostHP = lostValue
@@ -2084,6 +2089,7 @@
         atkBackHP += PlayerControl.GetPVPAtkBackHP(atkObj)
         # 百分比吸血
         atkBackHPPer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, None, None, ChConfig.TriggerType_Buff_SuckBloodPer)
+        atkBackHPPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, None, None, ChConfig.TriggerType_Buff_SuckBloodPer)
         atkBackHP += int(hurtValue * atkBackHPPer*1.0 / ChConfig.Def_MaxRateValue)
 
     suckHP += atkBackHP
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index ebf0c30..5804b6e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4207,7 +4207,8 @@
 Def_CalcAttrFunc_PetSign, # 宠物签到 33
 Def_CalcAttrFunc_MagicWeaponSoul, # 法宝之魂属性34
 Def_CalcAttrFunc_Dogz, # 神兽35
-) = range(36)
+Def_CalcAttrFunc_DogzBattleSkill, # 助战神兽技能36
+) = range(37)
 
 
 # 在此列表中的功能属性,不享受百分比加成,--属性参与战力计算
@@ -4217,7 +4218,7 @@
                       ]
 
 # 在此列表中的功能属性,不享受百分比加成,--属性不参与战力计算,战力由技能配置决定
-CalcAttrExFuncListNoFightPower = [Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_PetSkill]
+CalcAttrExFuncListNoFightPower = [Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_DogzBattleSkill]
 
 
 #战斗力分组类型对应功能点属性分类索引列表,并不是一一对应的,有些战斗力类型可由多个功能点组成
@@ -4301,7 +4302,8 @@
 TriggerType_Buff_BeAttackSubLayer,  # BUFF类:被攻击减buff层,0消失 48
 TriggerType_OneDamage,   # 伤害降低到1点 49
 TriggerType_LuckyHit, # 会心一击时增加会心伤害百分比 50
-) = range(1, 51)
+TriggerType_ChangeHurtToHP, # 把受到伤害的xx%转化为生命值 51
+) = range(1, 52)
 
 
 # NPC功能类型定义
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IPY_ClientToServer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IPY_ClientToServer.py
index 01ea434..33ccd7e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IPY_ClientToServer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IPY_ClientToServer.py
@@ -374,6 +374,8 @@
     def GetPhone(self): return _IPY_ClientToServer.IPY_CPlayerLogin_GetPhone(self)
     def GetServerID(self): return _IPY_ClientToServer.IPY_CPlayerLogin_GetServerID(self)
     def GetAdult(self): return _IPY_ClientToServer.IPY_CPlayerLogin_GetAdult(self)
+    def GetExtraLen(self): return _IPY_ClientToServer.IPY_CPlayerLogin_GetExtraLen(self)
+    def GetExtra(self): return _IPY_ClientToServer.IPY_CPlayerLogin_GetExtra(self)
     def __init__(self): 
         this = _IPY_ClientToServer.new_IPY_CPlayerLogin()
         try: self.this.append(this)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IPY_PlayerDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IPY_PlayerDefine.py
index a6cbde5..26fb8e1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IPY_PlayerDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IPY_PlayerDefine.py
@@ -270,6 +270,8 @@
 psFemale = _IPY_PlayerDefine.psFemale
 gitNormal = _IPY_PlayerDefine.gitNormal
 gitFreeSDK = _IPY_PlayerDefine.gitFreeSDK
+gitMRGame = _IPY_PlayerDefine.gitMRGame
+gitSPGame = _IPY_PlayerDefine.gitSPGame
 gitFaceBook = _IPY_PlayerDefine.gitFaceBook
 gitToken = _IPY_PlayerDefine.gitToken
 gitMax = _IPY_PlayerDefine.gitMax
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 5620200..3d558a4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDogz.py
@@ -25,6 +25,9 @@
 import IpyGameDataPY
 import ChConfig
 import ChEquip
+import PassiveBuffEffMng
+import SkillCommon
+import SkillShell
 
 '''
 神兽编号: 1~20,上线后不可修改
@@ -53,6 +56,9 @@
     ## 设置神兽是否助战状态
     GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_DogzFightState, dogzID - 1, 1 if isFight else 0)
     Sync_DogzHelpbattleState(curPlayer, dogzID, isFight)
+    
+    # 设置成功后才能刷技能
+    PassiveBuffEffMng.PlayerDogzSkill(curPlayer)
     return
 
 
@@ -539,8 +545,38 @@
     # 保存计算值
     PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Dogz, allAttrList)
     curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Dogz, fightPowerEx)
+    
+    # 技能属性,从Def_CalcAttrFunc_Dogz获取
+    skillAttrList = CalcDogzBattleSkillAttr(curPlayer)
+    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSkill, skillAttrList)
     return
 
+# 助战神兽技能属性,必须在 SetDogzIsHelpFight后调用
+def CalcDogzBattleSkillAttr(curPlayer):
+    skillAttrList = [{} for _ in range(4)]
+    skillManager = curPlayer.GetSkillManager()
+
+    for i in range(0 , skillManager.GetSkillCount()):
+        curSkill = skillManager.GetSkillByIndex(i)
+        if not curSkill:
+            continue
+        
+        if curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_Dogz:
+            continue
+        
+        if not SkillCommon.isPassiveAttr(curSkill):
+            continue
+        
+        
+        for effectIndex in xrange(curSkill.GetEffectCount()):
+            curEffect = curSkill.GetEffect(effectIndex)
+            SkillShell.CalcBuffEffAttr(curPlayer, curEffect, skillAttrList)
+            
+    
+    #GameWorld.DebugLog("神兽技能属性: skillFPEx=%s, %s" % ( skillFPEx, skillAttrList))
+    return skillAttrList
+
+
 def Sync_DogzInfo(curPlayer):
     ## 同步神兽信息
     dogzInfoPack = ChPyNetSendPack.tagMCDogzInfo()
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
new file mode 100644
index 0000000..a33c9db
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_550.py
@@ -0,0 +1,41 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#
+# @todo: 全体出战神兽(包括装备)XX属性值+xx%
+#
+# @author: Alee
+# @date 2018-1-20 下午02:50:26
+# @version 1.0
+#
+# @note: 
+#
+#---------------------------------------------------------------------
+#导入
+import ChConfig
+import PlayerControl
+#---------------------------------------------------------------------
+
+## buff线性增加属性
+#  @param defender Buff承受者
+#  @param curEffect 技能效果
+#  @param calcDict 技能效果累加总表
+#  @return None
+def OnCalcBuffEx(defender, curEffect, calcDict, curBuff):
+    attrType = curEffect.GetEffectValue(1)
+    attrList = PlayerControl.GetCalcAttrListValue(defender, ChConfig.Def_CalcAttrFunc_DogzBattleSkill)
+    value = int(attrList[2].get(attrType, 0)*curEffect.GetEffectValue(0)*1.0/ChConfig.Def_MaxRateValue)
+    
+    calcDict[attrType] = calcDict.get(attrType, 0) + value
+    
+    return
+
+
+## 返回buff类型,线性与否
+#  @param 
+#  @return None
+#  @remarks 函数详细说明.  
+def GetCalcType():
+    return ChConfig.TYPE_Linear
+
+
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_551.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_551.py
new file mode 100644
index 0000000..79c717c
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_551.py
@@ -0,0 +1,102 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#
+# @todo: 当前神兽(包括装备)属性项(如生命)+xx%,可多配
+#
+# @author: Alee
+# @date 2018-1-20 下午02:50:26
+# @version 1.0
+#
+# @note: 
+#
+#---------------------------------------------------------------------
+#导入
+import ChConfig
+import PlayerControl
+import ShareDefine
+import IpyGameDataPY
+import PlayerDogz
+import ChEquip
+#---------------------------------------------------------------------
+
+## buff线性增加属性
+#  @param defender Buff承受者
+#  @param curEffect 技能效果
+#  @param calcDict 技能效果累加总表
+#  @return None
+def OnCalcBuffEx(defender, curEffect, calcDict, curBuff):
+    attrType = curEffect.GetEffectValue(1)
+    attrList = GetTheDogzAttr(defender, curEffect.GetEffectValue(2))
+    value = int(attrList[2].get(attrType, 0)*curEffect.GetEffectValue(0)*1.0/ChConfig.Def_MaxRateValue)
+    
+    calcDict[attrType] = calcDict.get(attrType, 0) + value
+    
+    return
+
+
+## 返回buff类型,线性与否
+#  @param 
+#  @return None
+#  @remarks 函数详细说明.  
+def GetCalcType():
+    return ChConfig.TYPE_Linear
+
+# 指定神兽属性
+def GetTheDogzAttr(curPlayer, dogzID):
+    allAttrList = [{} for _ in range(4)]
+    
+    dogzEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
+    equipPackCount = dogzEquipPack.GetCount()
+    ipyData = IpyGameDataPY.GetIpyGameData("Dogz", dogzID)
+    if not ipyData:
+        return allAttrList
+    
+    # 1. 基础属性
+    attrTypeList = ipyData.GetBaseAttrTypes()
+    attrValueList = ipyData.GetBaseAttrValues()
+    if attrTypeList and len(attrTypeList) == len(attrValueList):
+        for attrIndex, baseAttrID in enumerate(attrTypeList):
+            baseAttrValue = attrValueList[attrIndex]
+            PlayerControl.CalcAttrDict_Type(baseAttrID, baseAttrValue, allAttrList)
+            #GameWorld.DebugLog("    基础属性: baseAttrID=%s,baseAttrValue=%s, %s" % (baseAttrID, baseAttrValue, allAttrList))
+            
+    # 2. 装备属性
+    startIndex = (dogzID - 1) * PlayerDogz.DogzEquipCount
+    for equipIndex in range(startIndex, startIndex + PlayerDogz.DogzEquipCount):
+        if equipIndex < 0 or equipIndex >= equipPackCount:
+            break
+        curEquip = dogzEquipPack.GetAt(equipIndex)            
+        if curEquip.IsEmpty():
+            continue
+        
+        #itemID = curEquip.GetItemTypeID()
+        # 装备基础属性
+        for effIndex in xrange(curEquip.GetEffectCount()):
+            curEffect = curEquip.GetEffectByIndex(effIndex)
+            if not curEffect or not curEffect.GetEffectID():
+                break
+            effID = curEffect.GetEffectID()
+            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))
+            
+        # 强化属性
+        curPlusLV = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetDogzEquipPlus, 0)
+        plusIpyData = IpyGameDataPY.GetIpyGameData("DogzEquipPlus", curEquip.GetEquipPlace(), curPlusLV)
+        if plusIpyData:
+            plusAttrTypeList = plusIpyData.GetPlusAttrTypes()
+            plusAttrValueList = plusIpyData.GetPlusAttrValues()
+            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))
+                    
+        # 传奇属性
+        ChEquip.CalcAttr_LegendAttr(curPlayer, curEquip, allAttrList)
+
+    return allAttrList
+
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4516.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4516.py
new file mode 100644
index 0000000..cd3e54f
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveBuff_4516.py
@@ -0,0 +1,21 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#
+# @todo: buff中把受到伤害的xx%转化为生命值
+#
+# @author: Alee
+# @date 2018-1-30 下午05:11:45
+# @version 1.0
+#
+# @note: 
+#
+#---------------------------------------------------------------------
+
+import ChConfig
+
+def CheckCanHappen(attacker, defender, passiveEffect, skillID):
+    return True
+
+
+def GetValue(attacker, defender, passiveEffect):
+    return float(passiveEffect.GetEffectValue(0))/ChConfig.Def_MaxRateValue
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4005.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4005.py
index f4e59a8..e9ee027 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4005.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4005.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 # -*- coding: GBK -*-
 #
-# @todo: 增加所有攻击伤害 含普攻
+# @todo: 增加所有攻击伤害 含普攻 附加血量判断 --(PVP)主角生命值低于30%时,所有技能伤害再增加60%
 #
 # @author: Alee
 # @date 2018-1-9 下午09:39:37
@@ -18,6 +18,13 @@
 
 
 def CheckCanHappen(attacker, defender, effect, curSkill):
+    # 未配置不验证血量百分比
+    hpPer = effect.GetEffectValue(2)
+    if hpPer:
+        if GameObj.GetHP(attacker)*ChConfig.Def_MaxRateValue/GameObj.GetMaxHP(attacker) >= hpPer:
+            return False
+        
+    
     return GameWorld.CanHappen(effect.GetEffectValue(1))
     
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4052.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4052.py
new file mode 100644
index 0000000..5d24f54
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuff/PassiveSkill_4052.py
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#
+# @todo: 生命值低于15%时,每次攻击将造成伤害的30%转化为自身生命
+#
+# @author: Alee
+# @date 2018-1-9 下午09:39:37
+# @version 1.0
+#
+# @note: 
+#
+#---------------------------------------------------------------------
+import GameObj
+import ChConfig
+
+def CheckCanHappen(attacker, defender, effect, curSkill):   
+    hpPer = effect.GetEffectValue(0)
+    if GameObj.GetHP(attacker)*ChConfig.Def_MaxRateValue/GameObj.GetMaxHP(attacker) >= hpPer:
+        return False
+        
+    return True
+    
+
+def GetValue(attacker, defender, effect):
+    return effect.GetEffectValue(1)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
index 293d7c0..845061b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py
@@ -258,6 +258,8 @@
     
     GetPassiveEffManager().RegistPassiveBuff(curPlayer)
 
+    # 助战神兽技能
+    GetPassiveEffManager().RegistPassiveEffDogz(curPlayer)
 
 #-被动逻辑处理--------------------------------------------------------------------------------------------------
 ##离开地图处理
@@ -325,6 +327,7 @@
              4049:ChConfig.TriggerType_MissSuccessPer, # 闪避成功率提升
              4050:ChConfig.TriggerType_OneDamage,   # 伤害降低到1点
              4051:ChConfig.TriggerType_LuckyHit, # 会心一击时增加会心伤害百分比 50
+             4052:ChConfig.TriggerType_Buff_SuckBloodPer,   # 攻击 百分比吸血
              }
     return tdict.get(effectID, -1)
     #===========================================================================
@@ -355,7 +358,8 @@
              4511:ChConfig.TriggerType_AttackAddFinalValue,   #攻击增加输出伤害11
              4512:ChConfig.TriggerType_ReduceHurtHPPer, # 百分比减少攻击计算后伤害 
              4513:ChConfig.TriggerType_AttackAddFinalValue,   #攻击增加输出伤害11
-             4515:ChConfig.TriggerType_AddIceAtkPer,    # BUFF类:攻击附加真实伤害百分比 
+             4515:ChConfig.TriggerType_AddIceAtkPer,    # BUFF类:攻击附加真实伤害百分比
+             4516:ChConfig.TriggerType_ChangeHurtToHP,    # BUFF类:buff中把受到伤害的xx%转化为生命值
              803:ChConfig.TriggerType_BloodShield,  # 血盾
              806:ChConfig.TriggerType_BloodShield,  # 血盾
              808:ChConfig.TriggerType_BloodShield,  # 血盾
@@ -374,7 +378,7 @@
         self.AffectBuffDict = {}    # 当前正受影响的效果buff, key为触发点
         self.AffectSkillDict = {}    # 被动技能 {(触发模式, 被影响的技能ID):[被动技能ID,效果]
         self.AffectPassiveSkillSetDict = {}    # 被动技能装备 {(触发模式, 被影响的技能ID):[被动技能ID,效果]
-    
+        self.AffectDogzSkillDict = {}   # 神兽助战技能
     
     #记录会影响其他技能或者被动触发释放技能的BUFF
     def AddBuffInfoByEffect(self, effect, skillID):
@@ -429,6 +433,37 @@
         return self.AffectBuffDict.get((triggerType, 0), {})
      
     
+    # 重刷神兽助战技能
+    def RefreshDogzBattleSkill(self):
+        self.AffectDogzSkillDict = {}
+        skills = FindDogzBattleSkills(self.gameObj)
+        
+        for curSkill in skills:
+            if not SkillCommon.isPassiveTriggerSkill(curSkill):
+                continue
+            
+            skillTypeID = curSkill.GetSkillTypeID()
+            
+            connSkillID = SkillShell.GetConnectSkillID(curSkill)    # 关联技能ID, 0代表不限技能
+            for i in xrange(curSkill.GetEffectCount()):
+                curEffect = curSkill.GetEffect(i)
+                effectID = curEffect.GetEffectID()
+                if effectID == 0:
+                    continue
+                
+                triggerType = GetTriggerTypeByEffectID(effectID)
+                if triggerType == -1:
+                    continue
+                
+                key = (triggerType,connSkillID)
+                if key not in self.AffectDogzSkillDict:
+                    self.AffectDogzSkillDict[key] = []
+                    
+                self.AffectDogzSkillDict[key].append((skillTypeID, effectID))
+        
+        return self.AffectDogzSkillDict
+    
+    
     # 重刷可装备的被动技能
     def RefreshPassiveSkillSet(self):
         self.AffectPassiveSkillSetDict = {}
@@ -473,8 +508,9 @@
             if not SkillCommon.isPassiveTriggerSkill(curSkill):
                 continue
             
-            if curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_FbPassiveSkill:
-                # 被动技能需装备
+            if curSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_FbPassiveSkill,
+                                          ChConfig.Def_SkillFuncType_Dogz]:
+                # 被动技能和神兽需设置才有效
                 continue
             
             skillTypeID = curSkill.GetSkillTypeID()
@@ -534,10 +570,11 @@
         ## skillList=self.AffectSkillDict.get((triggerType, connSkillID), [])再用extend会导致AffectSkillDict无限增长
         skillList.extend(self.AffectSkillDict.get((triggerType, connSkillID), []))
         skillList.extend(self.AffectPassiveSkillSetDict.get((triggerType, connSkillID), []))
+        skillList.extend(self.AffectDogzSkillDict.get((triggerType, connSkillID), []))
         if connSkillID != 0 and connSkillID != ChConfig.Def_SkillID_Somersault:
             skillList.extend(self.AffectSkillDict.get((triggerType, 0), []))
             skillList.extend(self.AffectPassiveSkillSetDict.get((triggerType, 0), []))
-            
+            skillList.extend(self.AffectDogzSkillDict.get((triggerType, 0), []))
         return skillList
         
 #所有obj的被动效果管理
@@ -597,6 +634,20 @@
             self.AddPassiveEff(gameObj, passiveEff)
         else:
             passiveEff.RefreshPassiveSkillSet()
+        return
+        
+        
+    # 人物需同步注册神兽技能
+    def RegistPassiveEffDogz(self, gameObj):
+        passiveEff = self.GetPassiveEff(gameObj)
+        if not passiveEff:
+            # 强制刷新所有被动技能
+            passiveEff = PassiveEff(gameObj)
+            if not passiveEff.RefreshDogzBattleSkill():
+                return
+            self.AddPassiveEff(gameObj, passiveEff)
+        else:
+            passiveEff.RefreshDogzBattleSkill()
         return
         
         
@@ -1064,3 +1115,62 @@
             
     return curValue
 
+
+# 因为要兼容低等级技能,所以技能只能是在助战的时候,先删除神兽技能再学习新的助战神兽技能
+def PlayerDogzSkill(curPlayer):
+
+    dogzSkills = [] # 需要学习的技能
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for i in xrange(ipyDataMgr.GetDogzCount()):
+        ipyData = ipyDataMgr.GetDogzByIndex(i)
+        if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_DogzFightState, i):
+            continue
+        
+        dogzSkills.extend(ipyData.GetHelpBattleSkills())
+    
+    delDogzSkills = [] # 删除不在助战神兽队列的技能
+    skillManager = curPlayer.GetSkillManager()
+    for i in xrange(skillManager.GetSkillCount()):
+        curSkill = skillManager.GetSkillByIndex(i)
+        if curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_Dogz:
+            continue
+        skillID = curSkill.GetSkillID()
+        if skillID in dogzSkills:
+            dogzSkills.pop(skillID)
+            continue
+        
+        delDogzSkills.append(skillID)
+        
+    GameWorld.DebugLog("PlayerDogzSkill:%s - 删除%s"%(dogzSkills, delDogzSkills))
+    
+    # 删除非助战技能
+    for skillID in delDogzSkills:
+        skillManager.DeleteSkillBySkillID(skillID, False)
+    
+    # 添加助战技能,同类技能取最高
+    dogzSkills.sort()
+    for skillID in dogzSkills:
+        skillManager.LearnSkillByID(skillID, False)
+    
+    # 刷被动效果
+    GetPassiveEffManager().RegistPassiveEffDogz(curPlayer)
+    return
+
+
+# 获取助战神兽的技能列表
+def FindDogzBattleSkills(gameObj):
+    skills = []
+    if gameObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
+        return skills
+    
+    skillManager = gameObj.GetSkillManager()
+    for i in xrange(skillManager.GetSkillCount()):
+        curSkill = skillManager.GetSkillByIndex(i)
+        if not curSkill:
+            continue
+        
+        if curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_Dogz:
+            continue
+        skills.append(curSkill)
+        
+    return skills

--
Gitblit v1.8.0