From f6e55772b80bf536223e6e949e28fb7b1812a54d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 19 九月 2025 12:02:36 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(甘夫人潜能1、3;增加使用技能后触发方式9;层级buff属性支持;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py |  160 +++++++++++++++++++++++++----------------------------
 1 files changed, 76 insertions(+), 84 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
index 03f9397..f91000e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
@@ -35,9 +35,7 @@
     ''' 触发被动效果,可能触发技能、buff,需根据优先级触发
     '''
     passiveEffMgr = batObj.GetPassiveEffManager()
-    if not connSkillTypeID and connSkill:
-        connSkillTypeID = connSkill.GetSkillTypeID()
-    effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkillTypeID)
+    effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID)
     if not effInfoList:
         return
     # [["skill/buff", skillID/buffID, effIDList], ...]
@@ -58,6 +56,8 @@
 def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill=None):
     skillMgr = batObj.GetSkillManager()
     effSkill = skillMgr.FindSkillByID(skillID)
+    if not effSkill and connSkill and connSkill.GetSkillID() == skillID:
+        effSkill = connSkill
     if not effSkill:
         return
     
@@ -106,86 +106,78 @@
     callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
     return
 
-def GetTriggerPassiveValue(batObj, triggerType, tagObj=None, useSkill=None):
+def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None):
     ''' 获取触发被动的值,一般用于某种条件下才会产生的值,如xx情况下属性变化 或 xx情况下是否发生什么
-    @return: 触发的值,0-没有触发或本身触发的值为0;大于0-触发的具体值
+    @param calcEffID: 需要统计的效果ID,可以是属性ID或者其他自定义效果ID
+    @return: 触发的值,0-没有触发或本身触发的值为0;非0-触发的具体值
     '''
-    return 0
-#    attacker = FindRealAttacker(attacker)
-#    if not attacker:
-#        return 0
-#    
-#    stopPassiveSkill = False   # 被动技能不能再触发被动技能,但可以触发天赋技能
-#    if useSkill and SkillCommon.isPassiveSkill(useSkill) and isStopPassiveSkill:
-#        #GameWorld.DebugLog("被动技能不能再次触发被动技能")
-#        #return 0
-#        if not PassPassiveLimit(useSkill):
-#            stopPassiveSkill = True
-#
-#
-#    passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)
-#    if not passiveEff:
-#        return 0
-#    buffDict = passiveEff.GetBuffsByTriggerType(triggerType)
-#    if not buffDict:
-#        return 0
-#    
-#    # 当前战斗关系 pvp pve
-#    battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)
-#    if not AttackCommon.CheckBattleRelationType(attacker, defender, useSkill, battleRelationType):
-#        return 0
-#    
-#    useSkillID = useSkill.GetSkillID() if useSkill else 0
-#    #tick = GameWorld.GetGameWorld().GetTick()
-#    curValue = 0
-#    
-#    for skillID, effectList in buffDict.items():
-#        if skillID == useSkillID:
-#            continue
-#        curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
-#        if not curSkill:
-#            continue
-#        
-#        if not IsValidPassiveSkill(curSkill):
-#            continue
-#        
-#        triggerCount = 0 # 成功触发次数
-#        for effectInfo in effectList:
-#            if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
-#                # 只有天赋才可以再次被触发
-#                continue 
-#            passiveEffect = effectInfo[0]
-#            # 被动触发的技能
-#            pyName = "PassiveBuff_%s"%passiveEffect.GetEffectID()
-#            
-#            callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))
-#            if not callFunc:
-#                continue
-#            
-#            # 条件不满足
-#            if not callFunc(attacker, defender, passiveEffect, skillID, useSkill=useSkill, ownerID=effectInfo[1], ownerType=effectInfo[2]):
-#                continue
-#            
-#            callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "GetValue"))
-#            if callFunc is None:
-#                continue
-#            
-#            # 如被动技能:千幻冥炎真实伤害从2变4倍
-#            #curValue += GetPassiveSkillValueByTriggerType(attacker, defender, curSkill, ChConfig.TriggerType_PassiveBuffValue)
-#            value = callFunc(attacker, defender, passiveEffect)
-#            if triggerType in TriggerValueMaxList:
-#                curValue = max(curValue, value) # 取最大值
-#            elif triggerType in TriggerValueMinList:
-#                if not curValue:
-#                    curValue = value
-#                elif value > 0:
-#                    curValue = min(curValue, value) # 取最小值
-#            else:
-#                curValue += value
-#                
-#            triggerCount += 1
-#            
-#        if triggerCount:
-#            OnTriggerBuffDel(attacker, curSkill, triggerCount)
-#            
-#    return curValue
+    
+    triggerWay = ChConfig.TriggerWay_CalcEffValue
+    passiveEffMgr = atkObj.GetPassiveEffManager()
+    effInfoList = passiveEffMgr.GetPassiveEffByTrigger("%s_%s" % (triggerWay, calcEffID), connSkill)
+    if not effInfoList:
+        return 0
+    
+    curValue = 0
+    skillMgr = atkObj.GetSkillManager()
+    buffMgr = atkObj.GetBuffManager()
+    # [["skill/buff", skillID/buffID, effIDList], ...]
+    tagID = defObj.GetID() if defObj else 0
+    GameWorld.DebugLog("统计被动效果值: calcEffID=%s,objID=%s,tagID=%s,%s" % (calcEffID, atkObj.GetID(), tagID, effInfoList))
+    for effInfo in effInfoList:
+        sign = effInfo[0]
+        if sign == "skill":
+            skillID, effIDList = effInfo[1:]
+            effSkill = skillMgr.FindSkillByID(skillID)
+            if not effSkill and connSkill and connSkill.GetSkillID() == skillID:
+                effSkill = connSkill
+        elif sign == "buff":
+            buffID, effIDList = effInfo[1:]
+            effBuff = buffMgr.GetBuff(buffID)
+            if not effBuff:
+                continue
+            effSkill = effBuff.GetSkillData()
+        else:
+            continue
+        
+        if not effSkill:
+            continue
+        
+        for effID in effIDList:
+            effect = effSkill.GetEffectByID(effID, triggerWay)
+            if not effect:
+                continue
+            effID = effect.GetEffectID()
+            if not effID or effID != calcEffID:
+                continue
+            
+            if effID in ChConfig.AttrIDList:
+                pyName = "PassiveEff_Attr"
+            else:
+                pyName = "PassiveEff_%s" % effID
+                
+            callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "GetHappenValue"))
+            if not callFunc:
+                continue
+            value = callFunc(atkObj, defObj, effect, effSkill)
+            if value is None:
+                continue
+            
+            if effID in ChConfig.PassiveEffHappenValueList:
+                if value:
+                    return value
+            elif effID in ChConfig.PassiveEffValueMaxList:
+                curValue = max(curValue, value) # 取最大值
+            elif effID in ChConfig.PassiveEffValueMinList:
+                if not curValue:
+                    curValue = value
+                elif value > 0:
+                    curValue = min(curValue, value) # 取最小值
+            else:
+                curValue += value
+            #if skillTypeID not in Def_PassiveSkillValueNoCD:
+            #    if curSkill.GetCoolDownTime():
+            #        SkillCommon.SetSkillRemainTime(curSkill, 0, tick, attacker)
+            
+    return curValue
+

--
Gitblit v1.8.0