@Override public boolean shouldExecute() { if (targets.size() == 0 || !npc.isSpawned()) return false; Collection<Entity> nearby = npc.getEntity().getNearbyEntities(radius, radius, radius); this.target = null; for (Entity entity : nearby) { if (targets.contains(entity.getType())) { target = entity; break; } } if (target != null) { npc.getNavigator().setTarget(target, aggressive); npc.getNavigator().getLocalParameters().addSingleUseCallback(new NavigatorCallback() { @Override public void onCompletion(CancelReason cancelReason) { reason = cancelReason; finished = true; } }); return true; } return false; }
@Override public boolean shouldExecute() { boolean executing = !npc.getNavigator().isNavigating() && target != null; if (executing) { npc.getNavigator().setTarget(target); npc.getNavigator().getLocalParameters().addSingleUseCallback(new NavigatorCallback() { @Override public void onCompletion(CancelReason cancelReason) { finished = true; reason = cancelReason; } }); } return executing; } }
@Override public void run(final NPC npc, Block point, ListIterator<Block> path) { current = path; if (added || npc.data().<Boolean> get("running-ladder", false)) { added = true; return; } Runnable callback = new Runnable() { Location dummy = new Location(null, 0, 0, 0); @Override public void run() { if (npc.getEntity().getLocation(dummy).getBlock().getType() == Material.LADDER && current.next().getY() > current.previous().getY()) { npc.getEntity().setVelocity(npc.getEntity().getVelocity().setY(0.3)); } } }; npc.getNavigator().getLocalParameters().addSingleUseCallback(new NavigatorCallback() { @Override public void onCompletion(CancelReason cancelReason) { npc.data().set("running-ladder", false); } }); npc.getNavigator().getLocalParameters().addRunCallback(callback); added = true; } }