From 957597f4baf9db39d67dfc37f09757d269cd9ec0 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 26 九月 2025 11:32:47 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(孙策技能;按回合触发伤害的dot支持单buff可算多层伤害;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 164 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..243507f 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,171 @@ 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, connBuff=None, **kwargs): + ''' 触发被动效果,可能触发技能、buff,需根据优先级触发 + ''' + passiveEffMgr = batObj.GetPassiveEffManager() + effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID, connBuff) + 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, connBuff, **kwargs) + + elif sign == "buff": + buffID, effIDList = effInfo[1:] + __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill, connBuff, **kwargs) + + return + +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: + 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, connBuff, **kwargs) + + return + +def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff=None, **kwargs): + 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, connBuff, **kwargs) + return + +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() + + for effID in effIDList: + curEffect = skillData.GetEffectByID(effID, triggerWay) + if not curEffect: + continue + DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs) + + return + +def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs): + 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, connBuff, **kwargs) + return + +def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None, connSkillTypeID=0, **kwargs): + ''' 获取触发被动的值,一般用于某种条件下才会产生的值,如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, connSkillTypeID) + 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 + 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 + effBuff = None + 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, effBuff, **kwargs) + if value is None: + continue + + if effID in ChConfig.PassiveEffHappenValueList: + if value: + GameWorld.DebugLog("统计被动效果值: calcEffID=%s,objID=%s,tagID=%s,%s,curValue=%s" % (calcEffID, atkObj.GetID(), tagID, effInfoList, 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) + + GameWorld.DebugLog("统计被动效果值: calcEffID=%s,objID=%s,tagID=%s,%s,curValue=%s" % (calcEffID, atkObj.GetID(), tagID, effInfoList, curValue)) + return curValue + -- Gitblit v1.8.0