无限天堂

标题: 关于命中判断部分的源码。 [打印本页]

作者: 颓废三道    时间: 2014-8-31 14:38
标题: 关于命中判断部分的源码。
最近你们很关心PK命中这个问题。
还有人说我更改过,而我的答案是,我没有改过。
包子同志让我给你计算,因为太复杂,不好算,所以我把源码贴出来。
你们不一定看得懂,但我会为每一句给出注释,你自己根据你的情况计算。

先定义几个概念。
    _weaponAddHit = _weapon.getItem().get_hitModifier() + _weapon.getHitByMagic(); // 武器命中包括武器本身命中+附加在武器上的魔法命中,类似祝福魔法武器。
_weaponEnchant ;武器加值。
  1. /**
  2.      * 命中判定
  3.      */
  4.     @Override
  5.     public boolean calcHit() {
  6.         // 对手为空则命中为空。
  7.         if (this._target == null) {
  8.             this._isHit = false;
  9.             return this._isHit;
  10.         }
  11.         
  12.         if (this._weaponRange != -1) {
  13.             final int location = this._pc.getLocation().getTileLineDistance(this._target.getLocation()); // 近距離武器攻擊距離判斷
  14.             
  15.             if (location > (this._weaponRange + 1)) {
  16.                 this._isHit = false; // 超出射程命中为空
  17.                 return this._isHit;
  18.             }
  19.             
  20.         } else {
  21.             // 遠距離武器攻擊距離判斷
  22.             if (!this._pc.getLocation().isInScreen(this._target.getLocation())) {
  23.                 this._isHit = false; // 超出射程命中为空
  24.                 return this._isHit;
  25.             }
  26.         }
  27.         
  28.         if ((this._weaponType == 20) && (this._weaponId != 190) && (this._arrow == null)) {
  29.             this._isHit = false; // 持弓 無箭 命中为空

  30.         } else if ((this._weaponType == 62) && (this._sting == null)) {
  31.             this._isHit = false; // 持鐵手甲 無飛刀 命中为空

  32.         } else if (!this._pc.glanceCheck(this._targetX, this._targetY)) {
  33.             this._isHit = false; // 攻擊方向中途具有障礙 命中为空

  34.         } else if ((this._weaponId == 247) || (this._weaponId == 248) || (this._weaponId == 249)) {
  35.             this._isHit = false; // 試煉武器 命中为空

  36.         } else if (this._calcType == PC_PC) {
  37.             this._isHit = this.calcPcHit(); // PC TO PC 命中计算

  38.         } else if (this._calcType == PC_NPC) {
  39.             this._isHit = this.calcNpcHit(); // PC TO NPC  命中计算
  40.         }
  41.         
  42.         return this._isHit;
  43.     }
