From 0323f1602690cba6522523d968b5ed2032dccba2 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 16 九月 2025 14:37:45 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(李典技能;被动触发支持增加击晕概率;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py | 210 ++++++++++++++++++++++++++-------------------------- 1 files changed, 106 insertions(+), 104 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 5dfbcf4..9891021 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py @@ -31,147 +31,149 @@ buffEffInfo and GameWorld.DebugLog(" 被动Buff效果: %s" % buffEffInfo) return -def OnTriggerPassiveEffect(turnFight, batObj, triggerType, tagObj=None, connSkill=None, connSkillTypeID=0): +def OnTriggerPassiveEffect(turnFight, batObj, triggerWay, tagObj=None, connSkill=None, connSkillTypeID=0): ''' 触发被动效果,可能触发技能、buff,需根据优先级触发 ''' passiveEffMgr = batObj.GetPassiveEffManager() if not connSkillTypeID and connSkill: connSkillTypeID = connSkill.GetSkillTypeID() - effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerType, connSkillTypeID) + effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkillTypeID) if not effInfoList: return # [["skill/buff", skillID/buffID, effIDList], ...] tagID = tagObj.GetID() if tagObj else 0 - GameWorld.DebugLog("触发被动: triggerType=%s,objID=%s,tagID=%s,%s" % (triggerType, batObj.GetID(), tagID, effInfoList)) + 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, skillID, effIDList, connSkill) + __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill) elif sign == "buff": buffID, effIDList = effInfo[1:] - __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, buffID, effIDList, connSkill) + __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill) return -def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, skillID, effIDList, connSkill=None): +def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill=None): skillMgr = batObj.GetSkillManager() effSkill = skillMgr.FindSkillByID(skillID) if not effSkill: return for effID in effIDList: - curEffect = effSkill.GetEffectByID(effID) + curEffect = effSkill.GetEffectByID(effID, triggerWay) if not curEffect: continue - pyName = "PassiveEff_%s" % effID - callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoSkillEffectLogic")) - if not callFunc: - continue - callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill) + DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill) return -def __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, buffID, effIDList, connSkill=None): - buffMgr = batObj.GetBuffManager() - curBuff = buffMgr.GetBuff(buffID) - if not curBuff: +def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill): + effID = curEffect.GetEffectID() + if not effID: return - skillData = curBuff.GetSkillData() + 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) + curEffect = skillData.GetEffectByID(effID, triggerWay) if not curEffect: continue - pyName = "PassiveEff_%s" % effID - callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoBuffEffectLogic")) - if not callFunc: - continue - callFunc(turnFight, batObj, tagObj, curBuff, curEffect, connSkill) + DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill) return -def GetTriggerPassiveValue(batObj, triggerType, tagObj=None, useSkill=None): +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情况下是否发生什么 - @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() + connSkillTypeID = connSkill.GetSkillTypeID() if connSkill else 0 + effInfoList = passiveEffMgr.GetPassiveEffByTrigger("%s_%s" % (triggerWay, calcEffID), 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 + 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) + 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 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 + #if skillTypeID not in Def_PassiveSkillValueNoCD: + # if curSkill.GetCoolDownTime(): + # SkillCommon.SetSkillRemainTime(curSkill, 0, tick, attacker) + + return curValue + -- Gitblit v1.8.0