129 【战斗】战斗系统-服务端(命格技能七杀、皇灵、贪狼、司命、破军、天机;增加绝对闪避及抗性属性 81 82;格挡buff支持层级;)
2个文件已修改
70 ■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -182,7 +182,9 @@
AttrID_GuanchuanDef,                        # 抗贯穿 78
AttrID_Zhaojia,                             # 招架 79
AttrID_ZhaojiaDef,                          # 抗招架 80
) = range(1, 1 + 80)
AttrID_AbsoluteMissRate,                    # 绝对闪避 81
AttrID_AbsoluteMissRateDef,                 # 抗绝对闪避 82
) = range(1, 1 + 82)
# 需要计算的武将战斗属性ID列表
CalcBattleAttrIDList = [AttrID_Atk, AttrID_Def, AttrID_MaxHP, AttrID_AtkSpeed, AttrID_StunRate, AttrID_StunRateDef, 
@@ -199,6 +201,7 @@
                        AttrID_ComboDamPer, AttrID_ComboDamPerDef, AttrID_XPRecoverPer, AttrID_PVPDamPer, AttrID_PVPDamPerDef,
                        AttrID_ReviveHPPer, AttrID_ReviveXPPer, AttrID_DOTBurnPer, AttrID_DOTBurnPerDef,
                        AttrID_Guanchuan, AttrID_GuanchuanDef, AttrID_Zhaojia, AttrID_ZhaojiaDef,
                        AttrID_AbsoluteMissRate, AttrID_AbsoluteMissRateDef,
                        ]
# 基础三维属性ID列表
@@ -902,7 +905,8 @@
HurtAtkType_IgnoreShield,      # 无视承伤盾 14
HurtAtkType_Guanchuan,         # 贯穿 15
HurtAtkType_Zhaojia,           # 招架 16
) = range(17)
HurtAtkType_AbsoluteMiss,      # 绝对闪避 17
) = range(18)
#伤害类型
(
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -163,8 +163,8 @@
    angerOverflow = curBatObj.GetAngerOverflow()
    
    bySkillID = bySkill.GetSkillID() if bySkill else 0
    GameWorld.DebugLogEx("◆使用技能: curID=%s,skillID=%s,tagCnt=%s,batType=%s,bySkillID=%s,HP:%s/%s,angerOverflow=%s,curXP=%s,oneActionUseCnt=%s",
                         objID, skillID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP(), angerOverflow, curXP, oneActionUseCnt)
    GameWorld.DebugLogEx("◆使用技能: skillID=%s,curID=%s,tagCnt=%s,batType=%s,bySkillID=%s,HP:%s/%s,angerOverflow=%s,curXP=%s,oneActionUseCnt=%s",
                         skillID, objID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP(), angerOverflow, curXP, oneActionUseCnt)
    # 以下为技能可以使用的处理,之后的逻辑默认技能使用成功
    
    if isinstance(useSkill, IpyGameDataPY.IPY_Skill):
@@ -1647,7 +1647,11 @@
        if tagID in missObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeMiss, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill)
            tagMGObj = tagObj.GetTFBatLineup().getMinggeObj()
            if tagMGObj and ChConfig.TriggerWay_Miss not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_Miss)
                TurnPassive.OnTriggerPassiveEffect(turnFight, tagMGObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill, byBatObj=tagObj)
        # 免疫
        if tagID in immuneObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_ImmuneHurt, curObj, connSkill=useSkill)
@@ -1695,7 +1699,10 @@
        if tagID in stunObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Stun, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeStun, curObj, connSkill=useSkill)
            if curMGObj and ChConfig.TriggerWay_Stun not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_Stun)
                TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Stun, tagObj, connSkill=useSkill, byBatObj=curObj)
        # 控制
        if tagID in beControlledHardDict:
            buff = beControlledHardDict[tagID]
