From 7cf1be63a7bbf9119bf6c404899e8f71f12400c9 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 20 一月 2026 21:10:30 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(命格技能朱雀;增加触发方式61-附加持续伤害buff时;群攻触发的命格buff默认只触发一次;增加效果5029-额外结算dot伤害;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py | 7 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5029.py | 63 +++++++++++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 55 +++++++++++++++++-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 3
4 files changed, 123 insertions(+), 5 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index ef02fab..d76dd34 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4049,7 +4049,8 @@
TriggerWay_EnemyBeControlledHard, # 敌方受控时(硬控) 58
TriggerWay_PursueAtk, # 追击直接攻击时 59
TriggerWay_Frozen, # 冰冻目标时 60
-) = range(1, 1 + 60)
+TriggerWay_AddDOTBuff, # 附加持续伤害buff时 61
+) = range(1, 1 + 61)
# 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5029.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5029.py
new file mode 100644
index 0000000..1356e78
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5029.py
@@ -0,0 +1,63 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Skill.PassiveTrigger.PassiveEff_5029
+#
+# @todo:额外结算dot伤害(敌方全体有dot的,不影响原dot)
+# @author hxp
+# @date 2026-01-20
+# @version 1.0
+#
+# 详细描述: 额外结算dot伤害(敌方全体有dot的,不影响原dot)
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2026-01-20 21:30"""
+#-------------------------------------------------------------------------------
+
+import TurnSkill
+import BattleObj
+import GameWorld
+import ChConfig
+
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
+ hurtPer = curEffect.GetEffectValue(0) # 额外结算dot总值的万分比
+
+ effSkillID = effSkill.GetSkillID()
+ faction = batObj.GetFaction()
+ lineupNum = batObj.GetLineupNum()
+ tagFaction = ChConfig.Def_FactionB if faction == ChConfig.Def_FactionA else ChConfig.Def_FactionA
+
+ tagBatFaction = turnFight.getBatFaction(tagFaction)
+ tagBatLineup = tagBatFaction.getBatlineup(lineupNum)
+
+ isOK = False
+ batObjMgr = BattleObj.GetBatObjMgr()
+ for objID in tagBatLineup.getBatHeroObjIDList():
+ tObj = batObjMgr.getBatObj(objID)
+ if not tObj or not tObj.IsAlive():
+ continue
+
+ dotValueDict = {}
+ buffMgr = tObj.GetBuffManager()
+ for buffIndex in range(buffMgr.GetBuffCount()):
+ buff = buffMgr.GetBuffByIndex(buffIndex)
+ buffSkillData = buff.GetSkillData()
+
+ if buffSkillData.GetSkillType() != ChConfig.Def_SkillType_LstDepBuff:
+ continue
+ buffValue = buff.GetValue1() + buff.GetValue2() * ChConfig.Def_PerPointValue
+ ownerID = buff.GetOwnerID()
+ dotValueDict[ownerID] = dotValueDict.get(ownerID, 0) + buffValue
+
+ for ownerID, dotValueTotal in dotValueDict.items():
+ hurtValue = int(dotValueTotal * hurtPer / 10000.0)
+ GameWorld.DebugLogEx("5029额外结算dot伤害: objID=%s,ownerID=%s,dotValueTotal=%s,hurtPer=%s,hurtValue=%s", objID, ownerID, dotValueTotal, hurtPer, hurtValue)
+ atkObj = batObjMgr.getBatObj(ownerID)
+ if not atkObj:
+ continue
+ if TurnSkill.DoHurtExAtk(turnFight, atkObj, tObj, hurtValue, effSkillID):
+ isOK = True
+
+ return isOK
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
index b762825..08acc2a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -226,6 +226,7 @@
ownerID = buffOwner.GetID()
buffID = buff.GetBuffID()
timing = batObj.GetTiming()
+ skillType = buffSkill.GetSkillType()
remainTime = buffSkill.GetLastTime()
remainTime += TurnPassive.GetTriggerEffectValue(turnFight, buffOwner, batObj, ChConfig.PassiveEff_AddBuffTime, buffSkill)
@@ -240,7 +241,7 @@
if curBuffState:
buffMgr.AddBuffState(curBuffState, buffID)
- if buffSkill.GetSkillType() == ChConfig.Def_SkillType_Halo:
+ if skillType == ChConfig.Def_SkillType_Halo:
__addHaloBuffEffObjID(curID, buff, skillID, ownerID, haloSrcBuff)
if afterLogic and buffSkill:
@@ -254,6 +255,10 @@
if curBuffState and IsControlledHardState(curBuffState):
buffSkill.AddAfterLogic(ChConfig.AfterLogic_TriggerAddBuff, [ChConfig.TriggerWay_BeControlledHard, batObj, buff, buffOwner])
+ #添加持续减益buff
+ if skillType == ChConfig.Def_SkillType_LstDepBuff:
+ buffSkill.AddAfterLogic(ChConfig.AfterLogic_TriggerAddBuff, [ChConfig.TriggerWay_AddDOTBuff, batObj, buff, buffOwner])
+
return buff
def IsControlledHardState(state):
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 6851048..135eb26 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -1422,6 +1422,7 @@
relatedSkillID = useSkill.GetSkillID()
delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
beControlledHardDict = {} # 受控目标 {objID:buff, ...}
+ beDotBuffDict = {} # 被添加dot的目标 {objID:buff, ...}
afterLogicList = useSkill.GetAfterLogicList()
for logicType, logicData in afterLogicList:
if logicType == ChConfig.AfterLogic_DelBuff:
@@ -1446,6 +1447,8 @@
if buffOwner.GetID() == curID:
if triggerType == ChConfig.TriggerWay_BeControlledHard:
beControlledHardDict[batObj.GetID()] = buff
+ elif triggerType == ChConfig.TriggerWay_AddDOTBuff:
+ beDotBuffDict[batObj.GetID()] = buff
# 统计击杀
killObjList = [] # 击杀其他阵营目标列表
@@ -1632,6 +1635,7 @@
isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
curBatLineup = curObj.GetTFBatLineup()
curMGObj = curBatLineup.getMinggeObj()
+ mgTriggerWayList = [] # 命格本次技能已触发方式列表,命格固定只触发一次
for tagObj in tagObjListAll:
tagID = tagObj.GetID()
@@ -1692,10 +1696,17 @@
if tagID in beControlledHardDict:
buff = beControlledHardDict[tagID]
if buff.GetCurBuffState() == ChConfig.BatObjState_Frozen:
- if curMGObj:
+ if curMGObj and ChConfig.TriggerWay_Frozen not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_Frozen)
TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Frozen, tagObj, connSkill=useSkill, byBatObj=curObj)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeControlledHard, curObj, connSkill=useSkill, connBuff=buff)
+ # 附加dot
+ if tagID in beDotBuffDict:
+ if curMGObj and ChConfig.TriggerWay_AddDOTBuff not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_AddDOTBuff)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_AddDOTBuff, tagObj, connSkill=useSkill, byBatObj=curObj)
+
# 暴击
if tagID in superHitObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill)
@@ -1720,7 +1731,8 @@
elif batType == ChConfig.TurnBattleType_Pursue:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Pursue, tagObj, connSkill=useSkill)
if isAttackDirect:
- if curMGObj:
+ if curMGObj and ChConfig.TriggerWay_PursueAtk not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_PursueAtk)
TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_PursueAtk, tagObj, connSkill=useSkill, byBatObj=curObj)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
# 反击
@@ -2031,7 +2043,7 @@
@param effectID: 被动效果ID
注:可能由A引起触发B技能的效果释放技能C
'''
- if not passiveSkill:
+ if not passiveSkill or not batObj:
return
if isinstance(passiveSkill, int):
passiveSkillID = passiveSkill
@@ -3103,6 +3115,43 @@
useSkill.ResetUseRec()
return
+def DoHurtExAtk(turnFight, atkObj, defObj, hurtValue, skillID, hurtTypes=0):
+ ## 额外结算指定伤害
+ skillIpyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
+ if not skillIpyData:
+ return
+
+ atkID = atkObj.GetID()
+ defID = defObj.GetID()
+
+ # 结算需要同步标签
+ useTag = "Skill_%s_%s_Dot_%s" % (atkID, skillID, atkObj.GetIncrementValue()) # 复用dot的标签
+ Sync_TurnFightTag(turnFight, useTag, 0)
+
+ dHP = defObj.GetHP()
+ dMaxHP = defObj.GetMaxHP()
+ GameWorld.DebugLogEx("额外结算指定伤害: atkID=%s,defID=%s,skillID=%s,hurtValue=%s,,dHP=%s/%s",
+ atkID, defID, skillID, hurtValue, dHP, dMaxHP)
+
+ useSkill = BattleObj.PySkill(skillIpyData, atkID)
+ useSkill.SetTagObjList([defObj])
+ useSkill.SetBatType(ChConfig.TurnBattleType_Dot) # 要修改表现的话等前端同步修改
+
+ hurtTypes |= pow(2, ChConfig.HurtAtkType_Hurt) # 确保有基础的伤害类型
+ hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
+ calcHurtResults = [[defObj, hurtValue, hurtTypes, immuneHurt]]
+ DoSkillHurtHP(turnFight, atkObj, useSkill, calcHurtResults, "HurtExAtk")
+
+ Sync_UseSkill(turnFight, atkObj, useSkill)
+
+ DoBeAttackResult(turnFight, atkObj, useSkill)
+
+ # 通知结束标签
+ Sync_TurnFightTag(turnFight, useTag, 1)
+
+ useSkill.ResetUseRec()
+ return True
+
def Sync_TurnFightTag(turnFight, useTag, sign):
## 通知技能标签
clientPack = ChPyNetSendPack.tagSCTurnFightTag()
--
Gitblit v1.8.0