From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Mon, 10 Sep 2018 23:52:28 -0400
Subject: [PATCH] Prevent pathfinding from loading chunks


diff --git a/src/main/java/net/minecraft/server/NavigationAbstract.java b/src/main/java/net/minecraft/server/NavigationAbstract.java
index 4023253f42..b2480301ef 100644
--- a/src/main/java/net/minecraft/server/NavigationAbstract.java
+++ b/src/main/java/net/minecraft/server/NavigationAbstract.java
@@ -0,0 +0,0 @@ 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
 
     public NavigationAbstract(EntityInsentient entityinsentient, World world) {
         this.a = entityinsentient;
         this.b = world;
         this.p = entityinsentient.getAttributeInstance(GenericAttributes.FOLLOW_RANGE);
         this.r = this.a();
+        getPathfinder().getPathfinder().world = world; // Paper
     }
 
     public BlockPosition i() {
diff --git a/src/main/java/net/minecraft/server/Pathfinder.java b/src/main/java/net/minecraft/server/Pathfinder.java
index 04c71ac0ef..6e583356ce 100644
--- a/src/main/java/net/minecraft/server/Pathfinder.java
+++ b/src/main/java/net/minecraft/server/Pathfinder.java
@@ -0,0 +0,0 @@ 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 ba7fe359fe..6716280146 100644
--- a/src/main/java/net/minecraft/server/PathfinderAbstract.java
+++ b/src/main/java/net/minecraft/server/PathfinderAbstract.java
@@ -0,0 +0,0 @@ package net.minecraft.server;
 public abstract class PathfinderAbstract {
     protected IBlockAccess a;
     protected EntityInsentient b;
+    public World world; // Paper
     protected final IntHashMap<PathPoint> c = new IntHashMap<PathPoint>();
     protected int d;
     protected int e;
@@ -0,0 +0,0 @@ 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 64e0b08170..93f3d2e363 100644
--- a/src/main/java/net/minecraft/server/PathfinderNormal.java
+++ b/src/main/java/net/minecraft/server/PathfinderNormal.java
@@ -0,0 +0,0 @@ public class PathfinderNormal extends PathfinderAbstract {
         BlockPosition blockposition2 = new BlockPosition(this.b);
         PathType pathtype1 = this.a(this.b, blockposition2.getX(), i, blockposition2.getZ());
         if (this.b.a(pathtype1) < 0.0F) {
-            HashSet hashset = Sets.newHashSet();
+            HashSet<BlockPosition> hashset = Sets.newHashSet(); // Paper - decompile fix
             hashset.add(new BlockPosition(this.b.getBoundingBox().a, (double)i, this.b.getBoundingBox().c));
             hashset.add(new BlockPosition(this.b.getBoundingBox().a, (double)i, this.b.getBoundingBox().f));
             hashset.add(new BlockPosition(this.b.getBoundingBox().d, (double)i, this.b.getBoundingBox().c));
@@ -0,0 +0,0 @@ public class PathfinderNormal extends PathfinderAbstract {
     }
 
     public PathType a(IBlockAccess iblockaccess, int i, int jx, int k, EntityInsentient entityinsentient, int l, int i1, int j1, boolean flag, boolean flag1) {
-        EnumSet enumset = EnumSet.noneOf(PathType.class);
+        EnumSet<PathType> enumset = EnumSet.noneOf(PathType.class); // Paper - decompile fix
         PathType pathtype = PathType.BLOCKED;
         double d0 = (double)entityinsentient.width / 2.0D;
         BlockPosition blockposition = new BlockPosition(entityinsentient);
@@ -0,0 +0,0 @@ public class PathfinderNormal extends PathfinderAbstract {
     public PathType a(IBlockAccess iblockaccess, int i, int jx, int k) {
         PathType pathtype = this.b(iblockaccess, i, jx, k);
         if (pathtype == PathType.OPEN && jx >= 1) {
-            Block block = iblockaccess.getType(new BlockPosition(i, jx - 1, k)).getBlock();
+            Block block = world.getBlockIfLoaded(new BlockPosition(i, jx - 1, k)); // Paper
+            if (block == null) return PathType.BLOCKED; // Paper
             PathType pathtype1 = this.b(iblockaccess, i, jx - 1, k);
             pathtype = pathtype1 != PathType.WALKABLE && pathtype1 != PathType.OPEN && pathtype1 != PathType.WATER && pathtype1 != PathType.LAVA ? PathType.WALKABLE : PathType.OPEN;
             if (pathtype1 == PathType.DAMAGE_FIRE || block == Blocks.MAGMA_BLOCK) {
@@ -0,0 +0,0 @@ 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$b.f(l + i, jx, i1 + k)).getBlock();
-                            if (block == Blocks.CACTUS) {
+                            Block block = world.getBlockIfLoaded(blockposition$b.f(l + i, jx, i1 + k)); // Paper
+                            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;
@@ -0,0 +0,0 @@ public class PathfinderNormal extends PathfinderAbstract {
 
     protected PathType b(IBlockAccess iblockaccess, int i, int jx, int k) {
         BlockPosition blockposition = new BlockPosition(i, jx, 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();
         if (iblockdata.isAir()) {
--