129 【战斗】战斗系统-服务端(张星彩怒技,觉醒技能;增加buff消失后触发时机;增加效果6007 6008 7001 7002;技能友好目标增加类型2:一定包含自己的友方单位)
12个文件已修改
2个文件已添加
254 ■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5001.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5002.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5011.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5012.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6007.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6008.py 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1003.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -37,17 +37,22 @@
        self._AffectBuffDict = {} # 被动buff {(触发方式, 有效来源):{buffID:[effID, ...], ...}, ...}
        return
    
    def GetPassiveEffByTrigger(self, triggerWay, connSkill=None, connSkillTypeID=0):
    def GetPassiveEffByTrigger(self, triggerWay, connSkill=None, connSkillTypeID=0, connBuff=None):
        '''获取可触发的效果列表,技能跟buff根据触发优先级按顺序触发,优先级越高越先执行,相同时技能优先
                        优先级之后有需要再扩展
        @return: [["skill/buff", skillID/buffID, effIDList], ...]
        '''
        effList = []
        
        if not connSkillTypeID and connSkill:
            connSkillTypeID = connSkill.GetSkillTypeID()
        if connSkill and self._batObj.GetID() == connSkill.GetObjID():
        if not connSkillTypeID:
            if connSkill:
                connSkillTypeID = connSkill.GetSkillTypeID()
            elif connBuff:
                skillData = connBuff.GetSkillData()
                connSkillTypeID = skillData.GetSkillTypeID()
        # SkillData 对象暂时没有 GetObjID
        if connSkill and hasattr(connSkill, "GetObjID") and self._batObj.GetID() == connSkill.GetObjID():
            skillID = connSkill.GetSkillID()
            skillManager = self._batObj.GetSkillManager()
            # 非对象身上的技能,读取本技能被动触发的效果,一般是主技能拆分的子技能
@@ -62,7 +67,7 @@
                    triggerSrc = effect.GetTriggerSrc()
                    if not triggerWay:
                        continue
                    if triggerWay == ChConfig.TriggerWay_CurSkillEff:
                    if triggerWay in ChConfig.TriggerWayNoLoadList:
                        continue
                    if triggerSrc != ChConfig.TriggerSrc_SkillSelf:
                        # 仅添加本技能的
@@ -124,7 +129,7 @@
        triggerSrc = effect.GetTriggerSrc()
        if not triggerWay:
            return
        if triggerWay == ChConfig.TriggerWay_CurSkillEff:
        if triggerWay in ChConfig.TriggerWayNoLoadList:
            return
        if triggerSrc in [ChConfig.TriggerSrc_Buff, ChConfig.TriggerSrc_BuffSelf]:
            # buff有效的不加进来
@@ -174,7 +179,7 @@
        triggerSrc = effect.GetTriggerSrc()
        if not triggerWay:
            return
        if triggerWay == ChConfig.TriggerWay_CurSkillEff:
        if triggerWay in ChConfig.TriggerWayNoLoadList:
            return
        if triggerSrc in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
            # 技能有效的不加进来
@@ -269,8 +274,6 @@
    def GetTriggerWay(self): return self._triggerWay
    def GetTriggerSrc(self): return self._triggerSrc
    #def GetTriggerParams(self, index): return self._triggerParams[index] if len(self._triggerParams) > index else 0
EmptyEffect = SkillEffect(0, [])
class SklllData():
    
@@ -311,7 +314,7 @@
    def GetHappenRate(self): return self._ipyData.GetHappenRate() # 触发概率
    def GetEffect(self, index): return self._effList[index] if len(self._effList) > index else 0
    def GetEffectCount(self): return len(self._effList)
    def GetEffectByID(self, effID, triggerWay=0): return self._effDict.get((effID, triggerWay), EmptyEffect)
    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() # 无视限制列表
@@ -502,6 +505,7 @@
        self._tagObjList = [] # 本次技能目标列表 [BatObj, ...]
        self._hurtList = [] # 本次伤血列表,可能同一个对象有多个伤害,如弹射等 [HurtObj, ...]
        self._bySkill = None # 由哪个技能触发的
        self._byBuff = None # 由哪个buff触发的
        self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
        
        # 连击相关
@@ -515,6 +519,7 @@
        self._batType = 0
        self._tagObjList = []
        self._bySkill = None
        self._byBuff = None
        self._afterLogicList = []
        self.ClearHurtObj()
        return
