129 【战斗】战斗系统-服务端(庞统所有技能;目标范围增加8-继承主技能友军;目标细分增加9-仅流血目标;增加触发方式48 49 50;增效效果5506;)
4个文件已修改
1个文件已添加
144 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5501.py 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5506.py 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -723,7 +723,7 @@
    def GetLayerMax(self): return self._skillData.GetLayerMax()
    def GetBuffRepeat(self): return self._skillData.GetBuffRepeat() # Buff叠加规则
    def GetDispersedLimit(self): return self._skillData.GetDispersedLimit() # 驱散限制
    def GetBuffRetain(self): return self._ipyData.GetBuffRetain()
    def GetBuffRetain(self): return self._skillData.GetBuffRetain()
    def GetFightPower(self): return self._skillData.GetFightPower()
    
    ## ---------------------------------- 非技能表内容 ----------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1347,7 +1347,8 @@
SkillTagAim_Self, # 自己 5
SkillTagAim_MainSkill, # 继承主技能目标 6
SkillTagAim_MainSkillEx, # 继承主技能目标一次性处理 7
) = range(8)
SkillTagAim_MainSkillFriend, # 继承主技能友军 8
) = range(9)
# 技能目标 - 细分
(
@@ -1360,7 +1361,8 @@
SkillTagAffect_Burn, # 灼烧/玄火目标优先 6
SkillTagAffect_PoisonCure, # 仅焚血(毒奶)目标 7
SkillTagAffect_DamShield, # 承伤盾目标优先 8
) = range(9)
SkillTagAffect_Bleeding, # 仅流血目标 9
) = range(10)
#技能施法目标
Def_UseSkillAim_Type = 3
@@ -4010,7 +4012,10 @@
TriggerWay_FriendAction, # 友方行动后(包含自己) 45
TriggerWay_HurtTag, # 对目标造成伤害时 46
TriggerWay_BeControlledHard, # 受控时(硬控) 47
) = range(1, 1 + 47)
TriggerWay_FriendCombo, # 友军连击时(包含自己) 48
TriggerWay_FriendPursue, # 友军追击时(包含自己) 49
TriggerWay_FriendAttackOverDirectOne, # 友方使用技能后(多目标仅触发一次,包含自己) 50
) = range(1, 1 + 50)
# 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5501.py
@@ -21,6 +21,21 @@
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
    skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
    setLayerCnt = curEffect.GetEffectValue(1) # 指定buff层级
    byTagStateList = curEffect.GetEffectValue(2) # 或根据目标xx状态 [状态1, 状态2, ...]总层级
    if byTagStateList:
        layerTotal = 0
        tagBuffMgr = tagObj.GetBuffManager()
        for index in range(tagBuffMgr.GetBuffCount()):
            buff = tagBuffMgr.GetBuffByIndex(index)
            skillData = buff.GetSkillData()
            if skillData.GetCurBuffState() not in byTagStateList:
                continue
            layerTotal += buff.GetLayer()
        setLayerCnt = layerTotal
    if setLayerCnt <= 0:
        return
    if not skillID:
        passiveSkill = effSkill
    else:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5506.py
