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 95f916d5a08a7781278080c4f4abd4e152a945b5..da15615a19474d5db9bd46c3d772f467ec58b133 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 u() { diff --git a/src/main/java/net/minecraft/server/NavigationAbstract.java b/src/main/java/net/minecraft/server/NavigationAbstract.java index 0c3b986c07d9b8dc2012bfa5b27388a67f080ff8..d043bf14d25fd030ec5fa079e3272df0c11cc5f2 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; @@ -95,16 +95,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) { @@ -114,6 +124,23 @@ public abstract class NavigationAbstract { } else if (this.c != null && !this.c.c() && 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 feed11b62a4df63c1782e7124a3f006d7a8019a3..013bdfe5540ae594a7f9cbe3ef8dc54dfb25afd4 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