@@ -563,6 +568,8 @@
    def SetBatType(self, batType): self._batType = batType
    def GetBySkill(self): return self._bySkill
    def SetBySkill(self, bySkill): self._bySkill = bySkill
    def GetByBuff(self): return self._byBuff
    def SetByBuff(self, byBuff): self._byBuff = byBuff
    def GetTagObjList(self): return self._tagObjList # 技能目标列表
    def SetTagObjList(self, tagObjList): self._tagObjList = tagObjList
    def GetAfterLogicList(self): return self._afterLogicList
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -1405,7 +1405,7 @@
                        #GameWorld.DebugLog("    永久buff不处理! curID=%s,index=%s,skillID=%s" % (curID, index, skillID))
                        continue
                    calcTimeline = buff.GetCalcTime()
                    passTurn = __calcPassturn(calcTimeline, nowTimeline, False)
                    passTurn = __calcPassturn(calcTimeline, nowTimeline, True)
                    if passTurn <= 0:
                        #GameWorld.DebugLog("    passTurn <= 0 passTurn=%s,calcTimeline=%s,nowTimeline=%s,skillID=%s" % (passTurn, calcTimeline, nowTimeline, skillID))
                        continue
@@ -1424,7 +1424,7 @@
def __calcPassturn(calcTimeline, nowTimeline, equalOK):
    ## 计算已经过了的回合数
    # @param equalOK: 时间节点相同时是否算1回合,一般技能可以算,buff不算
    # @param equalOK: 时间节点相同时是否算1回合,一般技能可以算,buff可算可不算,具体看需求调整
    calcTurnNum = calcTimeline / TimelineSet
    calcTimeNode = calcTimeline % TimelineSet
    nowTurnNum = nowTimeline / TimelineSet
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1329,7 +1329,8 @@
Def_Calc_MaxHP, # 最大生命值 1
Def_Calc_LastHurt, # 最后一次伤害值 2
Def_Calc_TagMaxHP, # 目标最大生命值 3
) = range(4)
Def_Calc_ByBuffValue, # 触发buff的buff值 4
) = range(5)
#治疗类型(影响公式参数)
Def_CureTypeList = (
@@ -4286,7 +4287,11 @@
TriggerWay_CurSkillEffLst, # 本持续buff结算后额外触发效果,仅该持续buff结算后有效 14
TriggerWay_KillOneObj, # 击杀目标后(单次击杀多目标只触发一次) 15
TriggerWay_KillTagObj, # 击杀每目标后(单次击杀多目标每个目标触发一次) 16
) = range(1, 1 + 16)
TriggerWay_BuffDel, # buff消失后  17
) = range(1, 1 + 17)
# 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
# 被动触发有效来源
TriggerSrc_Skill = 1    # 身上技能有效
@@ -4299,6 +4304,8 @@
PassiveEff_ChangeHurtType = 6002 # 变更伤害类型: 值1-伤害类型;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
PassiveEff_ChangeHurtMulti = 6003 # 变更伤害倍值(可增可减): 值1-变更倍值;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
PassiveEff_AddSkillPer = 6004 # 增加本次技能万分比: 值1-增加的万分比;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
PassiveEff_AddSkillTagCnt = 6007 # 增加技能目标数:值1-增加目标个数
PassiveEff_ImmuneControlBuff = 6008 # 生命值低于x%时免疫控制效果:值1-百分比
# 被动效果ID有触发值时就返回的
PassiveEffHappenValueList = [PassiveEff_ChangeHurtType]
@@ -4306,6 +4313,10 @@
PassiveEffValueMaxList = []
# 被动效果ID触发值取最小值的
PassiveEffValueMinList = []
# 技能效果 - 不需要配置触发方式的
SkillEff_CureWayEx = 7001 # 额外治疗值计算(对CalcType、SkillPer治疗计算方式扩展): 值1-计算方式;值2-万分比
SkillEff_HurtShare = 7002 # 均摊伤害
(
TriggerType_BeSuperHit, # 被暴击触发技能 1
@@ -4398,7 +4409,7 @@
TriggerType_ThumpSkillValue, # 重击增加技能固定值伤害 88
TriggerType_HitValue, # 记录命中个数 89
TriggerType_ChangeSkillEff, # 改变技能特效广播 90
) = range(1, 91)
) = range(1001, 1091)
#不可以佩戴翅膀的地图
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5001.py
@@ -17,7 +17,7 @@
import TurnBuff
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
    #结算一次扣除1回合
    remainTime = max(0, effBuff.GetRemainTime() - 1)
    effBuff.SetRemainTime(remainTime)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5002.py
