From 6f2c8b0e79e4963cc6aceda674847d04d23e02b2 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 24 十二月 2025 18:25:40 +0800
Subject: [PATCH] 16 卡牌服务端(MainLevelPass流向增加祝福树等级信息;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py |   75 ++++++++++++++++++++++++++++---------
 1 files changed, 57 insertions(+), 18 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 dadceb8..019e82f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -832,7 +832,7 @@
         tagID = tagObj.GetID()
         if tagID == ChConfig.HeroID_Caoren:
             continue
-        if tagObj.CheckInState(ChConfig.BatObjState_Wudi):
+        if tagObj.CheckInState(ChConfig.ImmuneHurtStateList):
             continue
         if not caorenProtectObj or tagObj.GetHP() < caorenProtectObj.GetHP():
             caorenProtectObj = tagObj
@@ -910,7 +910,7 @@
             continue
         if tagID == ChConfig.HeroID_Caoren:
             continue
-        if tagObj.CheckInState(ChConfig.BatObjState_Wudi):
+        if tagObj.CheckInState(ChConfig.ImmuneHurtStateList):
             continue
         if not caorenProtectObj or tagObj.GetHP() < caorenProtectObj.GetHP():
             caorenProtectObj = tagObj
@@ -1348,16 +1348,21 @@
     # 统计击杀
     killObjList = [] # 击杀其他阵营目标列表
     dieObjList = [] # 死亡的单位列表,包含友方单位或自己
+    nodeadObjList = [] # 不死的单位列表
     tagObjList = useSkill.GetTagObjList() # 主要目标列表
     tagObjListEx = useSkill.GetTagObjListEx() # 额外目标列表
     tagObjListAll = tagObjList + tagObjListEx
     for tagObj in tagObjListAll:
         tagID = tagObj.GetID()
         if tagObj.IsAlive() and tagObj.GetHP() <= 0:
-            dieObjList.append(tagObj)
-            if tagObj.GetFaction() != curObj.GetFaction():
-                killObjList.append(tagObj)
-            TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
+            if tagObj.CanNoDead():
+                tagObj.SetHP(1, True) # 触发不死,保留1点血量
+                nodeadObjList.append(tagObj)
+            else:
+                dieObjList.append(tagObj)
+                if tagObj.GetFaction() != curObj.GetFaction():
+                    killObjList.append(tagObj)
+                TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
     useSkill.SetKillObjList(killObjList)
     
     # 统计伤血,可能单个技能对同一目标造成多次伤害
@@ -1368,6 +1373,7 @@
     beHurtObjIDList = [] # 受伤的对象ID列表
     reviveObjList = [] # 复活的对象列表
     bounceObjList = [] # 有反弹的对象列表
+    caorenProtectList = [] # 有被曹仁防护的对象列表
     for hurtObj in useSkill.GetHurtObjListAll():
         hurtObjID = hurtObj.GetObjID()
         tagObj = batObjMgr.getBatObj(hurtObjID)
@@ -1415,14 +1421,22 @@
             if hurtObjID not in stunObjIDList:
                 stunObjIDList.append(hurtObjID)
                 
+        if hurtObj.HaveHurtType(ChConfig.HurtAtkType_CaorenProtect):
+            if tagObj not in caorenProtectList:
+                caorenProtectList.append(tagObj)
+                
         if hurtObj.GetSuckHP() > 0:
             isSuckHP = True
             
     # 判断自己死亡,因为反弹、平摊伤害的原因,有可能自己干死自己
     if curObj.IsAlive() and curObj.GetHP() <= 0:
-        dieObjList.append(curObj)
-        killer = bounceObjList[0] if bounceObjList else None
-        TurnAttack.SetObjKilled(turnFight, curObj, killer)
+        if curObj.CanNoDead():
+            curObj.SetHP(1, True) # 触发不死,保留1点血量
+            nodeadObjList.append(curObj)
+        else:
+            dieObjList.append(curObj)
+            killer = bounceObjList[0] if bounceObjList else None
+            TurnAttack.SetObjKilled(turnFight, curObj, killer)
         
     # 记录最后一次总伤害,有伤害目标才记录
     if totalHurtValue:
@@ -1483,7 +1497,11 @@
                         # 己方单位死亡时
                         else:
                             TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill, byFriendObj=dieObj)
-                 
+    
+    # 触发不死
+    for tagObj in nodeadObjList:
+        TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_NoDead, curObj, connSkill=useSkill)
+        
     # 复活时
     for tagObj in reviveObjList:
         # 同步最新的怒气及buff,血量已经在技能中通知了
@@ -1492,6 +1510,20 @@
         TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Revive, curObj, connSkill=useSkill)
         TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_InBattlefield, curObj, connSkill=useSkill)
         
