6632 子 【开发】增加新的符印属性 / 【后端】增加新的符印属性
6603 【后端】【2.0】增加新版的sp和被动技能 - 法爆 灼烧定义
| | |
| | | superHitRate = eval(ReadChConfig.GetChConfig("CalcSuperHitRate"))
|
| | | superHitRate += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, None,
|
| | | ChConfig.TriggerType_Buff_AddSuperHitRate)
|
| | | superHitRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, None, |
| | | ChConfig.TriggerType_Buff_AddSuperHitRate)
|
| | | if superHitRate <= 0:
|
| | | return
|
| | | if GameWorld.CanHappen(superHitRate):
|
| | |
| | | SetFirstDefender(atkObj, defObj, curSkill)
|
| | |
|
| | | resultHurtType = HurtType()
|
| | | atkObjType = attacker.GetGameObjType()
|
| | | defObjType = defObj.GetGameObjType()
|
| | | dHP = GameObj.GetHP(defObj) # 防守方当前血量
|
| | | dMaxHP = GameObj.GetMaxHP(defObj) # 防守方最大血量
|
| | | |
| | | # 当技能表的技能伤害百分比为0,技能伤害增加值定义为直接伤害值,不经过计算
|
| | | if atkSkillPer == 0:
|
| | | hurtValue, hurtType = int(atkSkillValue), ChConfig.Def_HurtType_Normal
|
| | | hurtValue += atkObj.GetDictByKey(ChConfig.Def_PlayerKey_MoreHurtValue)
|
| | | |
| | | elif SkillShell.IsPlayerUseSkill(atkObj, curSkill) and SkillShell.isClientHurtValue(defObj.GetID(), defObjType):
|
| | | # 缓存单次攻击中的最大伤害,被动技能概率性增加伤害,此处放大最大伤害
|
| | | hurtValue = atkObj.GetDictByKey(ChConfig.Def_PlayerKey_ClientMaxHurtValue)
|
| | | if hurtValue == 0:
|
| | | #hurtValue, hurtType = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, None, True)
|
| | | # 理论伤害一致, 多加点预算伤害避免计算误差
|
| | | #hurtValue = min(ShareDefine.Def_UpperLimit_DWord, hurtValue+10)
|
| | | #atkObj.SetDict(ChConfig.Def_PlayerKey_ClientMaxHurtValue, int(hurtValue*1.2))
|
| | | hurtValue = atkObj.GetMaxAtk()*atkSkillPer*40 # 加入被动计算不准确改成估算
|
| | | |
| | | clientValue, hurtType = SkillShell.GetClientHurtByObj(defObj.GetID(), defObjType)
|
| | | if clientValue <= hurtValue:
|
| | | hurtValue = clientValue
|
| | | else:
|
| | | # 外挂最高伤害基本防范
|
| | | GameWorld.DebugLog(atkObj, "%s----客户端伤害 %s 服务端最高伤害 %s"%(atkObj.GetID(), [clientValue, hurtType], hurtValue))
|
| | | hurtValue = int(hurtValue*0.8)
|
| | | #GameWorld.DebugAnswer(atkObj, "客户端伤害 %s 服务端伤害 %s"%([defObj.GetID(), clientValue, hurtType], hurtValue))
|
| | |
|
| | | else:
|
| | | hurtValue, hurtType = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, orgAtkObj=attacker)
|
| | | |
| | | WriteHurtLog(attacker, defObj, curSkill, hurtValue, hurtType, "公式层")
|
| | | |
| | | hurtValue = CalcHurtHPWithBuff(atkObj, defObj, hurtValue, curSkill, tick)
|
| | |
|
| | | # buff减少伤害百分比
|
| | | reducePer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ReduceHurtHPPer)
|
| | | |
| | | # 被攻击被动技能特殊减免 受到单次伤害超过生命上限10%时候,减免50%伤害,CD10秒
|
| | | defObj.SetDict(ChConfig.Def_PlayerKey_curHurtValue, hurtValue)
|
| | | reducePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ReduceHurtHPPer)
|
| | | hurtValue = int(hurtValue*(max(ChConfig.Def_MaxRateValue - reducePer, 0))*1.0/ChConfig.Def_MaxRateValue)
|
| | | |
| | |
|
| | | # 终极斩杀新效果,必须和斩杀严格区分,会涉及到CD概率,已经触发其他技能等问题
|
| | | if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_ZhongjiZhansha):
|
| | |
| | | remainHP = 0 # 剩余血量
|
| | |
|
| | | else:
|
| | | # 当技能表的技能伤害百分比为0,技能伤害增加值定义为直接伤害值,不经过计算
|
| | | if atkSkillPer == 0:
|
| | | hurtValue, hurtType = int(atkSkillValue), ChConfig.Def_HurtType_Normal
|
| | | hurtValue += atkObj.GetDictByKey(ChConfig.Def_PlayerKey_MoreHurtValue)
|
| | | |
| | | elif SkillShell.IsPlayerUseSkill(atkObj, curSkill) and SkillShell.isClientHurtValue(defObj.GetID(), defObjType):
|
| | | # 缓存单次攻击中的最大伤害,被动技能概率性增加伤害,此处放大最大伤害
|
| | | hurtValue = atkObj.GetDictByKey(ChConfig.Def_PlayerKey_ClientMaxHurtValue)
|
| | | if hurtValue == 0:
|
| | | #hurtValue, hurtType = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, None, True)
|
| | | # 理论伤害一致, 多加点预算伤害避免计算误差
|
| | | #hurtValue = min(ShareDefine.Def_UpperLimit_DWord, hurtValue+10)
|
| | | #atkObj.SetDict(ChConfig.Def_PlayerKey_ClientMaxHurtValue, int(hurtValue*1.2))
|
| | | hurtValue = atkObj.GetMaxAtk()*atkSkillPer*40 # 加入被动计算不准确改成估算
|
| | | |
| | | clientValue, hurtType = SkillShell.GetClientHurtByObj(defObj.GetID(), defObjType)
|
| | | if clientValue <= hurtValue:
|
| | | hurtValue = clientValue
|
| | | else:
|
| | | # 外挂最高伤害基本防范
|
| | | GameWorld.DebugLog(atkObj, "%s----客户端伤害 %s 服务端最高伤害 %s"%(atkObj.GetID(), [clientValue, hurtType], hurtValue))
|
| | | hurtValue = int(hurtValue*0.8)
|
| | | #GameWorld.DebugAnswer(atkObj, "客户端伤害 %s 服务端伤害 %s"%([defObj.GetID(), clientValue, hurtType], hurtValue))
|
| | | |
| | | else:
|
| | | hurtValue, hurtType = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, orgAtkObj=attacker)
|
| | | |
| | | WriteHurtLog(attacker, defObj, curSkill, hurtValue, hurtType, "公式层")
|
| | | |
| | | # 各种减伤 吸收盾处理
|
| | | hurtValue = CalcHurtHPWithBuff(atkObj, defObj, hurtValue, curSkill, tick)
|
| | | |
| | | #伤害结构体
|
| | | resultHurtType.HurtHP = hurtValue
|
| | | resultHurtType.HurtType = hurtType
|
| | | resultHurtType.RealHurtHP = hurtValue
|
| | |
|
| | | # 血盾 |
| | | hurtValue = CalcBloodShield(atkObj, defObj, hurtValue)
|
| | | remainHP = min(dMaxHP, max(0, dHP - hurtValue)) # 剩余血量
|
| | |
|
| | | remainHP = int(remainHP) #防范
|
| | |
| | |
|
| | | # 伤害吸收盾回血型
|
| | | buffManager = defObj.GetBuffState()
|
| | | curEffect, plusValue, skillID = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_AbsorbShieldXMZJ)
|
| | | if skillID:
|
| | | absortValue = hurtValue*curEffect.GetEffectValue(0)/ShareDefine.Def_MaxRateValue
|
| | | if absortValue:
|
| | | hurtValue -= absortValue
|
| | | findBuff = SkillCommon.FindBuffByID(defObj, skillID)[0]
|
| | | if findBuff:
|
| | | # 用于回血
|
| | | findBuff.SetValue(int(findBuff.GetValue() + absortValue))
|
| | |
|
| | |
|
| | | curEffect, plusValue, skillID = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_AbsorbShield)
|
| | | if skillID:
|
| | |
| | | findBuff.SetRemainTime(1)
|
| | |
|
| | |
|
| | | # 天罡护法,将期间受到的伤害总值用于回血,不改变伤害
|
| | | curEffect, plusValue, skillID2 = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_StoreBlood)
|
| | | if skillID2:
|
| | | # 天罡护法,将期间受到的伤害总值用于回血,不改变伤害,暂且不用
|
| | | #===========================================================================
|
| | | # curEffect, plusValue, skillID2 = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_StoreBlood)
|
| | | # if skillID2:
|
| | | # absortValue = hurtValue*curEffect.GetEffectValue(0)/ShareDefine.Def_MaxRateValue
|
| | | # if absortValue:
|
| | | # findBuff = SkillCommon.FindBuffByID(defObj, skillID2)[0]
|
| | | # if findBuff:
|
| | | # # 用于回血
|
| | | # findBuff.SetValue(int(findBuff.GetValue() + absortValue))
|
| | | #===========================================================================
|
| | | |
| | | curEffect, plusValue, skillID = BuffSkill.FindBuffEffectPlusByEffectID(buffManager, ChConfig.Def_Skill_Effect_AbsorbShieldXMZJ)
|
| | | if skillID:
|
| | | absortValue = hurtValue*curEffect.GetEffectValue(0)/ShareDefine.Def_MaxRateValue
|
| | | if absortValue:
|
| | | findBuff = SkillCommon.FindBuffByID(defObj, skillID2)[0]
|
| | | hurtValue -= absortValue
|
| | | findBuff = SkillCommon.FindBuffByID(defObj, skillID)[0]
|
| | | if findBuff:
|
| | | # 用于回血
|
| | | findBuff.SetValue(int(findBuff.GetValue() + absortValue))
|
| | | |
| | | # buff减少伤害百分比
|
| | | reducePer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ReduceHurtHPPer)
|
| | | |
| | | # 被攻击被动技能特殊减免 受到单次伤害超过生命上限10%时候,减免50%伤害,CD10秒
|
| | | defObj.SetDict(ChConfig.Def_PlayerKey_curHurtValue, hurtValue)
|
| | | reducePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_ReduceHurtHPPer)
|
| | | hurtValue = int(hurtValue*(max(ChConfig.Def_MaxRateValue - reducePer, 0))*1.0/ChConfig.Def_MaxRateValue)
|
| | | |
| | | hurtValue = CalcBloodShield(atkObj, defObj, hurtValue)
|
| | | |
| | | return hurtValue
|
| | |
|
| | |
|
| | |
| | | msg, attackerID, attackerName, defenderID, defenderName,
|
| | | skillID, skillName, hurtValue, hurtType))
|
| | |
|
| | | # 血盾支持多个同时存在
|
| | | # 血盾支持多个同时存在, 反弹也会被吸收
|
| | | def CalcBloodShield(atkObj, defObj, hurtValue):
|
| | | # 伤害值用于血盾抵消
|
| | | defObj.SetDict(ChConfig.Def_PlayerKey_BloodShiledHurt, hurtValue)
|
| | |
| | | # 计算攻击伤害
|
| | | # maxHurt参数用于模拟计算最大伤害,防范客户端攻击伤害过高
|
| | | def CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, happenState=None, **atkwargs):
|
| | | # 翻滚闪避特殊处理
|
| | | if tick - defObj.GetDictByKey(ChConfig.Def_PlayerKey_SomersaultTime) < 500:
|
| | | return 0, ChConfig.Def_HurtType_Miss
|
| | | #===========================================================================
|
| | | # # 翻滚闪避特殊处理
|
| | | # if tick - defObj.GetDictByKey(ChConfig.Def_PlayerKey_SomersaultTime) < 500:
|
| | | # return 0, ChConfig.Def_HurtType_Miss
|
| | | #===========================================================================
|
| | |
|
| | | summonAtkPer = 1 # 召唤继承提高基础攻击力,取表
|
| | | summonAtkObj = atkwargs.get('orgAtkObj', None) if atkwargs.get('orgAtkObj', None) else atkObj
|
| | |
| | |
|
| | | # atkSkillPer 包含普攻,所以不是用技能增强处理
|
| | | atkSkillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddSkillPer)
|
| | | |
| | | atkSkillPer += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddSkillPer)
|
| | | if hurtType == ChConfig.Def_HurtType_SuperHit:
|
| | | atkSkillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitAddSkillPer)
|
| | | |
| | |
|
| | | if isSuperHit:
|
| | | addASuperHit = PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitValue)
|
| | |
| | | if hurtFormulaKey not in hurtDist:
|
| | | GameWorld.ErrLog("CalcAttackValue.txt 伤害公式未配置, key=%s" % (hurtFormulaKey))
|
| | | return 0, ChConfig.Def_HurtType_Miss
|
| | | hurtFormula = hurtDist[hurtFormulaKey]
|
| | | |
| | | if atkwargs.get('hurtFormulaKey', None):
|
| | | # 指定公式
|
| | | aBurnValue = atkwargs.get('burnValue', 0)
|
| | | aBurnPer = atkwargs.get('burnPer', 0)
|
| | | hurtFormula = hurtDist[atkwargs.get('hurtFormulaKey', None)]
|
| | | else:
|
| | | hurtFormula = hurtDist[hurtFormulaKey]
|
| | | hurtValue = int(eval(FormulaControl.GetCompileFormula(hurtFormulaKey, hurtFormula)))
|
| | |
|
| | | if hurtType == ChConfig.Def_HurtType_Normal and SuppressValueRealmRate > 10000:
|
| | |
| | | #反弹伤害
|
| | | CalcBounceHP(atkObj, defObj, resultHurtType.LostHP, resultHurtType.HurtType, curSkill)
|
| | | #吸血
|
| | | CalcSuckBlood(atkObj, defObj, curSkill, resultHurtType.RealHurtHP, tick)
|
| | | CalcSuckBlood(atkObj, defObj, curSkill, resultHurtType, tick)
|
| | |
|
| | | if atkObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
| | | # 记录最后一次伤害值
|
| | |
| | | # @param atkObj 攻击者
|
| | | # @param defObj 防守者
|
| | | # @return None
|
| | | def CalcSuckBlood(atkObj, defObj, curSkill, hurtValue, tick):
|
| | | def CalcSuckBlood(atkObj, defObj, curSkill, resultHurtType, tick):
|
| | |
|
| | | if atkObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | return
|
| | | |
| | | hurtValue, hurtType = resultHurtType.RealHurtHP, resultHurtType.HurtType, |
| | | if not hurtValue:
|
| | | return
|
| | |
|
| | |
| | | atkBackHPPer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)
|
| | | atkBackHPPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)
|
| | |
|
| | | if hurtType == ChConfig.Def_HurtType_SuperHit:
|
| | | atkBackHPPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitSuckBloodPer)
|
| | | |
| | | atkBackHP += int(hurtValue * atkBackHPPer*1.0 / ChConfig.Def_MaxRateValue)
|
| | |
|
| | | suckHP += atkBackHP
|
| | |
| | | return
|
| | | if hurtType == ChConfig.Def_HurtType_SuperHit:
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SuperHit, tick)
|
| | | PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_SuperHit, tick)
|
| | | elif hurtType == ChConfig.Def_HurtType_ThumpHit:
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(attacker, defender, curSkill, ChConfig.TriggerType_ThumpHit, tick)
|
| | | return
|
| | |
| | | Def_Buff_Replace_Better, # 相同typeid取最高,如果新的是低级的则不处理
|
| | | Def_Buff_Replace_New, # 相同typeid替换最新,即使是低级的
|
| | | Def_Buff_Coexist, # 不同的释放者可共存
|
| | | ) = range(3)
|
| | | Def_Buff_Recharge, # 若同类型buff存在不管等级高低,只给原buff充能只改变值或时间
|
| | | ) = range(4)
|
| | |
|
| | | Def_BuffValue_Count = 3 # buff记录的value个数
|
| | |
|
| | | #游戏对象属性--------------------------------------------
|
| | | Def_Calc_AllAttrType_MAX = 131
|
| | | Def_Calc_AllAttrType_MAX = 135
|
| | | #基本属性BUFF计算,顺序与 ObjProperty_AttrByIndex 对应,同时也为buff效果ID同步通知策划
|
| | | TYPE_Calc_AttrList = (
|
| | | TYPE_Calc_Metal, # 金 1
|
| | |
| | | TYPE_Calc_FabaoHurt, # 法宝技能增伤
|
| | | TYPE_Calc_FabaoHurtPer, # 法宝技能加成
|
| | | TYPE_Calc_FinalHurtReducePer, # 最终伤害减少百分比
|
| | | TYPE_Calc_YinjiTime, # 每X秒自动消失一个印记
|
| | | TYPE_Calc_YinjiTime, # 每X秒自动消失一个印记 130
|
| | | TYPE_Calc_TheFBSkillsCD, # 减少指定技能组CD XX%
|
| | | TYPE_Calc_BurnValue, # 灼烧固定伤害
|
| | | TYPE_Calc_BurnTimePer, # 延长灼烧时间百分比
|
| | | TYPE_Calc_SubSpeedPer, # 减移动速度百分比
|
| | | ) = range(1, Def_Calc_AllAttrType_MAX)
|
| | |
|
| | |
|
| | |
| | | Def_Skill_Effect_SummonAttr = 1013 # 召唤兽属性
|
| | | Def_Skill_Effect_BoomSeedID = 1014 # 引爆BUFF种子
|
| | | Def_Skill_Effect_ReCD = 1016 # 重置CD
|
| | | Def_Skill_Effect_Burn = 1034 # 灼烧
|
| | | Def_Skill_Effect_RandWarn = 1061 # 随机预警
|
| | | Def_Skill_Effect_AttackReplaceByNPCSeries = 1062 # 对指定系的伤害
|
| | | Def_Skill_Effect_AvgHurtFMCnt = 1064 # NPC技能按仙盟成员数均摊伤害
|
| | |
| | | Def_PlayerState_LimitSkill, # 禁魔状态 10
|
| | | Def_PlayerState_LimitAddHP, # 禁疗状态 11
|
| | | Def_PlayerState_Blind, # 致盲状态 12
|
| | | Def_PlayerState_LoseBlood1, # 职业1持续掉血状态 13
|
| | | Def_PlayerState_LoseBlood1, # 灼烧 13
|
| | | Def_PlayerState_LoseBlood2, # 职业2持续掉血状态 14
|
| | | Def_PlayerState_LoseBlood3, # 职业3持续掉血状态 15
|
| | | Def_PlayerState_MissSneerAtk, # 对嘲讽攻击免疫表现为miss 16
|
| | |
| | |
|
| | | #---SetDict 玩家字典KEY,不存于数据库---
|
| | | # key的长度不能超过29个字节
|
| | | Def_PlayerKey_TheFBSkillsCD = "TheFBSkillsCD" # 减少指定技能组CD XX%
|
| | | Def_PlayerKey_BurnValue = "BurnValue" # 灼烧固定伤害
|
| | | Def_PlayerKey_BurnTimePer = "BurnTimePer" # 延长灼烧时间百分比
|
| | | Def_PlayerKey_SubSpeedPer = "SubSpeedPer" # 减移动速度百分比
|
| | | Def_PlayerKey_YinjiCnt = "YinjiCnt" # 当前印记数
|
| | | Def_PlayerKey_LostYinjiTime = "LostYinjiTime" # 每X秒自动消失一个印记
|
| | | Def_PlayerKey_1314HurtCount = "1314cnt" # 类剑刃风暴技能的1314效果,伤害次数处理
|
| | |
| | | Def_PlayerKey_LockHPSkillID = "LockHPSkillID" # 锁血功能的技能
|
| | | Def_PlayerKey_GodWeaponBeforeProDef = "GWBPD" # 神兵护盾被攻击前的值
|
| | | Def_PlayerKey_curHurtValue = "curHurtValue" # 计算中的临时伤害值,技能特殊用
|
| | | Def_PlayerKey_DefenderObjID = "DefenderObjID" # 后续触发技能需要用到的对象ID,暂用于玩家
|
| | | Def_PlayerKey_SomersaultTime = "Somersault" # 翻滚一定时间内无敌,表现为MISS
|
| | | Def_PlayerKey_CopyFuncAttr = "CopyFuncAttr%s" # 玩家属性刷新中的计算属性缓存,便于buff刷新计算
|
| | | Def_Player_RefreshAttrByBuff = "PlayerAttrByBuff" # 玩家属性刷新功能属性缓存,便于buff刷新计算, 间隔刷新
|
| | |
| | | ShareDefine.Def_Effect_FinalHurtPer:[[TYPE_Calc_FinalHurtPer], False, TYPE_Linear], # 最终伤害万分率
|
| | | ShareDefine.Def_Effect_FinalHurtReducePer:[[TYPE_Calc_FinalHurtReducePer], False, TYPE_Linear], # 最终伤害减少万分
|
| | | ShareDefine.Def_Effect_YinjiTime:[[TYPE_Calc_YinjiTime], False, TYPE_Linear], # 每X秒自动消失一个印记
|
| | | ShareDefine.Def_Effect_TheFBSkillsCD:[[TYPE_Calc_TheFBSkillsCD], False, TYPE_Linear], # 减少指定技能组CD XX%
|
| | | ShareDefine.Def_Effect_BurnValue:[[TYPE_Calc_BurnValue], False, TYPE_Linear], # 灼烧固定伤害
|
| | | ShareDefine.Def_Effect_BurnTimePer:[[TYPE_Calc_BurnTimePer], False, TYPE_Linear], # 延长灼烧时间百分比
|
| | | ShareDefine.Def_Effect_SubSpeedPer:[[TYPE_Calc_SubSpeedPer], False, TYPE_Linear], # 减移动速度百分比
|
| | |
|
| | | #战斗非线性
|
| | | ShareDefine.Def_Effect_SuperHitPer:[[TYPE_Calc_SuperHit], False, TYPE_NoLinear],
|
| | |
| | | TriggerType_SkillSuccess, # 任何技能释放成功都可触发 76
|
| | | TriggerType_BounceHPPerByAttacker, # 反弹伤害百分比值, 由攻击方决定 77
|
| | | TriggerType_NoControl, # 使关联技能不受控制 78
|
| | | ) = range(1, 79)
|
| | | TriggerType_SuperHitSuckBloodPer, # 暴击百分比吸血, 79
|
| | | TriggerType_SuperHitAddSkillPer, # 暴击增加技能伤害 80
|
| | | TriggerType_BurnPer, # 灼烧伤害百分比 81
|
| | | ) = range(1, 82)
|
| | |
|
| | |
|
| | | #不可以佩戴翅膀的地图
|
| | |
| | | skillTypeID, buffOwner = 0, None
|
| | | lostValue = int(GameObj.GetMaxHP(curPlayer) * lostHPPer / 100.0) * lostTime
|
| | | #GameWorld.DebugLog("OnCollecting lostHPPer=%s,lostTime=%s,lostValue=%s" % (lostHPPer, lostTime, lostValue), playerID)
|
| | | SkillCommon.SkillLostHP(curPlayer, skillTypeID, buffOwner, lostValue, tick)
|
| | | SkillCommon.SkillLostHP(curPlayer, skillTypeID, buffOwner, lostValue, tick, skillAffect=False)
|
| | | return
|
| | |
|
| | |
|
| | |
| | | def SetYinjiCnt(curPlayer, value):
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_YinjiCnt, value)
|
| | | curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_YinjiCnt, value, False)
|
| | | |
| | |
|
| | | # 减少指定技能组CD XX%
|
| | | def GetTheFBSkillsCD(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TheFBSkillsCD)
|
| | | def SetTheFBSkillsCD(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_TheFBSkillsCD, value)
|
| | | # 灼烧固定伤害
|
| | | def GetBurnValue(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_BurnValue)
|
| | | def SetBurnValue(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_BurnValue, value)
|
| | | # 延长灼烧时间百分比
|
| | | def GetBurnTimePer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_BurnTimePer)
|
| | | def SetBurnTimePer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_BurnTimePer, value)
|
| | | # 减移动速度百分比
|
| | | def GetSubSpeedPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_SubSpeedPer)
|
| | | def SetSubSpeedPer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_SubSpeedPer, value)
|
| | |
|
| | | ## 计算功能背包物品属性
|
| | | # @param curPlayer 当前玩家
|
| | | # @param packType 背包类型
|
| | |
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_CollectLostHPTick, tick)
|
| | | lostValue = int(GameObj.GetMaxHP(curPlayer) * lostHPPer / 100.0) * lostTime
|
| | | skillTypeID, buffOwner = 0, None
|
| | | SkillCommon.SkillLostHP(curPlayer, skillTypeID, buffOwner, lostValue, tick)
|
| | | SkillCommon.SkillLostHP(curPlayer, skillTypeID, buffOwner, lostValue, tick, skillAffect=False)
|
| | | GameWorld.DebugLog("采集掉血: npcID=%s,lostHPPer=%s,lostTime=%s,lostValue=%s" % (collectNPCIpyData.GetNPCID(), lostHPPer, lostTime, lostValue))
|
| | | return
|
| | |
|
| | |
| | | Def_Effect_FinalHurtPer = 142 # 最终伤害万分率
|
| | | Def_Effect_FinalHurtReducePer = 143 # 最终伤害减少万分
|
| | | Def_Effect_YinjiTime = 144 # 每X毫秒自动消失一个印记
|
| | | Def_Effect_TheFBSkillsCD = 145 # 减少指定技能组CD XX%
|
| | | Def_Effect_BurnValue = 146 # 灼烧固定伤害
|
| | | Def_Effect_BurnTimePer = 147 # 延长灼烧时间百分比
|
| | | Def_Effect_SubSpeedPer = 148 # 减移动速度百分比
|
| | |
|
| | | #增加%d物理伤害值,其中a值为伤害值
|
| | | Def_Effect_AddAtk = 1005
|
| | |
| | | return result
|
| | |
|
| | |
|
| | | #===============================================================================
|
| | | # # CanRepeatTime字段个位数
|
| | | # (
|
| | | # Def_BuffTime_Reset, # 0 重置时间
|
| | | # Def_BuffTime_Add, # 1 增加时间
|
| | | # Def_BuffTime_Keep, # 2 时间不变
|
| | | # Def_BuffTime_Keep_AddValue, # 3 时间不变只增加值,默认为替换更强值
|
| | | # ) = range(4)
|
| | | # |
| | | # # CanRepeatTime字段十位数
|
| | | # (
|
| | | # Def_Buff_Replace_Better, # 相同typeid取最高,如果新的是低级的则不处理
|
| | | # Def_Buff_Replace_New, # 相同typeid替换最新,即使是低级的
|
| | | # Def_Buff_Coexist, # 不同的释放者可共存
|
| | | # ) = range(3)
|
| | | #===============================================================================
|
| | |
|
| | | # 快捷搜索 CanRepeatTime字段
|
| | | # buff时间处理类型,个位数
|
| | | def GetBuffRepeatTimeType(curSkill):
|
| | | return curSkill.GetCanRepeatTime()%10
|
| | |
| | | layerMaxCnt = hasEffect.GetEffectValue(0) # 能叠加的最大上限
|
| | |
|
| | | return layerMaxCnt
|
| | |
|
| | | # 改变BUFF持续时间
|
| | | def ChangeLastTime(attacker, curSkill):
|
| | | buffTime = curSkill.GetLastTime() |
| | | if not attacker:
|
| | | return buffTime |
| | | if curSkill.GetEffect(0).GetEffectID() == ChConfig.Def_Skill_Effect_Burn:
|
| | | # 灼烧的时间特殊处理
|
| | | buffTime = buffTime*(ChConfig.Def_MaxRateValue + PlayerControl.GetBurnTimePer(attacker))/ChConfig.Def_MaxRateValue
|
| | | |
| | | buffTime += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(attacker, None, curSkill, ChConfig.TriggerType_BuffTime)
|
| | | return buffTime
|
| | | |
| | |
|
| | | #---------------------------------------------------------------------
|
| | | ## 增加BUFF 减少BUFF(参数 -> 当前对象,buff类型,当前技能,当前时间,Buff总值->用于持续类技能 , Buff拥有者)
|
| | |
| | | #技能类型ID
|
| | | curSkillTypeID = curSkill.GetSkillTypeID()
|
| | | #当前技能持续时间
|
| | | curSkillLastTime = curSkill.GetLastTime()
|
| | | curSkillLastTime = ChangeLastTime(buffOwner, curSkill)
|
| | | #当前技能等级
|
| | | curSkillLV = curSkill.GetSkillLV()
|
| | | #替换模式
|
| | |
| | |
|
| | | if buffSkillLV == curSkillLV:
|
| | | changeLayer = False
|
| | | if layerMaxCnt:
|
| | | curLayerCnt = curBuff.GetLayer()
|
| | | if curLayerCnt < layerMaxCnt:
|
| | | if layerCalc == ChConfig.Def_BuffLayer_Add:
|
| | | curBuff.SetLayer(curLayerCnt + 1)
|
| | | #BUFF层级变化触发被动
|
| | | if buffOwner:
|
| | | curObj.SetDict(ChConfig.Def_PlayerKey_AddBuffLayer, curBuff.GetLayer())
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddLayer, tick)
|
| | | PassiveBuffEffMng.OnPassiveBuffTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddLayer, tick)
|
| | | curObj.SetDict(ChConfig.Def_PlayerKey_AddBuffLayer, 0)
|
| | | else:
|
| | | curBuff.SetLayer(layerMaxCnt)
|
| | | changeLayer = True
|
| | | if layerMaxCnt and curBuff.GetLayer() < layerMaxCnt:
|
| | | if layerCalc == ChConfig.Def_BuffLayer_Add:
|
| | | curBuff.SetLayer(curBuff.GetLayer() + 1)
|
| | | #BUFF层级变化触发被动
|
| | | if buffOwner:
|
| | | curObj.SetDict(ChConfig.Def_PlayerKey_AddBuffLayer, curBuff.GetLayer())
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddLayer, tick)
|
| | | PassiveBuffEffMng.OnPassiveBuffTrigger(buffOwner, curObj, curSkill, ChConfig.TriggerType_AddLayer, tick)
|
| | | curObj.SetDict(ChConfig.Def_PlayerKey_AddBuffLayer, 0)
|
| | | else:
|
| | | curBuff.SetLayer(layerMaxCnt)
|
| | | changeLayer = True
|
| | | |
| | | # Def_Buff_Replace_New和Def_Buff_Recharge 均可走到此逻辑
|
| | | __BuffCanRemain(buffState, curBuff, i, resultTime, plusValueList, buffOwner)
|
| | | # 此处考虑下plusValue变强是否刷属性
|
| | | #DoAddBuffOver(curObj, curSkill, addBuff, tick)
|
| | | return changeLayer
|
| | | else:
|
| | | if buffReplaceType == ChConfig.Def_Buff_Recharge:
|
| | | # 充能型
|
| | | __BuffCanRemain(buffState, curBuff, i, resultTime, plusValueList, buffOwner)
|
| | | return
|
| | | |
| | | processInterval = curBuff.GetProcessInterval()
|
| | | ownerID, ownerType = curBuff.GetOwnerID(), curBuff.GetOwnerType()
|
| | | buffState.DeleteBuffByIndex(i)
|
| | | SkillShell.ClearBuffEffectBySkillID(curObj, buffSkillID, ownerID, ownerType)
|
| | | return __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh,
|
| | | tick, processInterval, layerMaxCnt, layerCalc)
|
| | | tick, curSkillLastTime, processInterval, layerMaxCnt, layerCalc)
|
| | |
|
| | | #已经找到同一类型的技能,立即退出不然会导致错乱
|
| | | return False
|
| | |
| | | isDelRefresh = True
|
| | |
|
| | | return __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh,
|
| | | tick, 0, layerMaxCnt, layerCalc)
|
| | | tick, curSkillLastTime, 0, layerMaxCnt, layerCalc)
|
| | |
|
| | |
|
| | | ## 是否血包/蓝包buff
|
| | |
| | | # @param isDelRefresh 外界删除BUFF是否刷新
|
| | | # @param tick 时间戳
|
| | | # @return 是否刷新玩家属性
|
| | | def __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh, tick, |
| | | updProcessInterval, layerMaxCnt, layerCalc):
|
| | | def __AddBuff(curObj, buffState, curSkill, plusValueList, buffOwner, isDelRefresh, tick,
|
| | | curSkillLastTime, updProcessInterval, layerMaxCnt, layerCalc):
|
| | | skillID = curSkill.GetSkillID()
|
| | |
|
| | | #是否需要通知客户端
|
| | | isNotify = True if curSkill.GetClientEffectType() != 0 else False
|
| | | # 增加第四个参数是否立即广播
|
| | | addBuff = buffState.AddBuff(skillID, tick, isNotify, False)
|
| | | buffIndex = buffState.GetBuffCount() # buff在管理器中的索引
|
| | | |
| | | if updProcessInterval > 0:
|
| | | # 继承上一个buff的循环记录
|
| | | addBuff.SetProcessInterval(updProcessInterval)
|
| | |
| | | else:
|
| | | addBuff.SetLayer(layerMaxCnt)
|
| | |
|
| | | if buffOwner:
|
| | | addTime = PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(buffOwner, None, curSkill, ChConfig.TriggerType_BuffTime)
|
| | | if addTime:
|
| | | #有改变持续时间的技能
|
| | | addBuff.SetRemainTime(curSkill.GetLastTime() + addTime)
|
| | | addBuff.SetRemainTime(curSkillLastTime)
|
| | |
|
| | | # 同步主从技能时间
|
| | | SyncMasterBuffTime(curObj, addBuff, curSkill)
|
| | |
| | | [lambda curObj:PlayerControl.GetFabaoHurtPer(curObj), lambda curObj, value:PlayerControl.SetFabaoHurtPer(curObj, value), ShareDefine.CDBPlayerRefresh_FabaoHurtPer, 1, 0], # 属性法宝技能加成
|
| | | [lambda curObj:PlayerControl.GetFinalHurtReducePer(curObj), lambda curObj, value:PlayerControl.SetFinalHurtReducePer(curObj, value), ShareDefine.CDBPlayerRefresh_FinalHurtReducePer, 1, 0], # 最终伤害减少百分比
|
| | | [lambda curObj:PlayerControl.GetLostYinjiTime(curObj), lambda curObj, value:PlayerControl.SetLostYinjiTime(curObj, value), ShareDefine.CDBPlayerRefresh_YinjiTime, 1, 0], # 每X秒自动消失一个印记 毫秒
|
| | | [lambda curObj:PlayerControl.GetTheFBSkillsCD(curObj), lambda curObj, value:PlayerControl.SetTheFBSkillsCD(curObj, value), 0, 0, 0], # 减少指定技能组CD XX%
|
| | | [lambda curObj:PlayerControl.GetBurnValue(curObj), lambda curObj, value:PlayerControl.SetBurnValue(curObj, value), ShareDefine.CDBPlayerRefresh_YinjiTime, 0, 0], # 灼烧固定伤害
|
| | | [lambda curObj:PlayerControl.GetBurnTimePer(curObj), lambda curObj, value:PlayerControl.SetBurnTimePer(curObj, value), 0, 0, 0], # 延长灼烧时间百分比
|
| | | [lambda curObj:PlayerControl.GetSubSpeedPer(curObj), lambda curObj, value:PlayerControl.SetSubSpeedPer(curObj, value), 0, 0, 0], # 减移动速度百分比
|
| | | ]
|
| | |
|
| | | ## 通过索引获得属性值
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 灼烧(流派专用,额外公式), 持续过程中可能会被改变伤害或者持续时长,无法用次数控制,无层级概念
|
| | | # 若同类型buff存在不管等级高低,只给原buff充能只改变值或时间
|
| | | # @author: Alee
|
| | | # @date 2019-4-28 下午04:12:17
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | #导入
|
| | | import SkillCommon
|
| | | import GameWorld
|
| | | import ChConfig
|
| | | import AttackCommon
|
| | | import PlayerControl
|
| | | import PassiveBuffEffMng
|
| | | #---------------------------------------------------------------------
|
| | | #全局变量
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | #逻辑实现
|
| | | ## 持续性Buff处理 |
| | | # @param defender 承受者
|
| | | # @param curBuff 当前Buff
|
| | | # @param curEffect Buff效果
|
| | | # @param tick 当前时间
|
| | | # @return None
|
| | | # @remarks 函数详细说明.
|
| | | def ProcessBuff(defender, curBuff, curEffect, processBuffTick, tick):
|
| | | #单次伤害
|
| | | singleDecHP = curBuff.GetValue()
|
| | | buffOwner = SkillCommon.GetBuffOwner(curBuff)
|
| | | |
| | | curBuffSkillID = curBuff.GetSkill().GetSkillTypeID()
|
| | | |
| | | SkillCommon.SkillLostHP(defender, curBuffSkillID, buffOwner, singleDecHP, tick, hurtType=ChConfig.Def_HurtType_Bleed)
|
| | | |
| | | return
|
| | |
|
| | | # 灼烧的特征为延长buff时间,重算伤害
|
| | | def CalcBuffValue(attacker, defender, curSkill, changeBuffValueDict):
|
| | | curEffect = curSkill.GetEffect(0)
|
| | | skillPer = curEffect.GetEffectValue(0)
|
| | | skillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(attacker, defender, curSkill, ChConfig.TriggerType_BurnPer)
|
| | | skillEnhance = curEffect.GetEffectValue(1) + PlayerControl.GetBurnValue(attacker)
|
| | | skillPer = skillPer*1.0/ChConfig.Def_MaxRateValue
|
| | | # 灼烧特殊公式
|
| | | hurtValue, hurtType = AttackCommon.CalcHurtHP(attacker, defender, curSkill, |
| | | 0, 0, GameWorld.GetGameWorld().GetTick(), ChConfig.Def_Skill_HappenState_HitOn, |
| | | hurtFormulaKey="Burn", burnValue=skillEnhance, burnPer=skillPer)
|
| | | |
| | | return [hurtValue]
|
| | |
|
| | |
| | | if GameObj.GetHP(curObj) <= 0:
|
| | | return
|
| | | SkillCommon.SkillLostHP(curObj, curBuff.GetBuffID(), SkillCommon.GetBuffOwner(curBuff),
|
| | | curBuff.GetValue(), tick, curBuff.GetValue1())
|
| | | curBuff.GetValue(), tick, hurtType=curBuff.GetValue1())
|
| | | return
|
| | |
|
| | |
|
| | |
| | |
|
| | | return
|
| | |
|
| | | ## 技能伤血
|
| | | # @param curObj 当前对象
|
| | | # @param skillTypeID 技能类型ID
|
| | | # @param buffOwner buff拥有者
|
| | | # @param lostValue 丢失值
|
| | | # @param tick 当前时间
|
| | | # @param view 是否广播
|
| | | # @param reduce 是否扣血
|
| | | # @return None
|
| | | # @remarks 函数详细说明.
|
| | | def SkillLostHP(curObj, skillTypeID, buffOwner, lostValue, tick, view=True, reduceHP=True, |
| | | isDoAttackResult=True, hurtType=ChConfig.Def_HurtType_Normal):
|
| | | ## 直接扣血不走公式
|
| | | # view 是否广播客户端飘血
|
| | | # isDoAttackResult 是否立即处理结果,为False必须外层有处理
|
| | | # hurtType 飘血类型
|
| | | # skillAffect 默认True 会被各种技能BUFF盾等影响伤血数值
|
| | | # False代表一些特殊处理纯固定伤害飘字(如采集固定掉1点血)
|
| | | def SkillLostHP(curObj, skillTypeID, buffOwner, lostValue, tick, view=True, |
| | | isDoAttackResult=True, hurtType=ChConfig.Def_HurtType_Normal,
|
| | | skillAffect=True):
|
| | | if lostValue <= 0:
|
| | | GameWorld.Log('###技能伤害血量异常,数值错误 = %s,技能类型ID = %s' % (lostValue, skillTypeID))
|
| | | return
|
| | |
| | | # 没有血量不能再触发
|
| | | return
|
| | |
|
| | | if reduceHP :
|
| | | lostValue = AttackCommon.CalcAtkProDef(buffOwner, curObj, lostValue, curSkill, tick)
|
| | | # 血盾 |
| | | lostValue = AttackCommon.CalcBloodShield(buffOwner, curObj, lostValue)
|
| | | |
| | | #剩余血量
|
| | | remainHP = max(curObjHP_BeforeAttack - lostValue , 0)
|
| | | |
| | | #NPC处理
|
| | | if curObjType == IPY_GameWorld.gotNPC:
|
| | | #宠物特殊处理
|
| | | if curObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
|
| | | PetControl.SetPetHP(curObj, remainHP)
|
| | | else:
|
| | | GameObj.SetHP(curObj, remainHP)
|
| | | if not view : # 已广播的不重复
|
| | | curObj.Notify_HPEx()
|
| | |
|
| | | #其他对象逻辑处理
|
| | | if skillAffect:
|
| | | lostValue = AttackCommon.CalcHurtHPWithBuff(buffOwner, curObj, lostValue, curSkill, tick)
|
| | | |
| | | #剩余血量
|
| | | remainHP = max(curObjHP_BeforeAttack - lostValue , 0)
|
| | | |
| | | #NPC处理
|
| | | if curObjType == IPY_GameWorld.gotNPC:
|
| | | #宠物特殊处理
|
| | | if curObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
|
| | | PetControl.SetPetHP(curObj, remainHP)
|
| | | else:
|
| | | # 已广播的不重复
|
| | | GameObj.SetHP(curObj, remainHP, not view)
|
| | | GameObj.SetHP(curObj, remainHP)
|
| | | if not view : # 已广播的不重复
|
| | | curObj.Notify_HPEx()
|
| | |
|
| | | #其他对象逻辑处理
|
| | | else:
|
| | | # 已广播的不重复
|
| | | GameObj.SetHP(curObj, remainHP, not view)
|
| | |
|
| | | AttackCommon.WriteHurtLog(buffOwner, curObj, curSkill, lostValue, hurtType, "持续掉血")
|
| | |
|
| | |
| | | #------------------------------------------------------------------------------
|
| | | import ChConfig
|
| | | import BaseAttack
|
| | | import GameObj
|
| | | import SkillCommon
|
| | | import IPY_GameWorld
|
| | | import GameWorld
|
| | | import SkillShell
|
| | | import AttackCommon
|
| | | import NPCCommon
|
| | | #------------------------------------------------------------------------------
|
| | |
|
| | |
| | | #GameWorld.DebugLog("-----技能冲锋模板9 %s %s"%([attacker.GetPosX(), attacker.GetPosY()], [destX, destY]))
|
| | | attacker.ChangePos(destX, destY)
|
| | |
|
| | | if curSkill.GetSkillID() == ChConfig.Def_SkillID_Somersault:
|
| | | attacker.SetDict(ChConfig.Def_PlayerKey_SomersaultTime, tick)
|
| | | #===========================================================================
|
| | | # if curSkill.GetSkillID() == ChConfig.Def_SkillID_Somersault:
|
| | | # attacker.SetDict(ChConfig.Def_PlayerKey_SomersaultTime, tick)
|
| | | #===========================================================================
|
| | | return result
|
| | | |
| | |
| | | import ChConfig
|
| | | import GameWorld
|
| | | import IPY_GameWorld
|
| | | import SkillCommon
|
| | | import AttackCommon
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | if not defender:
|
| | |
| | | if defender.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | return False
|
| | |
|
| | | curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | | if not curSkill:
|
| | | return
|
| | | |
| | | buffType = SkillCommon.GetBuffType(curSkill)
|
| | | buffTuple = SkillCommon.GetBuffManagerByBuffType(attacker, buffType)
|
| | | #通过类型获取目标的buff管理器为空,则跳出
|
| | | if buffTuple == ():
|
| | | return
|
| | | |
| | | buffManager = buffTuple[0]
|
| | | buff = buffManager.FindBuff(skillID)
|
| | | if not buff:
|
| | | return
|
| | | return buff.GetValue() == defender.GetID()
|
| | | if passiveEffect.GetEffectValue(1):
|
| | | # 第一目标
|
| | | if AttackCommon.GetFirstDefenderID(attacker) != defender.GetID():
|
| | | return False
|
| | | |
| | | if passiveEffect.GetEffectValue(2):
|
| | | useSkill = skillkwargs.get("useSkill", None)
|
| | | if not useSkill:
|
| | | return False
|
| | | # 普通攻击有效
|
| | | if useSkill.GetFuncType() != ChConfig.Def_SkillFuncType_NormalAttack:
|
| | | return False
|
| | | return True
|
| | |
|
| | |
|
| | | def GetValue(attacker, defender, passiveEffect):
|
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | # @todo: buff中被攻击反弹自身最大攻击力XX%伤害
|
| | | ##@package
|
| | | #
|
| | | # @todo: buff中被标记的攻击者攻击标记方,层级最后一次反弹伤害
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2018-1-30 下午05:11:45
|
| | | # @date 2019-4-27 下午10:25:12
|
| | | # @version 1.0
|
| | | #
|
| | | # @note:
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: buff中对第一目标暴击触发技能 附加第X倍数次普攻暴击触发
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-27 下午10:19:51
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | import ChConfig
|
| | | import GameWorld
|
| | | import SkillCommon
|
| | | import BuffSkill
|
| | |
|
| | | def CheckCanHappen(attacker, defender, passiveEffect, skillID, **skillkwargs):
|
| | | if passiveEffect.GetEffectValue(0):
|
| | | useSkill = skillkwargs.get("useSkill", None)
|
| | | if not useSkill:
|
| | | return False
|
| | | # 普通攻击有效
|
| | | if useSkill.GetFuncType() != ChConfig.Def_SkillFuncType_NormalAttack:
|
| | | return False
|
| | | |
| | | curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | | if not curSkill:
|
| | | return False
|
| | | |
| | | buffType = SkillCommon.GetBuffType(curSkill)
|
| | | buffTuple = SkillCommon.GetBuffManagerByBuffType(attacker, buffType)
|
| | | #通过类型获取目标的buff管理器为空,则跳出
|
| | | if buffTuple == ():
|
| | | return False
|
| | | |
| | | buffManager = buffTuple[0]
|
| | | buff = buffManager.FindBuff(curSkill.GetSkillTypeID())
|
| | | if not buff:
|
| | | return False
|
| | | |
| | | buff.SetValue2(buff.GetValue2() + 1)
|
| | | |
| | | if buff.GetValue2()%passiveEffect.GetEffectValue(0) != 0:
|
| | | return False
|
| | | |
| | | return True
|
| | |
|
| | |
|
| | | def GetSkillData(passiveEffect):
|
| | | skillID = passiveEffect.GetEffectValue(1)
|
| | | return GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | |
|
| | |
|
| | |
|
| | |
| | | if GameObj.GetHP(defender)*ChConfig.Def_MaxRateValue/GameObj.GetMaxHP(defender) >= hpPer:
|
| | | return False
|
| | |
|
| | | # 记录此目标,不使用其他接口是因为有可能被改变,如一段时间只对触发的目标玩家提高暴击率
|
| | | attacker.SetDict(ChConfig.Def_PlayerKey_DefenderObjID, defender.GetID())
|
| | |
|
| | | return GameWorld.CanHappen(effect.GetEffectValue(0)) |
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 对第一目标暴击时触发技能 --特殊效果转为附加效果触发,且需主效果不使被动技能进入CD才可触发
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-25 下午01:57:16
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | import GameWorld
|
| | | import SkillShell
|
| | | import GameObj
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | skillID = effect.GetEffectValue(0)
|
| | | if skillID:
|
| | | # 转为附加效果触发,且需主效果不使被动技能进入CD才可触发
|
| | | useSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | | if not useSkill:
|
| | | return False
|
| | | SkillShell.UsePassiveTriggerSkill(attacker, useSkill, defender, GameWorld.GetGameWorld().GetTick(), True)
|
| | | return False
|
| | | |
| | | return True
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 提高暴击概率
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-27 下午10:43:37
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | import GameObj
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | if not GameObj.GetPyPlayerState(defender, effect.GetEffectValue(1)):
|
| | | #GameWorld.DebugLog("状态触发----%s"%effect.GetEffectValue(1))
|
| | | return False
|
| | | return True
|
| | | |
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return effect.GetEffectValue(0)
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 提高暴击概率
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-27 下午10:43:37
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | return True
|
| | | |
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return effect.GetEffectValue(0)
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 暴击增加技能伤害
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-27 下午11:31:01
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | |
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | |
| | | return True
|
| | | |
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return float(effect.GetEffectValue(0))/ChConfig.Def_MaxRateValue
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #
|
| | | ##@package
|
| | | #
|
| | | # @todo: 暴击增加技能伤害
|
| | | #
|
| | | # @author: Alee
|
| | | # @date 2019-4-27 下午11:31:01
|
| | | # @version 1.0
|
| | | #
|
| | | # @note: |
| | | #
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import GameWorld
|
| | | import GameObj
|
| | | import PlayerControl
|
| | |
|
| | |
|
| | | def CheckCanHappen(attacker, defender, effect, curSkill):
|
| | | |
| | | return True
|
| | | |
| | |
|
| | | def GetValue(attacker, defender, effect):
|
| | | return effect.GetEffectValue(0)
|
| | |
| | | 4091:ChConfig.TriggerType_SkillOverNoAttack, # 技能释放后 与TriggerType_AttackOver相反19,
|
| | | 4092:ChConfig.TriggerType_SkillSuccess, # 任何技能释放成功都可触发 76 减印记
|
| | | 4093:ChConfig.TriggerType_NoControl, # 使关联技能不受控制 78
|
| | | 4094:ChConfig.TriggerType_Buff_AddSuperHitRate, # BUFF类:增加暴击率
|
| | | 4095:ChConfig.TriggerType_SuperHitSuckBloodPer, # BUFF类: 暴击百分比吸血, 79
|
| | | 4096:ChConfig.TriggerType_SuperHitAddSkillPer, # 暴击增加技能伤害
|
| | | 4097:ChConfig.TriggerType_BurnPer, # 灼烧伤害百分比 81
|
| | | }
|
| | | return tdict.get(effectID, -1)
|
| | | #===========================================================================
|
| | |
| | | 4529:ChConfig.TriggerType_Buff_SuckBloodPer, # BUFF类: 百分比吸血, 此处非属性类
|
| | | 4530:ChConfig.TriggerType_Buff_AttackSubLayer, # BUFF类:攻击减buff层,0消失
|
| | | 4531:ChConfig.TriggerType_BounceHPPerByAttacker, # 反弹伤害百分比值, 由攻击方决定 77
|
| | | 4532:ChConfig.TriggerType_SuperHit, # buff中对第一目标暴击触发技能
|
| | |
|
| | | 803:ChConfig.TriggerType_BloodShield, # 血盾
|
| | | 806:ChConfig.TriggerType_BloodShield, # 血盾
|
| | |
| | | return True
|
| | |
|
| | |
|
| | | #===============================================================================
|
| | | # Def_Effect_GoddessAddHP = 1300 # 加血 (压总值血量百分比)
|
| | | # Def_Effect_AddHPValue_All = 1027 # 持续加血(压总值攻击)
|
| | | # Def_Effect_LostHPValue_All = 1033 # 持续减血(压总值攻击)
|
| | | # Def_Effect_LostAndAddHPValue_All = 1050 # 持续吸血(压总值攻击)
|
| | | # Def_Effect_LostHPValue_Single = 1201 # 持续单次减血计算 攻击
|
| | | # Def_Effect_AddHPValue_Single = 1202 # 持续单次加血计算 攻击
|
| | | # Def_Effect_LostHP_MaxHP = 1089 # 持续减血(压总值, 血量百分比)
|
| | | #===============================================================================
|
| | |
|
| | | #waring: 此值影响了BUFF的替换规则,值大替换小的
|
| | | ##添加BUFF前压入BUFF的值,这边只计算和攻击者相关,仅支持放在效果1的buff
|
| | | # @param attacker 攻击方
|