New file
@@ -0,0 +1,71 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveTrigger.PassiveEff_5506
#
# @todo:触发释放技能(验证目标状态层级)
# @author hxp
# @date 2025-12-18
# @version 1.0
#
# 详细描述: 触发释放技能(验证目标状态层级)
#
#-------------------------------------------------------------------------------
#"""Version = 2025-12-18 17:30"""
#-------------------------------------------------------------------------------
import TurnSkill
import GameWorld
import IpyGameDataPY
import BattleObj
import TurnBuff
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
    if not tagObj:
        return
    skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
    checkStateList = curEffect.GetEffectValue(1) # 可附加验证目标处于xx状态
    needLayers = curEffect.GetEffectValue(2) # 达到x层时才触发
    isDelBuff = curEffect.GetEffectValue(3) # 层数不足时是否删除释放技能对应buff
    layerTotal = 0
    tagBuffMgr = tagObj.GetBuffManager()
    for index in range(tagBuffMgr.GetBuffCount()):
        buff = tagBuffMgr.GetBuffByIndex(index)
        skillData = buff.GetSkillData()
        if skillData.GetCurBuffState() not in checkStateList:
            continue
        layerTotal += buff.GetLayer()
    if layerTotal < needLayers:
        GameWorld.DebugLogEx("buff状态总层数不足不触发5506! checkStateList=%s,layerTotal=%s < %s,isDelBuff=%s", checkStateList, layerTotal, needLayers, isDelBuff)
        if isDelBuff:
            delBuffSkillID = skillID if skillID else effSkill.GetSkillID()
            if not delBuffSkillID:
                return
            buff = tagBuffMgr.FindBuffBySkillID(delBuffSkillID)
            if buff:
                TurnBuff.DoBuffDel(turnFight, tagObj, buff, connSkill)
        return
    if not skillID:
        passiveSkill = effSkill
    else:
        passiveSkill = IpyGameDataPY.GetIpyGameData("Skill", skillID)
    if not passiveSkill:
        return
    effectID = curEffect.GetEffectID()
    effSkillID = effSkill.GetSkillID()
    return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID, connBuff, **kwargs)
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
    ownerID = effBuff.GetOwnerID()
    if not ownerID:
        return
    buffOwner = BattleObj.GetBatObjMgr().getBatObj(ownerID)
    if not buffOwner:
        return
    effSkill = effBuff.GetSkillData().GetIpyData()
    return DoSkillEffectLogic(turnFight, buffOwner, batObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -443,6 +443,14 @@
        for aimObj in aimObjList[::-1]:
            if not aimObj.CheckInState(ChConfig.BatObjState_PoisonCure):
                aimObjList.remove(aimObj)
    # 仅流血目标
    elif tagAffect == ChConfig.SkillTagAffect_Bleeding:
        atkBackTagFrist = False
        for aimObj in aimObjList[::-1]:
            if not aimObj.CheckInState(ChConfig.BatObjState_Bleeding):
                aimObjList.remove(aimObj)
    else:
        # 范围目标超过个数,则随机取
        if tagCount and len(aimObjList) > tagCount:
@@ -1282,13 +1290,14 @@
            return useSkill
    return
def DoBeAttackResult(turnFight, curObj, useSkill, curBuff=None):
def DoBeAttackResult(turnFight, curObj, useSkill, timeBuff=None):
    '''被攻击结果
    @param curObj: 施法方或buff归属方
    @param timeBuff: 持续结算的buff,如持续攻击、持续治疗等
    '''
    
    #curID = curObj.GetID()
    isUseSkill = False if curBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
    isUseSkill = False if timeBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
    isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
    isAngerSkill = SkillCommon.isAngerSkill(useSkill)
    
@@ -1456,6 +1465,7 @@
    triggerOne = False
    batType = useSkill.GetBatType()
    isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
    curBatLineup = None
    for tagObj in tagObjListAll:
        tagID = tagObj.GetID()
        
@@ -1528,6 +1538,29 @@
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_AtkBack, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAtkBack, curObj, connSkill=useSkill)
            
        # 敌友方
        if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue]:
            if not curBatLineup:
                curBatLineup = curObj.GetBatLineup()
            for lineupObjID in curBatLineup.posObjIDDict.values():
                lineupObj = batObjMgr.getBatObj(lineupObjID)
                if not lineupObj.IsAlive():
                    continue
                # 直接攻击
                if isAttackDirect:
                    if not triggerOne:
                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOne, tagObj, connSkill=useSkill, byFriendObj=curObj)
                # 连击
                if batType == ChConfig.TurnBattleType_Combo:
                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
                # 追击
                elif batType == ChConfig.TurnBattleType_Pursue:
                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendPursue, tagObj, connSkill=useSkill, byFriendObj=curObj)
        triggerOne = True # 设置已经触发过一次
        
    # 验证是否结算,最后处理
@@ -1836,6 +1869,14 @@
            return
        passiveTagObjList = connSkill.GetTagObjList()
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
    elif tagAim == ChConfig.SkillTagAim_MainSkillFriend:
        if "byFriendObj" not in kwargs:
            return
        byFriendObj = kwargs["byFriendObj"]
        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)
    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)