复制代码
下面是pc对pc的计算方法
  1.      /**
  2.      * PC對PC的命中
  3.      * @return
  4.      */
  5.     protected boolean calcPcHit() {
  6.         if (_targetPc == null) { //对象玩家为空,命中为0
  7.             return false;
  8.         }
  9.         
  10.         // 傷害為0 命中为0
  11.         if (dmg0(_targetPc)) {
  12.             return false;
  13.         }

  14.         // 迴避攻擊 命中为0
  15.         if (calcEvasion()) {
  16.             return false;
  17.         }

  18.         // 奇古獸直接返回命中为真。
  19.         if (_weaponType2 == 17) {
  20.             return true;
  21.         }
  22.         
  23.         //坚固防护有15%几率让妖精对手MISS。
  24.         if ((_weaponType == 20 || _weaponType == 62) && _targetPc.hasSkillEffect(IDSkill.SOLID_CARRIAGE) && URandom.nextInt(100) <= 15){
  25.             //_pc.sendPackets(new SPMsgServer("miss"));
  26.             return false;
  27.         }
  28.         //回避提升有12%几率让妖精对手MISS。
  29.         if ((_weaponType == 20 || _weaponType == 62) && _targetPc.hasSkillEffect(IDSkill.DRESS_EVASION) && URandom.nextInt(100) <= 12){
  30.             //_pc.sendPackets(new SPMsgServer("miss1"));
  31.             return false;
  32.         }
  33.         
  34.         _hitRate = _pc.getLevel(); //玩家等级每增加1级,命中+1
  35.         _hitRate += str_dex_Hit(); // 力量命中加成,和透视镜一样,最高19. / 敏捷命中加成,和透视镜一样,最高29.

  36.         if ((_weaponType != 20) && (_weaponType != 62)) { //当玩家武器类型不是弓和铁手甲时的计算判断。命中追加。
  37.             _hitRate += (_weaponAddHit + _pc.getHitup() + _pc.getOriginalHitup() + (_weaponEnchant * 0.5)
  38.                     + (_pc.is_castleAdd() ? _pc.get_castleAdd().get_addHit() : 0)); //本段的计算是:武器本身命中+玩家自身命中 +玩家出身敏捷加成+武器加值的二分之一+城堡技能加值(本服未开放)。
  39.             
  40.         } else { //武器为弓和铁手甲
  41.             _hitRate += (_weaponAddHit + _pc.getBowHitup() + _pc.getOriginalBowHitup() + (_weaponEnchant * 0.5)
  42.                     + (_pc.is_castleAdd() ? _pc.get_castleAdd().get_addBowHit() : 0));//本段的计算是:武器本身命中+玩家自身弓命中 +玩家出身敏捷弓加成+武器加值的二分之一+城堡技能加值(本服未开放)。
  43.         }

  44.         // 防具追加命中
  45.         if ((_weaponType != 20) && (_weaponType != 62)) {
  46.             _hitRate += _pc.get_hitMdfByItem(); //防具命中

  47.         } else {
  48.             _hitRate += _pc.get_bowHitMdfByItem(); //防具弓命中。
  49.         }
  50.         
  51.         //尖刺盔甲攻击成功+6
  52.         if (_pc.hasSkillEffect(IDSkill.BOUNCE_ATTACK)){
  53.             _hitRate += 6;
  54.         }
  55.         
  56.         // 重量命中補正
  57.         final int weight240 = _pc.getInventory().getWeight240();
  58.         if (weight240 > 80) {
  59.             if ((80 < weight240) && (120 >= weight240)) { //玩家负重33~50%,命中-1
  60.                 _hitRate -= 1;

  61.             } else if ((121 <= weight240) && (160 >= weight240)) { //玩家负重51~66%,命中-3
  62.                 _hitRate -= 3;

  63.             } else if ((161 <= weight240) && (200 >= weight240)) {//玩家负重67~83%,命中-5
  64.                 _hitRate -= 5;
  65.             }
  66.         }

  67.         _hitRate += hitUp(); //追加技能追加的命中

  68.         int attackerDice = URandom.nextInt(20) + 2 + _hitRate - 10; //攻击随机点数。2~21 + 命中点数 -10.

  69.         attackerDice += attackerDice(_targetPc); // 技能增加閃避
  70.         
  71.         int defenderDice = 0;

  72.         final int defenderValue = (int) (_targetPc.getAc() * 1.5) * -1;

  73.         if (_targetPc.getAc() >= 0) {
  74.             defenderDice = 10 - _targetPc.getAc();

  75.         } else if (_targetPc.getAc() < 0) {
  76.             defenderDice = 10 + URandom.nextInt(defenderValue) + 1;
  77.         }

  78.         final int fumble = _hitRate - 9;
  79.         final int critical = _hitRate + 10;
  80.         
  81.         if (attackerDice <= fumble) {
  82.             _hitRate = 15;

  83.         } else if (attackerDice >= critical) {
  84.             _hitRate = 100;

  85.         } else {
  86.             if (attackerDice > defenderDice) {
  87.                 _hitRate = 100;
  88.                
  89.             } else if (attackerDice <= defenderDice) {
  90.                 _hitRate = 15;
  91.             }
  92.         }
  93.         
  94.         final int rnd = URandom.nextInt(100) + 1;
  95.         // 武器為弓 附加ER計算
  96.         if (_weaponType == 20) {
  97.             if (_hitRate > rnd) {
  98.                 return calcErEvasion();
  99.             }
  100.         }
  101.         
  102.         return _hitRate >= rnd;
  103.     }
复制代码