@@ -20,7 +20,7 @@
import IpyGameDataPY
import TurnSkill
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
    effectID = curEffect.GetEffectID()
    buffState = curEffect.GetEffectValue(0)
    needLayers = curEffect.GetEffectValue(1) # 累计达到多少层时才结算
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py
@@ -17,7 +17,7 @@
import TurnBuff
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
    #结算一次扣除1回合
    remainLayer = max(0, effBuff.GetLayer() - 1)
    effBuff.SetLayer(remainLayer)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5011.py
@@ -18,7 +18,7 @@
import TurnSkill
import IpyGameDataPY
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
    skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
    if not skillID:
        passiveSkill = effSkill
@@ -28,8 +28,8 @@
        return
    effectID = curEffect.GetEffectID()
    effSkillID = effSkill.GetSkillID()
    return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID)
    return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID, connBuff)
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
    effSkill = effBuff.GetSkillData().GetIpyData()
    return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
    return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5012.py
@@ -20,7 +20,7 @@
import GameWorld
import ChConfig
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
    rate = curEffect.GetEffectValue(0)
    if not GameWorld.CanHappen(rate):
        #GameWorld.DebugLog("概率进行追击不触发!")
@@ -32,8 +32,8 @@
        passiveSkill = IpyGameDataPY.GetIpyGameData("Skill", skillID)
    if not passiveSkill:
        return
    return TurnSkill.OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Pursue, bySkill=connSkill)
    return TurnSkill.OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Pursue, bySkill=connSkill, byBuff=connBuff)
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
    effSkill = effBuff.GetSkillData().GetIpyData()
    return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
    return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6007.py
New file
@@ -0,0 +1,19 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveTrigger.PassiveEff_6007
#
# @todo:增加技能目标数
# @author hxp
# @date 2025-09-22
# @version 1.0
#
# 详细描述: 增加技能目标数
#
#-------------------------------------------------------------------------------
#"""Version = 2025-09-22 16:00"""
#-------------------------------------------------------------------------------
def GetHappenValue(attacker, defender, curEffect, effSkill, **skillkwargs):
    return curEffect.GetEffectValue(0)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6008.py
New file
@@ -0,0 +1,21 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveTrigger.PassiveEff_6008
#
# @todo:生命值低于x%时免疫控制效果
# @author hxp
# @date 2025-09-22
# @version 1.0
#
# 详细描述: 生命值低于x%时免疫控制效果
#
#-------------------------------------------------------------------------------
#"""Version = 2025-09-22 16:00"""
#-------------------------------------------------------------------------------
def GetHappenValue(attacker, defender, curEffect, effSkill, **skillkwargs):
    lowerThanPer = curEffect.GetEffectValue(0)
    nowPer = attacker.GetHP() / float(attacker.GetMaxHP())
    return 1 if nowPer < lowerThanPer else 0
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -22,6 +22,7 @@
import TurnBuffs
import BattleObj
import ObjPool
import TurnPassive
GameWorld.ImportAll("Script\\Skill\\", "TurnBuffs")
@@ -65,6 +66,13 @@
                           % (curID, skillID, ownerID, relatedSkillID))
        return False
    
    #被动触发免疫控制buff
    if buffSkill.GetSkillType() == ChConfig.Def_SkillType_Action:
        if TurnPassive.GetTriggerEffectValue(turnFight, batObj, buffOwner, ChConfig.PassiveEff_ImmuneControlBuff, buffSkill):
            GameWorld.DebugLog("血量低于百分x时免疫控制buff: curID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s,hp:%s/%s"
                               % (curID, skillID, ownerID, relatedSkillID, batObj.GetHP(), batObj.GetMaxHP()))
            return False
    buffValueList = GetAddBuffValue(turnFight, buffOwner, batObj, buffSkill)
    GameWorld.DebugLog("OnAddBuff: curID=%s,skillID=%s,atkType=%s,buffValueList=%s,ownerID=%s,relatedSkillID=%s" 
                       % (curID, skillID, buffSkill.GetAtkType(), buffValueList, ownerID, relatedSkillID))
