From 4ec47a0dab32729d20389078ee78f89b64c12cab Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 22 九月 2025 15:58:57 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(张星彩怒技,觉醒技能;增加buff消失后触发时机;增加效果6007 6008 7001 7002;技能友好目标增加类型2:一定包含自己的友方单位)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5001.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5002.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                    |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py                      |   66 ++++++++++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6007.py |   19 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py                       |   44 +++++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5011.py |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5012.py |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py                     |   29 +++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6008.py |   21 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py                    |   30 +++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                             |   17 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1003.py     |    2 
 14 files changed, 180 insertions(+), 74 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
index 2297e4b..2fc113a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -37,17 +37,22 @@
         self._AffectBuffDict = {} # 被动buff {(触发方式, 有效来源):{buffID:[effID, ...], ...}, ...}
         return
     
-    def GetPassiveEffByTrigger(self, triggerWay, connSkill=None, connSkillTypeID=0):
+    def GetPassiveEffByTrigger(self, triggerWay, connSkill=None, connSkillTypeID=0, connBuff=None):
         '''获取可触发的效果列表,技能跟buff根据触发优先级按顺序触发,优先级越高越先执行,相同时技能优先
                         优先级之后有需要再扩展
         @return: [["skill/buff", skillID/buffID, effIDList], ...]
         '''
         effList = []
         
-        if not connSkillTypeID and connSkill:
-            connSkillTypeID = connSkill.GetSkillTypeID()
-            
-        if connSkill and self._batObj.GetID() == connSkill.GetObjID():
+        if not connSkillTypeID:
+            if connSkill:
+                connSkillTypeID = connSkill.GetSkillTypeID()
+            elif connBuff:
+                skillData = connBuff.GetSkillData()
+                connSkillTypeID = skillData.GetSkillTypeID()
+                
+        # SkillData 对象暂时没有 GetObjID
+        if connSkill and hasattr(connSkill, "GetObjID") and self._batObj.GetID() == connSkill.GetObjID():
             skillID = connSkill.GetSkillID()
             skillManager = self._batObj.GetSkillManager()
             # 非对象身上的技能,读取本技能被动触发的效果,一般是主技能拆分的子技能
@@ -62,7 +67,7 @@
                     triggerSrc = effect.GetTriggerSrc()
                     if not triggerWay:
                         continue
-                    if triggerWay == ChConfig.TriggerWay_CurSkillEff:
+                    if triggerWay in ChConfig.TriggerWayNoLoadList:
                         continue
                     if triggerSrc != ChConfig.TriggerSrc_SkillSelf:
                         # 仅添加本技能的
@@ -124,7 +129,7 @@
         triggerSrc = effect.GetTriggerSrc()
         if not triggerWay:
             return
-        if triggerWay == ChConfig.TriggerWay_CurSkillEff:
+        if triggerWay in ChConfig.TriggerWayNoLoadList:
             return
         if triggerSrc in [ChConfig.TriggerSrc_Buff, ChConfig.TriggerSrc_BuffSelf]:
             # buff有效的不加进来
@@ -174,7 +179,7 @@
         triggerSrc = effect.GetTriggerSrc()
         if not triggerWay:
             return
-        if triggerWay == ChConfig.TriggerWay_CurSkillEff:
+        if triggerWay in ChConfig.TriggerWayNoLoadList:
             return
         if triggerSrc in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
             # 技能有效的不加进来
@@ -269,8 +274,6 @@
     def GetTriggerWay(self): return self._triggerWay
     def GetTriggerSrc(self): return self._triggerSrc
     #def GetTriggerParams(self, index): return self._triggerParams[index] if len(self._triggerParams) > index else 0
-    
-EmptyEffect = SkillEffect(0, [])
 
 class SklllData():
     
@@ -311,7 +314,7 @@
     def GetHappenRate(self): return self._ipyData.GetHappenRate() # 触发概率
     def GetEffect(self, index): return self._effList[index] if len(self._effList) > index else 0
     def GetEffectCount(self): return len(self._effList)
