129 【战斗】战斗系统-服务端(庞统技能;增加触发方式被连击18,被追击19;增加buff状态限制管理支持,写死硬控中无法格挡、闪避、行动;)
5个文件已修改
1个文件已添加
104 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5013.py 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -111,7 +111,7 @@
    BYTE        TriggerWay3;    //触发方式
    BYTE        TriggerSrc3;    //有效来源
    WORD        CoolDownTime;    //技能冷却时间
    list        IgnoreStates;    //无视限制列表
    WORD        BuffStateLimit;    //Buff状态限制组
    BYTE        CurBuffState;    //Buff״ֵ̬
    WORD        LastTime;    //持续时间
    BYTE        LayerCnt;    //Buff层数
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -317,7 +317,7 @@
    def GetEffectByID(self, effID, triggerWay=0): return self._effDict.get((effID, triggerWay), None)
    def GetConnSkill(self): return self._ipyData.GetConnSkill()
    def GetCoolDownTime(self): return self._ipyData.GetCoolDownTime()
    def GetIgnoreStates(self): return self._ipyData.GetIgnoreStates() # 无视限制列表
    def GetBuffStateLimit(self): return self._ipyData.GetBuffStateLimit()
    def GetCurBuffState(self): return self._ipyData.GetCurBuffState()
    def GetLastTime(self): return self._ipyData.GetLastTime() # 持续时间
    def GetLayerCnt(self): return self._ipyData.GetLayerCnt()
@@ -549,7 +549,7 @@
    def GetEffectByID(self, effID, triggerWay=0): return self._skillData.GetEffectByID(effID, triggerWay)
    def GetConnSkill(self): return self._skillData.GetConnSkill()
    def GetCoolDownTime(self): return self._skillData.GetCoolDownTime()
    def GetIgnoreStates(self): return self._skillData.GetIgnoreStates() # 无视限制列表
    def GetBuffStateLimit(self): return self._skillData.GetBuffStateLimit()
    def GetCurBuffState(self): return self._skillData.GetCurBuffState()
    def GetLastTime(self): return self._skillData.GetLastTime() # 持续时间
    def GetLayerCnt(self): return self._skillData.GetLayerCnt()
@@ -827,18 +827,25 @@
                return True
        return False
    
    def IsInControlled(self):
        ## 是否被控制中
        for state in ChConfig.InControlledStateList:
    def IsInControlled(self): return self.IsInBuffStateGroup(1) or self.IsInBuffStateGroup(2) # 是否被控制中
    def IsInControlledHard(self): return self.IsInBuffStateGroup(1) # 是否被硬控中
    def IsInBuffStateGroup(self, buffStateGroup):
        '''是否在某个状态组中
                        已定义的组: 1 - 硬控组;2 - 软控组;3 - 限制普攻组;4 - 限制怒技组;5 - 限制被动动态组
        '''
        buffStateGroupDict = IpyGameDataPY.GetFuncEvalCfg("BuffStateGroup", 1, {})
        if buffStateGroup not in buffStateGroupDict:
            return
        for state in buffStateGroupDict[buffStateGroup]:
            if self._buffMgr.IsInBuffState(state):
                return True
        return False
                return state
        return
    
    def CanAction(self):
        ## 是否可以行动
        if not self.IsAlive():
            return False
        if self.IsInControlled():
        if self.IsInControlledHard():
            return False
        return True
    
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3150,10 +3150,10 @@
    BatObjState_Stone, # 石化 12
    BatObjState_Disarm, # 缴械 13
    BatObjState_ParryYJ, # 格挡印记 14
) = range(15)
# 被控制的状态列表,无法行动,处于某些控制类buff影响状态下,如晕眩,冰冻,石化
InControlledStateList = [BatObjState_Frozen, BatObjState_Stun, BatObjState_Stone]
    BatObjState_Weak, # 虚弱 15
    BatObjState_Charm, # 魅惑 16
    BatObjState_Chaos, # 混乱 17
) = range(18)
#玩家状态定义,不能超过31个,如超过,需扩展多个key支持
Def_PlayerStateList = (
@@ -4288,7 +4288,9 @@
TriggerWay_KillOneObj, # 击杀目标后(单次击杀多目标只触发一次) 15
TriggerWay_KillTagObj, # 击杀每目标后(单次击杀多目标每个目标触发一次) 16
TriggerWay_BuffDel, # buff消失后  17
) = range(1, 1 + 17)
TriggerWay_BeCombo, # 被连击时 18
TriggerWay_BePursue, # 被追击时 19
) = range(1, 1 + 19)
# 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -133,7 +133,7 @@
                        ("BYTE", "TriggerWay3", 0),
                        ("BYTE", "TriggerSrc3", 0),
                        ("WORD", "CoolDownTime", 0),
                        ("list", "IgnoreStates", 0),
                        ("WORD", "BuffStateLimit", 0),
                        ("BYTE", "CurBuffState", 0),
                        ("WORD", "LastTime", 0),
                        ("BYTE", "LayerCnt", 0),