@@ -241,6 +249,19 @@
    buffMgr = batObj.GetBuffManager()
    buffID = curBuff.GetBuffID()
    skillData = curBuff.GetSkillData()
    # 先删除buff再触发其他内容,防止当前要删除的buff影响后续触发的内容,如无敌buff等,理论上触发的后续内容无敌buff不应该再生效
    curBuffState = skillData.GetCurBuffState()
    if curBuffState:
        buffMgr.DelBuffState(curBuffState, buffID)
    buffMgr.DelBuff(buffID, release)
    if isSync:
        SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
    if afterLogic and relatedSkill:
        tagObjID = tagObj.GetID() if tagObj else buffObjID
        relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID])
    #buff消失的触发
    for effectIndex in range(0, skillData.GetEffectCount()):
        curEffect = skillData.GetEffect(effectIndex)
@@ -249,32 +270,19 @@
        if not effectID:
            continue
        
        if curEffect.GetTriggerWay():
        triggerWay = curEffect.GetTriggerWay()
        if triggerWay:
            if triggerWay == ChConfig.TriggerWay_BuffDel:
                TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BuffDel, connBuff=curBuff)
            if curEffect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
                haveBuffPassiveEff = True
                
        elif effectID in ChConfig.AttrIDList:
            isRefreshAttr = True
            
        else:
            callFunc = GameWorld.GetExecFunc(TurnBuffs, "Buff_%d.%s" % (effectID, "OnBuffDel"))
            if callFunc:
                callFunc(turnFight, batObj, curBuff, curEffect)
    if haveBuffPassiveEff:
        batObj.GetPassiveEffManager().DelBuffPassiveEffect(buffID)
    curBuffState = skillData.GetCurBuffState()
    if curBuffState:
        buffMgr.DelBuffState(curBuffState, buffID)
    # 最后删除buff、通知
    buffMgr.DelBuff(buffID, release)
    if isSync:
        SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
    if afterLogic and relatedSkill:
        tagObjID = tagObj.GetID() if tagObj else buffObjID
        relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID])
        
    if isRefreshAttr:
        RefreshBuffAttr(batObj)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuffs/BuffAtkType_1003.py
@@ -22,6 +22,6 @@
    calcType = curSkill.GetCalcType()
    skillPer = curSkill.GetSkillPer()
    skillValue = curSkill.GetSkillValue()
    baseValue = TurnSkill.GetCalcBaseValue(calcType, attacker, defender)
    baseValue = TurnSkill.GetCalcBaseValue(calcType, attacker, defender, curSkill)
    shieldValue = int(baseValue * skillPer / 10000.0) + skillValue
    return [shieldValue % ChConfig.Def_PerPointValue, shieldValue / ChConfig.Def_PerPointValue]
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
@@ -31,11 +31,11 @@
    buffEffInfo and GameWorld.DebugLog("    被动Buff效果: %s" % buffEffInfo)
    return
def OnTriggerPassiveEffect(turnFight, batObj, triggerWay, tagObj=None, connSkill=None, connSkillTypeID=0):
def OnTriggerPassiveEffect(turnFight, batObj, triggerWay, tagObj=None, connSkill=None, connSkillTypeID=0, connBuff=None, **kwargs):
    ''' 触发被动效果,可能触发技能、buff,需根据优先级触发
    '''
    passiveEffMgr = batObj.GetPassiveEffManager()
    effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID)
    effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID, connBuff)
    if not effInfoList:
        return
    # [["skill/buff", skillID/buffID, effIDList], ...]
@@ -45,15 +45,15 @@
        sign = effInfo[0]
        if sign == "skill":
            skillID, effIDList = effInfo[1:]
            __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill)
            __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill, connBuff, **kwargs)
            
        elif sign == "buff":
            buffID, effIDList = effInfo[1:]
            __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill)
            __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill, connBuff, **kwargs)
            
    return
def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill=None):
def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill=None, connBuff=None, **kwargs):
    skillMgr = batObj.GetSkillManager()
    effSkill = skillMgr.FindSkillByID(skillID)
    if not effSkill and connSkill and connSkill.GetSkillID() == skillID:
@@ -65,11 +65,11 @@
        curEffect = effSkill.GetEffectByID(effID, triggerWay)
        if not curEffect:
            continue
        DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
        DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
        
    return
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff=None, **kwargs):
    effID = curEffect.GetEffectID()
    if not effID:
        return
@@ -77,12 +77,14 @@
    callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoSkillEffectLogic"))
    if not callFunc:
        return
    callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
    callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
    return