-    def GetEffectByID(self, effID, triggerWay=0): return self._effDict.get((effID, triggerWay), EmptyEffect)
+    def GetEffectByID(self, effID, triggerWay=0): return self._effDict.get((effID, triggerWay), None)
     def GetConnSkill(self): return self._ipyData.GetConnSkill()
     def GetCoolDownTime(self): return self._ipyData.GetCoolDownTime()
     def GetIgnoreStates(self): return self._ipyData.GetIgnoreStates() # 无视限制列表
@@ -502,6 +505,7 @@
         self._tagObjList = [] # 本次技能目标列表 [BatObj, ...]
         self._hurtList = [] # 本次伤血列表,可能同一个对象有多个伤害,如弹射等 [HurtObj, ...]
         self._bySkill = None # 由哪个技能触发的
+        self._byBuff = None # 由哪个buff触发的
         self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
         
         # 连击相关
@@ -515,6 +519,7 @@
         self._batType = 0
         self._tagObjList = []
         self._bySkill = None
+        self._byBuff = None
         self._afterLogicList = []
         self.ClearHurtObj()
         return
@@ -563,6 +568,8 @@
     def SetBatType(self, batType): self._batType = batType
     def GetBySkill(self): return self._bySkill
     def SetBySkill(self, bySkill): self._bySkill = bySkill
+    def GetByBuff(self): return self._byBuff
+    def SetByBuff(self, byBuff): self._byBuff = byBuff
     def GetTagObjList(self): return self._tagObjList # 技能目标列表
     def SetTagObjList(self, tagObjList): self._tagObjList = tagObjList
     def GetAfterLogicList(self): return self._afterLogicList
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
index 111c080..be4346b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -1405,7 +1405,7 @@
                         #GameWorld.DebugLog("    永久buff不处理! curID=%s,index=%s,skillID=%s" % (curID, index, skillID))
                         continue
                     calcTimeline = buff.GetCalcTime()
-                    passTurn = __calcPassturn(calcTimeline, nowTimeline, False)
+                    passTurn = __calcPassturn(calcTimeline, nowTimeline, True)
                     if passTurn <= 0:
                         #GameWorld.DebugLog("    passTurn <= 0 passTurn=%s,calcTimeline=%s,nowTimeline=%s,skillID=%s" % (passTurn, calcTimeline, nowTimeline, skillID))
                         continue
@@ -1424,7 +1424,7 @@
 
 def __calcPassturn(calcTimeline, nowTimeline, equalOK):
     ## 计算已经过了的回合数
-    # @param equalOK: 时间节点相同时是否算1回合,一般技能可以算,buff不算
+    # @param equalOK: 时间节点相同时是否算1回合,一般技能可以算,buff可算可不算,具体看需求调整
     calcTurnNum = calcTimeline / TimelineSet
     calcTimeNode = calcTimeline % TimelineSet
     nowTurnNum = nowTimeline / TimelineSet
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index bd99e5a..7726a8f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1329,7 +1329,8 @@
 Def_Calc_MaxHP, # 最大生命值 1
 Def_Calc_LastHurt, # 最后一次伤害值 2
 Def_Calc_TagMaxHP, # 目标最大生命值 3
-) = range(4)
+Def_Calc_ByBuffValue, # 触发buff的buff值 4
+) = range(5)
 
 #治疗类型(影响公式参数)
 Def_CureTypeList = (
@@ -4286,7 +4287,11 @@
 TriggerWay_CurSkillEffLst, # 本持续buff结算后额外触发效果,仅该持续buff结算后有效 14
 TriggerWay_KillOneObj, # 击杀目标后(单次击杀多目标只触发一次) 15
 TriggerWay_KillTagObj, # 击杀每目标后(单次击杀多目标每个目标触发一次) 16
-) = range(1, 1 + 16)
+TriggerWay_BuffDel, # buff消失后  17
+) = range(1, 1 + 17)
+
+# 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
+TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
 
 # 被动触发有效来源
 TriggerSrc_Skill = 1    # 身上技能有效
