Guest User

ExactNavigator.java

a guest
Apr 7th, 2022
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.67 KB | None | 0 0
  1. import com.destroystokyo.paper.entity.Pathfinder;
  2. import lombok.NonNull;
  3. import org.bukkit.Location;
  4. import org.bukkit.entity.Mob;
  5.  
  6. import javax.annotation.Nullable;
  7. import java.util.function.Predicate;
  8.  
  9. // По неизвестной причине обычный навигатор не доводит моба до точки назначения 4-5 блоков.
  10. // Подозреваю, что это сделано с целью оптимизации расхода оперативной памяти.
  11. // Скорее всего, для всего пути может создаться лишь определённое кол-во точек,
  12. // поэтому на больших расстояниях дистанция между точками увеличивается,
  13. // что и приводит к большой погрешности.
  14.  
  15. // Таким образом, при достижении последней точки необходимо запустить навигацию ещё раз.
  16. // Расстояние между точками станет меньше, погрешность уменьшится до допустимого значения в 1 блок.
  17.  
  18. // Почему такой метод не использует сама игра - неясно. Возможно не нужна такая точность,
  19. // а, возможно, и нет необходимости "запускать" мобов на столь большое расстояние.
  20.  
  21. // Поскольку нам нужна точность - используем этот прекрасный класс
  22.  
  23. // Author: Dymeth.Ru
  24. public class ExactNavigator {
  25.     private final Mob mob;
  26.     private final Location target;
  27.     private final double movingSpeed;
  28.     private final Predicate<ExactNavigator> continueOnFail;
  29.  
  30.     private long lastDistanceCalculatedAt;
  31.     private boolean failed;
  32.  
  33.     public ExactNavigator(@NonNull Mob mob, @NonNull Location target, double movingSpeed, @Nullable Predicate<ExactNavigator> continueOnFail) {
  34.         this.mob = mob;
  35.         this.target = target;
  36.         this.movingSpeed = movingSpeed;
  37.         this.continueOnFail = continueOnFail;
  38.  
  39.         this.lastDistanceCalculatedAt = 0;
  40.         this.failed = false;
  41.  
  42.         this.mob.getPathfinder().moveTo(this.target, this.movingSpeed);
  43.     }
  44.  
  45.     @NonNull
  46.     public Mob getMob() {
  47.         return this.mob;
  48.     }
  49.  
  50.     @NonNull
  51.     public Location getTarget() {
  52.         return this.target;
  53.     }
  54.  
  55.     public boolean isPathCompleteSuccessfully() {
  56.         Pathfinder.PathResult path = this.mob.getPathfinder().getCurrentPath();
  57.         if (path == null) return true;
  58.         if (path.getNextPoint() != null) return false;
  59.         long now = System.currentTimeMillis();
  60.         if (now - this.lastDistanceCalculatedAt > 1_000) {
  61.             this.lastDistanceCalculatedAt = now;
  62.             if (this.mob.getLocation().distanceSquared(this.target) < 1) return true;
  63.             this.mob.getPathfinder().moveTo(this.target, this.movingSpeed);
  64.             return false;
  65.         }
  66.         // Моб не смог найти путь до цели
  67.         boolean continuePathfinding;
  68.         if (this.continueOnFail == null) continuePathfinding = false;
  69.         else continuePathfinding = this.continueOnFail.test(this);
  70.         if (continuePathfinding) return false;
  71.         this.mob.getPathfinder().stopPathfinding();
  72.         this.failed = true;
  73.         return false;
  74.     }
  75.  
  76.     public boolean isPathFailed() {
  77.         return this.failed;
  78.     }
  79.  
  80.     public boolean isPathCompleteOrFailed() {
  81.         return this.failed || this.isPathCompleteSuccessfully();
  82.     }
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment