129 【战斗】战斗系统-服务端(命格技能朱雀;增加触发方式61-附加持续伤害buff时;群攻触发的命格buff默认只触发一次;增加效果5029-额外结算dot伤害;)
1个文件已添加
3个文件已修改
128 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5029.py 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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]
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5029.py
New file
@@ -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
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):
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,9 +1696,16 @@
        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:
@@ -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()