From d33b1530147a412e88a32bf1168ca3ac6e9718c6 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 20 三月 2026 10:35:50 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(左慈所有技能;技能目标细分增加11-受控目标优先;敌友目标增加3-友方(一定不含自己);7011效果改为无技能目标时触发;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py |    1 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py  |   24 +++++++++++++++++-------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py         |    5 +++--
 3 files changed, 21 insertions(+), 9 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 572c1cf..afc8275 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -1095,6 +1095,7 @@
     
     def IsInControlled(self): return self.IsInBuffStateGroup([1, 2]) # 是否被控制中
     def IsInControlledHard(self): return self.IsInBuffStateGroup([1]) # 是否被硬控中
+    def IsInControlledSoft(self): return self.IsInBuffStateGroup([2]) # 是否被软控中
     def IsInBuffStateGroup(self, buffStateGroups):
         '''是否在某个状态组中
                         已定义的组: 1 - 硬控组;2 - 软控组;3 - 限制普攻组;4 - 限制怒技组;5 - 限制被动动态组
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index c5cb00e..d1f14b7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1361,7 +1361,8 @@
 SkillTagAffect_DamShield, # 承伤盾目标优先 8
 SkillTagAffect_Bleeding, # 仅流血目标 9
 SkillTagAffect_HPPerLowest, # 血量百分比最低 10
-) = range(11)
+SkillTagAffect_IncontrolledPriority, # 受控目标优先 11
+) = range(12)
 
 #技能施法目标
 Def_UseSkillAim_Type = 3
@@ -3969,7 +3970,7 @@
 SkillEff_UseSkillHarmSelf = 7008 # 释放技能时自残(先扣血)
 SkillEff_SkillUseCntLimit = 7009 # 限制技能最多触发次数
 SkillEff_UseSkillStealBuff = 7010 # 释放技能前偷取buff
-SkillEff_ReviveNoUse = 7011 # 没有复活目标时释放其他技能
+SkillEff_NoTagUse = 7011 # 没有技能设定的目标时释放其他技能
 SkillEff_LearnSkillEx = 7012 # 额外学习技能(用于拆分完全独立的技能,视为已学习)
 
 (
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 04d2139..3ce8ef6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -130,18 +130,19 @@
                 
     if not tagObjList:
         # 可扩展其他目标选择,如复活技能没有死亡单位时则使用另外的效果
+        isOK = None
         GameWorld.DebugLogEx("找不到技能目标! skillID=%s,mapID=%s,funcLineID=%s", skillID, turnFight.mapID, turnFight.funcLineID, turnFight.getReqPlayerID())
-        if skillType == ChConfig.Def_SkillType_Revive and not isinstance(useSkill, IpyGameDataPY.IPY_Skill):
-            otherEff = useSkill.GetEffectByID(ChConfig.SkillEff_ReviveNoUse)
+        if not isinstance(useSkill, IpyGameDataPY.IPY_Skill):
+            otherEff = useSkill.GetEffectByID(ChConfig.SkillEff_NoTagUse)
             if otherEff:
                 otherSkillID = otherEff.GetEffectValue(0)
-                GameWorld.DebugLogEx("没有可复活的目标,释放其他技能! otherSkillID=%s", otherSkillID)
+                GameWorld.DebugLogEx("没有目标时释放其他技能! otherSkillID=%s", otherSkillID)
                 otherSkill = curBatObj.GetSkillManager().FindSkillByID(otherSkillID)
                 if not otherSkill:
                     otherSkill = IpyGameDataPY.GetIpyGameData("Skill", otherSkillID)
                 if otherSkill:
-                    OnUseSkill(turnFight, curBatObj, otherSkill, None, batType, bySkill, byBuff, comboLimit, atkBackTag, **kwargs)
-        return
+                    isOK = OnUseSkill(turnFight, curBatObj, otherSkill, None, batType, bySkill, byBuff, comboLimit, atkBackTag, **kwargs)
+        return isOK
     
     oneActionUseCnt = turnFight.GetOneActionUseSkillCnt(objID)
     if oneActionUseCnt >= 20:
@@ -312,7 +313,11 @@
         if SkillCommon.isAttackDirectSkill(useSkill):
             isNoSelf = True
             #GameWorld.DebugLogEx("特殊不包含自己")
-            
+    
+    #0=敌对方; 1-友好方; 2-友好方(一定包含自己) ;3-友好方(一定不含自己)
+    if tagFriendly == 3:
+        isNoSelf = True
+        
     # 根据敌友关系确定阵营及一些敌友关系的特殊逻辑
     sneerObjFirst = True # 嘲讽目标是否优先
     sneerTagObj = None # 嘲讽目标
@@ -470,7 +475,12 @@
         sneerObjFirst = False
         aimObjList.sort(key=lambda o:(o.IsInControlled()))
         GameWorld.DebugLogEx("未被控制优先: %s", [[o.GetID(), o.IsInControlled()] for o in aimObjList])
-                
+        
+    # 受控目标优先(硬控>软控>其他)
+    elif tagAffect == ChConfig.SkillTagAffect_IncontrolledPriority:
+        aimObjList.sort(key=lambda o:(o.IsInControlledHard(), o.IsInControlledSoft()), reverse=True)
+        GameWorld.DebugLogEx("受控目标优先: %s", [[o.GetID(), o.IsInControlledHard(), o.IsInControlledSoft()] for o in aimObjList])
+        
     # 灼烧/玄火目标优先
     elif tagAffect == ChConfig.SkillTagAffect_Burn:
         atkBackTagFrist = False

--
Gitblit v1.8.0