aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0089-Do-not-load-chunks-for-Pathfinding.patch
blob: b78a2737cc17345accf3c507b250c0a7413b3819 (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
From e243b9109433eae11aa5d0ba4c3aecb1fccf3976 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Thu, 31 Mar 2016 19:17:58 -0400
Subject: [PATCH] Do not load chunks for Pathfinding


diff --git a/src/main/java/net/minecraft/server/ChunkCache.java b/src/main/java/net/minecraft/server/ChunkCache.java
index 49533ac33..eef3ab73f 100644
--- a/src/main/java/net/minecraft/server/ChunkCache.java
+++ b/src/main/java/net/minecraft/server/ChunkCache.java
@@ -26,7 +26,7 @@ public class ChunkCache implements IIBlockAccess {
 
         for (l = this.a; l <= j; ++l) {
             for (i1 = this.b; i1 <= k; ++i1) {
-                this.c[l - this.a][i1 - this.b] = world.getChunkAt(l, i1);
+                this.c[l - this.a][i1 - this.b] = world.getChunkIfLoaded(l, i1); // Paper
             }
         }
 
diff --git a/src/main/java/net/minecraft/server/NavigationAbstract.java b/src/main/java/net/minecraft/server/NavigationAbstract.java
index 604049b08..716d00afb 100644
--- a/src/main/java/net/minecraft/server/NavigationAbstract.java
+++ b/src/main/java/net/minecraft/server/NavigationAbstract.java
@@ -22,8 +22,9 @@ public abstract class NavigationAbstract {
     protected long n;
     protected PathfinderAbstract o;
     private BlockPosition q;
-    private Pathfinder r;
+    private Pathfinder r; public Pathfinder getPathfinder() { return r; } // Paper - OBFHELPER
 
+    private void setWorld() { if (getPathfinder() != null && getPathfinder().getPathfinder() != null) getPathfinder().getPathfinder().world = getEntity().world; } // Paper
     public NavigationAbstract(EntityInsentient entityinsentient, World world) {
         this.g = Vec3D.a;
         this.h = Vec3D.a;
@@ -32,6 +33,7 @@ public abstract class NavigationAbstract {
         this.b = world;
         this.p = entityinsentient.getAttributeInstance(GenericAttributes.FOLLOW_RANGE);
         this.r = this.a();
+        setWorld(); // Paper
     }
 
     public BlockPosition i() {
@@ -174,6 +176,7 @@ public abstract class NavigationAbstract {
     }
 
     public void d() {
+        setWorld(); // Paper
         ++this.e;
         if (this.m) {
             this.l();
diff --git a/src/main/java/net/minecraft/server/Pathfinder.java b/src/main/java/net/minecraft/server/Pathfinder.java
index 3085338f0..89d51d471 100644
--- a/src/main/java/net/minecraft/server/Pathfinder.java
+++ b/src/main/java/net/minecraft/server/Pathfinder.java
@@ -9,7 +9,7 @@ public class Pathfinder {
     private final Path a = new Path();
     private final Set<PathPoint> b = Sets.newHashSet();
     private final PathPoint[] c = new PathPoint[32];
-    private PathfinderAbstract d;
+    private PathfinderAbstract d; public PathfinderAbstract getPathfinder() { return d; }  // Paper - OBFHELPER
 
     public Pathfinder(PathfinderAbstract pathfinderabstract) {
         this.d = pathfinderabstract;
diff --git a/src/main/java/net/minecraft/server/PathfinderAbstract.java b/src/main/java/net/minecraft/server/PathfinderAbstract.java
index 36d7e1d96..d722c8513 100644
--- a/src/main/java/net/minecraft/server/PathfinderAbstract.java
+++ b/src/main/java/net/minecraft/server/PathfinderAbstract.java
@@ -4,6 +4,7 @@ public abstract class PathfinderAbstract {
 
     protected IBlockAccess a;
     protected EntityInsentient b;
+    public World world; // Paper
     protected final IntHashMap<PathPoint> c = new IntHashMap<>();
     protected int d;
     protected int e;
@@ -16,6 +17,7 @@ public abstract class PathfinderAbstract {
 
     public void a(IBlockAccess iblockaccess, EntityInsentient entityinsentient) {
         this.a = iblockaccess;
+        if (iblockaccess instanceof World) world = (World) iblockaccess; // Paper
         this.b = entityinsentient;
         this.c.c();
         this.d = MathHelper.d(entityinsentient.width + 1.0F);
diff --git a/src/main/java/net/minecraft/server/PathfinderNormal.java b/src/main/java/net/minecraft/server/PathfinderNormal.java
index eec891647..e45bdb581 100644
--- a/src/main/java/net/minecraft/server/PathfinderNormal.java
+++ b/src/main/java/net/minecraft/server/PathfinderNormal.java
@@ -327,7 +327,8 @@ public class PathfinderNormal extends PathfinderAbstract {
         PathType pathtype = this.b(iblockaccess, i, j, k);
 
         if (pathtype == PathType.OPEN && j >= 1) {
-            Block block = iblockaccess.getType(new BlockPosition(i, j - 1, k)).getBlock();
+            Block block = world.getBlockIfLoaded(new BlockPosition(i, j - 1, k)); // Paper
+            if (block == null) return PathType.BLOCKED; // Paper
             PathType pathtype1 = this.b(iblockaccess, i, j - 1, k);
 
             pathtype = pathtype1 != PathType.WALKABLE && pathtype1 != PathType.OPEN && pathtype1 != PathType.WATER && pathtype1 != PathType.LAVA ? PathType.WALKABLE : PathType.OPEN;
@@ -353,9 +354,10 @@ public class PathfinderNormal extends PathfinderAbstract {
                 for (int l = -1; l <= 1; ++l) {
                     for (int i1 = -1; i1 <= 1; ++i1) {
                         if (l != 0 || i1 != 0) {
-                            Block block = iblockaccess.getType(blockposition_pooledblockposition.c(l + i, j, i1 + k)).getBlock();
+                            Block block = world.getBlockIfLoaded(blockposition_pooledblockposition.c(l + i, j, i1 + k)); // Paper
 
-                            if (block == Blocks.CACTUS) {
+                            if (block == null) pathtype = PathType.BLOCKED; // Paper
+                            else if (block == Blocks.CACTUS) { // Paper
                                 pathtype = PathType.DANGER_CACTUS;
                             } else if (block == Blocks.FIRE) {
                                 pathtype = PathType.DANGER_FIRE;
@@ -387,7 +389,8 @@ public class PathfinderNormal extends PathfinderAbstract {
 
     protected PathType b(IBlockAccess iblockaccess, int i, int j, int k) {
         BlockPosition blockposition = new BlockPosition(i, j, k);
-        IBlockData iblockdata = iblockaccess.getType(blockposition);
+        IBlockData iblockdata = world.getTypeIfLoaded(blockposition); // Paper
+        if (iblockdata == null) return PathType.BLOCKED; // Paper
         Block block = iblockdata.getBlock();
         Material material = iblockdata.getMaterial();
 
-- 
2.21.0