From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Aikar 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/Navigation.java b/src/main/java/net/minecraft/server/Navigation.java index 3303edadf722557212ab973cb4f1684a0a8ae0f2..681465d8a74831461dce4615d2d19c7ed46bc299 100644 --- a/src/main/java/net/minecraft/server/Navigation.java +++ b/src/main/java/net/minecraft/server/Navigation.java @@ -60,7 +60,7 @@ public class Navigation extends NavigationAbstract { @Override public PathEntity a(Entity entity, int i) { - return this.a(entity.getChunkCoordinates(), i); + return this.a(entity.getChunkCoordinates(), entity, i); // Paper - Forward target entity } private int t() { diff --git a/src/main/java/net/minecraft/server/NavigationAbstract.java b/src/main/java/net/minecraft/server/NavigationAbstract.java index 6c65bab60d21b6c431855bc6516d4fd840a0efb8..0ed4b1d9c636a9051718f800ba5717e3ae46cdc9 100644 --- a/src/main/java/net/minecraft/server/NavigationAbstract.java +++ b/src/main/java/net/minecraft/server/NavigationAbstract.java @@ -8,7 +8,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; @@ -94,16 +94,26 @@ public abstract class NavigationAbstract { @Nullable public PathEntity a(BlockPosition blockposition, int i) { - return this.a(ImmutableSet.of(blockposition), 8, false, i); + // Paper start - add target parameter + return this.a(blockposition, null, i); + } + @Nullable public PathEntity a(BlockPosition blockposition, Entity target, int i) { + return this.a(ImmutableSet.of(blockposition), target, 8, false, i); + // Paper end } @Nullable public PathEntity a(Entity entity, int i) { - return this.a(ImmutableSet.of(entity.getChunkCoordinates()), 16, true, i); + return this.a(ImmutableSet.of(entity.getChunkCoordinates()), entity, 16, true, i); // Paper } @Nullable + // Paper start - Add target protected PathEntity a(Set set, int i, boolean flag, int j) { + return this.a(set, null, i, flag, j); + } + @Nullable protected PathEntity a(Set set, Entity target, int i, boolean flag, int j) { + // Paper end if (set.isEmpty()) { return null; } else if (this.a.locY() < 0.0D) { @@ -113,6 +123,23 @@ public abstract class NavigationAbstract { } else if (this.c != null && !this.c.b() && set.contains(this.p)) { return this.c; } else { + // Paper start - Pathfind event + boolean copiedSet = false; + for (BlockPosition possibleTarget : set) { + if (!new com.destroystokyo.paper.event.entity.EntityPathfindEvent(getEntity().getBukkitEntity(), + MCUtil.toLocation(getEntity().world, possibleTarget), target == null ? null : target.getBukkitEntity()).callEvent()) { + if (!copiedSet) { + copiedSet = true; + set = new java.util.HashSet<>(set); + } + // note: since we copy the set this remove call is safe, since we're iterating over the old copy + set.remove(possibleTarget); + if (set.isEmpty()) { + return null; + } + } + } + // Paper end this.b.getMethodProfiler().enter("pathfind"); float f = (float) this.a.b(GenericAttributes.FOLLOW_RANGE); BlockPosition blockposition = flag ? this.a.getChunkCoordinates().up() : this.a.getChunkCoordinates(); diff --git a/src/main/java/net/minecraft/server/NavigationFlying.java b/src/main/java/net/minecraft/server/NavigationFlying.java index d9f0d446fceeba33fdf47e6ff88f888e6e17d019..0c33a0c9d59d79a39826b5ee14144604717ffebe 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, int i) { - return this.a(entity.getChunkCoordinates(), i); + return this.a(entity.getChunkCoordinates(), entity, i); // Paper - Forward target entity } @Override