From 8de6a6994a0dd623514899310e415269d42e4685 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 20 三月 2019 16:11:59 +0800
Subject: [PATCH] 6382 【后端】【2.0】功能是否绑定及拍品优化调整(部分绑定修改为是否拍品)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveBuffEffMng.py | 254 +++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 217 insertions(+), 37 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 4cac370..116989f 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,11 @@
def GetTriggerTypeByEffectID(effectID):
# 临时配置
tdict = {
+ 2102:ChConfig.TriggerType_BeAttackOver, # 被攻击后触发 20
+ 2104:ChConfig.TriggerType_LockHP, # 锁血触发技能 63
+ 2105:ChConfig.TriggerType_BeLuckyHit, # 被会心一击触发技能 64
+ 2106:ChConfig.TriggerType_BeSuperHit, # 被暴击触发技能
+
4000:ChConfig.TriggerType_BuffState, # 进入4012的某个状态触发技能 2
4001:ChConfig.TriggerType_TagBuffState, # 目标进入4012的某个状态触发技能 2
4002:ChConfig.TriggerType_AddDamagePer, # 提高增加伤害属性值,计算时 3
@@ -340,6 +345,17 @@
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
+ 4069:ChConfig.TriggerType_ZhongjiZhansha, # 终极斩杀 64
+ 4070:ChConfig.TriggerType_DebuffOff, # 抵消一次debuff 23
+ 4071:ChConfig.TriggerType_Buff_SuckBloodPer, # 攻击 百分比吸血
+ 4072:ChConfig.TriggerType_SuperHitSkipCD, # 暴击无冷却 68
+ 4073:ChConfig.TriggerType_BuffHurtCnt, # 当持续buff伤害第X次时触发技能 69
+ 4074:ChConfig.TriggerType_BounceHP, # 反弹伤害固定值14, 记录值
+ 4075:ChConfig.TriggerType_4074PerValue, # 增加4074的反弹比例
}
return tdict.get(effectID, -1)
#===========================================================================
@@ -364,20 +380,27 @@
4506:ChConfig.TriggerType_BeAttackOver, # BUFF类:被攻击触发技能 只刷新属性 不触发技能
4507:ChConfig.TriggerType_Buff_AddSuperHitRate, # BUFF类:增加暴击率
4508:ChConfig.TriggerType_Buff_AttackSubLayer, # BUFF类:攻击减buff层,0消失
- 4514:ChConfig.TriggerType_Buff_BeAttackSubLayer, # BUFF类:被攻击减buff层,0消失
4509:ChConfig.TriggerType_Buff_SuckBloodPer, # BUFF类: 百分比吸血, 此处非属性类
4510:ChConfig.TriggerType_Buff_MustBeHit, # BUFF类: 无视闪避必中
4511:ChConfig.TriggerType_AttackAddFinalValue, #攻击增加输出伤害11
4512:ChConfig.TriggerType_ReduceHurtHPPer, # 百分比减少攻击计算后伤害
4513:ChConfig.TriggerType_AttackAddFinalValue, #攻击增加输出伤害11
+ 4514:ChConfig.TriggerType_Buff_BeAttackSubLayer, # BUFF类:被攻击减buff层,0消失
4515:ChConfig.TriggerType_AddIceAtkPer, # BUFF类:攻击附加真实伤害百分比
4516:ChConfig.TriggerType_ChangeHurtToHP, # BUFF类:buff中把受到伤害的xx%转化为生命值
4517:ChConfig.TriggerType_DebuffOff, # BUFF类: 抵消debuff
4518:ChConfig.TriggerType_ForbidenCure, # BUFF类: 禁止治疗 53
4519:ChConfig.TriggerType_WillDead, # BUFF类: 进入濒死状态 25
4520:ChConfig.TriggerType_AddLayer, # BUFF类: 目标BUFF层级增加时 52
+ 4521:ChConfig.TriggerType_BeLuckyHitSubPer, # 减少受到的会心伤害 65
+ 4522:ChConfig.TriggerType_DebuffOff, # BUFF类: 抵消debuff
+ 4523:ChConfig.TriggerType_SuperHitSkillPer, # 暴击时,增加技能伤害 10
+ 4524:ChConfig.TriggerType_SuperHitSubLayer, # 暴击减层 67
+ 4525:ChConfig.TriggerType_SuperHitSkipCD, # 暴击无冷却 68
+
803:ChConfig.TriggerType_BloodShield, # 血盾
806:ChConfig.TriggerType_BloodShield, # 血盾
+ 807:ChConfig.TriggerType_BloodShield, # 血盾
808:ChConfig.TriggerType_BloodShield, # 血盾
}
return tdict.get(effectID, -1)
@@ -716,36 +739,6 @@
return PyGameData.g_PassiveEffManager
-## 当前释放技能 skillData
-#def CalcBuffTriggerSkill(attacker, skillData, target, tick):
-# #===========================================================================
-# # passiveEff = GetPassiveEffManager().GetPassiveEff(attacker, False)
-# # if not passiveEff:
-# # return
-# # #影响技能的BUFF
-# # buffTriggerSkillDict = passiveEff.GetBuffTriggerSkill(skillData.GetSkillID())
-# # if not buffTriggerSkillDict:
-# # return
-# #
-# # passiveEff.CalcBuffTriggerSkill(attacker, target, skillData, buffTriggerSkillDict, tick)
-# #===========================================================================
-# OnPassiveSkillTrigger(attacker, target, ChConfig.TriggerType_AttackOver, tick)
-
-#===============================================================================
-# # 判断PK关系是否可攻击 Def_BattleRelationType_CommNoBoss也可攻击 只是攻击无效果
-# def CheckBattleRelationType(skillBattleType, battleRelationType):
-# if skillBattleType in [ChConfig.Def_BattleRelationType_Comm, ChConfig.Def_BattleRelationType_CommNoBoss]:
-# return True
-#
-# #if battleRelationType in [ChConfig.Def_BattleRelationType_Comm, ChConfig.Def_BattleRelationType_CommNoBoss]:
-# # return True
-#
-# if skillBattleType != battleRelationType:
-# # PK模式的判定
-# return False
-# return True
-#===============================================================================
-
# 查找被动技能时的对象
def GetPassiveDefender(attacker, defender):
# 寻找被击者,1.目标排除是自己(后面逻辑会更换) 2. 查客户端伤害队列,3.查服务端伤害队列
@@ -767,7 +760,167 @@
return
return GameWorld.GetObj(curHurt.GetObjID(), curHurt.GetObjType())
+
+# 当前有效被动触发技能, 可用于基础使用判定
+def IsValidPassiveSkill(curSkill):
+ validMap = SkillShell.GetAttrMapID(curSkill)
+ if validMap and validMap != GameWorld.GetMap().GetMapID():
+ # 有效地图可触发
+ return False
+
+ return True
+
+# 多种被动技能优先触发释放一个,如被动 血量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 not IsValidPassiveSkill(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):
@@ -813,6 +966,9 @@
if not curSkill:
continue
+ if not IsValidPassiveSkill(curSkill):
+ continue
+
if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
# 只有天赋才可以再次被触发
continue
@@ -908,6 +1064,10 @@
curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)
if not curSkill:
continue
+
+ if not IsValidPassiveSkill(curSkill):
+ continue
+
if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
# 只有天赋才可以再次被触发
continue
@@ -971,6 +1131,9 @@
if not curSkill:
continue
+ if not IsValidPassiveSkill(curSkill):
+ continue
+
effect = SkillCommon.GetSkillEffectByEffectID(curSkill, effectID)
if not effect:
continue
@@ -1014,6 +1177,9 @@
continue
curSkill = attacker.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)
if not curSkill:
+ continue
+
+ if not IsValidPassiveSkill(curSkill):
continue
effect = SkillCommon.GetSkillEffectByEffectID(curSkill, effectID)
@@ -1063,6 +1229,13 @@
for skillID, effectList in buffDict.items():
if tagSkillID == skillID:
+ continue
+
+ curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
+ if not curSkill:
+ continue
+
+ if not IsValidPassiveSkill(curSkill):
continue
for passiveEffect in effectList:
# 被动触发的技能
@@ -1123,15 +1296,19 @@
for skillID, effectList in buffDict.items():
if skillID == useSkillID:
continue
+ curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
+ if not curSkill:
+ continue
+
+ if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
+ # 只有天赋才可以再次被触发
+ continue
+
+ if not IsValidPassiveSkill(curSkill):
+ continue
for passiveEffect in effectList:
# 被动触发的技能
pyName = "PassiveBuff_%s"%passiveEffect.GetEffectID()
- curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
- if not curSkill:
- continue
- if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
- # 只有天赋才可以再次被触发
- continue
callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))
if not callFunc:
continue
@@ -1203,6 +1380,9 @@
if not curSkill:
continue
+ if not IsValidPassiveSkill(curSkill):
+ continue
+
for passiveEffect in effectList:
if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
# 只有天赋才可以再次被触发
--
Gitblit v1.8.0