查看: 1603|回復: 14

[分享] 用最简洁的代码实现最完美的自动跟随

[複製鏈接]

19

主題

255

帖子

4366

金錢

暗殺軍王.史雷佛

Rank: 8Rank: 8

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
45
積分
4631
在線時間
65 小時
相冊
0
日誌
0
好友
7
QQ
發表於 2024-4-8 17:20 | 顯示全部樓層 |閱讀模式
大幅數位科技
本帖最後由 Lin-JN 於 2024-4-8 17:22 編輯

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


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

  6.             L1Character target = null;
  7.             if (_follower.isActivated()) { // 主人是自动狩猎AI
  8.                 if (_follower._AiTarget != null) {
  9.                     target = _follower._AiTarget;
  10.                 }
  11.             } else { // 主人是手动玩家
  12.                 target = _follower._attackTarget;
  13.             }

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

  17.             } else { // 无攻击对象则靠近主人
  18.                 reached(_follower);
  19.             }
複製代碼


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


  1.     /**
  2.      * 接近目标
  3.      *
  4.      * @param cha 目标
  5.      */
  6.     public void reached(L1Character cha) {
  7.         if (hasSkillEffect(STATUS_CURSE_PARALYZED)) {
  8.             return;
  9.         }
  10.         if (hasSkillEffect(STATUS_POISON_PARALYZED)) {
  11.             return;
  12.         }
  13.         if (hasSkillEffect(STATUS_FREEZE)) {
  14.             return;
  15.         }

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

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

  26.                 if (dir == -1) { // 无法通行时直接用飞的
  27.                     followTeleport(cha.getLocation());
  28.                 } else {
  29.                     _pcMove.setDirectionMove(dir);
  30.                 }
  31.             }
  32.         }
  33.     }
複製代碼



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




上一篇︰請問排行風雲榜的對話黨
下一篇︰變身修改 轉檔 位元16...依然異常! 有大神可指導一下嗎?
http://starway.freebbs.tw/index.php

8

主題

98

帖子

1388

金錢

妖魔鬥士

Rank: 6Rank: 6

威望
7
精華
0
貢獻
0
鑽石
0
閱讀權限
40
積分
1506
在線時間
115 小時
相冊
0
日誌
0
好友
0
發表於 2024-4-8 17:50 | 顯示全部樓層
感謝分享

回復

使用道具 舉報

2

主題

248

帖子

1萬

金錢

巨蟻女皇

Rank: 9Rank: 9Rank: 9

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
55
積分
11188
在線時間
57 小時
相冊
0
日誌
0
好友
1
發表於 2024-4-8 23:17 | 顯示全部樓層
3qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

回復 支持 反對

使用道具 舉報

1

主題

287

帖子

2109

金錢

妖魔鬥士

Rank: 6Rank: 6

威望
0
精華
0
貢獻
0
鑽石
0
閱讀權限
40
積分
2396
在線時間
60 小時
相冊
0
日誌
0
好友
1
發表於 2024-4-8 23:18 | 顯示全部樓層
3qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

[發帖際遇]: lin47411 在網吧通宵,花了 1 金錢. 幸運榜 / 衰神榜
回復 支持 反對

使用道具 舉報

0

主題

17

帖子

5

金錢

剛加入小嫩嫩

Rank: 1

威望
0
精華
0
貢獻
0
鑽石
0
閱讀權限
10
積分
22
在線時間
0 小時
相冊
0
日誌
0
好友
0
發表於 2024-4-9 17:49 | 顯示全部樓層
感謝大大分享 來看看

回復 支持 反對

使用道具 舉報

51

主題

425

帖子

2590

金錢

暗殺軍王.史雷佛

Rank: 8Rank: 8

威望
0
精華
0
貢獻
0
鑽石
0
閱讀權限
45
積分
3015
在線時間
219 小時
相冊
1
日誌
0
好友
6
發表於 2024-4-9 20:47 | 顯示全部樓層
感謝大大分享 來看看

回復 支持 反對

使用道具 舉報

1

主題

25

帖子

2311

金錢

妖魔鬥士

Rank: 6Rank: 6

威望
0
精華
0
貢獻
0
鑽石
0
閱讀權限
40
積分
2336
在線時間
28 小時
相冊
0
日誌
0
好友
0
發表於 2024-4-10 06:18 | 顯示全部樓層
請把重點說出來 不使用 World.get().findObjId(xxx)來取 那用什麼來取?

