From 1ea73e1885835466265ce788d93556b7030ee0e8 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期日, 30 十二月 2018 18:42:00 +0800 Subject: [PATCH] 5424 【后端】【1.4】跨服竞技场开发(GM工具增加子服服务器维护,文字翻译版) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 164 insertions(+), 0 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py index e4e37db..319aa2a 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py @@ -276,6 +276,10 @@ def GetTriggerTypeByEffectID(effectID): # 临时配置 tdict = { + 2102:ChConfig.TriggerType_BeAttackOver, # 被攻击后触发 20 + 2104:ChConfig.TriggerType_LockHP, # 锁血触发技能 63 + 2105:ChConfig.TriggerType_BeLuckyHit, # 被会心一击触发技能 64 + 4000:ChConfig.TriggerType_BuffState, # 进入4012的某个状态触发技能 2 4001:ChConfig.TriggerType_TagBuffState, # 目标进入4012的某个状态触发技能 2 4002:ChConfig.TriggerType_AddDamagePer, # 提高增加伤害属性值,计算时 3 @@ -336,6 +340,14 @@ 4058:ChConfig.TriggerType_AddBuffOver, # 添加buff之后触发技能 56 4059:ChConfig.TriggerType_StormAttackOneByOne, # 类剑刃风暴攻击1对1触发技能 57 4060:ChConfig.TriggerType_StormAttackOver, # 类剑刃风暴攻击后触发技能 57 + 4061:ChConfig.TriggerType_AttackOverPassive, # 攻击(对敌技能)后被动技能被触发在其他被动效果处理后调用,触发顺序原因 + 4062:ChConfig.TriggerType_AttackAddFinalPer, # 增加最终伤害百分比 59 + 4063:ChConfig.TriggerType_SummonDie, #自身召唤兽死亡触发技能 60 + 4064:ChConfig.TriggerType_GiftReduceCD, # 天赋减少CD9, #CD + 4065:ChConfig.TriggerType_DamageReducePVP, # PVP减少伤害 + 4066:ChConfig.TriggerType_AddDamagePer, # 提高增加伤害属性值,计算时 3 + 4067:ChConfig.TriggerType_ProDefValue, # 神兵护盾值下降时 62 + 4068:ChConfig.TriggerType_LockHP, # 锁血触发技能 63 } return tdict.get(effectID, -1) #=========================================================================== @@ -372,8 +384,11 @@ 4518:ChConfig.TriggerType_ForbidenCure, # BUFF类: 禁止治疗 53 4519:ChConfig.TriggerType_WillDead, # BUFF类: 进入濒死状态 25 4520:ChConfig.TriggerType_AddLayer, # BUFF类: 目标BUFF层级增加时 52 + 4521:ChConfig.TriggerType_BeLuckyHitSubPer, # 减少受到的会心伤害 65 + 803:ChConfig.TriggerType_BloodShield, # 血盾 806:ChConfig.TriggerType_BloodShield, # 血盾 + 807:ChConfig.TriggerType_BloodShield, # 血盾 808:ChConfig.TriggerType_BloodShield, # 血盾 } return tdict.get(effectID, -1) @@ -765,6 +780,155 @@ return GameWorld.GetObj(curHurt.GetObjID(), curHurt.GetObjType()) +# 多种被动技能优先触发释放一个,如被动 血量40%触发无敌技能,血量一定是停留在40% +# 先锁血,后触发技能 同 DelayUsePassiveTriggerSkill 使用 +def OnPassiveSkillLockHP(attacker, defender, connSkill, triggerType, tick, isEnhanceSkill=False): + attacker = FindRealAttacker(attacker) + if not attacker: + return 0, 0 + + stopPassiveSkill = False # 被动技能不能再触发被动技能,但可以触发天赋技能 + if connSkill: + if not connSkill.GetFuncType(): + # 非功能类技能,避免死循环 + return 0, 0 + if SkillCommon.isPassiveSkill(connSkill): + stopPassiveSkill = True + + if SkillCommon.GetUsingPassiveSkill(attacker) and triggerType != ChConfig.TriggerType_BuffState: + # 防范被动技能触发的 非被动技能 + stopPassiveSkill = True + + passiveEff = GetPassiveEffManager().GetPassiveEff(attacker) + if not passiveEff: + return 0, 0 + + connSkillID = connSkill.GetSkillTypeID() if connSkill else 0 + skills = passiveEff.GetPassiveSkillsByTriggerType(triggerType, connSkillID) + if not skills: + return 0, 0 + + defender = GetPassiveDefender(attacker, defender) + + # 当前战斗关系 pvp pve + battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender) + #GameWorld.DebugLog("OnPriorityPassiveSkillTrigger-----------%s-%s"%(skills, battleRelationType)) + + lockHPPerMax = 0 ## 取有效的最高血量 + lockHPSkillID = 0 + for skillTypeID, effectID in skills: + if connSkillID == skillTypeID: + continue + curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID) + if not curSkill: + continue + + if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill: + # 只有天赋才可以再次被触发 + continue + + effect = SkillCommon.GetSkillEffectByEffectID(curSkill, effectID) + if not effect: + continue + + if SkillCommon.RefreshSkillRemainTime(curSkill, tick): + continue + + skillBattleType = SkillCommon.GetSkillBattleType(curSkill) + if not AttackCommon.CheckBattleRelationType(skillBattleType, battleRelationType): + # PK模式的判定 + continue + + pyName = "PassiveSkill_%s" % effectID + callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen")) + if not callFunc: + continue + if not callFunc(attacker, defender, effect, curSkill): + continue + + # 最终取最高值来决定当前生命值,卡血设定 + if effect.GetEffectValue(0) > lockHPPerMax: + lockHPPerMax = effect.GetEffectValue(0) + lockHPSkillID = skillTypeID + + return lockHPSkillID, lockHPPerMax + + +# 锁血功能的技能 含人物和宠物 +def OnObjsPassiveSkillLockHP(attacker, defender, connSkill, triggerType, tick,): + if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer: + return 0 + + lockHPSkillID, lockHPPerMax = OnPassiveSkillLockHP(attacker, defender, connSkill, triggerType, tick) + rolePet = attacker.GetPetMgr().GetFightPet() + if rolePet: + lockHPSkillIDPet, lockHPPerMaxPet = OnPassiveSkillLockHP(rolePet, defender, connSkill, triggerType, tick) + + if lockHPPerMax + lockHPPerMaxPet == 0: + # 无触发 + return 0 + + # 触发宠物技能标志 + if lockHPPerMaxPet > lockHPPerMax: + rolePet.SetDict(ChConfig.Def_PlayerKey_LockHPSkillID, lockHPSkillIDPet) + return lockHPPerMaxPet + + if lockHPPerMax == 0: + return 0 + + # 触发人物技能标志 + attacker.SetDict(ChConfig.Def_PlayerKey_LockHPSkillID, lockHPSkillID) + return lockHPPerMax + + +# 从伤血延后到技能结束触发被动技能 +def DelayUsePassiveTriggerSkill(attacker, curSkill, defender, tick): + if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer: + return + + # 检查是宠物还是人物技能 + skillTypeID = attacker.GetDictByKey(ChConfig.Def_PlayerKey_LockHPSkillID) + if not skillTypeID: + rolePet = attacker.GetPetMgr().GetFightPet() + if not rolePet: + return + skillTypeID = rolePet.GetDictByKey(ChConfig.Def_PlayerKey_LockHPSkillID) + if not skillTypeID: + return + attacker = rolePet + GameWorld.DebugLog("DelayUsePassiveTriggerSkill-----pet") + + # 一定要清标志 + attacker.SetDict(ChConfig.Def_PlayerKey_LockHPSkillID, 0) + + curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID) + if not curSkill: + return + + GameWorld.DebugLog("DelayUsePassiveTriggerSkill-----skillTypeID-%s"%skillTypeID) + # 设置标志避免被动技能触发被动技能, 被动当中可能会触发多种类型技能,故不用isPassiveSkill做屏蔽 + SkillCommon.SetUsingPassiveSkill(attacker, 1) + if not SkillShell.UsePassiveTriggerSkill(attacker, curSkill, defender, tick): + # 不管技能是否是否成功都必须进入CD + SkillCommon.SetSkillRemainTime(curSkill, PlayerControl.GetReduceSkillCDPer(attacker), tick, attacker) + + SkillCommon.SetUsingPassiveSkill(attacker, 0) + return + + +# 灵宠部分技能需要通过主人触发,灵宠自己触发的逻辑依然走 OnPassiveSkillTrigger +def OnPetPassiveSkillTrigger(attacker, defender, connSkill, triggerType, tick): + if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer: + return + + rolePet = attacker.GetPetMgr().GetFightPet() + #无出战宠物 + if rolePet == None: + return + + OnPassiveSkillTrigger(rolePet, defender, connSkill, triggerType, tick) + + # 被动技能触发释放 def OnPassiveSkillTrigger(attacker, defender, connSkill, triggerType, tick, isEnhanceSkill=False, skillIDSet=None): attacker = FindRealAttacker(attacker) -- Gitblit v1.8.0