From 19bc80177637e62f6abf6e8422fb97663e2bd524 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 light checks Should only happen for blocks on the edge that uses neighbors light level (certain blocks). In that case, there will be 3-4 other neighbors to get a light level from. diff --git a/src/main/java/net/minecraft/server/NavigationAbstract.java b/src/main/java/net/minecraft/server/NavigationAbstract.java index a8b070ed32..7a4bc0fcc3 100644 --- a/src/main/java/net/minecraft/server/NavigationAbstract.java +++ b/src/main/java/net/minecraft/server/NavigationAbstract.java @@ -21,13 +21,15 @@ 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.a = entityinsentient; this.b = world; this.p = entityinsentient.getAttributeInstance(GenericAttributes.FOLLOW_RANGE); this.r = this.a(); + setWorld(); // Paper } public BlockPosition i() { @@ -164,6 +166,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 04c71ac0ef..6e583356ce 100644 --- a/src/main/java/net/minecraft/server/Pathfinder.java +++ b/src/main/java/net/minecraft/server/Pathfinder.java @@ -8,7 +8,7 @@ public class Pathfinder { private final Path a = new Path(); private final Set 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 @@ -3,6 +3,7 @@ package net.minecraft.server; public abstract class PathfinderAbstract { protected IBlockAccess a; protected EntityInsentient b; + public World world; // Paper protected final IntHashMap 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 64e0b08170..93f3d2e363 100644 --- a/src/main/java/net/minecraft/server/PathfinderNormal.java +++ b/src/main/java/net/minecraft/server/PathfinderNormal.java @@ -47,7 +47,7 @@ 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 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)); @@ -233,7 +233,7 @@ 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 enumset = EnumSet.noneOf(PathType.class); // Paper - decompile fix PathType pathtype = PathType.BLOCKED; double d0 = (double)entityinsentient.width / 2.0D; BlockPosition blockposition = new BlockPosition(entityinsentient); @@ -304,7 +304,8 @@ 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) { @@ -326,8 +327,9 @@ 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; @@ -343,7 +345,8 @@ 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()) { diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java index 207f53a9c3..b8fcfb6092 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -663,6 +663,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc if (blockposition.getY() >= 256) { blockposition = new BlockPosition(blockposition.getX(), 255, blockposition.getZ()); } + if (!this.isLoaded(blockposition)) return 0; // Paper return this.getChunkAtWorldCoords(blockposition).a(blockposition, i); } -- 2.19.0