本帖最後由 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的。