@@ -4299,6 +4304,8 @@
 PassiveEff_ChangeHurtType = 6002 # 变更伤害类型: 值1-伤害类型;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
 PassiveEff_ChangeHurtMulti = 6003 # 变更伤害倍值(可增可减): 值1-变更倍值;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
 PassiveEff_AddSkillPer = 6004 # 增加本次技能万分比: 值1-增加的万分比;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
+PassiveEff_AddSkillTagCnt = 6007 # 增加技能目标数:值1-增加目标个数
+PassiveEff_ImmuneControlBuff = 6008 # 生命值低于x%时免疫控制效果:值1-百分比
 
 # 被动效果ID有触发值时就返回的
 PassiveEffHappenValueList = [PassiveEff_ChangeHurtType]
@@ -4306,6 +4313,10 @@
 PassiveEffValueMaxList = []
 # 被动效果ID触发值取最小值的
 PassiveEffValueMinList = []
+
+# 技能效果 - 不需要配置触发方式的
+SkillEff_CureWayEx = 7001 # 额外治疗值计算(对CalcType、SkillPer治疗计算方式扩展): 值1-计算方式;值2-万分比
+SkillEff_HurtShare = 7002 # 均摊伤害
 
 (
 TriggerType_BeSuperHit, # 被暴击触发技能 1
@@ -4398,7 +4409,7 @@
 TriggerType_ThumpSkillValue, # 重击增加技能固定值伤害 88
 TriggerType_HitValue, # 记录命中个数 89
 TriggerType_ChangeSkillEff, # 改变技能特效广播 90
-) = range(1, 91)
+) = range(1001, 1091)
 
 
 #不可以佩戴翅膀的地图
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5001.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5001.py
index 3e18e05..ebf27e0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5001.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5001.py
@@ -17,7 +17,7 @@
 
 import TurnBuff
 
-def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
     #结算一次扣除1回合
     remainTime = max(0, effBuff.GetRemainTime() - 1)
     effBuff.SetRemainTime(remainTime)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5002.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5002.py
index c68d5a4..0b744f8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5002.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5002.py
@@ -20,7 +20,7 @@
 import IpyGameDataPY
 import TurnSkill
 
-def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
     effectID = curEffect.GetEffectID()
     buffState = curEffect.GetEffectValue(0)
     needLayers = curEffect.GetEffectValue(1) # 累计达到多少层时才结算
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py
index 5fc2e16..a1df592 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py
@@ -17,7 +17,7 @@
 
 import TurnBuff
 
-def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
     #结算一次扣除1回合
     remainLayer = max(0, effBuff.GetLayer() - 1)
     effBuff.SetLayer(remainLayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5011.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5011.py
index 3293030..34209f9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5011.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5011.py
@@ -18,7 +18,7 @@
 import TurnSkill
 import IpyGameDataPY
 
-def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
     skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
     if not skillID:
         passiveSkill = effSkill
@@ -28,8 +28,8 @@
         return
     effectID = curEffect.GetEffectID()
     effSkillID = effSkill.GetSkillID()
-    return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID)
+    return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID, connBuff)
 
-def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
     effSkill = effBuff.GetSkillData().GetIpyData()
-    return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
+    return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5012.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5012.py
index 4285c9e..7e30a7d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5012.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5012.py
@@ -20,7 +20,7 @@
 import GameWorld
 import ChConfig
 
-def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
     rate = curEffect.GetEffectValue(0)
     if not GameWorld.CanHappen(rate):
         #GameWorld.DebugLog("概率进行追击不触发!")
@@ -32,8 +32,8 @@
         passiveSkill = IpyGameDataPY.GetIpyGameData("Skill", skillID)
     if not passiveSkill:
         return
-    return TurnSkill.OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Pursue, bySkill=connSkill)
+    return TurnSkill.OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Pursue, bySkill=connSkill, byBuff=connBuff)
 
-def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
     effSkill = effBuff.GetSkillData().GetIpyData()
