From d69d0cd898405aa741ae65ad4458fe81afef9f32 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 18 十二月 2025 17:26:38 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(庞统所有技能;目标范围增加8-继承主技能友军;目标细分增加9-仅流血目标;增加触发方式48 49 50;增效效果5506;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py                     |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5501.py |   15 +++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5506.py |   71 +++++++++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py                      |   45 ++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                             |   11 ++-
 5 files changed, 138 insertions(+), 6 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 ae30896..0fc0d02 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -723,7 +723,7 @@
     def GetLayerMax(self): return self._skillData.GetLayerMax()
     def GetBuffRepeat(self): return self._skillData.GetBuffRepeat() # Buff叠加规则
     def GetDispersedLimit(self): return self._skillData.GetDispersedLimit() # 驱散限制
-    def GetBuffRetain(self): return self._ipyData.GetBuffRetain()
+    def GetBuffRetain(self): return self._skillData.GetBuffRetain()
     def GetFightPower(self): return self._skillData.GetFightPower()
     
     ## ---------------------------------- 非技能表内容 ----------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index e737e03..118e099 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1347,7 +1347,8 @@
 SkillTagAim_Self, # 自己 5
 SkillTagAim_MainSkill, # 继承主技能目标 6
 SkillTagAim_MainSkillEx, # 继承主技能目标一次性处理 7
-) = range(8)
+SkillTagAim_MainSkillFriend, # 继承主技能友军 8
+) = range(9)
 
 # 技能目标 - 细分
 (
@@ -1360,7 +1361,8 @@
 SkillTagAffect_Burn, # 灼烧/玄火目标优先 6
 SkillTagAffect_PoisonCure, # 仅焚血(毒奶)目标 7
 SkillTagAffect_DamShield, # 承伤盾目标优先 8
-) = range(9)
+SkillTagAffect_Bleeding, # 仅流血目标 9
+) = range(10)
 
 #技能施法目标
 Def_UseSkillAim_Type = 3
@@ -4010,7 +4012,10 @@
 TriggerWay_FriendAction, # 友方行动后(包含自己) 45
 TriggerWay_HurtTag, # 对目标造成伤害时 46
 TriggerWay_BeControlledHard, # 受控时(硬控) 47
-) = range(1, 1 + 47)
+TriggerWay_FriendCombo, # 友军连击时(包含自己) 48
+TriggerWay_FriendPursue, # 友军追击时(包含自己) 49
+TriggerWay_FriendAttackOverDirectOne, # 友方使用技能后(多目标仅触发一次,包含自己) 50
+) = range(1, 1 + 50)
 
 # 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
 TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5501.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5501.py
index 61d768a..478798a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5501.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5501.py
@@ -21,6 +21,21 @@
 def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
     skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
     setLayerCnt = curEffect.GetEffectValue(1) # 指定buff层级
+    byTagStateList = curEffect.GetEffectValue(2) # 或根据目标xx状态 [状态1, 状态2, ...]总层级
+    if byTagStateList:
+        layerTotal = 0
+        tagBuffMgr = tagObj.GetBuffManager()
+        for index in range(tagBuffMgr.GetBuffCount()):
+            buff = tagBuffMgr.GetBuffByIndex(index)
+            skillData = buff.GetSkillData()
+            if skillData.GetCurBuffState() not in byTagStateList:
+                continue
+            layerTotal += buff.GetLayer()
+        setLayerCnt = layerTotal
+        
+    if setLayerCnt <= 0:
+        return
+    
     if not skillID:
         passiveSkill = effSkill
     else:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5506.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5506.py
