Lin-JN 發表於 2024-4-8 17:20

用最简洁的代码实现最完美的自动跟随

本帖最後由 Lin-JN 於 2024-4-8 17:22 編輯

之前看过一个朋友PO出来的自动跟随,认真看了一下,逻辑不是很顺,而且写得挺复杂的,于是自己改了一下。


首先是帮打的对象判断
// 跟随状态下
            if (getLocation().outSpellArea(_follower.getLocation(), 13)) {
                reached(_follower); // 距离主人超出13格 靠近主人
                return;
            }

            L1Character target = null;
            if (_follower.isActivated()) { // 主人是自动狩猎AI
                if (_follower._AiTarget != null) {
                  target = _follower._AiTarget;
                }
            } else { // 主人是手动玩家
                target = _follower._attackTarget;
            }

            if (target instanceof L1MonsterInstance) { // 添加主人攻击对象为攻击目标
                _hateList.add(target, 1);
                _AiTarget = _hateList.getMaxHateCharacter();

            } else { // 无攻击对象则靠近主人
                reached(_follower);
            }

然后是接近某个物件对象的方法(这个是之前为了别的功能早就写好了的东西)


    /**
   * 接近目标
   *
   * @param cha 目标
   */
    public void reached(L1Character cha) {
      if (hasSkillEffect(STATUS_CURSE_PARALYZED)) {
            return;
      }
      if (hasSkillEffect(STATUS_POISON_PARALYZED)) {
            return;
      }
      if (hasSkillEffect(STATUS_FREEZE)) {
            return;
      }

      // 不在同画面时直接用飞的
      if (!getLocation().isInScreen(cha.getLocation())) {
            followTeleport(cha.getLocation());
            return;
      }

      // 同画面中 距离目标3格以外时尝试接近
      if (getLocation().outSpellArea(cha.getLocation(), 3)) {
            if (_pcMove != null) {
                int dir = _pcMove.moveDirection(cha.getX(), cha.getY());
                dir = _pcMove.openDoor(dir);

                if (dir == -1) { // 无法通行时直接用飞的
                  followTeleport(cha.getLocation());
                } else {
                  _pcMove.setDirectionMove(dir);
                }
            }
      }
    }


就这样,基本实现了完美的自动跟随,测试了一下,非常好,没有问题……
当然,这里面有些变量,是我之前就优化过的,可能跟大部分人使用的版本不太一样,但是万变不离其宗,实际都一样。
之所以不使用 World.get().findObjId(xxx),是因为这种代码用多了,每一次都会把数十万个物件搜寻一次,真的会爆CPU的。

loveisayu 發表於 2024-4-8 17:50

感謝分享

lin47410 發表於 2024-4-8 23:17

3qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

lin47411 發表於 2024-4-8 23:18

3qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

pinying0203 發表於 2024-4-9 17:49

感謝大大分享 來看看

新手上路 發表於 2024-4-9 20:47

感謝大大分享 來看看

大殘大殘 發表於 2024-4-10 06:18

請把重點說出來 不使用 World.get().findObjId(xxx)來取 那用什麼來取?

大殘大殘 發表於 2024-4-10 16:00

大殘大殘 發表於 2024-4-10 06:18
請把重點說出來 不使用 World.get().findObjId(xxx)來取 那用什麼來取?

哦,繼承父類,明白了

zouzouge 發表於 2024-4-11 21:54

感谢分享,我那个跟随,还是有问题,两个主人在同一个地图就会出错!!!!!气死。

Nutcracker 發表於 2024-4-11 22:05

感謝分享

chsun5283 發表於 2024-4-13 15:36

了解想了解想了解想了解想了解想了解想
頁: [1]
查看完整版本: 用最简洁的代码实现最完美的自动跟随