-    return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
+    return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6007.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6007.py
new file mode 100644
index 0000000..20060e4
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6007.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_6007
+#
+# @todo:增加技能目标数
+# @author hxp
+# @date 2025-09-22
+# @version 1.0
+#
+# 详细描述: 增加技能目标数
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-09-22 16:00"""
+#-------------------------------------------------------------------------------
+
+def GetHappenValue(attacker, defender, curEffect, effSkill, **skillkwargs):
+    return curEffect.GetEffectValue(0)
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6008.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6008.py
new file mode 100644
index 0000000..65a0d65
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6008.py
@@ -0,0 +1,21 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_6008
+#
+# @todo:生命值低于x%时免疫控制效果
+# @author hxp
+# @date 2025-09-22
+# @version 1.0
+#
+# 详细描述: 生命值低于x%时免疫控制效果
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-09-22 16:00"""
+#-------------------------------------------------------------------------------
+
+def GetHappenValue(attacker, defender, curEffect, effSkill, **skillkwargs):
+    lowerThanPer = curEffect.GetEffectValue(0)
+    nowPer = attacker.GetHP() / float(attacker.GetMaxHP())
+    return 1 if nowPer < lowerThanPer else 0
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
index b77b72f..bd8ae78 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -22,6 +22,7 @@
 import TurnBuffs
 import BattleObj
 import ObjPool
+import TurnPassive
 
 GameWorld.ImportAll("Script\\Skill\\", "TurnBuffs")
 
@@ -65,6 +66,13 @@
                            % (curID, skillID, ownerID, relatedSkillID))
         return False
     
+    #被动触发免疫控制buff
+    if buffSkill.GetSkillType() == ChConfig.Def_SkillType_Action:
+        if TurnPassive.GetTriggerEffectValue(turnFight, batObj, buffOwner, ChConfig.PassiveEff_ImmuneControlBuff, buffSkill):
+            GameWorld.DebugLog("血量低于百分x时免疫控制buff: curID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s,hp:%s/%s" 
+                               % (curID, skillID, ownerID, relatedSkillID, batObj.GetHP(), batObj.GetMaxHP()))
+            return False
+        
     buffValueList = GetAddBuffValue(turnFight, buffOwner, batObj, buffSkill)
     GameWorld.DebugLog("OnAddBuff: curID=%s,skillID=%s,atkType=%s,buffValueList=%s,ownerID=%s,relatedSkillID=%s" 
                        % (curID, skillID, buffSkill.GetAtkType(), buffValueList, ownerID, relatedSkillID))
@@ -241,6 +249,19 @@
     buffMgr = batObj.GetBuffManager()
     buffID = curBuff.GetBuffID()
     skillData = curBuff.GetSkillData()
+    
+    # 先删除buff再触发其他内容,防止当前要删除的buff影响后续触发的内容,如无敌buff等,理论上触发的后续内容无敌buff不应该再生效
+    curBuffState = skillData.GetCurBuffState()
+    if curBuffState:
+        buffMgr.DelBuffState(curBuffState, buffID)
+        
+    buffMgr.DelBuff(buffID, release)
+    if isSync:
+        SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
+    if afterLogic and relatedSkill:
+        tagObjID = tagObj.GetID() if tagObj else buffObjID
+        relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID])
+        
     #buff消失的触发
     for effectIndex in range(0, skillData.GetEffectCount()):
         curEffect = skillData.GetEffect(effectIndex)
@@ -249,32 +270,19 @@
         if not effectID:
             continue
         
-        if curEffect.GetTriggerWay():
+        triggerWay = curEffect.GetTriggerWay()
+        if triggerWay:
+            if triggerWay == ChConfig.TriggerWay_BuffDel:
+                TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BuffDel, connBuff=curBuff)
+                
             if curEffect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
                 haveBuffPassiveEff = True
                 
         elif effectID in ChConfig.AttrIDList:
             isRefreshAttr = True
             
-        else:
-            callFunc = GameWorld.GetExecFunc(TurnBuffs, "Buff_%d.%s" % (effectID, "OnBuffDel"))
-            if callFunc:
-                callFunc(turnFight, batObj, curBuff, curEffect)
-                
     if haveBuffPassiveEff:
         batObj.GetPassiveEffManager().DelBuffPassiveEffect(buffID)
