From a7ee20f2467c3d04d23ad80ebd25e07b806b5c22 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 03 十一月 2025 10:47:21 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(词条技能1021、1022、1024;增加触发方式25-受到持续伤害,26-敌方单位死亡时,27-己方单位死亡时;优化效果6008可配置免控类型;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py |  130 +++++++++++++++++++++++++++++++++++++++---
 1 files changed, 119 insertions(+), 11 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 0f82ce0..fd38c2c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -61,6 +61,10 @@
     
     objID = curBatObj.GetID()
     
+    if hasattr(useSkill, "GetRemainTime") and useSkill.GetRemainTime() > 0:
+        GameWorld.DebugLog("技能CD中! skillID=%s,RemainTime=%s" % (skillID, useSkill.GetRemainTime()))
+        return
+    
     buffStateGroups = useSkill.GetBuffStateLimit()
     if buffStateGroups:
         limitState = curBatObj.IsInBuffStateGroup(buffStateGroups)
@@ -68,6 +72,9 @@
             GameWorld.DebugLog("技能使用处于buff状态限制中! skillID=%s,buffStateGroups=%s,limitState=%s" % (skillID, buffStateGroups, limitState))
             return
         
+    if CheckSkillUseCntLimit(curBatObj, useSkill):
+        return
+    
     #没有指定目标,则按技能自身的目标逻辑
     if not tagObjList:
         tagObjList = GetSkillTags(turnFight, curBatObj, useSkill)
@@ -158,9 +165,39 @@
         poolMgr.release(useSkill)
     return True
 
+def CheckSkillUseCntLimit(batObj, useSkill):
+    ## 检查技能使用次数是否受限
+    # @return: 是否受限
+    if not hasattr(useSkill, "GetEffectByID"):
+        return
+    effect = useSkill.GetEffectByID(ChConfig.SkillEff_SkillUseCntLimit)
+    if not effect:
+        return
+    useCntLimit = effect.GetEffectValue(0) # 每场战斗最大次数,0不限
+    turnUseCntLimit = effect.GetEffectValue(1) # 每大回合最大次数,0不限
+    
+    skillID = useSkill.GetSkillID()
+    if useCntLimit:
+        useCnt = batObj.GetSkillUseCnt(skillID)
+        if useCnt >= useCntLimit:
+            GameWorld.DebugLog("技能每场战斗使用次数受限! skillID=%s,useCnt=%s >= %s" % (skillID, useCnt, useCntLimit))
+            return True
+        
+    if turnUseCntLimit:
+        turnUseCnt = batObj.GetSkillTurnUseCnt(skillID)
+        if turnUseCnt >= turnUseCntLimit:
+            GameWorld.DebugLog("技能每大回合使用次数受限! skillID=%s,turnUseCnt=%s >= %s" % (skillID, turnUseCnt, turnUseCntLimit))
+            return True
+        
+    return
+
 def IsNeedSyncSkill(useSkill):
     ## 使用需要同步B427使用技能
-    return useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_CleanBuff]
+    if useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_CleanBuff]:
+        return True
+    if useSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_TurnNormaSkill, ChConfig.Def_SkillFuncType_AngerSkill]:
+        return True
+    return False
 
 def GetSkillTags(turnFight, curBatObj, useSkill):
     ## 获取技能目标
@@ -782,7 +819,7 @@
         else:
             diffType = 1
             tagXP = tagBatObj.GetXP()
-            diffValue = calcValue
+            diffValue = GetEnhanceXP(tagBatObj, calcValue)
             updValue = tagXP + diffValue
             tagBatObj.SetXP(updValue, False)
             GameWorld.DebugLog("    加怒气: tagID=%s,diffValue=%s,tagXP=%s,updXP=%s" % (tagID, diffValue, tagXP, updValue))
@@ -791,10 +828,10 @@
     if curStealTotal > 0:
         diffType = 1
         curXP = curBatObj.GetXP()
-        diffValue = curStealTotal
+        diffValue = GetEnhanceXP(tagBatObj, curStealTotal)
         updValue = curXP + diffValue
         curBatObj.SetXP(updValue, False)
-        GameWorld.DebugLog("    加总怒气: curID=%s,curStealTotal=%s,curXP=%s,updXP=%s" % (curID, curStealTotal, curXP, updValue))
+        GameWorld.DebugLog("    加总怒气: curID=%s,curStealTotal=%s,curXP=%s,diffValue=%s,updXP=%s" % (curID, curStealTotal, curXP, diffValue, updValue))
         Sync_PropertyRefreshView(turnFight, curBatObj, attrID, updValue, diffValue, diffType, skillID, relatedSkillID)
         
     return
