| | |
| | | int _aDamagePer = 0;// 伤害加成 万分率
|
| | | //int _aDamagePerPVP = 0;// PVP伤害加成 万分率
|
| | | int _aFinalHurt = 0;// 最终伤害加成 固定值
|
| | | int _aIceAtkSuperHit = 1;// 真实伤害暴击倍值 倍值, 默认1
|
| | | //int _aIceAtkSuperHit = 1;// 真实伤害暴击倍值 倍值, 默认1
|
| | | int _aOnlyFinalHurt = 0;
|
| | | int _aFinalHurtPer = 0;
|
| | | int _aDamagePVE = 0;
|
| | | int _superHit = 0;
|
| | | int _luckyHit = 0;
|
| | | int _aNPCHurtAddPer = 0;
|
| | |
|
| | | int _aRealmLv = 0;
|
| | | int _suppressLV = 0;
|
| | | float _suppressLV_0 = 0;
|
| | | //int _dLuckyHitReduce = 0;// 会心一击伤害减少 万分率, 默认0, 会心一击时有值
|
| | | //int _dSuperHitReduce = 0;// 暴击伤害减少 万分率, 默认0, 暴击时有值
|
| | | int _dDamChanceDef = 0;// 抵御伤害比例 万分率, 默认0, 只在格挡成功才有值, 格挡成功率默认20%
|
| | | int _dDef = 0;// 防御值 固定值
|
| | | int _dIceDef = 1;// 真实伤害防御 固定值
|
| | | //int _dIgnoreDefRateReduce = 0;// 无视防御比率抗性 万分率
|
| | | //int _dSkillAtkRateReduce = 0;// 技能伤害减少 万分率
|
| | | int _dDamReduce = 0;// 伤害减少 万分率
|
| | | int _dIgnoreDefRateReduce = 0;// 无视防御比率抗性 万分率
|
| | | int _dSkillAtkRateReduce = 0;// 技能伤害减少 万分率
|
| | | //int _dDamagePerPVPReduce = 0;// PVP伤害减少 万分率
|
| | | int _dFinalHurtReduce = 0;// 最终伤害减少 固定值
|
| | | int _dRealmLv = 0;
|
| | |
|
| | | int _suppressValueRealmRate = 1;
|
| | | float _suppressFightPower = 0;
|
| | | float _suppressValueFP_0 = 0;
|
| | |
|
| | | #region 伤害替换
|
| | |
|
| | |
| | |
|
| | | _missRate = _npcBase.NpcConfig.MissRate;
|
| | | _dDef = _npcBase.NpcConfig.Def;
|
| | | _dRealmLv = _npcBase.NpcConfig.Realm;
|
| | | _dIceDef = _npcBase.NpcConfig.IceDef;
|
| | | }
|
| | | else if (target.ActorType == GameObjType.gotPlayer)
|
| | | {
|
| | | _missRate = PlayerDatas.Instance.extersion.Miss;
|
| | | _dIgnoreDefRateReduce = PlayerDatas.Instance.extersion.IgnoreDefRateReduce;
|
| | | _dRealmLv = PlayerDatas.Instance.baseData.realmLevel;
|
| | | _dIceDef = PlayerDatas.Instance.extersion.realDEF;
|
| | | _dDef = PlayerDatas.Instance.extersion.DEF;
|
| | | }
|
| | |
|
| | | // -------------- 指定攻击方属性 --------------
|
| | |
| | | _aMinAtk = (int)(PlayerDatas.Instance.extersion.MINATK * _rate);
|
| | | _aIgnoreDefRate = PlayerDatas.Instance.extersion.IgnoreDefRate;
|
| | | _aSkillAtkRate = PlayerDatas.Instance.extersion.SkillAtkRate;
|
| | | _aDamagePer = PlayerDatas.Instance.extersion.DamagePer;
|
| | | _aDamagePer = PlayerDatas.Instance.extersion.DamagePVP;
|
| | | _aFinalHurt = (int)(PlayerDatas.Instance.extersion.FinalHurt);
|
| | | _aIceAtk = (int)(PlayerDatas.Instance.extersion.realATK * _rate);
|
| | | _aOnlyFinalHurt = PlayerDatas.Instance.extersion.OnlyFinalHurt;
|
| | |
| | | _superHit = PlayerDatas.Instance.extersion.SuperHit;
|
| | | _aNPCHurtAddPer = PlayerDatas.Instance.extersion.NpcHurtAddPer;
|
| | | _aFinalHurtPer = PlayerDatas.Instance.extersion.FunalHurtPer;
|
| | | _aDamagePVE = PlayerDatas.Instance.extersion.DamagePVE;
|
| | | _aRealmLv = PlayerDatas.Instance.baseData.realmLevel;
|
| | | }
|
| | | else if (attacker.ActorType == GameObjType.gotNPC)
|
| | | {
|
| | |
| | | {
|
| | | return;
|
| | | }
|
| | | var _config = _npcBase.NpcConfig;
|
| | |
|
| | | _hitRate = _npcBase.NpcConfig.Hit;
|
| | | _hitRate = _config.Hit;
|
| | |
|
| | | _isCrit = IsCrit(_npcBase.NpcConfig.SuperHiteRate);
|
| | | _isCrit = IsCrit(_config.SuperHiteRate);
|
| | |
|
| | | _aMaxAtk = _npcBase.NpcConfig.MaxAtk;
|
| | | _aMinAtk = _npcBase.NpcConfig.MinAtk;
|
| | | _aMaxAtk = _config.MaxAtk;
|
| | | _aMinAtk = _config.MinAtk;
|
| | | _aRealmLv = _config.Realm;
|
| | | _aIceAtk = _config.IceAtk;
|
| | |
|
| | | if (target.ActorType == GameObjType.gotPlayer)
|
| | | {
|
| | | _suppressLV = Mathf.Max(0, _config.NPCLV - PlayerDatas.Instance.baseData.LV);
|
| | | _suppressFightPower = Mathf.Max(0, _config.ThunderDef - PlayerDatas.Instance.baseData.FightPoint);
|
| | |
|
| | | /* 等级压制
|
| | | (min(max(suppressLV-10,0),10)*0.02
|
| | | +min(max(suppressLV-20,0),10)*0.03
|
| | | +min(max(suppressLV-30,0),10)*0.05
|
| | | +min(max(suppressLV-40,0),10)*1
|
| | | +min(max(suppressLV-50,0),50)*0.1)
|
| | | */
|
| | | _suppressLV_0 = Mathf.Min(Mathf.Max(_suppressLV - 10, 0), 10) * .02f
|
| | | + Mathf.Min(Mathf.Max(_suppressLV - 20, 0), 10) * .03f
|
| | | + Mathf.Min(Mathf.Max(_suppressLV - 30, 0), 10) * .05f
|
| | | + Mathf.Min(Mathf.Max(_suppressLV - 40, 0), 10)
|
| | | + Mathf.Min(Mathf.Max(_suppressLV - 50, 0), 10) * .1f;
|
| | | /* 战力压制
|
| | | min(max(suppressFightPower*1.0/suppressNPCFightPower-0,0),0.05)*5
|
| | | +min(max(suppressFightPower*1.0/suppressNPCFightPower-0.05,0),0.15)*8
|
| | | +min(max(suppressFightPower*1.0/suppressNPCFightPower-0.2,0),1)*10
|
| | | */
|
| | | _suppressValueFP_0 = Mathf.Min(Mathf.Max(_suppressFightPower * 1f / _config.ThunderDef, 0), .05f) * 5
|
| | | + Mathf.Min(Mathf.Max(_suppressFightPower * 1f / _config.ThunderDef - .05f, 0), .15f) * 8
|
| | | + Mathf.Min(Mathf.Max(_suppressFightPower * 1f / _config.ThunderDef - .2f, 0), 1f) * 10;
|
| | | }
|
| | | }
|
| | |
|
| | |
|
| | |
|
| | | _isMiss = IsMiss(_hitRate, _missRate);
|
| | | _isCrit = IsCrit(_aSuperHitRate);
|
| | |
| | | }
|
| | |
|
| | | // -------------- 公式计算 --------------
|
| | | float _value1;
|
| | | float _value2;
|
| | | float _value3;
|
| | |
|
| | | // PVE
|
| | | if (attacker.ActorType == GameObjType.gotPlayer
|
| | | && (target.ActorType == GameObjType.gotNPC || target is GA_PVPClientPlayer))
|
| | | {
|
| | | //"PVE_1" :"int(max((((max((aMaxAtk if isLuckyHit else (aMinAtk + (aMaxAtk - aMinAtk)*rand))
|
| | | // -dDef*max(1-aIgnoreDefRate/10000.0,0),1))*(1+(aLuckyHit/10000.0 if isLuckyHit else 0))
|
| | | // +(aSuperHit if isSuperHit else 0)+ max(aIceAtkSuperHit*aIceAtk - dIceDef, 0))
|
| | | // *(atkSkillPer+(aZhuxianHurtPer/10000.0 if isZhuxianHit else 0)+aSkillAtkRate/10000.0)
|
| | | // *(1+aDamagePer/10000.0)+max(aFinalHurt+aOnlyFinalHurt-dFinalHurtReduce, 0)
|
| | | // +atkSkillValue)*(1+dBeHurtPer/10000.0)*max(1+aFinalHurtPer/10000.0,1)
|
| | | // +aNPCHurtAddPer/10000.0*(aMinAtk+aMaxAtk)/2.0,(aMinAtk+aMaxAtk)/2*0.05 + (aMinAtk+aMaxAtk)/2*0.1*rand))"
|
| | | /* "PVE_1" :"int(SuppressValueRealmRate/10000*
|
| | | max((((
|
| | | max((aMaxAtk if isLuckyHit else (aMinAtk + (aMaxAtk - aMinAtk)*rand))-dDef*(1-max(aIgnoreDefRate-dIgnoreDefRateReduce,0)/10000.0),0)
|
| | | +(max(aLuckyHit,0) if isLuckyHit else 0)
|
| | | +(max(aSuperHit,0) if isSuperHit else 0)
|
| | | +max(aIceAtk-dIceDef,0))
|
| | | *max((atkSkillPer
|
| | | +(aZhuxianHurtPer/10000.0 if isZhuxianHit else 0)
|
| | | +(aSkillAtkRate-dSkillAtkRateReduce)/10000.0)
|
| | | +aNPCHurtAddPer/10000.0-(min(dDamChanceDef,8000)/10000.0),0.5))
|
| | | +aFinalHurt-dFinalHurtReduce+atkSkillValue+aDamagePVE)
|
| | | *max((1+aFinalHurtPer/10000.0)*(1-dFinalHurtReducePer/10000.0),0.2),(aMaxAtk+aMinAtk)/2*0.05+(aMaxAtk+aMinAtk)/2*0.1*rand))" |
| | | */
|
| | |
|
| | | float _random = Random.Range(0f, 1f);
|
| | | _value1 = _aMinAtk + (_aMaxAtk - _aMinAtk) * _random;
|
| | | hurtValue = (uint)(_suppressValueRealmRate * (Mathf.Max((((Mathf.Max((_isLucky ? _aMaxAtk : _aMinAtk + (_aMaxAtk - _aMinAtk) * Random.Range(0f, 1f)) - _dDef * (1 - Mathf.Max(_aIgnoreDefRate - _dIgnoreDefRateReduce, 0)) * Constants.F_DELTA, 0)
|
| | | + (_isLucky ? Mathf.Max(_aLuckyHit, 0) : 0)
|
| | | + (_isCrit ? Mathf.Max(_aSuperHit, 0) : 0)
|
| | | + Mathf.Max(_aIceAtk - _dIceDef, 0))
|
| | | * Mathf.Max((_aAtkSkillPer
|
| | | + (_isZhuxianHit ? _aZhuxianHurtPer * Constants.F_DELTA : 0)
|
| | | + (_aSkillAtkRate - _dSkillAtkRateReduce) * Constants.F_DELTA)
|
| | | + _aNPCHurtAddPer * Constants.F_DELTA - Mathf.Min(_dDamChanceDef, 8000) * Constants.F_DELTA, .5f))
|
| | | + _aFinalHurt - _dFinalHurtReduce + _atkSkillValue + _aDamagePVE)
|
| | | * Mathf.Max((1 + _aFinalHurtPer * Constants.F_DELTA) * (1 - _dFinalHurtReduce * Constants.F_DELTA), .2f), (_aMaxAtk + _aMinAtk) * .5f * .05f + (_aMaxAtk + _aMinAtk) * .5f * .1f * Random.Range(0, 1))));
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("_aMinAtk + (_aMaxAtk - _aMinAtk) * _random = {0}", _value1);
|
| | | }
|
| | | #endif
|
| | | _value2 = _dDef * Mathf.Max(1 - _aIgnoreDefRate * Constants.F_DELTA, 1);
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("_dDef * Mathf.Max(1 - _aIgnoreDefRate * Constants.F_DELTA, 1) = {0}", _value2);
|
| | | }
|
| | | #endif
|
| | | _value3 = _isLucky ? _aMaxAtk : _value1;
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("_isLucky ? _aMaxAtk : _value1 = {0}", _value3);
|
| | | }
|
| | | #endif |
| | | _value3 = _value3 - _value2;
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("_value3 - _value2 = {0}", _value3);
|
| | | }
|
| | | #endif
|
| | |
|
| | | _value3 = Mathf.Max(_value3, 1);
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("Mathf.Max(_value3, 1) = {0}", _value3);
|
| | | }
|
| | | #endif
|
| | |
|
| | | _value1 = 1 + (_isLucky ? _aLuckyHit * Constants.F_DELTA : 0);
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("1 + (_isLucky ? _aLuckyHit * Constants.F_DELTA : 0) = {0}", _value1);
|
| | | }
|
| | | #endif
|
| | |
|
| | | _value3 *= _value1;
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("_value3 *= _value1 = {0}", _value3);
|
| | | }
|
| | | #endif
|
| | |
|
| | | _value3 += _aSuperHit;
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("_value3 += _aSuperHit = {0}", _value3);
|
| | | }
|
| | | #endif
|
| | |
|
| | | _value3 += Mathf.Max(_aIceAtkSuperHit * _aIceAtk - _dIceDef, 0);
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("_value3 += Mathf.Max(_aIceAtkSuperHit * _aIceAtk - _dIceDef, 0) = {0}", _value3);
|
| | | }
|
| | | #endif
|
| | |
|
| | | _value1 = (_aAtkSkillPer + (_isZhuxianHit ? _aZhuxianHurtPer * Constants.F_DELTA : 0) + _aSkillAtkRate * Constants.F_DELTA) * (1 + _aDamagePer * Constants.F_DELTA);
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("(_aAtkSkillPer + _aSkillAtkRate * Constants.F_DELTA) * (1 + _aDamagePer * Constants.F_DELTA) = {0}", _value1);
|
| | | }
|
| | | #endif
|
| | |
|
| | | _value3 *= _value1;
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("_value3 *= _value1", _value3);
|
| | | }
|
| | | #endif
|
| | |
|
| | | _value3 += _aFinalHurt + _aOnlyFinalHurt + _atkSkillValue;
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("_value3 += _aFinalHurt + _aOnlyFinalHurt + _atkSkillValue = {0}", _value3);
|
| | | }
|
| | | #endif
|
| | |
|
| | | _value2 = Mathf.Max(1 + _aFinalHurtPer * Constants.F_DELTA, 1);
|
| | | _value3 *= _value2;
|
| | |
|
| | | _value2 = _aNPCHurtAddPer * Constants.F_DELTA * (_aMinAtk + _aMaxAtk) * .5f;
|
| | | _value3 += _value2;
|
| | |
|
| | | //(aMinAtk+aMaxAtk)/2*0.05 + (aMinAtk+aMaxAtk)/2*0.1*rand)
|
| | | _random = Random.Range(0f, 1f);
|
| | | _value1 = (_aMinAtk + _aMaxAtk) * .5f * .05f + (_aMinAtk + _aMaxAtk) * .5f * .1f * _random;
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("(_aMinAtk + _aMaxAtk) * .5f * .3f + (_aMinAtk + _aMaxAtk) * .5f * .2f * _random = {0}", _value3);
|
| | | }
|
| | | #endif
|
| | | hurtValue = (uint)Mathf.Max(_value3, _value1);
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | if (RuntimeLogUtility.s_HurtValueLog)
|
| | | {
|
| | | Debug.LogFormat("(uint)Mathf.Max(_value3, _value1) = {0}", _value3);
|
| | | }
|
| | | #endif
|
| | | }
|
| | | // EVP
|
| | | else if ((attacker.ActorType == GameObjType.gotNPC
|
| | | && target.ActorType == GameObjType.gotPlayer) || attacker is GA_PVPClientPlayer)
|
| | | {
|
| | | // "EVP_1" :"max((max((aMinAtk+aMaxAtk)/2.0-dDef,0)+max(aIceAtk - dIceDef, 0))*(atkSkillPer+aSkillAtkRate/10000.0)*(1-min(dDamReduce,8000)/10000.0)*(1-min(dDamChanceDef,8000)/10000.0)+max(aFinalHurt-dFinalHurtReduce, 0)+atkSkillValue,1)"
|
| | |
|
| | | _value1 = Mathf.Max((_aMaxAtk + _aMinAtk) * .5f - _dDef, 0);
|
| | | _value2 = Mathf.Max(_aIceAtk - _dIceDef, 0);
|
| | | _value1 += _value2;
|
| | |
|
| | | _value2 = (1 - Mathf.Min(_dDamReduce, 8000) * Constants.F_DELTA);
|
| | | _value3 = (1 - Mathf.Min(_dDamChanceDef, 8000) * Constants.F_DELTA);
|
| | |
|
| | | _value1 = _value1 * _value2 * (_aAtkSkillPer + _aSkillAtkRate * Constants.F_DELTA) * _value3;
|
| | | _value2 = Mathf.Max(_aFinalHurt - _dFinalHurtReduce, 0);
|
| | | _value1 += _value2;
|
| | | _value3 = 1 + 4 * Random.Range(0f, 1f);
|
| | |
|
| | | hurtValue = (uint)Mathf.Max(_value1, _value3);
|
| | | /* int(max(((max((aMinAtk+aMaxAtk)/2.0*(1+suppressValueLV)-dDef,0)
|
| | | +max(aIceAtk - dIceDef, 0))
|
| | | *max(atkSkillPer+aSkillAtkRate/10000.0-min(dDamChanceDef,8000)/10000.0,0.5)
|
| | | +aFinalHurt-dFinalHurtReduce+atkSkillValue)
|
| | | *max((1+aFinalHurtPer/10000.0)*(1-dFinalHurtReducePer/10000.0),0.2)*(1+suppressValueFP),aMaxAtk*0.05+rand*aMaxAtk*0.05)) */
|
| | | hurtValue = (uint)((Mathf.Max(((Mathf.Max((_aMinAtk + _aMaxAtk) * .5f * (1 + _suppressLV_0) - _dDef, 0)
|
| | | + Mathf.Max(_aIceAtk - _dIceDef, 0))
|
| | | * Mathf.Max(_atkSkillValue + _aSkillAtkRate * Constants.F_DELTA - Mathf.Min(_dDamChanceDef, 8000) * Constants.F_DELTA, .5f)
|
| | | + _aFinalHurt - _dFinalHurtReduce + _atkSkillValue)
|
| | | * Mathf.Max((1 + _aFinalHurtPer * Constants.F_DELTA) * (1 - _dFinalHurtReduce * Constants.F_DELTA), .2f) * (1 + _suppressValueFP_0), _aMaxAtk * .05f + Random.Range(0f, 1f) * _aMaxAtk * .05f)));
|
| | | }
|
| | |
|
| | | if (_isZhuxianHit)
|