From c563327fa2af7f0e6760ef8e4a532458a14fabdf Mon Sep 17 00:00:00 2001 From: Aikar Date: Tue, 11 Sep 2018 00:07:19 -0400 Subject: [PATCH] Prevent pathfinding and zombie AI from loading chunks --- ...vent-pathfinding-from-loading-chunks.patch | 79 +++++++++++++++++++ ...ent-Mob-AI-Rules-from-Loading-Chunks.patch | 55 +++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 Spigot-Server-Patches/0367-Prevent-pathfinding-from-loading-chunks.patch create mode 100644 Spigot-Server-Patches/0368-Prevent-Mob-AI-Rules-from-Loading-Chunks.patch diff --git a/Spigot-Server-Patches/0367-Prevent-pathfinding-from-loading-chunks.patch b/Spigot-Server-Patches/0367-Prevent-pathfinding-from-loading-chunks.patch new file mode 100644 index 000000000..130853473 --- /dev/null +++ b/Spigot-Server-Patches/0367-Prevent-pathfinding-from-loading-chunks.patch @@ -0,0 +1,79 @@ +From 67fd8976c70a84758a635896026b931f58b32689 Mon Sep 17 00:00:00 2001 +From: Aikar +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/PathfinderNormal.java b/src/main/java/net/minecraft/server/PathfinderNormal.java +index 64e0b08170..58aa6df0a1 100644 +--- a/src/main/java/net/minecraft/server/PathfinderNormal.java ++++ b/src/main/java/net/minecraft/server/PathfinderNormal.java +@@ -7,6 +7,7 @@ import javax.annotation.Nullable; + + public class PathfinderNormal extends PathfinderAbstract { + protected float j; ++ private World world; // Paper + + public PathfinderNormal() { + } +@@ -14,6 +15,7 @@ public class PathfinderNormal extends PathfinderAbstract { + public void a(IBlockAccess iblockaccess, EntityInsentient entityinsentient) { + super.a(iblockaccess, entityinsentient); + this.j = entityinsentient.a(PathType.WATER); ++ this.world = entityinsentient.world; // Paper + } + + public void a() { +@@ -47,7 +49,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 +235,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 +306,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 +329,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 +347,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.18.0 + diff --git a/Spigot-Server-Patches/0368-Prevent-Mob-AI-Rules-from-Loading-Chunks.patch b/Spigot-Server-Patches/0368-Prevent-Mob-AI-Rules-from-Loading-Chunks.patch new file mode 100644 index 000000000..64c55846f --- /dev/null +++ b/Spigot-Server-Patches/0368-Prevent-Mob-AI-Rules-from-Loading-Chunks.patch @@ -0,0 +1,55 @@ +From 1ca3b4fcfc301b5dbf685d5a5fcadb65fecc2e32 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Mon, 10 Sep 2018 23:56:36 -0400 +Subject: [PATCH] Prevent Mob AI Rules from Loading Chunks + + +diff --git a/src/main/java/net/minecraft/server/PathfinderGoalRemoveBlock.java b/src/main/java/net/minecraft/server/PathfinderGoalRemoveBlock.java +index b1661693cf..2cbb6c8f91 100644 +--- a/src/main/java/net/minecraft/server/PathfinderGoalRemoveBlock.java ++++ b/src/main/java/net/minecraft/server/PathfinderGoalRemoveBlock.java +@@ -7,11 +7,13 @@ public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget { + private final Block f; + private final EntityInsentient g; + private int h; ++ private World world; // Paper + + public PathfinderGoalRemoveBlock(Block block, EntityCreature entitycreature, double d0, int i) { + super(entitycreature, d0, 24, i); + this.f = block; + this.g = entitycreature; ++ this.world = entitycreature.world; // Paper + } + + public boolean a() { +@@ -89,13 +91,15 @@ public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget { + + @Nullable + private BlockPosition a(BlockPosition blockposition, IBlockAccess iblockaccess) { +- if (iblockaccess.getType(blockposition).getBlock() == this.f) { ++ Block block = world.getBlockIfLoaded(blockposition); // Paper ++ if (block == null) return null; // Paper ++ if (block == this.f) { // Paper + return blockposition; + } else { + BlockPosition[] ablockposition = new BlockPosition[]{blockposition.down(), blockposition.west(), blockposition.east(), blockposition.north(), blockposition.south(), blockposition.down().down()}; + + for(BlockPosition blockposition1 : ablockposition) { +- if (iblockaccess.getType(blockposition1).getBlock() == this.f) { ++ if (world.getBlockIfLoaded(blockposition1) == this.f) { // Paper + return blockposition1; + } + } +@@ -105,7 +109,8 @@ public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget { + } + + protected boolean a(IWorldReader iworldreader, BlockPosition blockposition) { +- Block block = iworldreader.getType(blockposition).getBlock(); ++ Block block = world.getBlockIfLoaded(blockposition); // Paper ++ if (block == null) return false; // Paper + return block == this.f && iworldreader.getType(blockposition.up()).isAir() && iworldreader.getType(blockposition.up(2)).isAir(); + } + } +-- +2.18.0 +