@@ -964,19 +1001,24 @@
             
     # 统计击杀
     killObjList = [] # 击杀其他阵营目标列表
+    dieObjList = [] # 死亡的单位列表
     for tagObj in useSkill.GetTagObjList():
         tagID = tagObj.GetID()
-        if tagObj.IsAlive() and tagObj.GetHP() <= 0 and tagObj.GetFaction() != curObj.GetFaction():
-            killObjList.append(tagObj)
-            TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
+        if tagObj.IsAlive() and tagObj.GetHP() <= 0:
+            dieObjList.append(tagObj)
+            if tagObj.GetFaction() != curObj.GetFaction():
+                killObjList.append(tagObj)
+                TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
     useSkill.SetKillObjList(killObjList)
     if curObj.IsAlive() and curObj.GetHP() <= 0:
+        dieObjList.append(curObj)
         TurnAttack.SetObjKilled(turnFight, curObj)
         
     # 统计伤血,可能单个技能对同一目标造成多次伤害
     totalHurtValue = 0
     isSuperHit, isStun, isSuckHP = False, False, False
-    missObjIDList, immuneObjIDList = [], []
+    missObjIDList, immuneObjIDList = [], [] # 闪避、免疫对象ID列表
+    beHurtObjIDList = [] # 受伤的对象ID列表
     for hurtObj in useSkill.GetHurtObjList():
         hurtObjID = hurtObj.GetObjID()
         tagObj = batObjMgr.getBatObj(hurtObjID)
@@ -988,7 +1030,10 @@
             
         if hurtObj.HaveHurtType(ChConfig.HurtType_Normal):
             totalHurtValue += hurtObj.GetHurtHP()
-            
+            if hurtObj.GetLostHP() > 0: # 有掉血的
+                if hurtObjID not in beHurtObjIDList:
+                    beHurtObjIDList.append(hurtObjID)
+                    
         if hurtObj.HaveHurtType(ChConfig.HurtType_Miss):
             if hurtObjID not in missObjIDList:
                 missObjIDList.append(hurtObjID)
@@ -1046,6 +1091,23 @@
             TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_KillOneObj, tagObj, connSkill=useSkill)
         TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_KillTagObj, tagObj, connSkill=useSkill)
         
+    if dieObjList:
+        for faction in [ChConfig.Def_FactionA, ChConfig.Def_FactionB]:
+            batFaction = turnFight.getBatFaction(faction)
+            for lineupNum in batFaction.lineupDict.keys():
+                batLineup = batFaction.getBatlineup(lineupNum)
+                for lineupObjID in batLineup.posObjIDDict.values():
+                    lineupObj = batObjMgr.getBatObj(lineupObjID)
+                    if not lineupObj.IsAlive():
+                        continue
+                    for dieObj in dieObjList:
+                        # 敌方单位死亡时
+                        if lineupObj.GetFaction() != dieObj.GetFaction():
+                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyDie, dieObj, connSkill=useSkill)
+                        # 己方单位死亡时
+                        else:
+                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill)
+                            
     triggerOne = False
     batType = useSkill.GetBatType()
     isAttackDirect = (isUseSkill and not SkillCommon.IsBuff(useSkill) and useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk])
@@ -1054,6 +1116,10 @@
         if tagID in effIgnoreObjIDList:
             continue
         
+        # 掉血时
+        if tagID in beHurtObjIDList:
+            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeHurt, curObj, connSkill=useSkill)
+            
         # 直接攻击
         if isAttackDirect:
             if not triggerOne:
@@ -1062,7 +1128,10 @@
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAttackedDirect, curObj, connSkill=useSkill)
         else:
             TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAnyEffect, curObj, connSkill=useSkill)
-            
+            # 受到持续伤害
+            if tagID in beHurtObjIDList:
+                TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeDOTHurt, curObj, connSkill=useSkill)
+                
         # 使用技能后
         if isUseSkill:
             if not triggerOne:
@@ -1149,6 +1218,7 @@
     if posNum <= 0:
         #非主战单位不加
         return
+    addXP = GetEnhanceXP(gameObj, addXP)
     curXP = gameObj.GetXP()
     updXP = curXP + addXP
     gameObj.SetXP(updXP)