-        
-    curBuffState = skillData.GetCurBuffState()
-    if curBuffState:
-        buffMgr.DelBuffState(curBuffState, buffID)
-        
-    # 最后删除buff、通知
-    buffMgr.DelBuff(buffID, release)
-    if isSync:
-        SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
-    if afterLogic and relatedSkill:
-        tagObjID = tagObj.GetID() if tagObj else buffObjID
-        relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID])
         
     if isRefreshAttr:
         RefreshBuffAttr(batObj)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1003.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1003.py
index f8077ad..5d26677 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1003.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1003.py
@@ -22,6 +22,6 @@
     calcType = curSkill.GetCalcType()
     skillPer = curSkill.GetSkillPer()
     skillValue = curSkill.GetSkillValue()
-    baseValue = TurnSkill.GetCalcBaseValue(calcType, attacker, defender)
+    baseValue = TurnSkill.GetCalcBaseValue(calcType, attacker, defender, curSkill)
     shieldValue = int(baseValue * skillPer / 10000.0) + skillValue
     return [shieldValue % ChConfig.Def_PerPointValue, shieldValue / ChConfig.Def_PerPointValue]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
index f91000e..e76260f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
@@ -31,11 +31,11 @@
     buffEffInfo and GameWorld.DebugLog("    被动Buff效果: %s" % buffEffInfo)
     return
 
-def OnTriggerPassiveEffect(turnFight, batObj, triggerWay, tagObj=None, connSkill=None, connSkillTypeID=0):
+def OnTriggerPassiveEffect(turnFight, batObj, triggerWay, tagObj=None, connSkill=None, connSkillTypeID=0, connBuff=None, **kwargs):
     ''' 触发被动效果,可能触发技能、buff,需根据优先级触发
     '''
     passiveEffMgr = batObj.GetPassiveEffManager()
-    effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID)
+    effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID, connBuff)
     if not effInfoList:
         return
     # [["skill/buff", skillID/buffID, effIDList], ...]
@@ -45,15 +45,15 @@
         sign = effInfo[0]
         if sign == "skill":
             skillID, effIDList = effInfo[1:]
-            __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill)
+            __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill, connBuff, **kwargs)
             
         elif sign == "buff":
             buffID, effIDList = effInfo[1:]
-            __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill)
+            __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill, connBuff, **kwargs)
             
     return
 
-def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill=None):
+def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill=None, connBuff=None, **kwargs):
     skillMgr = batObj.GetSkillManager()
     effSkill = skillMgr.FindSkillByID(skillID)
     if not effSkill and connSkill and connSkill.GetSkillID() == skillID:
@@ -65,11 +65,11 @@
         curEffect = effSkill.GetEffectByID(effID, triggerWay)
         if not curEffect:
             continue
-        DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
+        DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
         
     return
 
-def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff=None, **kwargs):
     effID = curEffect.GetEffectID()
     if not effID:
         return
@@ -77,12 +77,14 @@
     callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoSkillEffectLogic"))
     if not callFunc:
         return
-    callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
+    callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
     return
 
-def __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill=None):
+def __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill=None, connBuff=None, **kwargs):
     buffMgr = batObj.GetBuffManager()
     effBuff = buffMgr.GetBuff(buffID)
+    if not effBuff and connBuff and connBuff.GetBuffID() == buffID:
+        effBuff = connBuff
     if not effBuff:
         return
     skillData = effBuff.GetSkillData()
@@ -91,11 +93,11 @@
         curEffect = skillData.GetEffectByID(effID, triggerWay)
         if not curEffect:
             continue
-        DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
+        DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs)
         
     return
 
-def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
     effID = curEffect.GetEffectID()
     if not effID:
         return
@@ -103,10 +105,10 @@
     callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoBuffEffectLogic"))
     if not callFunc:
         return
-    callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
+    callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs)
     return
 
