From ef812432ec5d1a861add26683b2236d6e3cbcb25 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Mon, 28 Mar 2016 21:22:26 -0400
Subject: [PATCH] EntityPathfindEvent

Fires when an Entity decides to start moving to a location.

diff --git a/src/main/java/net/minecraft/server/NavigationAbstract.java b/src/main/java/net/minecraft/server/NavigationAbstract.java
index 2ced8dedd..6ce35018a 100644
--- a/src/main/java/net/minecraft/server/NavigationAbstract.java
+++ b/src/main/java/net/minecraft/server/NavigationAbstract.java
@@ -4,7 +4,7 @@ import javax.annotation.Nullable;
 
 public abstract class NavigationAbstract {
 
-    protected final EntityInsentient a;
+    protected final EntityInsentient a; public Entity getEntity() { return a; } // Paper - OBFHELPER
     protected final World b;
     @Nullable
     protected PathEntity c;
@@ -71,13 +71,16 @@ public abstract class NavigationAbstract {
         return this.b(new BlockPosition(d0, d1, d2));
     }
 
+    // Paper start - Add target entity parameter for path find event
+    @Nullable public PathEntity b(BlockPosition blockposition) { return this.b(blockposition, null); }
     @Nullable
-    public PathEntity b(BlockPosition blockposition) {
+    public PathEntity b(BlockPosition blockposition, Entity target) {
+        // Paper end
         float f = (float) blockposition.getX() + 0.5F;
         float f1 = (float) blockposition.getY() + 0.5F;
         float f2 = (float) blockposition.getZ() + 0.5F;
 
-        return this.a(blockposition, (double) f, (double) f1, (double) f2, 8, false);
+        return this.a(blockposition, target, (double) f, (double) f1, (double) f2, 8, false); // Paper - Path find event
     }
 
     @Nullable
@@ -87,16 +90,25 @@ public abstract class NavigationAbstract {
         double d1 = entity.getBoundingBox().minY;
         double d2 = entity.locZ;
 
-        return this.a(blockposition, d0, d1, d2, 16, true);
+        return this.a(blockposition, entity, d0, d1, d2, 16, true); // Paper - Path find event
     }
 
+    // Paper start - Add target entity parameter for path find event
+    @Nullable protected PathEntity a(BlockPosition blockposition, double d0, double d1, double d2, int i, boolean flag) { return this.a(blockposition, null, d0, d1, d2, i, flag); }
     @Nullable
-    protected PathEntity a(BlockPosition blockposition, double d0, double d1, double d2, int i, boolean flag) {
+    protected PathEntity a(BlockPosition blockposition, Entity target, double d0, double d1, double d2, int i, boolean flag) {
+        // Paper end
         if (!this.a()) {
             return null;
         } else if (this.c != null && !this.c.b() && blockposition.equals(this.q)) {
             return this.c;
         } else {
+            // Paper start - Pathfind event
+            if (!new com.destroystokyo.paper.event.entity.EntityPathfindEvent(getEntity().getBukkitEntity(),
+                    MCUtil.toLocation(getEntity().world, blockposition), target == null ? null : target.getBukkitEntity()).callEvent()) {
+                return null;
+            }
+            // Paper end
             this.q = blockposition;
             float f = this.i();
 
diff --git a/src/main/java/net/minecraft/server/NavigationFlying.java b/src/main/java/net/minecraft/server/NavigationFlying.java
index 9dfca6067..551ff417b 100644
--- a/src/main/java/net/minecraft/server/NavigationFlying.java
+++ b/src/main/java/net/minecraft/server/NavigationFlying.java
@@ -25,7 +25,7 @@ public class NavigationFlying extends NavigationAbstract {
 
     @Override
     public PathEntity a(Entity entity) {
-        return this.b(new BlockPosition(entity));
+        return this.b(new BlockPosition(entity), entity); // Paper - Pathfind event
     }
 
     @Override
-- 
2.21.0