129 【战斗】战斗系统-服务端(修复曹仁、甄宓破盾无法触发bug;)
| | |
| | | DoBuffDel(turnFight, batObj, curBuff, relatedSkill)
|
| | | return
|
| | |
|
| | | def DoBuffDel(turnFight, batObj, curBuff, relatedSkill=None, afterLogic=False, tagObj=None, noRefreshAttr=False, isSync=True):
|
| | | def DoBuffDel(turnFight, batObj, curBuff, relatedSkill=None, afterLogic=False, tagObj=None, noRefreshAttr=False, isSync=True, afterTriggerData=None):
|
| | | '''删除buff
|
| | | @param relatedSkill: 关联的技能
|
| | | @param afterLogic: 是否需要在关联技能处理完毕后才处理删除后续逻辑,如通知,触发被动等
|
| | | @param tagObj: 由谁引起的buff删除
|
| | | @param noRefreshAttr: 不刷新属性
|
| | | @return: isRefreshAttr 是否需要刷属性,如果设置了 noRefreshAttr,则要在外层刷属性
|
| | | @return: afterTriggerData afterLogic为True时,附带的被动触发数据,因为buff被删除后该buff自带的被动效果也会被删除,所以先缓存供后续处理
|
| | | '''
|
| | |
|
| | | release = True # 释放buff实例
|
| | |
| | | SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
|
| | | if afterLogic and relatedSkill:
|
| | | tagObjID = tagObj.GetID() if tagObj else buffObjID
|
| | | relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID])
|
| | | relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID, afterTriggerData])
|
| | |
|
| | | #buff消失的触发
|
| | | for effectIndex in range(0, skillData.GetEffectCount()):
|
| | |
| | |
|
| | | import GameWorld
|
| | | import PassiveTrigger
|
| | | import IpyGameDataPY
|
| | | import BattleObj
|
| | | import ChConfig
|
| | |
|
| | | GameWorld.ImportAll("Script\\Skill\\", "PassiveTrigger")
|
| | |
| | | effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID, connBuff)
|
| | | if not effInfoList:
|
| | | return
|
| | | # [["skill/buff", skillID, buffID, effIDList], ...]
|
| | | OnTriggerPassiveEffList(turnFight, batObj, triggerWay, tagObj, effInfoList, connSkill, connBuff, **kwargs)
|
| | | return
|
| | |
|
| | | def OnTriggerPassiveEffList(turnFight, batObj, triggerWay, tagObj, effInfoList, connSkill=None, connBuff=None, **kwargs):
|
| | | '''触发外部指定的被动效果列表
|
| | | @param effInfoList: [["skill/buff", skillID, buffID, effIDList], ...]
|
| | | '''
|
| | | tagID = tagObj.GetID() if tagObj else 0
|
| | | GameWorld.DebugLogEx("触发被动: triggerWay=%s,objID=%s,tagID=%s,%s", triggerWay, batObj.GetID(), tagID, effInfoList)
|
| | | for effInfo in effInfoList:
|
| | |
| | |
|
| | | # 优先处理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]
|
| | |
| | |
|
| | | # ========== 以下触发被动 ==========
|
| | |
|
| | | # 破盾时
|
| | | 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):
|
| | |
| | | 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)
|