@@ -1163,12 +1233,24 @@
     if str(specialty) not in specialtyAddXPDict:
         return
     addXP = specialtyAddXPDict[str(specialty)]
+    addXP = GetEnhanceXP(gameObj, addXP)
     curXP = gameObj.GetXP()
     updXP = curXP + addXP
     gameObj.SetXP(updXP, False)
     GameWorld.DebugLog("        特长加XP: curID=%s,curXP=%s,addXP=%s,updXP=%s,特性=%s" % (gameObj.GetID(), curXP, addXP, updXP, specialty))
     Sync_PropertyRefreshView(turnFight, gameObj, ChConfig.AttrID_XP, updXP, addXP, diffType=1, relatedSkillID=relatedSkillID)
     return
+
+def GetEnhanceXP(gameObj, addXP):
+    ## 获取提升后的xp值
+    addPer = gameObj.GetBatAttrValue(ChConfig.AttrID_XPRecoverPer)
+    # 其他强化、弱化
+    if addPer == 0:
+        return addXP
+    objID = gameObj.GetID()
+    updAddXP = int(addXP * max(10000 + addPer, 0) / 10000.0)
+    GameWorld.DebugLog("怒气恢复提升: objID=%s,addXP=%s,addPer=%s,updAddXP=%s" % (objID, addXP, addPer, updAddXP))
+    return updAddXP
 
 def __DoCurSkillEff(turnFight, curObj, useSkill, effIgnoreObjIDList, isUseSkill):
     ## 执行本技能/buff释放后额外效果
@@ -1216,7 +1298,7 @@
     
     killObjList = useSkill.GetKillObjList()
     if killObjList:
-        invalidSkillID = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_SkillInvalid, useSkill, 
+        invalidSkillID = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_SkillInvalid, useSkill,
                                                            triggerWay=ChConfig.TriggerWay_KillOneObj)
         if invalidSkillID and invalidSkillID == enhanceSkillID:
             GameWorld.DebugLog("有击杀目标时该技能无效! enhanceSkillID=%s" % enhanceSkillID)
@@ -1294,6 +1376,10 @@
     passiveSkillID = passiveSkill.GetSkillID()
     if passiveSkillID == bySkillID:
         #GameWorld.DebugLog("###被动触发技能不触发自身,防止死循环! effSkillID=%s,effectID=%s,passiveSkillID=%s" % (effSkillID, effectID, passiveSkillID))
+        return
+    
+    if hasattr(passiveSkill, "GetRemainTime") and passiveSkill.GetRemainTime() > 0:
+        #GameWorld.DebugLog("被动触发技能CD中! skillID=%s,RemainTime=%s" % (passiveSkillID, passiveSkill.GetRemainTime()))
         return
     
     isOK = False
@@ -1859,6 +1945,16 @@
     elif calcType == ChConfig.Def_Calc_HarmSelfHP:
         baseValue = curObj.GetHarmSelfHP()
         GameWorld.DebugLog("根据自残值: %s" % baseValue)
+    elif calcType == ChConfig.Def_Calc_AtkedSkillHurtHP:
+        bySkill = curSkill.GetBySkill()
+        bySkillID = 0
+        if bySkill:
+            bySkillID = bySkill.GetSkillID()
+            curID = curObj.GetID()
+            for hurtObj in bySkill.GetHurtObjList():
+                if curID == hurtObj.GetObjID():
+                    baseValue += hurtObj.GetHurtHP()
+        GameWorld.DebugLog("根据最后受击技能伤害: %s,bySkillID=%s" % (baseValue, bySkillID))
         
     return baseValue
 
@@ -1991,3 +2087,15 @@
     clientPack.RelatedSkillID = relatedSkillID
     turnFight.addBatPack(clientPack)
     return
+
+def Sync_HPRefresh(turnFight, curBatObj):
+    hp, maxHP = curBatObj.GetHP(), curBatObj.GetMaxHP()
+    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCObjHPRefresh)
+    clientPack.ObjID = curBatObj.GetID()
+    clientPack.HP = hp % ShareDefine.Def_PerPointValue
+    clientPack.HPEx = hp / ShareDefine.Def_PerPointValue
+    clientPack.MaxHP = maxHP % ShareDefine.Def_PerPointValue
+    clientPack.MaxHPEx = maxHP / ShareDefine.Def_PerPointValue
+    turnFight.addBatPack(clientPack)
+    return
+    
\ No newline at end of file

--
Gitblit v1.8.0