aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0084-EntityPathfindEvent.patch
blob: e29cff85e67554e77425571af3092455c522d301 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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 d3a279a1a14f99aee8dd516552e5c60de92b4969..a3e0c5af4cc9323c02e88e768cbda9e46854aea1 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
@@ -40,7 +40,7 @@ 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 - EntityPathfindEvent
     }
 
     @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 f1a63db8dac13efcfd73b59c7074f6817cc5dbde..62634bedd97c5be9ecce24ab0cff205715a68da8 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
@@ -41,7 +41,7 @@ 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 - EntityPathfindEvent
         LevelChunk levelChunk = this.level
             .getChunkSource()
             .getChunkNow(SectionPos.blockToSectionCoord(target.getX()), SectionPos.blockToSectionCoord(target.getZ()));
@@ -56,7 +56,7 @@ 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 - EntityPathfindEvent
                 }
 
                 while (blockPos.getY() < this.level.getMaxBuildHeight() && levelChunk.getBlockState(blockPos).isAir()) {
@@ -67,7 +67,7 @@ public class GroundPathNavigation extends PathNavigation {
             }
 
             if (!levelChunk.getBlockState(target).isSolid()) {
-                return super.createPath(target, distance);
+                return super.createPath(target, entity, distance); // Paper - EntityPathfindEvent
             } else {
                 BlockPos blockPos2 = target.above();
 
@@ -75,14 +75,14 @@ public class GroundPathNavigation extends PathNavigation {
                     blockPos2 = blockPos2.above();
                 }
 
-                return super.createPath(blockPos2, distance);
+                return super.createPath(blockPos2, 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/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java
index 92addc1d3e7d0630c5db76e2a00d61b95b1430cc..21bbc98b26b270b3ad6a3b34d6e50dfb796c3d5a 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
@@ -109,7 +109,13 @@ public abstract class PathNavigation {
 
     @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
@@ -119,7 +125,7 @@ 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 - EntityPathfindEvent
     }
 
     @Nullable
@@ -129,6 +135,17 @@ public abstract class PathNavigation {
 
     @Nullable
     protected Path createPath(Set<BlockPos> 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<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 - EntityPathfindEvent
         if (positions.isEmpty()) {
             return null;
         } else if (this.mob.getY() < (double)this.level.getMinBuildHeight()) {
@@ -138,6 +155,23 @@ public abstract class PathNavigation {
         } 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
             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 1a1bc30b425858d82dbfb84b4a94d7793cab7125..5bbfa43d1e97970f035fcb101c3252c01ffead0d 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
@@ -16,9 +16,9 @@ public class WallClimberNavigation extends GroundPathNavigation {
     }
 
     @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