點評

看不明白吗? L1PcInstance _follower,从开始跟随的时候就设定好了固定对象,参考我之前写的R版特效物件。循环获取世界ID是一件非常愚蠢的事情。  發表於 2024-4-10 06:32
回復 支持 反對

使用道具 舉報

1

主題

25

帖子

2311

金錢

妖魔鬥士

Rank: 6Rank: 6

威望
0
精華
0
貢獻
0
鑽石
0
閱讀權限
40
積分
2336
在線時間
28 小時
相冊
0
日誌
0
好友
0
發表於 2024-4-10 16:00 | 顯示全部樓層
大殘大殘 發表於 2024-4-10 06:18
請把重點說出來 不使用 World.get().findObjId(xxx)來取 那用什麼來取?

哦,繼承父類,明白了

[發帖際遇]: 大殘大殘 在網吧通宵,花了 4 金錢. 幸運榜 / 衰神榜
回復 支持 反對

使用道具 舉報

12

主題

149

帖子

3萬

金錢

安塔瑞斯

Rank: 11Rank: 11Rank: 11Rank: 11

威望
5
精華
0
貢獻
0
鑽石
0
閱讀權限
65
積分
35849
在線時間
261 小時
相冊
0
日誌
0
好友
2
發表於 2024-4-11 21:54 | 顯示全部樓層
感谢分享,我那个跟随,还是有问题,两个主人在同一个地图就会出错!!!!!气死。

回復 支持 反對

使用道具 舉報

4

主題

233

帖子

2萬

金錢

巴列斯

Rank: 10Rank: 10Rank: 10

威望
6
精華
0
貢獻
0
鑽石
0
閱讀權限
60
積分
20343
在線時間
101 小時
相冊
0
日誌
0
好友
0
發表於 2024-4-11 22:05 | 顯示全部樓層
感謝分享

回復

使用道具 舉報

0

主題

26

帖子

142

金錢

史萊姆

Rank: 2

威望
0
精華
0
貢獻
0
鑽石
0
閱讀權限
20
積分
169
在線時間
11 小時
相冊
0
日誌
0
好友
0
發表於 2024-4-13 15:36 | 顯示全部樓層
了解想了解想了解想了解想了解想了解想

回復 支持 反對

使用道具 舉報

5

主題

263

帖子

2678

金錢

妖魔鬥士

Rank: 6Rank: 6

威望
0
精華
0
貢獻
0
鑽石
0
閱讀權限
40
積分
2941
在線時間
81 小時
相冊
0
日誌
0
好友
0
發表於 2024-12-23 20:25 | 顯示全部樓層
谢谢分享屏幕坏了一个小时了了了了了

回復 支持 反對

使用道具 舉報

5

主題

263

帖子

2678

金錢

妖魔鬥士

Rank: 6Rank: 6

威望
0
精華
0
貢獻
0
鑽石
0
閱讀權限
40
積分
2941
在線時間
81 小時
相冊
0
日誌
0
好友
0
發表於 2024-12-29 22:57 | 顯示全部樓層
谢谢分享屏幕坏了一个小时了了了

回復 支持 反對

使用道具 舉報

5

主題

263

帖子

2678

金錢

妖魔鬥士

Rank: 6Rank: 6

威望
0
精華
0
貢獻
0
鑽石
0
閱讀權限
40
積分
2941
在線時間
81 小時
相冊
0
日誌
0
好友
0
發表於 2025-1-20 01:23 | 顯示全部樓層
大佬6666+摇一摇啊摇一摇一摆一晚上没睡

回復 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊會員

本版積分規則

天堂私服列表

45客服

Archiver| 45天堂私服論壇   分享到微博! 分享到臉書! 分享到噗浪! 分享到維特! 分享到Google+! 分享到LINE!

45天堂私服發佈站 ©    天堂私服架設教學  提供最新天堂私服最新資訊

流量最高、品質最好、服務最優、玩家首選、最新天堂私服資訊,都在45天堂私服發佈站.    免責聲明

Sitetag
line客服聯繫
掃一掃二碼
Line客服聯繫
24H專人回覆
返回頂部 返回列表