From cc207773cbedb51c20300a87c62529ace416b086 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 19 九月 2025 19:23:35 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(无敌支持,免疫伤害、dot、控制;小怪技能;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py |   93 +++++++++++++++++++++++++++++++++-------------
 1 files changed, 67 insertions(+), 26 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 69bc764..3d2c457 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -720,26 +720,44 @@
         TurnAttack.SetObjKilled(turnFight, curObj)
         
     # 统计伤血,可能单个技能对同一目标造成多次伤害
+    totalHurtValue = 0
     isSuperHit, isStun, isSuckHP = False, False, False
-    missObjIDList = []
+    missObjIDList, immuneObjIDList = [], []
     for hurtObj in useSkill.GetHurtObjList():
         hurtObjID = hurtObj.GetObjID()
         tagObj = batObjMgr.getBatObj(hurtObjID)
         if not tagObj:
             continue
-        if not hurtObj.HaveHurtType(ChConfig.HurtTYpe_Recovery) and (isTurnNormalSkill or isAngerSkill) and tagObj.IsAlive():
+        if not hurtObj.HaveHurtType(ChConfig.HurtTYpe_Recovery) and not hurtObj.HaveHurtType(ChConfig.HurtType_Immune) \
+            and (isTurnNormalSkill or isAngerSkill) and tagObj.IsAlive():
             __doSkillHurtAnger(tagObj, hurtObj.GetLostHP(), useSkill)
+            
+        if hurtObj.HaveHurtType(ChConfig.HurtType_Normal):
+            totalHurtValue += hurtObj.GetHurtHP()
+            
         if hurtObj.HaveHurtType(ChConfig.HurtType_Miss):
-            missObjIDList.append(hurtObjID)
+            if hurtObjID not in missObjIDList:
+                missObjIDList.append(hurtObjID)
             DoHeroSpecialty(turnFight, tagObj, ChConfig.HeroSpecialty_Miss, relatedSkillID)
+            
+        if hurtObj.HaveHurtType(ChConfig.HurtType_Immune):
+            if hurtObjID not in immuneObjIDList:
+                immuneObjIDList.append(hurtObjID)
+                
         if hurtObj.HaveHurtType(ChConfig.HurtType_Parry):
             DoHeroSpecialty(turnFight, tagObj, ChConfig.HeroSpecialty_Parry, relatedSkillID)
+            
         if hurtObj.HaveHurtType(ChConfig.HurtType_SuperHit):
             isSuperHit = True
+            
         if hurtObj.HaveHurtType(ChConfig.HurtType_Stun):
             isStun = True
+            
         if hurtObj.GetSuckHP() > 0:
             isSuckHP = True
+            
+    curObj.SetLastHurtValue(totalHurtValue) # 记录最后一次总伤害
+    
     # 群攻只触发一次特长
     if isSuperHit:
         DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuperHit, relatedSkillID)
@@ -753,8 +771,9 @@
     if curPlayer and curObj and curObj.GetOwnerID() == curPlayer.GetPlayerID():
         FBLogic.OnPlayerLineupAttackResult(curPlayer, curObj, killObjList, useSkill, turnFight.mapID, turnFight.funcLineID)
         
+    effIgnoreObjIDList = missObjIDList + immuneObjIDList
     # 优先触发本技能额外效果,注:仅该技能释放后该技能的额外效果视为主技能的效果,优先级最高
-    __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList, isUseSkill)
+    __DoCurSkillEff(turnFight, curObj, useSkill, effIgnoreObjIDList, isUseSkill)
         
     # ========== 以下触发被动 ==========
     
@@ -766,14 +785,17 @@
         
     for tagObj in useSkill.GetTagObjList():
         tagID = tagObj.GetID()
-        if tagID == curID or tagID in missObjIDList:
-            # 自己或对方闪避了不再触发被动
+        if tagID in effIgnoreObjIDList:
             continue
         
         # 直接攻击
         if isUseSkill and not SkillCommon.IsBuff(useSkill) and useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk]:
             TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_AttackOverDirect, tagObj, connSkill=useSkill)
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAttackedDirect, curObj, connSkill=useSkill)
+            
+        # 使用技能后
+        if isUseSkill:
+            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_UseSkillOver, tagObj, connSkill=useSkill)
             
     if killObjList:
         tagObj = killObjList[0]
@@ -869,7 +891,7 @@
     Sync_PropertyRefreshView(turnFight, gameObj, ChConfig.AttrID_XP, updXP, addXP, diffType=1, relatedSkillID=relatedSkillID)
     return
 
-def __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList, isUseSkill):
+def __DoCurSkillEff(turnFight, curObj, useSkill, effIgnoreObjIDList, isUseSkill):
     ## 执行本技能/buff释放后额外效果
     for index in xrange(useSkill.GetEffectCount()):
         curEffect = useSkill.GetEffect(index)