-def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None):
+def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None, **kwargs):
     ''' 获取触发被动的值,一般用于某种条件下才会产生的值,如xx情况下属性变化 或 xx情况下是否发生什么
     @param calcEffID: 需要统计的效果ID,可以是属性ID或者其他自定义效果ID
     @return: 触发的值,0-没有触发或本身触发的值为0;非0-触发的具体值
@@ -159,7 +161,7 @@
             callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "GetHappenValue"))
             if not callFunc:
                 continue
-            value = callFunc(atkObj, defObj, effect, effSkill)
+            value = callFunc(atkObj, defObj, effect, effSkill, **kwargs)
             if value is None:
                 continue
             
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
index 3d2c457..67bb230 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -45,7 +45,7 @@
     ## 是否无视防御
     return useSkill.GetHurtType() / 10 == 1 # 2为真伤,待扩展
 
-def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None):
+def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None, byBuff=None):
     '''使用技能通用入口
     @param useSkill: 使用的技能,注意并不一定是身上的技能,可能只是 SkillData 表数据
     @param bySkill: 由哪个技能额外触发的,比如附加触发的技能或被动技能均可能由某个技能触发
@@ -61,11 +61,7 @@
     
     #没有指定目标,则按技能自身的目标逻辑
     if not tagObjList:
-        tagAim = useSkill.GetTagAim()
-        tagFriendly = useSkill.GetTagFriendly()
-        tagAffect = useSkill.GetTagAffect()
-        tagCount = useSkill.GetTagCount()
-        tagObjList = GetSkillTags(turnFight, curBatObj, tagAim, tagFriendly, tagAffect, tagCount)
+        tagObjList = GetSkillTags(turnFight, curBatObj, useSkill)
         rate = useSkill.GetHappenRate()
         if rate and rate != ChConfig.Def_MaxRateValue: 
             for tagObj in tagObjList[::-1]:
@@ -99,6 +95,7 @@
     useSkill.SetTagObjList(tagObjList)
     useSkill.SetBatType(batType)
     useSkill.SetBySkill(bySkill)
+    useSkill.SetByBuff(byBuff)
     
     isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
     if isTurnNormalSkill:
@@ -153,15 +150,22 @@
         poolMgr.release(useSkill)
     return True
 
-def GetSkillTags(turnFight, curBatObj, tagAim, tagFriendly, tagAffect, tagCount):
+def GetSkillTags(turnFight, curBatObj, useSkill):
     ## 获取技能目标
     # @return: [主目标, 目标2, ...]
+    
+    tagAim = useSkill.GetTagAim()
+    tagFriendly = useSkill.GetTagFriendly()
+    tagAffect = useSkill.GetTagAffect()
+    tagCount = useSkill.GetTagCount()
     
     curFaction = curBatObj.GetFaction()
     
     # 自己,直接返回
     if tagAim == ChConfig.SkillTagAim_Self:
         return [curBatObj]
+    
+    tagCount += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillTagCnt, useSkill)
     
     sneerObj = None # 嘲讽目标
     sneerObjID, sneerObjPosNum = 0, 0
@@ -291,6 +295,11 @@
         if sneerObj in aimObjList and aimObjList.index(sneerObj) != 0:
             aimObjList.remove(sneerObj)
             aimObjList.insert(0, sneerObj)
+            
+    # 一定包含自己
+    if tagFriendly == 2:
+        if curBatObj not in aimObjList:
+            aimObjList.append(curBatObj)
             
     if tagCount and len(aimObjList) > tagCount:
         aimObjList = aimObjList[:tagCount]
@@ -977,7 +986,7 @@
     OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
     return
 