def __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill=None):
def __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill=None, connBuff=None, **kwargs):
    buffMgr = batObj.GetBuffManager()
    effBuff = buffMgr.GetBuff(buffID)
    if not effBuff and connBuff and connBuff.GetBuffID() == buffID:
        effBuff = connBuff
    if not effBuff:
        return
    skillData = effBuff.GetSkillData()
@@ -91,11 +93,11 @@
        curEffect = skillData.GetEffectByID(effID, triggerWay)
        if not curEffect:
            continue
        DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
        DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs)
        
    return
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
    effID = curEffect.GetEffectID()
    if not effID:
        return
@@ -103,10 +105,10 @@
    callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoBuffEffectLogic"))
    if not callFunc:
        return
    callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
    callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs)
    return
def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None):
def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None, **kwargs):
    ''' 获取触发被动的值,一般用于某种条件下才会产生的值,如xx情况下属性变化 或 xx情况下是否发生什么
    @param calcEffID: 需要统计的效果ID,可以是属性ID或者其他自定义效果ID
    @return: 触发的值,0-没有触发或本身触发的值为0;非0-触发的具体值
@@ -159,7 +161,7 @@
            callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "GetHappenValue"))
            if not callFunc:
                continue
            value = callFunc(atkObj, defObj, effect, effSkill)
            value = callFunc(atkObj, defObj, effect, effSkill, **kwargs)
            if value is None:
                continue
            
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -45,7 +45,7 @@
    ## 是否无视防御
    return useSkill.GetHurtType() / 10 == 1 # 2为真伤,待扩展
def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None):
def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None, byBuff=None):
    '''使用技能通用入口
    @param useSkill: 使用的技能,注意并不一定是身上的技能,可能只是 SkillData 表数据
    @param bySkill: 由哪个技能额外触发的,比如附加触发的技能或被动技能均可能由某个技能触发
@@ -61,11 +61,7 @@
    
    #没有指定目标,则按技能自身的目标逻辑
    if not tagObjList:
        tagAim = useSkill.GetTagAim()
        tagFriendly = useSkill.GetTagFriendly()
        tagAffect = useSkill.GetTagAffect()
        tagCount = useSkill.GetTagCount()
        tagObjList = GetSkillTags(turnFight, curBatObj, tagAim, tagFriendly, tagAffect, tagCount)
        tagObjList = GetSkillTags(turnFight, curBatObj, useSkill)
        rate = useSkill.GetHappenRate()
        if rate and rate != ChConfig.Def_MaxRateValue: 
            for tagObj in tagObjList[::-1]:
@@ -99,6 +95,7 @@
    useSkill.SetTagObjList(tagObjList)
    useSkill.SetBatType(batType)
    useSkill.SetBySkill(bySkill)
    useSkill.SetByBuff(byBuff)
    
    isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
    if isTurnNormalSkill:
@@ -153,15 +150,22 @@
        poolMgr.release(useSkill)
    return True
def GetSkillTags(turnFight, curBatObj, tagAim, tagFriendly, tagAffect, tagCount):
def GetSkillTags(turnFight, curBatObj, useSkill):
    ## 获取技能目标
    # @return: [主目标, 目标2, ...]
    tagAim = useSkill.GetTagAim()
    tagFriendly = useSkill.GetTagFriendly()
    tagAffect = useSkill.GetTagAffect()
    tagCount = useSkill.GetTagCount()
    
    curFaction = curBatObj.GetFaction()
    
    # 自己,直接返回
    if tagAim == ChConfig.SkillTagAim_Self:
        return [curBatObj]
    tagCount += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillTagCnt, useSkill)
    
    sneerObj = None # 嘲讽目标
    sneerObjID, sneerObjPosNum = 0, 0
@@ -291,6 +295,11 @@
        if sneerObj in aimObjList and aimObjList.index(sneerObj) != 0:
            aimObjList.remove(sneerObj)
            aimObjList.insert(0, sneerObj)
    # 一定包含自己
    if tagFriendly == 2:
        if curBatObj not in aimObjList:
            aimObjList.append(curBatObj)
            
    if tagCount and len(aimObjList) > tagCount:
        aimObjList = aimObjList[:tagCount]
@@ -977,7 +986,7 @@
    OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
    return