@@ -882,15 +904,15 @@
                 continue
             
         effID = curEffect.GetEffectID()
-        GameWorld.DebugLog("◆执行额外技能效果: %s, triggerWay=%s,missObjIDList=%s" % (effID, triggerWay, missObjIDList))
+        GameWorld.DebugLog("◆执行额外技能效果: %s, triggerWay=%s,effIgnoreObjIDList=%s" % (effID, triggerWay, effIgnoreObjIDList))
         if effID == 5010:
             # 额外技能效果
-            __doUseEnhanceSkill(turnFight, curObj, useSkill, curEffect, missObjIDList)
+            __doUseEnhanceSkill(turnFight, curObj, useSkill, curEffect, effIgnoreObjIDList)
             continue
         
         for tagObj in useSkill.GetTagObjList():
             tagID = tagObj.GetID()
-            if tagID in missObjIDList:
+            if tagID in effIgnoreObjIDList:
                 # 闪避了不触发
                 continue
             
@@ -898,7 +920,7 @@
             
     return
 
-def __doUseEnhanceSkill(turnFight, curBatObj, useSkill, curEffect, missObjIDList):
+def __doUseEnhanceSkill(turnFight, curBatObj, useSkill, curEffect, effIgnoreObjIDList):
     ## 执行主技能的额外技能效果
     #if useSkill.GetBatType() == ChConfig.TurnBattleType_Enhance:
     #    #GameWorld.DebugLog("自身为额外触发的技能不再触发额外技能! skillID=%s" % useSkill.GetSkillID())
@@ -923,8 +945,8 @@
             if not tagObj.IsAlive():
                 GameWorld.DebugLog("    已被击杀不触发: tagID=%s" % (tagID))
                 continue
-            if tagID in missObjIDList:
-                GameWorld.DebugLog("    闪避的不触发: tagID=%s" % (tagID))
+            if tagID in effIgnoreObjIDList:
+                GameWorld.DebugLog("    闪避或免疫的不触发: tagID=%s" % (tagID))
                 continue
             if checkInStateList:
                 if not tagObj.CheckInState(checkInStateList):
@@ -1011,7 +1033,7 @@
     
     else:
         hurtValue, hurtTypes = CalcHurtHP(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer)
-        hurtValue, realHurtHP = CalcHurtHPWithBuff(turnFight, atkObj, defObj, curSkill, hurtValue)
+        hurtValue, realHurtHP, hurtTypes = CalcHurtHPWithBuff(turnFight, atkObj, defObj, curSkill, hurtValue, hurtTypes)
         
         #伤害结构体
         hurtObj.SetHurtTypes(hurtTypes)
@@ -1024,7 +1046,6 @@
     hurtObj.SetLostHP(lostHP)
     hurtObj.SetCurHP(remainHP)
     defObj.SetHP(remainHP)
-    atkObj.SetLastHurtValue(hurtValue)
     GameWorld.DebugLog("    伤血: atkID=%s,defID=%s,hurtValue=%s,realHurtHP=%s,lostHP=%s,%s/%s" 
                        % (atkID, defID, hurtValue, realHurtHP, lostHP, defObj.GetHP(), defObj.GetMaxHP()))
     TurnAttack.AddTurnObjHurtValue(atkObj, defObj, hurtValue, lostHP, skillID)
@@ -1221,10 +1242,11 @@
     happenRate = eval(IpyGameDataPY.GetFuncCompileCfg("StunCfg", 1))
     if not GameWorld.CanHappen(happenRate):
         return False
-    GameWorld.DebugLog("击晕了: happenRate=%s,aStunRate=%s,dStunRateDef=%s" % (happenRate, aStunRate, dStunRateDef))
     stunSkillID = IpyGameDataPY.GetFuncCfg("StunCfg", 2)
-    TurnBuff.DoAddBuffBySkillID(turnFight, defObj, stunSkillID, atkObj, curSkill, afterLogic=True)
-    return True
+    if TurnBuff.DoAddBuffBySkillID(turnFight, defObj, stunSkillID, atkObj, curSkill, afterLogic=True):
+        GameWorld.DebugLog("击晕了: happenRate=%s,aStunRate=%s,dStunRateDef=%s" % (happenRate, aStunRate, dStunRateDef))
+        return True
+    return False
 
 def CanParry(turnFight, atkObj, defObj, curSkill):
     if defObj.IsInControlled():
@@ -1237,7 +1259,7 @@
     parryYJBuff = buffMgr.FindBuffByState(ChConfig.BatObjState_ParryYJ)
     if parryYJBuff and parryYJBuff.GetLayer():
         GameWorld.DebugLog("格挡印记格挡了: buffID=%s,buffLayer=%s" % (parryYJBuff.GetBuffID(), parryYJBuff.GetLayer()))
