ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -27,7 +27,6 @@
import TurnPassive
import TurnAttack
import TurnBuff
import ObjPool
import FBLogic
import random
@@ -140,12 +139,9 @@
                         objID, skillID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP(), angerOverflow, curXP, oneActionUseCnt)
    # 以下为技能可以使用的处理,之后的逻辑默认技能使用成功
    
    poolMgr = ObjPool.GetPoolMgr()
    usePoolSkill = False
    if isinstance(useSkill, IpyGameDataPY.IPY_Skill):
        usePoolSkill = True
        # 统一使用 BattleObj.PySkill
        useSkill = poolMgr.acquire(BattleObj.PySkill, useSkill, objID)
        useSkill = BattleObj.PySkill(useSkill, objID)
        
    useSkill.ResetUseRec()
    useSkill.SetTagObjList(tagObjList)
@@ -192,8 +188,6 @@
            
    # 最后重置、回收对象
    useSkill.ResetUseRec()
    if usePoolSkill:
        poolMgr.release(useSkill)
    return True
def CheckSkillUseCntLimit(batObj, useSkill):
@@ -851,8 +845,13 @@
    
    calcCureResults = []
    relativeObj = GetRelativeObj(turnFight, curBatObj)
    multiValue = 1
    addCureMulti = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddCureMulti, useSkill)
    if addCureMulti:
        multiValue += addCureMulti / 100.0
    for tagBatObj in useSkill.GetTagObjList():
        cureHP = CalcCureHP(turnFight, curBatObj, tagBatObj, useSkill, relativeObj=relativeObj)
        cureHP = CalcCureHP(turnFight, curBatObj, tagBatObj, useSkill, relativeObj=relativeObj, multiValue=multiValue)
        poisonCureOwner = GetPoisonCureOwner(tagBatObj)
        calcCureResults.append([tagBatObj, cureHP, poisonCureOwner])
        
@@ -1018,8 +1017,7 @@
    #    hurtValue *= (10000 + FinalDamPer) / 10000.0
    #    GameWorld.DebugLogEx("    增伤: hurtValue=%s,FinalDamPer=%s", hurtValue, FinalDamPer)
    
    poolMgr = ObjPool.GetPoolMgr()
    useSkill = poolMgr.acquire(BattleObj.PySkill, skillIpyData, atkID)
    useSkill = BattleObj.PySkill(skillIpyData, atkID)
    useSkill.SetTagObjList([defObj])
    useSkill.SetBatType(ChConfig.TurnBattleType_Cot)
    
@@ -1055,7 +1053,6 @@
    Sync_TurnFightTag(turnFight, useTag, 1)
    
    useSkill.ResetUseRec()
    poolMgr.release(useSkill)
    return
def SkillModule_6(turnFight, curBatObj, useSkill, opType):
@@ -1287,16 +1284,14 @@
    
    # 优先处理afterLogic,可再预先汇总一些会触发被动的信息
    relatedSkillID = useSkill.GetSkillID()
    shieldBrokenList = [] # 记录盾破
    delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
    afterLogicList = useSkill.GetAfterLogicList()
    for logicType, logicData in afterLogicList:
        if logicType == ChConfig.AfterLogic_DelBuff:
            buffObjID, buff, tagObjID = logicData
            buffSkillData = buff.GetSkillData()
            buffSkillTypeID = buffSkillData.GetSkillTypeID()
            buffObjID, buff, tagObjID, afterTriggerData = logicData
            TurnBuff.DoBuffDelAfterLogicOver(turnFight, buffObjID, buff, useSkill)
            if SkillCommon.isDamageShieldSkill(buffSkillData):
                shieldBrokenList.append([buffObjID, tagObjID, buffSkillTypeID])
            if afterTriggerData:
                delBuffAfterEffList.append([buffObjID, buff, tagObjID, afterTriggerData])
                
        elif logicType == ChConfig.AfterLogic_AddBuff:
            batObj = logicData[0]
@@ -1405,11 +1400,13 @@
    
    # ========== 以下触发被动 ==========
    
    # 破盾时
    for buffObjID, tagObjID, buffSkillTypeID in shieldBrokenList:
    # buff消失后置处理的被动,优先处理,如破盾,区别于被动方式  ChConfig.TriggerWay_BuffDel(立即触发)
    for buffObjID, buff, tagObjID, afterTriggerData in delBuffAfterEffList:
        triggerWay, effInfoList = afterTriggerData
        buffObj = batObjMgr.getBatObj(buffObjID)
        tagObj = batObjMgr.getBatObj(tagObjID)
        TurnPassive.OnTriggerPassiveEffect(turnFight, buffObj, ChConfig.TriggerWay_ShieldBroken, tagObj, connSkillTypeID=buffSkillTypeID)
        tagObj = batObjMgr.getBatObj(tagObjID) # 导致该buff消失的目标
        GameWorld.DebugLogEx("buff消失后置处理的被动: buffObjID=%s,tagObjID=%s,triggerWay=%s,%s", buffObjID, tagObjID, triggerWay, effInfoList)
        TurnPassive.OnTriggerPassiveEffList(turnFight, buffObj, triggerWay, tagObj, effInfoList, connSkill=useSkill, connBuff=buff)
        
    # 有击杀时
    for index, tagObj in enumerate(killObjList):
