用最简洁的代码实现最完美的自动跟随
本帖最後由 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的。 感謝分享 3qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 3qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 感謝大大分享 來看看 感謝大大分享 來看看 請把重點說出來 不使用 World.get().findObjId(xxx)來取 那用什麼來取? 大殘大殘 發表於 2024-4-10 06:18
請把重點說出來 不使用 World.get().findObjId(xxx)來取 那用什麼來取?
哦,繼承父類,明白了
感谢分享,我那个跟随,还是有问题,两个主人在同一个地图就会出错!!!!!气死。 感謝分享 了解想了解想了解想了解想了解想了解想
谢谢分享屏幕坏了一个小时了了了了了 谢谢分享屏幕坏了一个小时了了了 大佬6666+摇一摇啊摇一摇一摆一晚上没睡
頁:
[1]