@@ -2701,7 +2701,7 @@
    def GetTriggerWay3(self): return self.attrTuple[28] # 触发方式 BYTE
    def GetTriggerSrc3(self): return self.attrTuple[29] # 有效来源 BYTE
    def GetCoolDownTime(self): return self.attrTuple[30] # 技能冷却时间 WORD
    def GetIgnoreStates(self): return self.attrTuple[31] # 无视限制列表 list
    def GetBuffStateLimit(self): return self.attrTuple[31] # Buff状态限制组 WORD
    def GetCurBuffState(self): return self.attrTuple[32] # Buff״ֵ̬ BYTE
    def GetLastTime(self): return self.attrTuple[33] # 持续时间 WORD
    def GetLayerCnt(self): return self.attrTuple[34] # Buff层数 BYTE
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5013.py
New file
@@ -0,0 +1,39 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveTrigger.PassiveEff_5013
#
# @todo:触发释放技能(buff施法方对该buff携带方进行释放技能)
# @author hxp
# @date 2025-09-23
# @version 1.0
#
# 详细描述: 触发释放技能(buff施法方对该buff携带方进行释放技能)
#
#-------------------------------------------------------------------------------
#"""Version = 2025-09-23 11:00"""
#-------------------------------------------------------------------------------
import TurnSkill
import IpyGameDataPY
import BattleObj
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 or not buffOwner.IsAlive():
        return
    effSkill = effBuff.GetSkillData().GetIpyData()
    skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
    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, buffOwner, batObj, passiveSkill, connSkill, effSkillID, effectID, connBuff)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -59,6 +59,16 @@
    if not skillID:
        return
    
    if not curBatObj.CanAction():
        return
    buffStateLimit = useSkill.GetBuffStateLimit()
    if buffStateLimit:
        limitState = curBatObj.IsInBuffStateGroup(buffStateLimit)
        if limitState:
            GameWorld.DebugLog("技能使用处于buff状态限制中! skillID=%s,buffStateLimit=%s,limitState=%s" % (skillID, buffStateLimit, limitState))
            return
    #没有指定目标,则按技能自身的目标逻辑
    if not tagObjList:
        tagObjList = GetSkillTags(turnFight, curBatObj, useSkill)
@@ -792,6 +802,7 @@
        tagObj = batObjMgr.getBatObj(tagObjID)
        TurnPassive.OnTriggerPassiveEffect(turnFight, buffObj, ChConfig.TriggerWay_ShieldBroken, tagObj, connSkillTypeID=buffSkillTypeID)
        
    batType = useSkill.GetBatType()
    for tagObj in useSkill.GetTagObjList():
        tagID = tagObj.GetID()
        if tagID in effIgnoreObjIDList:
@@ -805,6 +816,13 @@
        # 使用技能后
        if isUseSkill:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_UseSkillOver, tagObj, connSkill=useSkill)
        # 连击
        if batType == ChConfig.TurnBattleType_Combo:
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeCombo, curObj, connSkill=useSkill)
        # 追击
        elif batType == ChConfig.TurnBattleType_Pursue:
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
            
    if killObjList:
        tagObj = killObjList[0]
@@ -1097,7 +1115,7 @@
        GameWorld.DebugLog("XP必命中! curXP=%s,angerOverflow=%s" % (curXP, angerOverflow))
        
    #命中公式 攻击方类型不同,公式不同
    if isTurnNormalSkill and not mustHit:
    if isTurnNormalSkill and not mustHit and not defObj.IsInControlledHard():
        aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_MissRateDef) #atkObj.GetHit() # 抗闪避率 - 命中
        dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_MissRate) # 闪避率
        missNum = curSkill.GetTagMissNum(defID)
@@ -1268,8 +1286,8 @@
    return False
def CanParry(turnFight, atkObj, defObj, curSkill):
    if defObj.IsInControlled():
        #被控制无法格挡
    if defObj.IsInControlledHard():
        #被硬控无法格挡
        return False
    
    defID = defObj.GetID()