From 435410e1e7631cb7e5b169d2b0a7f6b8bad0992e Mon Sep 17 00:00:00 2001 From: Aikar 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 2c9bf7d00..281f5f04f 100644 --- a/src/main/java/net/minecraft/server/ChunkCache.java +++ b/src/main/java/net/minecraft/server/ChunkCache.java @@ -25,7 +25,7 @@ public class ChunkCache implements IWorldReader { for (k = this.a; k <= i; ++k) { for (l = this.b; l <= j; ++l) { - this.c[k - this.a][l - this.b] = world.getChunkAt(k, l, ChunkStatus.FULL, false); + this.c[k - this.a][l - this.b] = world.getChunkIfLoaded(k, l); // Paper } } diff --git a/src/main/java/net/minecraft/server/NavigationAbstract.java b/src/main/java/net/minecraft/server/NavigationAbstract.java index d04eb1bbf..4a91e0d8c 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(MathHelper.floor(this.p.getValue() * 16.0D)); + setWorld(); // Paper } public BlockPosition h() { @@ -177,6 +179,7 @@ public abstract class NavigationAbstract { } public void c() { + setWorld(); // Paper ++this.e; if (this.m) { this.k(); diff --git a/src/main/java/net/minecraft/server/Pathfinder.java b/src/main/java/net/minecraft/server/Pathfinder.java index 359d9a11c..262fa5585 100644 --- a/src/main/java/net/minecraft/server/Pathfinder.java +++ b/src/main/java/net/minecraft/server/Pathfinder.java @@ -12,7 +12,7 @@ public class Pathfinder { private final Set b = Sets.newHashSet(); private final PathPoint[] c = new PathPoint[32]; private final int d; - private PathfinderAbstract e; + private PathfinderAbstract e; public PathfinderAbstract getPathfinder() { return this.e; } // Paper - OBFHELPER public Pathfinder(PathfinderAbstract pathfinderabstract, int i) { this.e = pathfinderabstract; diff --git a/src/main/java/net/minecraft/server/PathfinderAbstract.java b/src/main/java/net/minecraft/server/PathfinderAbstract.java index 92df34aba..e773bef61 100644 --- a/src/main/java/net/minecraft/server/PathfinderAbstract.java +++ b/src/main/java/net/minecraft/server/PathfinderAbstract.java @@ -7,6 +7,7 @@ public abstract class PathfinderAbstract { protected IWorldReader a; protected EntityInsentient b; + public World world; // Paper protected final Int2ObjectMap c = new Int2ObjectOpenHashMap(); protected int d; protected int e; @@ -19,6 +20,7 @@ public abstract class PathfinderAbstract { public void a(IWorldReader iworldreader, EntityInsentient entityinsentient) { this.a = iworldreader; + if (iworldreader instanceof World) world = (World) iworldreader; // Paper this.b = entityinsentient; this.c.clear(); this.d = MathHelper.d(entityinsentient.getWidth() + 1.0F); diff --git a/src/main/java/net/minecraft/server/PathfinderNormal.java b/src/main/java/net/minecraft/server/PathfinderNormal.java index d97166f8f..51991b8c8 100644 --- a/src/main/java/net/minecraft/server/PathfinderNormal.java +++ b/src/main/java/net/minecraft/server/PathfinderNormal.java @@ -355,7 +355,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; @@ -385,9 +386,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.d(l + i, j, i1 + k)).getBlock(); + Block block = world.getBlockIfLoaded(blockposition_pooledblockposition.d(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; @@ -421,7 +423,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