@@ -1715,22 +1722,35 @@
        if tagID in superHitObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuperHit, curObj, connSkill=useSkill)
            if curMGObj and ChConfig.TriggerWay_SuperHit not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_SuperHit)
                TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill, byBatObj=curObj)
        # 格挡
        if tagID in parryObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeParry, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill)
            tagMGObj = tagObj.GetTFBatLineup().getMinggeObj()
            if tagMGObj and ChConfig.TriggerWay_Parry not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_Parry)
                TurnPassive.OnTriggerPassiveEffect(turnFight, tagMGObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill, byBatObj=tagObj)
        # 吸血
        if tagID in suckObjIDList:
            if not triggerOne:
                TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuckHP, curObj, connSkill=useSkill)
            if curMGObj and ChConfig.TriggerWay_SuckHPOne not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_SuckHPOne)
                TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill, byBatObj=curObj)
        # 连击
        if batType == ChConfig.TurnBattleType_Combo:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeCombo, curObj, connSkill=useSkill)
            if curMGObj and ChConfig.TriggerWay_Combo not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_Combo)
                TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill, byBatObj=curObj)
        # 追击
        elif batType == ChConfig.TurnBattleType_Pursue:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Pursue, tagObj, connSkill=useSkill)
@@ -2148,23 +2168,31 @@
    isAngerSkill = SkillCommon.isAngerSkill(curSkill)
    isDot = ("damageoftime" in kwargs)
    
    mustHit = False # 是否必命中
    if not isTurnNormalSkill: # 仅普攻判断是否闪避
        mustHit = True
    angerOverflow = atkObj.GetAngerOverflow() # 怒气溢出值
    #命中公式 攻击方类型不同,公式不同
    if not mustHit and not curSkill.GetEffectByID(ChConfig.SkillEff_MustHit) and not defObj.IsInControlledHard():
    # 常规闪避 - 仅针对普攻
    if isTurnNormalSkill and not curSkill.GetEffectByID(ChConfig.SkillEff_MustHit) and not defObj.IsInControlledHard():
        aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_MissRateDef) #atkObj.GetHit() # 抗闪避率 - 命中
        dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_MissRate) # 闪避率
        missNum = curSkill.GetTagMissNum(defID)
        missRate = eval(IpyGameDataPY.GetFuncCompileCfg("MissCfg", 1))
        if GameWorld.CanHappen(missRate):
            GameWorld.DebugLogEx("闪避了! missRate=%s,dMissRate=%s,aMissRateDef=%s,missNum=%s", missRate, dMissRate, aMissRateDef, missNum)
            curSkill.SetTagMissNum(defID, missRate + 1)
            curSkill.SetTagMissNum(defID, missNum + 1)
            return 0, pow(2, ChConfig.HurtAtkType_Miss)
        
    # 绝对闪避 - 除dot外的所有技能,因为绝对闪避不触发常规闪避的被动,所以在常规闪避后判断
    if not isDot:
        aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_AbsoluteMissRateDef)
        dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_AbsoluteMissRate)
        missNum = curSkill.GetTagMissNum(defID)
        if dMissRate > 0:
            missRate = eval(IpyGameDataPY.GetFuncCompileCfg("MissCfg", 1))
            if GameWorld.CanHappen(missRate):
                GameWorld.DebugLogEx("绝对闪避了! missRate=%s,dAbsoluteMissRate=%s,aAbsoluteMissRateDef=%s,missNum=%s", missRate, dMissRate, aMissRateDef, missNum)
                curSkill.SetTagMissNum(defID, missNum + 1)
                return 0, pow(2, ChConfig.HurtAtkType_AbsoluteMiss)
    angerOverflow = atkObj.GetAngerOverflow() # 怒气溢出值
    hurtTypes = pow(2, ChConfig.HurtAtkType_Hurt)
    
    isSuperHit, isParry, isStun = False, False, False
@@ -2895,7 +2923,7 @@
    damBackPer = 0
    buffMgr = defObj.GetBuffManager()
    for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamBackShield):
        damBackPer += buff.GetValue1()
        damBackPer += buff.GetValue1() * max(1, buff.GetLayer())
        connSkillTypeID = buff.GetSkillTypeID()
        damBackPer += TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_AddDamBackPerByBuffLayer, connSkillTypeID=connSkillTypeID)