作者: 颓废三道    时间: 2014-8-31 14:42
几个影响命中的方法,该方法在上面的calc中被引用。
  1.         /**
  2.          * 傷害為0
  3.          * @param pc 玩家
  4.          * @return true 傷害為0
  5.          */
  6.         protected static boolean dmg0(final L1Character character) {
  7.                 try {
  8.                         if (character == null) {
  9.                                 return false;
  10.                         }
  11.                        
  12.                         if (character.getSkillisEmpty()) {
  13.                                 return false;
  14.                         }
  15.                        
  16.                         if (character.getSkillEffect().size() <= 0) {
  17.                                 return false;
  18.                         }

  19.                         for (final Integer key : character.getSkillEffect()) {
  20.                                 final Integer integer = L1AtkMgcList.SKM0.get(key);
  21.                                 if (integer != null) {
  22.                                         return true;
  23.                                 }
  24.                         }
  25.                        
  26.                 } catch (final ConcurrentModificationException e) {
  27.                         // 技能取回發生其他線程進行修改
  28.                        
  29.                 } catch (final Exception e) {
  30.                         LOG.error(e.getLocalizedMessage(), e);
  31.                 }
  32.                
  33.                 return false;
  34.         }

  35.         /**
  36.          * 技能增加閃避
  37.          * @param character 角色
  38.          * @return
  39.          */
  40.         protected static int attackerDice(final L1Character character) {
  41.                 int attackerDice = 0;
  42.                
  43.                 if (character.get_dodge() > 0) {
  44.                         attackerDice -= character.get_dodge();
  45.                 }
  46.                
  47.                 if (character.get_dodge_down() > 0) {
  48.                         attackerDice += character.get_dodge_down();
  49.                 }
  50.                
  51.                 return attackerDice;
  52.         }
  53.        
  54.         /**
  55.          * ER迴避率
  56.          * @return true:命中 false:未命中
  57.          */
  58.         protected boolean calcErEvasion() {
  59.                 int er = this._targetPc.getEr();
  60.                 // 地龍魔眼 誕生,形象,生命魔眼
  61.                 if (_targetPc.hasSkillEffect(IDSkill.DRAGONE)
  62.                                 || _targetPc.hasSkillEffect(IDSkill.DRAGONB)
  63.                                 || _targetPc.hasSkillEffect(IDSkill.DRAGONP)
  64.                                 || _targetPc.hasSkillEffect(IDSkill.DRAGONL)) {
  65.                         er += er*0.1;
  66.                 }
  67.                 final int rnd = URandom.nextInt(100) + 1;
  68.                
  69.                 return er < rnd;
  70.         }
  71.        
  72.         /**
  73.          * 迴避
  74.          * @return true:迴避成功 false:迴避未成功
  75.          */
  76.         protected boolean calcEvasion() {
  77.                 if (this._targetPc == null) {
  78.                         return false;
  79.                 }
  80.                 int ev = this._targetPc.get_evasion();
  81.                 // 地龍魔眼 誕生,形象,生命魔眼
  82.                 if (_targetPc.hasSkillEffect(IDSkill.DRAGONE)
  83.                                 || _targetPc.hasSkillEffect(IDSkill.DRAGONB)
  84.                                 || _targetPc.hasSkillEffect(IDSkill.DRAGONP)
  85.                                 || _targetPc.hasSkillEffect(IDSkill.DRAGONL)) {
  86.                         ev += ev * 0.1;
  87.                 }
  88.                 if (ev <= 0) {
  89.                         return false;
  90.                 }
  91.                 final int rnd = URandom.nextInt(1000) + 1; // 1-1000
  92.                 return ev >= rnd; // EV越大則大於隨機數的幾率越高
  93.         }   
复制代码

作者: zkk1985    时间: 2014-8-31 16:58
以下红色部分为三道回复的话

//  这里没有贴出 技能增加闪避的。 闪避与回避针对 近战和 远程的分别判定  可以贴出来吗

   attackerDice += attackerDice(_targetPc); // 技能增加閃避
attackerDice方法,我已经列在了2楼,但是

//  _targetPc.getAc() 这个的值怎么取 比如人物显示-100的防御是取-100,还是-110
getAc() 获取的是你面板上显示的防御,显示-100,就是-100.

//  以下举例 命中按 140 计算 防御为 -110

//  是否可以贴出力量和敏捷的命中代码
力量和敏捷的计算,就在透视镜,

