From 5442da19166041144cf69ac36d9f8728ae597692 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期六, 13 十二月 2025 19:36:46 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(修复曹仁、甄宓破盾无法触发bug;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py    |    5 +++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py |   10 +++++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py   |   24 +++++++++++++-----------
 3 files changed, 25 insertions(+), 14 deletions(-)

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 355f8a7..e9bb3bc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -361,13 +361,14 @@
     DoBuffDel(turnFight, batObj, curBuff, relatedSkill)
     return
 
-def DoBuffDel(turnFight, batObj, curBuff, relatedSkill=None, afterLogic=False, tagObj=None, noRefreshAttr=False, isSync=True):
+def DoBuffDel(turnFight, batObj, curBuff, relatedSkill=None, afterLogic=False, tagObj=None, noRefreshAttr=False, isSync=True, afterTriggerData=None):
     '''删除buff
     @param relatedSkill: 关联的技能
     @param afterLogic: 是否需要在关联技能处理完毕后才处理删除后续逻辑,如通知,触发被动等
     @param tagObj: 由谁引起的buff删除
     @param noRefreshAttr: 不刷新属性
     @return: isRefreshAttr 是否需要刷属性,如果设置了 noRefreshAttr,则要在外层刷属性
+    @return: afterTriggerData afterLogic为True时,附带的被动触发数据,因为buff被删除后该buff自带的被动效果也会被删除,所以先缓存供后续处理
     '''
     
     release = True # 释放buff实例
@@ -398,7 +399,7 @@
         SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
     if afterLogic and relatedSkill:
         tagObjID = tagObj.GetID() if tagObj else buffObjID
-        relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID])
+        relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID, afterTriggerData])
         
     #buff消失的触发
     for effectIndex in range(0, skillData.GetEffectCount()):
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 d16dfec..1609937 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
@@ -17,6 +17,8 @@
 
 import GameWorld
 import PassiveTrigger
+import IpyGameDataPY
+import BattleObj
 import ChConfig
 
 GameWorld.ImportAll("Script\\Skill\\", "PassiveTrigger")
@@ -41,7 +43,13 @@
     effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID, connBuff)
     if not effInfoList:
         return
-    # [["skill/buff", skillID, buffID, effIDList], ...]
+    OnTriggerPassiveEffList(turnFight, batObj, triggerWay, tagObj, effInfoList, connSkill, connBuff, **kwargs)
+    return
+
+def OnTriggerPassiveEffList(turnFight, batObj, triggerWay, tagObj, effInfoList, connSkill=None, connBuff=None, **kwargs):
+    '''触发外部指定的被动效果列表
+    @param effInfoList: [["skill/buff", skillID, buffID, effIDList], ...]
+    '''
     tagID = tagObj.GetID() if tagObj else 0
     GameWorld.DebugLogEx("触发被动: triggerWay=%s,objID=%s,tagID=%s,%s", triggerWay, batObj.GetID(), tagID, effInfoList)
     for effInfo in effInfoList:
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 e4f017d..28703f6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -1279,16 +1279,14 @@
     
     # 优先处理afterLogic,可再预先汇总一些会触发被动的信息
     relatedSkillID = useSkill.GetSkillID()
-    shieldBrokenList = [] # 记录盾破
+    delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
     afterLogicList = useSkill.GetAfterLogicList()
     for logicType, logicData in afterLogicList:
         if logicType == ChConfig.AfterLogic_DelBuff:
-            buffObjID, buff, tagObjID = logicData
-            buffSkillData = buff.GetSkillData()
-            buffSkillTypeID = buffSkillData.GetSkillTypeID()
+            buffObjID, buff, tagObjID, afterTriggerData = logicData
             TurnBuff.DoBuffDelAfterLogicOver(turnFight, buffObjID, buff, useSkill)
-            if SkillCommon.isDamageShieldSkill(buffSkillData):
-                shieldBrokenList.append([buffObjID, tagObjID, buffSkillTypeID])
+            if afterTriggerData:
+                delBuffAfterEffList.append([buffObjID, buff, tagObjID, afterTriggerData])
                 
         elif logicType == ChConfig.AfterLogic_AddBuff:
             batObj = logicData[0]
@@ -1397,11 +1395,13 @@
     
     # ========== 以下触发被动 ==========
     
-    # 破盾时
-    for buffObjID, tagObjID, buffSkillTypeID in shieldBrokenList:
+    # buff消失后置处理的被动,优先处理,如破盾,区别于被动方式  ChConfig.TriggerWay_BuffDel(立即触发)
+    for buffObjID, buff, tagObjID, afterTriggerData in delBuffAfterEffList:
+        triggerWay, effInfoList = afterTriggerData
         buffObj = batObjMgr.getBatObj(buffObjID)
-        tagObj = batObjMgr.getBatObj(tagObjID)
-        TurnPassive.OnTriggerPassiveEffect(turnFight, buffObj, ChConfig.TriggerWay_ShieldBroken, tagObj, connSkillTypeID=buffSkillTypeID)
+        tagObj = batObjMgr.getBatObj(tagObjID) # 导致该buff消失的目标
+        GameWorld.DebugLogEx("buff消失后置处理的被动: buffObjID=%s,tagObjID=%s,triggerWay=%s,%s", buffObjID, tagObjID, triggerWay, effInfoList)
+        TurnPassive.OnTriggerPassiveEffList(turnFight, buffObj, triggerWay, tagObj, effInfoList, connSkill=useSkill, connBuff=buff)
         
     # 有击杀时
     for index, tagObj in enumerate(killObjList):
@@ -2471,7 +2471,9 @@
             shieldHurtValue -= decShieldValue # 承伤值
             if decShieldValue >= buffValue:
                 GameWorld.DebugLogEx("        删除盾: buffID=%s,剩余盾伤=%s", buffID, shieldHurtValue)
-                TurnBuff.DoBuffDel(turnFight, defObj, buff, relatedSkill=curSkill, afterLogic=True, tagObj=atkObj)
+                #盾破时buff会被删除,导致绑定在该buff上的被动效果同步被清除,后续就无法触发盾破后被动,固先取出来
+                effInfoList = defObj.GetPassiveEffManager().GetPassiveEffByTrigger(ChConfig.TriggerWay_ShieldBroken, connSkillTypeID=buffSkillID)
+                TurnBuff.DoBuffDel(turnFight, defObj, buff, relatedSkill=curSkill, afterLogic=True, tagObj=atkObj, afterTriggerData=[ChConfig.TriggerWay_ShieldBroken, effInfoList])
             else:
                 updShieldValue = buffValue - decShieldValue
                 GameWorld.DebugLogEx("        更新盾: updShieldValue=%s,剩余盾伤=%s", updShieldValue, shieldHurtValue)

--
Gitblit v1.8.0