-        TurnBuff.DecBuffLayer(turnFight, defObj, parryYJBuff, 1, curSkill.GetSkillID())
+        TurnBuff.DoBuffLayerChange(turnFight, defObj, parryYJBuff, parryYJBuff.GetLayer() - 1, curSkill)
         return True
     
     aParryRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ParryRateDef)
@@ -1250,12 +1272,31 @@
         return True
     return False
 
-def CalcHurtHPWithBuff(turnFight, atkObj, defObj, curSkill, hurtValue):
+def CalcHurtHPWithBuff(turnFight, atkObj, defObj, curSkill, hurtValue, hurtTypes=0):
     ## 计算伤害后,因各种buff和状态的影响处理
-    # @return: hurtValue, realHurtHP
+    # @return: hurtValue, realHurtHP, hurtTypes
     
     if hurtValue <= 0:
-        return 0, 0
+        return 0, 0, hurtTypes
+    
+    if defObj.CheckInState(ChConfig.BatObjState_Wudi):
+        hurtTypes |= pow(2, ChConfig.HurtType_Immune) # 添加免疫
+        buffMgr = defObj.GetBuffManager()
+        for index in range(buffMgr.GetBuffCount()):
+            buff = buffMgr.GetBuffByIndex(index)
+            if not buff:
+                continue
+            skillData = buff.GetSkillData()
+            if skillData.GetCurBuffState() != ChConfig.BatObjState_Wudi:
+                continue
+            # 记录免疫的积攒伤害
+            buffValue = buff.GetValue1() + buff.GetValue2() * ChConfig.Def_PerPointValue
+            updBuffValue = buffValue + hurtValue
+            buff.SetValue1(updBuffValue % ChConfig.Def_PerPointValue)
+            buff.SetValue2(updBuffValue / ChConfig.Def_PerPointValue)
+            GameWorld.DebugLog("    无敌盾免疫伤害: defID=%s,buffID=%s,skillID=%s,updBuffValue=%s" 
+                               % (defObj.GetID(), buff.GetBuffID(), skillData.GetSkillID(), updBuffValue))
+        return 0, 0, hurtTypes
     
     # 减伤盾减伤, 会改变 hurtValue
     hurtValue = max(0, hurtValue)
@@ -1297,7 +1338,7 @@
                 buff.SetValue2(updShieldValue / ChConfig.Def_PerPointValue)
                 curSkill.AddAfterLogic(ChConfig.AfterLogic_SyncBuff, [defObj, buff, atkObj, "ReduceShieldValue"])
                 
-    return hurtValue, max(0, realHurtHP)
+    return hurtValue, max(0, realHurtHP), hurtTypes
 
 def CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill):
     '''计算反弹反弹伤害
@@ -1310,8 +1351,9 @@
         return
     
     GameWorld.DebugLog("    反弹伤害=%s,%s/%s" % (bounceHP, atkObj.GetHP(), atkObj.GetMaxHP()))
-    bounceHP, realBounceHP = CalcHurtHPWithBuff(turnFight, defObj, atkObj, curSkill, bounceHP)
+    bounceHP, realBounceHP, _ = CalcHurtHPWithBuff(turnFight, defObj, atkObj, curSkill, bounceHP)
     if bounceHP <= 0:
+        GameWorld.DebugLog("        bounceHP=%s" % (bounceHP))
         return
     hurtObj.SetBounceHP(bounceHP)
     
@@ -1428,14 +1470,13 @@
     dHP = defObj.GetHP()
     GameWorld.DebugLog("结算dot: atkID=%s,defID=%s,buffID=%s,skillID=%s,ownerID=%s,hurtValue=%s,hurtTypes=%s,dHP=%s" 
                        % (atkID, defID, buffID, skillID, ownerID, hurtValue, hurtTypes, dHP))
-    hurtValue, realHurtHP = CalcHurtHPWithBuff(turnFight, atkObj, defObj, useSkill, hurtValue)
+    hurtValue, realHurtHP, hurtTypes = CalcHurtHPWithBuff(turnFight, atkObj, defObj, useSkill, hurtValue, hurtTypes)
     
     # dot的反弹、吸血待定
     
     remainHP = max(0, dHP - realHurtHP) # 剩余血量
     lostHP = dHP - remainHP # 实际掉血量
     defObj.SetHP(remainHP)
-    atkObj.SetLastHurtValue(hurtValue)
     GameWorld.DebugLog("    hurtValue=%s,realHurtHP=%s,lostHP=%s,%s/%s" % (hurtValue, realHurtHP, lostHP, defObj.GetHP(), defObj.GetMaxHP()))
     
     hurtObj.SetHurtTypes(hurtTypes)

--
Gitblit v1.8.0