From a410c052ad4992ca846e3e30f0ccf9ab0b85a1d7 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 17 九月 2025 17:14:32 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(甄姬、曹操技能;增加本次技能万分比效果ID6004;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py |  162 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 160 insertions(+), 2 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 24321a0..f91000e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
@@ -17,9 +17,167 @@
 
 import GameWorld
 import PassiveTrigger
+import ChConfig
 
 GameWorld.ImportAll("Script\\Skill\\", "PassiveTrigger")
 
-
 def RefreshPassive(batObj):
-    return
\ No newline at end of file
+    ''' 刷新被动效果,一般可能存在于技能或buff中
+    '''
+    passiveEffMgr = batObj.GetPassiveEffManager()
+    skillEffInfo = passiveEffMgr.RefreshSkillPassiveEffect()
+    buffEffInfo = passiveEffMgr.RefreshBuffPassiveEffect()
+    skillEffInfo and GameWorld.DebugLog("    被动技能效果: %s" % skillEffInfo)
+    buffEffInfo and GameWorld.DebugLog("    被动Buff效果: %s" % buffEffInfo)
+    return
+
+def OnTriggerPassiveEffect(turnFight, batObj, triggerWay, tagObj=None, connSkill=None, connSkillTypeID=0):
+    ''' 触发被动效果,可能触发技能、buff,需根据优先级触发
+    '''
+    passiveEffMgr = batObj.GetPassiveEffManager()
+    effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID)
+    if not effInfoList:
+        return
+    # [["skill/buff", skillID/buffID, effIDList], ...]
+    tagID = tagObj.GetID() if tagObj else 0
+    GameWorld.DebugLog("触发被动: triggerWay=%s,objID=%s,tagID=%s,%s" % (triggerWay, batObj.GetID(), tagID, effInfoList))
+    for effInfo in effInfoList:
+        sign = effInfo[0]
+        if sign == "skill":
+            skillID, effIDList = effInfo[1:]
+            __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill)
+            
+        elif sign == "buff":
+            buffID, effIDList = effInfo[1:]
+            __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill)
+            
+    return
+
+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
+    
+    for effID in effIDList:
+        curEffect = effSkill.GetEffectByID(effID, triggerWay)
+        if not curEffect:
+            continue
+        DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
+        
+    return
+
+def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
+    effID = curEffect.GetEffectID()
+    if not effID:
+        return
+    pyName = "PassiveEff_%s" % effID
+    callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoSkillEffectLogic"))
+    if not callFunc:
+        return
+    callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
+    return
+
+def __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill=None):
+    buffMgr = batObj.GetBuffManager()
+    effBuff = buffMgr.GetBuff(buffID)
+    if not effBuff:
+        return
+    skillData = effBuff.GetSkillData()
+    
+    for effID in effIDList:
+        curEffect = skillData.GetEffectByID(effID, triggerWay)
+        if not curEffect:
+            continue
+        DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
+        
+    return
+
+def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
+    effID = curEffect.GetEffectID()
+    if not effID:
+        return
+    pyName = "PassiveEff_%s" % effID
+    callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoBuffEffectLogic"))
+    if not callFunc:
+        return
+    callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
+    return
+
+def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None):
+    ''' 获取触发被动的值,一般用于某种条件下才会产生的值,如xx情况下属性变化 或 xx情况下是否发生什么
+    @param calcEffID: 需要统计的效果ID,可以是属性ID或者其他自定义效果ID
+    @return: 触发的值,0-没有触发或本身触发的值为0;非0-触发的具体值
+    '''
+    
+    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