if (_targetPc.getAc() >= 0) {

86.            defenderDice = 10 - _targetPc.getAc();

87.

88.        } else if (_targetPc.getAc() < 0) {

                     // 现在肯定是这个了, 按-110算的话,  随机区间为11 - 175
                      老实说,我看不懂你这句话是什么意思,这是防御骰点,假设玩家防御-100,那么这里 defenderDice = 11~150.
89.            defenderDice = 10 + URandom.nextInt(defenderValue) + 1;

90.        }



  // attackerDice 的区间: 132 - 151

if (attackerDice <= fumble) {

                //   这个的几率是不是为0.。。。
       这是保持最低命中15%
96.            _hitRate = 15;

97.

98.        } else if (attackerDice >= critical) {
                    //  这个是保证最低命中5%
                   这就是命中的意思。
99.            _hitRate = 100;

100.

101.        } else {

                // 2个随机数的比较  132 - 151 PK 11 - 175
                // 分三段 defenderDice 11 - 131 表示 觉得绝对命中 占了89%
                // 131 - 150 看运气 有可能绝对命中
                // 151 - 175 没有绝对命中 但有一定几率命中 几率为 15% 出现151 - 175的几率为15%
                // 防御为140 区间为11 - 221 ,如果命中为140的话。约为33%
                // 即使命中达到160!超高命中!说实话昨天搞了个160防御与120比较,也不太明显
                // 这里最后算下来怎么地也有10%的差距吧!!!!
                老实说。。。你这一堆怎么算的,我完全看不懂。。。
102.            if (attackerDice > defenderDice) {

                // _hitRate 为100 表示绝对命中
103.                _hitRate = 100;

104.               

105.            } else if (attackerDice <= defenderDice) {
               
106.                _hitRate = 15;

107.            }

108.        }

109.        

110.        final int rnd = URandom.nextInt(100) + 1;

111.        // 武器為弓 附加ER計算

112.        if (_weaponType == 20) {

113.            if (_hitRate > rnd) {

114.                return calcErEvasion();

115.            }

116.        }

117.        
               
118.        return _hitRate >= rnd;
作者: 荏苒    时间: 2014-8-31 17:17
改考虑考虑进攻进攻你修改修改源代码
作者: 颓废三道    时间: 2014-8-31 23:42
你可以看看1楼第二段代码中的第16行,关于calcEvasion方法的判断,其方法代码是
  1.     protected boolean calcEvasion() {
  2.         if (this._targetPc == null) {
  3.             return false;
  4.         }
  5.         int ev = this._targetPc.get_evasion(); //[color=Red]获取玩家ev值,在角色面板的回避值读取。[/color]
  6.         // 地龍魔眼 誕生,形象,生命魔眼
  7.         if (_targetPc.hasSkillEffect(IDSkill.DRAGONE)
  8.                 || _targetPc.hasSkillEffect(IDSkill.DRAGONB)
  9.                 || _targetPc.hasSkillEffect(IDSkill.DRAGONP)
  10.                 || _targetPc.hasSkillEffect(IDSkill.DRAGONL)) {
  11.             ev += ev * 0.1; //拥有以上魔眼状态,ev值提高10%
  12.         }
  13.         if (ev <= 0) {
  14.             return false;
  15.         }
  16.         final int rnd = URandom.nextInt(1000) + 1; // 1-1000
  17.         return ev >= rnd; // EV越大則大於隨機數的幾率越高
  18.     }
复制代码
在第114行,方法calcErEvasion
在判定命中hitrate大于随机骰点的情况下,如果武器是弓,要进行闪避判断。
闪避就是骑士的坚固防御和黑妖的闪避提升加的那个,所以有时候看到黑妖和近战PK加闪避提升很无语。

闪避的判断代码是这样写的
  1.     /**
  2.      * ER迴避率
  3.      * @return true:命中 false:未命中
  4.      */
  5.     protected boolean calcErEvasion() {
  6.         int er = this._targetPc.getEr(); [color=Red]注意这个方法[/color]
  7.         // 地龍魔眼 誕生,形象,生命魔眼
  8.         if (_targetPc.hasSkillEffect(IDSkill.DRAGONE)
  9.                 || _targetPc.hasSkillEffect(IDSkill.DRAGONB)
  10.                 || _targetPc.hasSkillEffect(IDSkill.DRAGONP)
  11.                 || _targetPc.hasSkillEffect(IDSkill.DRAGONL)) {
  12.             er += er*0.1; 如果有以上状态,闪避值提升10%。
  13.         }
  14.         final int rnd = URandom.nextInt(100) + 1;
  15.         
  16.         return er < rnd;
  17.     }