@@ -1817,6 +1814,8 @@
    batType = curSkill.GetBatType()
    
    changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtType, curSkill)
    if not changeHurtType:
        changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtTypeByBuff, curSkill)
    if changeHurtType == 1:
        ignoreDef = True
        GameWorld.DebugLogEx("强制变更本次伤害为无视防御! skillID=%s", skillID)
@@ -2135,8 +2134,10 @@
        defObj, hurtValue, hurtTypes, immuneHurt = hurtInfo[:4]
        isEx = hurtInfo[4] if len(hurtInfo) > 4 else 0 # 是否是额外目标
        
        lostHP = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
        lostHP, ignoreShield = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
        if ignoreShield:
            hurtTypes |= pow(2, ChConfig.HurtAtkType_IgnoreShield)
        #伤害结构体
        defID = defObj.GetID()
        if isEx:
@@ -2423,9 +2424,10 @@
    @param hpCanNegative: 扣除后的生命是否允许负值
    @param immuneHurt: 免疫的伤害值
    @param isSkillSelfTag: 是否技能自身的直接目标,如平摊伤害目标、溅射伤害目标这种就不算直接目标
    @return: lostHP
    @return: lostHP, ignoreShield
    '''
    
    ignoreShield = None
    if immuneHurt > 0:
        buffMgr = defObj.GetBuffManager()
        wudiBuffList = buffMgr.FindBuffListByState(ChConfig.BatObjState_Wudi)
@@ -2440,7 +2442,7 @@
                                 defObj.GetID(), buff.GetBuffID(), buffSkillID, buffValue, immuneHurt, updBuffValue, lostType)
            
    if hurtValue <= 0:
        return 0
        return 0, ignoreShield
    
    atkID = atkObj.GetID()
    defID = defObj.GetID()
@@ -2451,6 +2453,11 @@
    shieldBuffList = []
    buffMgr = defObj.GetBuffManager()
    for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamShield):
        if ignoreShield == None:
            if TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_IgnoreShield, curSkill):
                ignoreShield = True # 无视承伤盾
                break
            ignoreShield = False
        skillData = buff.GetSkillData()
        remainTime = buff.GetRemainTime() # 剩余回合
        if not skillData.GetLastTime():
@@ -2479,7 +2486,9 @@
            shieldHurtValue -= decShieldValue # 承伤值
            if decShieldValue >= buffValue:
                GameWorld.DebugLogEx("        删除盾: buffID=%s,剩余盾伤=%s", buffID, shieldHurtValue)
                TurnBuff.DoBuffDel(turnFight, defObj, buff, relatedSkill=curSkill, afterLogic=True, tagObj=atkObj)
                #盾破时buff会被删除,导致绑定在该buff上的被动效果同步被清除,后续就无法触发盾破后被动,固先取出来
                effInfoList = defObj.GetPassiveEffManager().GetPassiveEffByTrigger(ChConfig.TriggerWay_ShieldBroken, connSkillTypeID=buffSkillID)
                TurnBuff.DoBuffDel(turnFight, defObj, buff, relatedSkill=curSkill, afterLogic=True, tagObj=atkObj, afterTriggerData=[ChConfig.TriggerWay_ShieldBroken, effInfoList])
            else:
                updShieldValue = buffValue - decShieldValue
                GameWorld.DebugLogEx("        更新盾: updShieldValue=%s,剩余盾伤=%s", updShieldValue, shieldHurtValue)
@@ -2500,7 +2509,7 @@
    GameWorld.DebugLogEx("    扣血: atkID=%s,defID=%s,hurtValue=%s,lostType=%s,lostHP=%s,dHP=%s,updHP=%s/%s", 
                         atkID, defID, hurtValue, lostType, lostHP, dHP, defObj.GetHP(), defObj.GetMaxHP())
    TurnAttack.AddTurnObjHurtValue(atkObj, defObj, hurtValue, lostHP, skillID, lostType)
    return lostHP
    return lostHP, ignoreShield
def CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill):
    '''计算反弹反弹伤害
@@ -2584,7 +2593,7 @@
    TurnAttack.AddTurnObjCureHP(atkObj, atkObj, suckHP, cureHP)
    return
def CalcCureHP(turnFight, userObj, tagObj, curSkill, relativeObj=None):
def CalcCureHP(turnFight, userObj, tagObj, curSkill, relativeObj=None, multiValue=1):
    ''' 计算治疗值
    '''
    
@@ -2624,6 +2633,10 @@
        cureHPEx = eval(IpyGameDataPY.GetFuncCompileCfg("CureFormula", 1))
        cureHP += cureHPEx
        GameWorld.DebugLogEx("    额外治疗值(%s): cureType=%s,baseValue=%s,skillPer=%s,cureHP=%s", cureHPEx, cureType, baseValue, skillPer, cureHP)
    if multiValue and multiValue != 1:
        cureHP = int(cureHP * multiValue)
        GameWorld.DebugLogEx("    治疗倍值: cureHP=%s,multiValue=%s", cureHP, multiValue)
        
    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
    if hurtShareEff:
@@ -2710,8 +2723,7 @@
        hurtValue *= (10000 + FinalDamPer) / 10000.0
        GameWorld.DebugLogEx("    增伤: hurtValue=%s,FinalDamPer=%s", hurtValue, FinalDamPer)
        
    poolMgr = ObjPool.GetPoolMgr()
    useSkill = poolMgr.acquire(BattleObj.PySkill, skillIpyData, atkID)
    useSkill = BattleObj.PySkill(skillIpyData, atkID)
    useSkill.SetTagObjList([defObj])
    useSkill.SetBatType(ChConfig.TurnBattleType_Dot)
    
@@ -2727,12 +2739,11 @@
    Sync_TurnFightTag(turnFight, useTag, 1)
    
    useSkill.ResetUseRec()
    poolMgr.release(useSkill)
    return
def Sync_TurnFightTag(turnFight, useTag, sign):
    ## 通知技能标签
    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCTurnFightTag)
    clientPack = ChPyNetSendPack.tagSCTurnFightTag()
    clientPack.Tag = useTag
    clientPack.Len = len(clientPack.Tag)
    clientPack.Sign = sign
@@ -2743,8 +2754,7 @@
    ## 通知释放技能
    bySkill = useSkill.GetBySkill()
    relatedSkillID = bySkill.GetSkillID() if bySkill else 0
    poolMgr = ObjPool.GetPoolMgr()
    clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkill)
    clientPack = ChPyNetSendPack.tagSCUseSkill()
    clientPack.ObjID = curBatObj.GetID()
    clientPack.PMType = GetPMType(curBatObj, useSkill)
    clientPack.BattleType = useSkill.GetBatType()
@@ -2755,7 +2765,7 @@
    # 技能的主要伤害
    clientPack.HurtList = []
    for hurtObj in useSkill.GetHurtObjList():
        hurt = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurt)
        hurt = ChPyNetSendPack.tagSCUseSkillHurt()
        hurt.ObjID = hurtObj.GetObjID()
        hurt.AttackTypes = hurtObj.GetHurtTypes()
        hurt.HurtHP = hurtObj.GetHurtHP() % ChConfig.Def_PerPointValue
@@ -2767,7 +2777,7 @@
        hurt.HurtListEx = []
        # 单个伤害的额外伤害,如弹射+平摊伤害
        for hurtObjEx in hurtObj.GetHurtObjListEx():
            hurtEx = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurtEx)
            hurtEx = ChPyNetSendPack.tagSCUseSkillHurtEx()
            hurtEx.ObjID = hurtObjEx.GetObjID()
            hurtEx.AttackTypes = hurtObjEx.GetHurtTypes()
            hurtEx.HurtHP = hurtObjEx.GetHurtHP() % ChConfig.Def_PerPointValue
@@ -2782,7 +2792,7 @@
    # 技能的额外伤害,如常规技能的平摊伤害
    clientPack.HurtListEx = []
    for hurtObjEx in useSkill.GetHurtObjListEx():
        hurtEx = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurtEx)
        hurtEx = ChPyNetSendPack.tagSCUseSkillHurtEx()
        hurtEx.ObjID = hurtObjEx.GetObjID()
        hurtEx.AttackTypes = hurtObjEx.GetHurtTypes()
        hurtEx.HurtHP = hurtObjEx.GetHurtHP() % ChConfig.Def_PerPointValue
@@ -2797,7 +2807,7 @@
    if not clientPack.HurtList:
        for tagObj in useSkill.GetTagObjList():
            tagID = tagObj.GetID()
            hurt = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurt)
            hurt = ChPyNetSendPack.tagSCUseSkillHurt()
            hurt.ObjID = tagID
            hurt.CurHP = tagObj.GetHP() % ChConfig.Def_PerPointValue
            hurt.CurHPEx = tagObj.GetHP() / ChConfig.Def_PerPointValue
@@ -2819,8 +2829,7 @@
    if attrID not in ChConfig.CDBRefresh_AttrIDDict:
        return
    refreshType, isBig = ChConfig.CDBRefresh_AttrIDDict[attrID]
    poolMgr = ObjPool.GetPoolMgr()
    clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCObjPropertyRefreshView)
    clientPack = ChPyNetSendPack.tagSCObjPropertyRefreshView()
    clientPack.ObjID = curBatObj.GetID()
    clientPack.RefreshType = refreshType
    clientPack.AttackTypes = hurtTypes    
@@ -2842,7 +2851,7 @@
def Sync_HPRefresh(turnFight, curBatObj):
    hp, maxHP = curBatObj.GetHP(), curBatObj.GetMaxHP()
    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCObjHPRefresh)
    clientPack = ChPyNetSendPack.tagSCObjHPRefresh()
    clientPack.ObjID = curBatObj.GetID()
    clientPack.HP = hp % ShareDefine.Def_PerPointValue
    clientPack.HPEx = hp / ShareDefine.Def_PerPointValue