PaperMC/Spigot-Server-Patches/0363-Prevent-pathfinding-from-loading-chunks.patch
Aikar b62dfa0bf9
Updated Upstream (Bukkit/CraftBukkit)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

Bukkit Changes:
39ce5d3a SPIGOT-4399: ItemMeta.equals broken with AttributeModifiers

CraftBukkit Changes:
1cf8b5dc SPIGOT-4400: Populators running on existing chunks
116cb9a1 SPIGOT-4399: Add attribute modifier equality test
5ee1c18a SPIGOT-4398: Set ASM7_EXPERIMENTAL flag
2018-09-28 19:31:59 -04:00

125 lines
7 KiB
Diff

From d4c08451b25b657274e3ad1b3a492338e6242f08 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..113fd9a50f 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() {
@@ -166,6 +168,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<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
@@ -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<PathPoint> c = new IntHashMap<PathPoint>();
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<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));
@@ -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<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);
@@ -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()) {
--
2.19.0