复制代码
闪避值的计算来源于以下代码
  1.      public int getEr() {
  2.         if (this.hasSkillEffect(STRIKER_GALE)) { [color=Red]//如果拥有精准射击状态,则无视闪避,注意,依然受到物理回避效果影响。[/color]
  3.             return 0;
  4.         }

  5.         int er = 0;
  6.         if (this.isKnight() || this.isDarkelf() ) { //骑士、黑妖每1级+1闪避
  7.             er = this.getLevel() >> 2;// /4 // ナイト
  8.         
  9.         } else if (this.isCrown()) {
  10.             er = this.getLevel() / 6;//王族每6级+1闪避。
  11.                     
  12.         } else if (this.isElf()) { //妖精每6级+1闪避。
  13.             er = this.getLevel() / 6; // ダークエルフ
  14.             
  15.         } else if (this.isWizard()) { //法师每10级+1闪避。
  16.             er = this.getLevel() / 10; // ウィザード
  17.             
  18.         } else if (this.isDragonKnight()) { //龙骑每5级+1闪避。
  19.             er = this.getLevel() / 5; // ドラゴンナイト
  20.             
  21.         } else if (this.isIllusionist()) { //幻术每9级+1闪避。
  22.             er = this.getLevel() / 9; // イリュージョニスト
  23.         }

  24.         er += (this.getDex() - 8) >> 1;/// 2;  每2点敏捷+1闪避。
  25.                     
  26.         er += this.getOriginalEr(); //附加出身点数加到闪避点数。

  27.         if (this.hasSkillEffect(DRESS_EVASION)) { // 閃避提升 +12闪避
  28.             er += 12;
  29.         }
  30.         
  31.         if (this.hasSkillEffect(SOLID_CARRIAGE)) { // 堅固防護 +15闪避
  32.             er += 15;
  33.         }
  34.         
  35.         return er;
  36.     }
复制代码

作者: zkk1985    时间: 2014-8-31 23:45
本帖最后由 zkk1985 于 2014-8-31 23:57 编辑

if (attackerDice <= fumble) {

    _hitRate = 15;
}

这个不是恒定的 假吗
attackerDice 的最小值 (  _hitRate  - 8)也比 fumble (  _hitRate  - 9)这个大
进不去这个判断
怎么能保证最低命中

之前没看到 关于这段代码

attackerDice += attackerDice(_targetPc); // 技能增加閃避

详细的代码
现在看到了。。。

这下出入可大了
白天再好好研究研究。。。。


你举例是-100,我是-110。。。
所以数据稍有不同


作者: zkk1985    时间: 2014-8-31 23:49
本帖最后由 zkk1985 于 2014-9-1 00:11 编辑

在楼下看到新的代码了。。很好。。。
作者: zkk1985    时间: 2014-8-31 23:53
if (_targetPc.getAc() >= 0) {

            defenderDice = 10 - _targetPc.getAc();

  } else if (_targetPc.getAc() < 0) {

           defenderDice = 10 + URandom.nextInt(defenderValue) + 1;

  }