def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0):
def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None):
    '''被动触发使用技能
    @param passiveSkill: 释放的被动技能
    @param connSkill: 由什么技能引起的
@@ -1003,10 +1012,10 @@
            GameWorld.DebugLog("    概率不触发: tagID=%s,happenRate=%s" % (tagID, happenRate))
            return
        passiveTagObjList = [tagObj]
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill)
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff)
    else:
        GameWorld.DebugLog("被动触发技能,重新锁定目标! effSkillID=%s,effectID=%s,passiveSkillID=%s" % (effSkillID, effectID, passiveSkillID))
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill)
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff)
        
    return isOK
@@ -1184,7 +1193,7 @@
    aPursueDamPer /= 10000.0
    
    if calcType != ChConfig.Def_Calc_Attack:
        aAtk = GetCalcBaseValue(calcType, atkObj, defObj)
        aAtk = GetCalcBaseValue(calcType, atkObj, defObj, curSkill)
    GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s,aAddSkillPer=%s" 
                       % (atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, hurtTypes, aAddSkillPer))
    
@@ -1198,6 +1207,9 @@
    elif isDot:
        hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
        GameWorld.DebugLog("    持续技能伤害=%s" % (hurtValue))
    elif calcType == ChConfig.Def_Calc_ByBuffValue:
        hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 2))
        GameWorld.DebugLog("    按最后一次buff值计算伤害=%s,calcType=%s,LastHurt=%s" % (hurtValue, calcType, aAtk))
    elif calcType != ChConfig.Def_Calc_Attack:
        hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 1))
        GameWorld.DebugLog("    非按攻击力伤害=%s,calcType=%s,aAtk=%s" % (hurtValue, calcType, aAtk))
@@ -1221,6 +1233,13 @@
        hurtValueMax = aAtk * hurtAtkPerMax / 10000.0
        hurtValue = min(hurtValue, hurtValueMax)
        GameWorld.DebugLog("    伤害最高限制: hurtValue=%s,hurtAtkPerMax=%s,aAtk=%s" % (hurtValue, hurtAtkPerMax, aAtk))
    # 均摊
    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
    if hurtShareEff:
        tagCnt = max(1, len(curSkill.GetTagObjList()))
        hurtValue = hurtValue / tagCnt
        GameWorld.DebugLog("    目标均摊伤害: hurtValue=%s,tagCnt=%s" % (hurtValue, tagCnt))
        
    hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后
    return hurtValue, hurtTypes
@@ -1399,9 +1418,22 @@
    skillPer = curSkill.GetSkillPer()
    #skillValue = curSkill.GetSkillValue()
    
    cureBaseValue = GetCalcBaseValue(cureType, userObj, tagObj)
    skillPer += TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
    cureHP = __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum)
    cureWayExEff = curSkill.GetEffectByID(ChConfig.SkillEff_CureWayEx)
    if cureWayExEff:
        cureType = cureWayExEff.GetEffectValue(0)
        skillPer = cureWayExEff.GetEffectValue(1)
        GameWorld.DebugLog("额外计算治疗方式: cureType=%s,skillPer=%s" % (cureType, skillPer))
        cureHPEx = __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum)
        cureHP += cureHPEx
    return max(1, int(cureHP)) # 保底1点
def __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum=False):
    cureBaseValue = GetCalcBaseValue(cureType, userObj, tagObj, curSkill)
    
    # 回合制
    curePer = 0 # 治疗加成
@@ -1430,8 +1462,9 @@
                       % (cureHP, curSkill.GetSkillID(), cureType, baseValue, skillPer, curePer, cureDefPer, angerOverflow))
    return cureHP
def GetCalcBaseValue(calcType, curObj, tagObj):
def GetCalcBaseValue(calcType, curObj, tagObj, curSkill):
    ##获得基础计算值
    baseValue = 0
    if calcType == ChConfig.Def_Calc_Attack:
        baseValue = curObj.GetAtk()
    elif calcType == ChConfig.Def_Calc_MaxHP:
@@ -1440,6 +1473,11 @@
        baseValue = curObj.GetLastHurtValue()
    elif calcType == ChConfig.Def_Calc_TagMaxHP:
        baseValue = 0 if not tagObj else tagObj.GetMaxHP()
    elif calcType == ChConfig.Def_Calc_ByBuffValue:
        byBuff = curSkill.GetByBuff()
        if byBuff:
            baseValue = byBuff.GetValue1() + byBuff.GetValue2() * ChConfig.Def_PerPointValue
            GameWorld.DebugLog("根据buff值: %s" % baseValue)
    return baseValue
def DoDOTAttack(turnFight, batObj, curBuff, hurtValue, hurtTypes):