mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-30 16:19:03 +01:00
52a9b1c91e
With the function overload, need to pass the entity through to the super call
151 lines
7.8 KiB
Diff
151 lines
7.8 KiB
Diff
From 0000000000000000000000000000000000000000 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/world/entity/ai/navigation/FlyingPathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java
|
|
@@ -0,0 +0,0 @@ public class FlyingPathNavigation extends PathNavigation {
|
|
|
|
@Override
|
|
public Path createPath(Entity entity, int distance) {
|
|
- return this.createPath(entity.blockPosition(), distance);
|
|
+ return this.createPath(entity.blockPosition(), entity, distance); // Paper - Forward target entity
|
|
}
|
|
|
|
@Override
|
|
diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java
|
|
@@ -0,0 +0,0 @@ public class GroundPathNavigation extends PathNavigation {
|
|
}
|
|
|
|
@Override
|
|
- public Path createPath(BlockPos target, int distance) {
|
|
+ public Path createPath(BlockPos target, @javax.annotation.Nullable Entity entity, int distance) { // Paper
|
|
LevelChunk levelChunk = this.level.getChunkSource().getChunkNow(SectionPos.blockToSectionCoord(target.getX()), SectionPos.blockToSectionCoord(target.getZ()));
|
|
if (levelChunk == null) {
|
|
return null;
|
|
@@ -0,0 +0,0 @@ public class GroundPathNavigation extends PathNavigation {
|
|
}
|
|
|
|
if (blockPos.getY() > this.level.getMinBuildHeight()) {
|
|
- return super.createPath(blockPos.above(), distance);
|
|
+ return super.createPath(blockPos.above(), entity, distance); // Paper
|
|
}
|
|
|
|
while(blockPos.getY() < this.level.getMaxBuildHeight() && levelChunk.getBlockState(blockPos).isAir()) {
|
|
@@ -0,0 +0,0 @@ public class GroundPathNavigation extends PathNavigation {
|
|
}
|
|
|
|
if (!levelChunk.getBlockState(target).isSolid()) {
|
|
- return super.createPath(target, distance);
|
|
+ return super.createPath(target, entity, distance); // Paper
|
|
} else {
|
|
BlockPos blockPos2;
|
|
for(blockPos2 = target.above(); blockPos2.getY() < this.level.getMaxBuildHeight() && levelChunk.getBlockState(blockPos2).isSolid(); blockPos2 = blockPos2.above()) {
|
|
}
|
|
|
|
- return super.createPath(blockPos2, distance);
|
|
+ return super.createPath(blockPos2, entity, distance); // Paper
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Path createPath(Entity entity, int distance) {
|
|
- return this.createPath(entity.blockPosition(), distance);
|
|
+ return this.createPath(entity.blockPosition(), entity, distance); // Paper - Forward target entity
|
|
}
|
|
|
|
private int getSurfaceY() {
|
|
diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java
|
|
@@ -0,0 +0,0 @@ public abstract class PathNavigation {
|
|
|
|
@Nullable
|
|
public Path createPath(BlockPos target, int distance) {
|
|
- return this.createPath(ImmutableSet.of(target), 8, false, distance);
|
|
+ // Paper start - add target entity parameter
|
|
+ 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
|
|
}
|
|
|
|
@Nullable
|
|
@@ -0,0 +0,0 @@ public abstract class PathNavigation {
|
|
|
|
@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
|
|
}
|
|
|
|
@Nullable
|
|
@@ -0,0 +0,0 @@ public abstract class PathNavigation {
|
|
|
|
@Nullable
|
|
protected Path createPath(Set<BlockPos> positions, int range, boolean useHeadPos, int distance, float followRange) {
|
|
+ return this.createPath(positions, null, range, useHeadPos, distance, followRange);
|
|
+ }
|
|
+
|
|
+ @Nullable
|
|
+ protected Path createPath(Set<BlockPos> 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<BlockPos> positions, @Nullable Entity target, int range, boolean useHeadPos, int distance, float followRange) {
|
|
+ // Paper end
|
|
if (positions.isEmpty()) {
|
|
return null;
|
|
} else if (this.mob.getY() < (double)this.level.getMinBuildHeight()) {
|
|
@@ -0,0 +0,0 @@ public abstract class PathNavigation {
|
|
} else if (this.path != null && !this.path.isDone() && positions.contains(this.targetPos)) {
|
|
return this.path;
|
|
} else {
|
|
+ // Paper start - Pathfind event
|
|
+ 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
|
|
this.level.getProfiler().push("pathfind");
|
|
BlockPos blockPos = useHeadPos ? this.mob.blockPosition().above() : this.mob.blockPosition();
|
|
int i = (int)(followRange + (float)range);
|
|
diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java
|
|
@@ -0,0 +0,0 @@ public class WallClimberNavigation extends GroundPathNavigation {
|
|
}
|
|
|
|
@Override
|
|
- public Path createPath(BlockPos target, int distance) {
|
|
+ public Path createPath(BlockPos target, @Nullable Entity entity, int distance) { // Paper
|
|
this.pathToPosition = target;
|
|
- return super.createPath(target, distance);
|
|
+ return super.createPath(target, entity, distance); // Paper
|
|
}
|
|
|
|
@Override
|