这段代码可以优化
经常出现的应该放在最前面
这样可以少跑几微秒。。。。
我是程序员是个新手。
刚转行,看书的时候不小心看到的
作者: 颓废三道    时间: 2014-9-1 02:52
zkk1985 发表于 2014-8-31 23:45
if (attackerDice

if (attackerDice <= fumble) {

    _hitRate = 15;
}
这个显然不是恒定的假啊。。
假设_hitRate 是80,
那么attackerdice是 0~19+2+80-10 = 70~91
那么fumble = 71.
当attackerdice <= 71时,保证_hitRate = 15. 配合下面的esle条件,相当于无论如何,保持15%的命中。
作者: zkk1985    时间: 2014-9-1 08:36
本帖最后由 zkk1985 于 2014-9-1 08:38 编辑

那么attackerdice是 0~19+2+80-10 = 70~91

你是怎么算出70的。。。
难道我要开始怀疑人生了吗.....
请大家评评理!!!
你的区间有 21 个数了。。。

0 + 2 = 2
2 + 80 = 82
82 - 10 = 72
这个算术不会隐藏深奥的问题吧。。。

作者: 风流小法师    时间: 2014-9-1 08:50
这个太高深了,你们在对飙技术吗?
作者: zkk1985    时间: 2014-9-1 09:20
我有啥技术阿
这就像有个作家写了本书
我就是那个找错别字的那个而已。。。


作者: zkk1985    时间: 2014-9-1 09:31
本帖最后由 zkk1985 于 2014-9-1 11:57 编辑

整个命中算法的结构
我想源代码应该不是出自三道吧
也不会是nc的
这套算法更像是为了接近于真实的算法而模拟出来的
思路不是特别的清晰
很多加10减10的感觉更像是为了靠近想要接近的那个结果

没有任何资料说过黑妖骑士 每1级 加一点闪避的
应该是你写错了
你代码写的是每4级加1点。。。。
也没有根据等级加闪避的
倒是根据等级不同职业有加额外命中的
有根据等级不同职业追加回避的
骑士黑妖是每4级一点追加一点回避

然后详细看了代码
是你把回避写成闪避了。。。。
// 注释错误。。。误导!

        int ev = this._targetPc.get_evasion(); //获取玩家ev值,在角色面板的回避值读取。
究竟是读回避值还是闪避值

  int ev = this._targetPc.get_evasion(); 读出来的实际数据是多少
        final int rnd = URandom.nextInt(1000) + 1; // 1-1000

确定这个没错吧。。。区间这么大
如果闪避50的话,那岂不是只有5%
而实际上绝不是5%!!!!

而下面的回避又是100了。。。
确定没搞错吧!!!

另外 这个随机算法是怎么样的随机算法
有种是区间内数据平均出现很均匀的
还有一种是不稳定随机
主要出2头的!不是偏小就是偏大,中间的超级少的
自己可以循环打印看看。。。。

很多地方闪避写成回避, 回避写成闪避。。。。// 注释坑人!

get_evasion() 这个方法读取的面板左边的那个值还是右边的
一个回避 一个闪避



不光是红色恋曲
就是很久以前的青岛,新浪也有说明

但是那样的话这里的一部分的算法就不适用

这是红色发表的一套算法
http://www.hslq.cn/forum.php?mod ... rderby%3Drecommends
这是红色某人看了无数资料的总结,看起来很可靠
http://www.hslq.cn/forum.php?mod=viewthread&tid=409849

整个帖子的算法也不能说是nc的算法
但是我看起来觉得更科学点
更接近于真实



作者: lsw456852    时间: 2014-9-1 09:42
外行插一句:
包子一开始发帖,讨论的是”三道出公告修改的只是高治卷的CD,却为何中治卷的CD也同样成了5s“
为什么转而对这个命中和闪避讨论那么细致?而对中治卷的CD不管不问了
作者: zkk1985    时间: 2014-9-1 12:17
      //坚固防护有15%几率让妖精对手MISS。
        if ((_weaponType == 20 || _weaponType == 62) && _targetPc.hasSkillEffect(IDSkill.SOLID_CARRIAGE) && URandom.nextInt(100) <= 15){
            //_pc.sendPackets(new SPMsgServer("miss"));
            return false;
        }
        //回避提升有12%几率让妖精对手MISS。
        if ((_weaponType == 20 || _weaponType == 62) && _targetPc.hasSkillEffect(IDSkill.DRESS_EVASION) && URandom.nextInt(100) <= 12){
            //_pc.sendPackets(new SPMsgServer("miss1"));
            return false;
        }

// 这段代码是不是可以整到这里面去

112.        if (_weaponType == 20) {

113.            if (_hitRate > rnd) {

114.                return calcErEvasion();

115.            }

116.        }

可能有多余的运算

或者增加了近战判定的负担!
作者: 颓废三道    时间: 2014-9-1 13:27
zkk1985 发表于 2014-9-1 12:17
//坚固防护有15%几率让妖精对手MISS。
        if ((_weaponType == 20 || _weaponType == 62) && _ ...

搞到下面才会多余很多计算。提到最前面,直接判断状态,返回判断结果,下面的内容就都不用计算了。
作者: 颓废三道    时间: 2014-9-1 13:32
lsw456852 发表于 2014-9-1 09:42
外行插一句:
包子一开始发帖,讨论的是”三道出公告修改的只是高治卷的CD,却为何中治卷的CD也同样成了5s ...

有两个原因导致出现你说的跑题。
一是治疗卷的CD我不会缩短了。现在天堂官府我不太了解,不过以前我玩的时候,也算半个人民币玩家了,一个区花7~8万人民币玩的应该不是很多。但那时候我PK也没钱一直用中治。我从来不打钱,只PK,所有消耗的金币也都是收购的。 私服的获取条件太单调了,再者,官府再怎么收购,产出是恒定的。而在无限,他们花的金币大多是我刷出来卖给他们的,没有限制。

二是,其实仔细看,包子质疑治疗卷CD只是个印子,质疑的重点,还是在命中这个问题上,也就是说,他认为职业强度发生改变是因为命中的改变导致的。所以我才重点和他谈这个问题。贴出代码,对于喜欢研究游戏的玩家来说,更能加深他们对游戏的理解。很多会员不明白为什么比不过非会员玩家,其实就是对游戏的认识不足。


作者: zkk1985    时间: 2014-9-1 13:53
   //坚固防护有15%几率让妖精对手MISS。
        if ((_weaponType == 20 || _weaponType == 62) && _targetPc.hasSkillEffect(IDSkill.SOLID_CARRIAGE) && URandom.nextInt(100) <= 15){
            //_pc.sendPackets(new SPMsgServer("miss"));
            return false;
        }
        //回避提升有12%几率让妖精对手MISS。
        if ((_weaponType == 20 || _weaponType == 62) && _targetPc.hasSkillEffect(IDSkill.DRESS_EVASION) && URandom.nextInt(100) <= 12){
            //_pc.sendPackets(new SPMsgServer("miss1"));
            return false;
        }

这 2 个判断可以合 到一个里面
不然近战要判断2次
作者: zkk1985    时间: 2014-9-1 13:55
颓废三道 发表于 2014-9-1 02:52
if (attackerDice

你的70是怎么算出来的!!!!
作者: 颓废三道    时间: 2014-9-1 14:15
zkk1985 发表于 2014-9-1 13:53
//坚固防护有15%几率让妖精对手MISS。
        if ((_weaponType == 20 || _weaponType == 62) && _tar ...

是两个不同的判断,if里面用If一样都要判断的。
作者: 颓废三道    时间: 2014-9-1 14:27
这个扯得我很累。。。

首先,你
int ev = this._targetPc.get_evasion(); //获取玩家ev值,在角色面板的回避值读取。
这里我说得很清楚,是回避值,不是闪避值。不用质疑到底是回避还是闪避。回避值是千分位,50点回避是有5%的几率回避近战攻击。
闪避是百分位,50点闪避是50%几率闪避弓箭。

我注释读取面板的地方,那就是面板显示是多少,就是读多少,还用问读出来是多少。。昏。
这套写法是L1JJP L1JTW 以及韩国PJJUMP共同测试下来的写法。都是以NC的测试数据为标准来写的。
作者: zkk1985    时间: 2014-9-1 14:31
颓废三道 发表于 2014-9-1 14:15
是两个不同的判断,if里面用If一样都要判断的。

  if ((_weaponType == 20 || _weaponType == 62))
    {
        if (_targetPc.hasSkillEffect(IDSkill.SOLID_CARRIAGE) && URandom.nextInt(100) <= 15)
        {
            //_pc.sendPackets(new SPMsgServer("miss"));
            return false;
        }
        else if ( _targetPc.hasSkillEffect(IDSkill.DRESS_EVASION) && URandom.nextInt(100) <= 12)
        {
            //_pc.sendPackets(new SPMsgServer("miss1"));
            return false;
        }
    }

这样近战是不是少一次
作者: 哥玩的是寂寞    时间: 2014-9-1 15:13
果然是技能贴


借贵保地留个言
求更新法师可以使用的初级腰带
作者: 奥拉奇里亚    时间: 2014-9-1 19:34
我日。
给大神跪了。
程序猿牛逼。
作者: zkk1985    时间: 2014-9-2 02:33
颓废三道 发表于 2014-8-31 23:42
你可以看看1楼第二段代码中的第16行,关于calcEvasion方法的判断,其方法代码是在第114行,方法calcErEvasi ...

怎么没有水之防护的。。




欢迎光临 无限天堂 (http://down.t4coming.net/) Powered by Discuz! X2.5