-def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0):
+def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None):
     '''被动触发使用技能
     @param passiveSkill: 释放的被动技能
     @param connSkill: 由什么技能引起的
@@ -1003,10 +1012,10 @@
             GameWorld.DebugLog("    概率不触发: tagID=%s,happenRate=%s" % (tagID, happenRate))
             return
         passiveTagObjList = [tagObj]
-        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill)
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff)
     else:
         GameWorld.DebugLog("被动触发技能,重新锁定目标! effSkillID=%s,effectID=%s,passiveSkillID=%s" % (effSkillID, effectID, passiveSkillID))
-        isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill)
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff)
         
     return isOK
 
@@ -1184,7 +1193,7 @@
     aPursueDamPer /= 10000.0
     
     if calcType != ChConfig.Def_Calc_Attack:
-        aAtk = GetCalcBaseValue(calcType, atkObj, defObj)
+        aAtk = GetCalcBaseValue(calcType, atkObj, defObj, curSkill)
     GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s,aAddSkillPer=%s" 
                        % (atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, hurtTypes, aAddSkillPer))
     
@@ -1198,6 +1207,9 @@
     elif isDot:
         hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
         GameWorld.DebugLog("    持续技能伤害=%s" % (hurtValue))
+    elif calcType == ChConfig.Def_Calc_ByBuffValue:
+        hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 2))
+        GameWorld.DebugLog("    按最后一次buff值计算伤害=%s,calcType=%s,LastHurt=%s" % (hurtValue, calcType, aAtk))
     elif calcType != ChConfig.Def_Calc_Attack:
         hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 1))
         GameWorld.DebugLog("    非按攻击力伤害=%s,calcType=%s,aAtk=%s" % (hurtValue, calcType, aAtk))
@@ -1221,6 +1233,13 @@
         hurtValueMax = aAtk * hurtAtkPerMax / 10000.0
         hurtValue = min(hurtValue, hurtValueMax)
         GameWorld.DebugLog("    伤害最高限制: hurtValue=%s,hurtAtkPerMax=%s,aAtk=%s" % (hurtValue, hurtAtkPerMax, aAtk))
+        
+    # 均摊
+    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
+    if hurtShareEff:
+        tagCnt = max(1, len(curSkill.GetTagObjList()))
+        hurtValue = hurtValue / tagCnt
+        GameWorld.DebugLog("    目标均摊伤害: hurtValue=%s,tagCnt=%s" % (hurtValue, tagCnt))
         
     hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后
     return hurtValue, hurtTypes
@@ -1399,9 +1418,22 @@
     skillPer = curSkill.GetSkillPer()
     #skillValue = curSkill.GetSkillValue()
     
-    cureBaseValue = GetCalcBaseValue(cureType, userObj, tagObj)
-    
     skillPer += TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
+    
+    cureHP = __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum)
+    
+    cureWayExEff = curSkill.GetEffectByID(ChConfig.SkillEff_CureWayEx)
+    if cureWayExEff:
+        cureType = cureWayExEff.GetEffectValue(0)
+        skillPer = cureWayExEff.GetEffectValue(1)
+        GameWorld.DebugLog("额外计算治疗方式: cureType=%s,skillPer=%s" % (cureType, skillPer))
+        cureHPEx = __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum)
+        cureHP += cureHPEx
+        
+    return max(1, int(cureHP)) # 保底1点
+
+def __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum=False):
+    cureBaseValue = GetCalcBaseValue(cureType, userObj, tagObj, curSkill)
     
     # 回合制
     curePer = 0 # 治疗加成
@@ -1430,8 +1462,9 @@
                        % (cureHP, curSkill.GetSkillID(), cureType, baseValue, skillPer, curePer, cureDefPer, angerOverflow))
     return cureHP
 
-def GetCalcBaseValue(calcType, curObj, tagObj):
+def GetCalcBaseValue(calcType, curObj, tagObj, curSkill):
     ##获得基础计算值
+    baseValue = 0
     if calcType == ChConfig.Def_Calc_Attack:
         baseValue = curObj.GetAtk()
     elif calcType == ChConfig.Def_Calc_MaxHP:
@@ -1440,6 +1473,11 @@
         baseValue = curObj.GetLastHurtValue()
     elif calcType == ChConfig.Def_Calc_TagMaxHP:
         baseValue = 0 if not tagObj else tagObj.GetMaxHP()
+    elif calcType == ChConfig.Def_Calc_ByBuffValue:
+        byBuff = curSkill.GetByBuff()
+        if byBuff:
+            baseValue = byBuff.GetValue1() + byBuff.GetValue2() * ChConfig.Def_PerPointValue
+            GameWorld.DebugLog("根据buff值: %s" % baseValue)
     return baseValue
 
 def DoDOTAttack(turnFight, batObj, curBuff, hurtValue, hurtTypes):

--
Gitblit v1.8.0