| | |
| | | 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
|