From fe40f1881045b901bd5e7365673e3a2b677f7e7f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 30 十二月 2025 18:07:49 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(吕布所有技能;优化效果5501支持同国层级;7002效果支持配置学习x技能生效;增加效果5511;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py |   42 ++++++++++++++++++++++++++++++++----------
 1 files changed, 32 insertions(+), 10 deletions(-)

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 019e82f..e8ba14f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -426,6 +426,11 @@
         aimObjList.sort(key=lambda o:(o.GetHP()), reverse=False)
         #GameWorld.DebugLogEx("血量最低排序: %s", [[o.GetID(), o.GetHP(), o.GetMaxHP()] for o in aimObjList])
         
+    # 血量百分比最低
+    elif tagAffect == ChConfig.SkillTagAffect_HPPerLowest:
+        aimObjList.sort(key=lambda o:(o.GetHP() / float(o.GetMaxHP())), reverse=False)
+        #GameWorld.DebugLogEx("血量百分比最低排序: %s", [[o.GetID(), o.GetHP(), o.GetMaxHP(), o.GetHP() / float(o.GetMaxHP())] for o in aimObjList])
+        
     # 血量最高
     elif tagAffect == ChConfig.SkillTagAffect_HPHighest:
         aimObjList.sort(key=lambda o:(o.GetHP()), reverse=True)
@@ -1367,7 +1372,7 @@
     
     # 统计伤血,可能单个技能对同一目标造成多次伤害
     totalHurtValue = 0
-    isSuckHP = False
+    suckObjIDList = [] # 吸血的对象ID列表
     missObjIDList, immuneObjIDList = [], [] # 闪避、免疫对象ID列表
     stunObjIDList, superHitObjIDList, parryObjIDList = [], [], []
     beHurtObjIDList = [] # 受伤的对象ID列表
@@ -1425,9 +1430,10 @@
             if tagObj not in caorenProtectList:
                 caorenProtectList.append(tagObj)
                 
-        if hurtObj.GetSuckHP() > 0:
-            isSuckHP = True
-            
+        if hurtObj.GetSuckHP() > 0 and not hurtObj.HaveHurtType(ChConfig.HurtAtkType_PoisonCureSuck):
+            if hurtObjID not in suckObjIDList:
+                suckObjIDList.append(hurtObjID)
+                
     # 判断自己死亡,因为反弹、平摊伤害的原因,有可能自己干死自己
     if curObj.IsAlive() and curObj.GetHP() <= 0:
         if curObj.CanNoDead():
@@ -1447,7 +1453,7 @@
         DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuperHit, relatedSkillID)
     if stunObjIDList:
         DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_Stun, relatedSkillID)
-    if isSuckHP:
+    if suckObjIDList:
         DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuckHP, relatedSkillID)
         
     # 结算副本相关的攻击结果,仅主动发起玩家阵容武将触发
@@ -1548,7 +1554,7 @@
         # 掉血时
         if tagID in beHurtObjIDList:
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeHurt, curObj, connSkill=useSkill)
-            #TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_HurtTag, tagObj, connSkill=useSkill) 暂时用不到先屏蔽
+            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_HurtTag, tagObj, connSkill=useSkill)
             
         #  受到任意效果时(除直接攻击外的任意效果,如buff、dot、治疗、额外怒技)
         if not isAttackDirect:
@@ -1593,6 +1599,12 @@
         if tagID in parryObjIDList:
             TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeParry, tagObj, connSkill=useSkill)
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill)
+            
+        # 吸血
+        if tagID in suckObjIDList:
+            if not triggerOne:
+                TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill)
+            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuckHP, curObj, connSkill=useSkill)
             
         # 连击
         if batType == ChConfig.TurnBattleType_Combo:
@@ -2194,14 +2206,25 @@
         GameWorld.DebugLogEx("    伤害最高限制: hurtValue=%s,hurtAtkPerMax=%s,aAtk=%s", hurtValue, hurtAtkPerMax, aAtk)
         
     # 均摊
-    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
-    if hurtShareEff:
+    if HaveShareEff(atkObj, curSkill):
         tagCnt = max(1, len(curSkill.GetTagObjList()))
         hurtValue = hurtValue / tagCnt
         GameWorld.DebugLogEx("    目标均摊伤害: hurtValue=%s,tagCnt=%s", hurtValue, tagCnt)
         
     hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后
     return hurtValue, hurtTypes
+
+def HaveShareEff(atkObj, curSkill):
+    ## 玩家技能是否有分摊效果: 均摊伤害/治疗/承伤盾值
+    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
+    if not hurtShareEff:
+        return False
+    needLearnSkillID = hurtShareEff.GetEffectValue(0)
+    if needLearnSkillID:
+        if not atkObj.GetSkillManager().FindSkillByID(needLearnSkillID):
+            GameWorld.DebugLogEx("所需技能未学习,分摊效果不生效! skillID=%s,needLearnSkillID=%s", curSkill.GetSkillID(), needLearnSkillID)
+            return False
+    return True
 
 def GetAddSkillPer(turnFight, atkObj, defObj, curSkill):
     ## 获取额外增加的技能万分比
@@ -2820,8 +2843,7 @@
         cureHP = int(cureHP * multiValue)
         GameWorld.DebugLogEx("    治疗倍值: cureHP=%s,multiValue=%s", cureHP, multiValue)
         
-    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
-    if hurtShareEff:
+    if HaveShareEff(userObj, curSkill):
         tagCnt = max(1, len(curSkill.GetTagObjList()))
         cureHP = cureHP / tagCnt
         GameWorld.DebugLogEx("    目标均摊治疗: cureHP=%s,tagCnt=%s", cureHP, tagCnt)

--
Gitblit v1.8.0