new file mode 100644
index 0000000..f6fe95d
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5506.py
@@ -0,0 +1,71 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_5506
+#
+# @todo:触发释放技能(验证目标状态层级)
+# @author hxp
+# @date 2025-12-18
+# @version 1.0
+#
+# 详细描述: 触发释放技能(验证目标状态层级)
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-12-18 17:30"""
+#-------------------------------------------------------------------------------
+
+import TurnSkill
+import GameWorld
+import IpyGameDataPY
+import BattleObj
+import TurnBuff
+
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
+    if not tagObj:
+        return
+    
+    skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
+    checkStateList = curEffect.GetEffectValue(1) # 可附加验证目标处于xx状态
+    needLayers = curEffect.GetEffectValue(2) # 达到x层时才触发
+    isDelBuff = curEffect.GetEffectValue(3) # 层数不足时是否删除释放技能对应buff
+    
+    layerTotal = 0
+    tagBuffMgr = tagObj.GetBuffManager()
+    for index in range(tagBuffMgr.GetBuffCount()):
+        buff = tagBuffMgr.GetBuffByIndex(index)
+        skillData = buff.GetSkillData()
+        if skillData.GetCurBuffState() not in checkStateList:
+            continue
+        layerTotal += buff.GetLayer()
+        
+    if layerTotal < needLayers:
+        GameWorld.DebugLogEx("buff状态总层数不足不触发5506! checkStateList=%s,layerTotal=%s < %s,isDelBuff=%s", checkStateList, layerTotal, needLayers, isDelBuff)
+        if isDelBuff:
+            delBuffSkillID = skillID if skillID else effSkill.GetSkillID()
+            if not delBuffSkillID:
+                return
+            buff = tagBuffMgr.FindBuffBySkillID(delBuffSkillID)
+            if buff:
+                TurnBuff.DoBuffDel(turnFight, tagObj, buff, connSkill)
+        return
+    
+    if not skillID:
+        passiveSkill = effSkill
+    else:
+        passiveSkill = IpyGameDataPY.GetIpyGameData("Skill", skillID)
+    if not passiveSkill:
+        return
+    effectID = curEffect.GetEffectID()
+    effSkillID = effSkill.GetSkillID()
+    return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID, connBuff, **kwargs)
+
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
+    ownerID = effBuff.GetOwnerID()
+    if not ownerID:
+        return
+    buffOwner = BattleObj.GetBatObjMgr().getBatObj(ownerID)
+    if not buffOwner:
+        return
+    effSkill = effBuff.GetSkillData().GetIpyData()
+    return DoSkillEffectLogic(turnFight, buffOwner, batObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
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 912d3cb..b67c3c9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -443,6 +443,14 @@
         for aimObj in aimObjList[::-1]:
             if not aimObj.CheckInState(ChConfig.BatObjState_PoisonCure):
                 aimObjList.remove(aimObj)
+        
+    # 仅流血目标
+    elif tagAffect == ChConfig.SkillTagAffect_Bleeding:
+        atkBackTagFrist = False
+        for aimObj in aimObjList[::-1]:
+            if not aimObj.CheckInState(ChConfig.BatObjState_Bleeding):
+                aimObjList.remove(aimObj)
+                
     else:
         # 范围目标超过个数,则随机取
         if tagCount and len(aimObjList) > tagCount:
@@ -1282,13 +1290,14 @@
             return useSkill
     return
 
-def DoBeAttackResult(turnFight, curObj, useSkill, curBuff=None):
+def DoBeAttackResult(turnFight, curObj, useSkill, timeBuff=None):
     '''被攻击结果
     @param curObj: 施法方或buff归属方
+    @param timeBuff: 持续结算的buff,如持续攻击、持续治疗等
     '''
     
     #curID = curObj.GetID()
-    isUseSkill = False if curBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
+    isUseSkill = False if timeBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
     isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
     isAngerSkill = SkillCommon.isAngerSkill(useSkill)
     
@@ -1456,6 +1465,7 @@
     triggerOne = False
     batType = useSkill.GetBatType()
     isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
+    curBatLineup = None
     for tagObj in tagObjListAll:
         tagID = tagObj.GetID()
         
@@ -1528,6 +1538,29 @@
             TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_AtkBack, tagObj, connSkill=useSkill)
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAtkBack, curObj, connSkill=useSkill)
             
+            
+        # 敌友方
+        if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue]:
+            if not curBatLineup:
+                curBatLineup = curObj.GetBatLineup()
+            for lineupObjID in curBatLineup.posObjIDDict.values():
+                lineupObj = batObjMgr.getBatObj(lineupObjID)
+                if not lineupObj.IsAlive():
+                    continue
+                
+                # 直接攻击
+                if isAttackDirect:
+                    if not triggerOne:
+                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOne, tagObj, connSkill=useSkill, byFriendObj=curObj)
+                        
+                # 连击
+                if batType == ChConfig.TurnBattleType_Combo:
+                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
+                    
+                # 追击
+                elif batType == ChConfig.TurnBattleType_Pursue:
+                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendPursue, tagObj, connSkill=useSkill, byFriendObj=curObj)
+                    
         triggerOne = True # 设置已经触发过一次
         
     # 验证是否结算,最后处理
@@ -1836,6 +1869,14 @@
             return
         passiveTagObjList = connSkill.GetTagObjList()
         isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+    elif tagAim == ChConfig.SkillTagAim_MainSkillFriend:
+        if "byFriendObj" not in kwargs:
+            return
+        byFriendObj = kwargs["byFriendObj"]
+        passiveTagObjList = [byFriendObj]
+        GameWorld.DebugLogEx("被动触发技能,针对来源友军! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s,byFriendID=%s", 
+                             effSkillID, effectID, passiveSkillID, bySkillID, byFriendObj.GetID())
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
     else:
         GameWorld.DebugLogEx("被动触发技能,重新锁定目标! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
         isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)

--
Gitblit v1.8.0