+    # 曹仁防护触发,暂写死
+    for tagObj in caorenProtectList:
+        tagBatLineup = tagObj.GetBatLineup()
+        caorenObj = tagBatLineup.getHeroObj(ChConfig.HeroID_Caoren) # 获取被防护目标阵容的曹仁
+        if not caorenObj or not caorenObj.IsAlive():
+            continue
+        caoRenSkill = caorenObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_CaorenProtect)
+        if not caoRenSkill:
+            continue
+        passiveSkillID = caoRenSkill.GetEffect(0).GetEffectValue(0) # 防护成功后的触发技能ID,默认写在效果1的值
+        GameWorld.DebugLogEx("曹仁防护后触发技能: caorenID=%s,protectID=%s,passiveSkillID=%s", caorenObj.GetID(), tagObj.GetID(), passiveSkillID)
+        if passiveSkillID:
+            OnUsePassiveSkill(turnFight, caorenObj, curObj, passiveSkillID, connSkill=useSkill)
+            
     triggerOne = False
     batType = useSkill.GetBatType()
     isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
@@ -1503,6 +1535,10 @@
         if tagID in missObjIDList:
             TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeMiss, tagObj, connSkill=useSkill)
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill)
+            
+        # 免疫
+        if tagID in immuneObjIDList:
+            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_ImmuneHurt, curObj, connSkill=useSkill)
             
         if tagID in effIgnoreObjIDList:
             continue
@@ -1862,7 +1898,7 @@
     OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
     return
 
-def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None, **kwargs):
+def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None, batType=ChConfig.TurnBattleType_Passive, **kwargs):
     '''被动触发使用技能
     @param passiveSkill: 释放的被动技能 或 技能ID
     @param connSkill: 由什么技能引起的
@@ -1912,12 +1948,12 @@
             GameWorld.DebugLogEx("    概率不触发: tagID=%s,happenRate=%s", tagID, happenRate)
             return
         passiveTagObjList = [tagObj]
-        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
     elif tagAim == ChConfig.SkillTagAim_MainSkillEx:
         if not connSkill:
             return
         passiveTagObjList = connSkill.GetTagObjList()
-        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
     elif tagAim == ChConfig.SkillTagAim_MainSkillFriend:
         if "byFriendObj" not in kwargs:
             return
@@ -1925,10 +1961,10 @@
         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)
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, 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)
+        isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
         
     return isOK
 
@@ -2241,7 +2277,7 @@
         return hurtValue, hurtTypes, immuneHurt
     
     hurtValue = int(hurtValue)
-    if defObj.CheckInState(ChConfig.BatObjState_Wudi):
+    if defObj.CheckInState(ChConfig.ImmuneHurtStateList):
         hurtTypes |= pow(2, ChConfig.HurtAtkType_Immune) # 添加免疫
         immuneHurt = hurtValue
         hurtValue = 0
@@ -2412,7 +2448,7 @@
     # 曹仁的分担触发条件暂时程序内固定,有修改时程序同步修改
     # 曹仁: 我方英雄受到直接攻击时(受到群攻时选择血量最低的友方进行防护),曹仁有30%概率为其分担一半所受伤害,每成功分担一次,曹仁获得1层坚韧,使我方全体减伤提升5%,最多6层,曹仁死亡效果消失
     # 董白怒气    同命锁    对敌方攻击最高的1个目标造成攻击力450%物理伤害,并与其连接,使两人受到的任意伤害平摊(平摊伤害不会被再次平摊),持续2回合
-    caorenSkillID = 1015070
+    caorenSkillID = ChConfig.SkillID_CaorenProtect
     effHeroIDList = [ChConfig.HeroID_Zhenfu, ChConfig.HeroID_Caoren, ChConfig.HeroID_Dongbai] # 暂固定,有增加武将再同步修改
     
     isAve = False
@@ -2525,7 +2561,7 @@
             
             immuneHurt = immuneHurtDict.get(aveObjID)
             if immuneHurt == None:
-                if aveObj.CheckInState(ChConfig.BatObjState_Wudi):
+                if aveObj.CheckInState(ChConfig.ImmuneHurtStateList):
                     immuneHurt = 0
                 else:
                     immuneHurt = -1 # 标记没有无敌
@@ -2777,6 +2813,9 @@
         cureHP += cureHPEx
         GameWorld.DebugLogEx("    额外治疗值(%s): cureType=%s,baseValue=%s,skillPer=%s,cureHP=%s", cureHPEx, cureType, baseValue, skillPer, cureHP)
         
+    addCureMulti = TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddCureMultiBySkillType, curSkill)
+    if addCureMulti:
+        multiValue += addCureMulti / 100.0
     if multiValue and multiValue != 1:
         cureHP = int(cureHP * multiValue)
         GameWorld.DebugLogEx("    治疗倍值: cureHP=%s,multiValue=%s", cureHP, multiValue)

--
Gitblit v1.8.0