From c801c5439d0de1870c9ca4c623be10b110b0e1ac 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. --- .../FlyingPathNavigation.java.patch | 11 +++ .../GroundPathNavigation.java.patch | 46 +++++++++++++ .../ai/navigation/PathNavigation.java.patch | 69 +++++++++++++++++++ .../WallClimberNavigation.java.patch | 14 ++++ 4 files changed, 140 insertions(+) create mode 100644 paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java.patch create mode 100644 paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java.patch create mode 100644 paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/PathNavigation.java.patch create mode 100644 paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java.patch diff --git a/paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java.patch new file mode 100644 index 0000000000..ac1686a6c3 --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java ++++ b/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java +@@ -39,7 +39,7 @@ + + @Override + public Path createPath(Entity entity, int distance) { +- return this.createPath(entity.blockPosition(), distance); ++ return this.createPath(entity.blockPosition(), entity, distance); // Paper - EntityPathfindEvent + } + + @Override diff --git a/paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java.patch new file mode 100644 index 0000000000..36cc381dc3 --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java.patch @@ -0,0 +1,46 @@ +--- a/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java ++++ b/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java +@@ -41,7 +41,7 @@ + } + + @Override +- public Path createPath(BlockPos target, int distance) { ++ public Path createPath(BlockPos target, @javax.annotation.Nullable Entity entity, int distance) { // Paper - EntityPathfindEvent + LevelChunk levelChunk = this.level + .getChunkSource() + .getChunkNow(SectionPos.blockToSectionCoord(target.getX()), SectionPos.blockToSectionCoord(target.getZ())); +@@ -56,7 +56,7 @@ + } + + if (mutableBlockPos.getY() > this.level.getMinY()) { +- return super.createPath(mutableBlockPos.above(), distance); ++ return super.createPath(mutableBlockPos.above(), entity, distance); // Paper - EntityPathfindEvent + } + + mutableBlockPos.setY(target.getY() + 1); +@@ -69,7 +69,7 @@ + } + + if (!levelChunk.getBlockState(target).isSolid()) { +- return super.createPath(target, distance); ++ return super.createPath(target, entity, distance); // Paper - EntityPathfindEvent + } else { + BlockPos.MutableBlockPos mutableBlockPos2 = target.mutable().move(Direction.UP); + +@@ -77,14 +77,14 @@ + mutableBlockPos2.move(Direction.UP); + } + +- return super.createPath(mutableBlockPos2.immutable(), distance); ++ return super.createPath(mutableBlockPos2.immutable(), entity, distance); // Paper - EntityPathfindEvent + } + } + } + + @Override + public Path createPath(Entity entity, int distance) { +- return this.createPath(entity.blockPosition(), distance); ++ return this.createPath(entity.blockPosition(), entity, distance); // Paper - EntityPathfindEvent + } + + private int getSurfaceY() { diff --git a/paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/PathNavigation.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/PathNavigation.java.patch new file mode 100644 index 0000000000..afee077193 --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/PathNavigation.java.patch @@ -0,0 +1,69 @@ +--- a/net/minecraft/world/entity/ai/navigation/PathNavigation.java ++++ b/net/minecraft/world/entity/ai/navigation/PathNavigation.java +@@ -125,8 +125,14 @@ + + @Nullable + public Path createPath(BlockPos target, int distance) { +- return this.createPath(ImmutableSet.of(target), 8, false, distance); ++ // Paper start - EntityPathfindEvent ++ return this.createPath(target, null, distance); + } ++ @Nullable ++ public Path createPath(BlockPos target, @Nullable Entity entity, int distance) { ++ return this.createPath(ImmutableSet.of(target), entity, 8, false, distance); ++ // Paper end - EntityPathfindEvent ++ } + + @Nullable + public Path createPath(BlockPos target, int minDistance, int maxDistance) { +@@ -135,7 +141,7 @@ + + @Nullable + public Path createPath(Entity entity, int distance) { +- return this.createPath(ImmutableSet.of(entity.blockPosition()), 16, true, distance); ++ return this.createPath(ImmutableSet.of(entity.blockPosition()), entity, 16, true, distance); // Paper - EntityPathfindEvent + } + + @Nullable +@@ -145,6 +151,17 @@ + + @Nullable + protected Path createPath(Set positions, int range, boolean useHeadPos, int distance, float followRange) { ++ // Paper start - EntityPathfindEvent ++ return this.createPath(positions, null, range, useHeadPos, distance, followRange); ++ } ++ ++ @Nullable ++ protected Path createPath(Set positions, @Nullable Entity target, int range, boolean useHeadPos, int distance) { ++ return this.createPath(positions, target, range, useHeadPos, distance, (float) this.mob.getAttributeValue(Attributes.FOLLOW_RANGE)); ++ } ++ ++ @Nullable protected Path createPath(Set positions, @Nullable Entity target, int range, boolean useHeadPos, int distance, float followRange) { ++ // Paper end - EntityPathfindEvent + if (positions.isEmpty()) { + return null; + } else if (this.mob.getY() < (double)this.level.getMinY()) { +@@ -154,6 +171,23 @@ + } else if (this.path != null && !this.path.isDone() && positions.contains(this.targetPos)) { + return this.path; + } else { ++ // Paper start - EntityPathfindEvent ++ boolean copiedSet = false; ++ for (BlockPos possibleTarget : positions) { ++ if (!new com.destroystokyo.paper.event.entity.EntityPathfindEvent(this.mob.getBukkitEntity(), ++ io.papermc.paper.util.MCUtil.toLocation(this.mob.level(), possibleTarget), target == null ? null : target.getBukkitEntity()).callEvent()) { ++ if (!copiedSet) { ++ copiedSet = true; ++ positions = new java.util.HashSet<>(positions); ++ } ++ // note: since we copy the set this remove call is safe, since we're iterating over the old copy ++ positions.remove(possibleTarget); ++ if (positions.isEmpty()) { ++ return null; ++ } ++ } ++ } ++ // Paper end - EntityPathfindEvent + ProfilerFiller profilerFiller = Profiler.get(); + profilerFiller.push("pathfind"); + BlockPos blockPos = useHeadPos ? this.mob.blockPosition().above() : this.mob.blockPosition(); diff --git a/paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java.patch new file mode 100644 index 0000000000..b2662d7401 --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java.patch @@ -0,0 +1,14 @@ +--- a/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java ++++ b/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java +@@ -16,9 +16,9 @@ + } + + @Override +- public Path createPath(BlockPos target, int distance) { ++ public Path createPath(BlockPos target, @Nullable Entity entity, int distance) { // Paper - EntityPathfindEvent + this.pathToPosition = target; +- return super.createPath(target, distance); ++ return super.createPath(target, entity, distance); // Paper - EntityPathfindEvent + } + + @Override