79 lines
4.5 KiB
Diff
79 lines
4.5 KiB
Diff
From c78da171571b4c501b074da90f332bd2cfd04617 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
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 bf8ca9b32..7ccb3d5c0 100644
|
|
--- a/src/main/java/net/minecraft/server/PathfinderGoalRemoveBlock.java
|
|
+++ b/src/main/java/net/minecraft/server/PathfinderGoalRemoveBlock.java
|
|
@@ -12,11 +12,13 @@ public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget {
|
|
private final Block g;
|
|
private final EntityInsentient entity;
|
|
private int i;
|
|
+ private World world; // Paper
|
|
|
|
public PathfinderGoalRemoveBlock(Block block, EntityCreature entitycreature, double d0, int i) {
|
|
super(entitycreature, d0, 24, i);
|
|
this.g = block;
|
|
this.entity = entitycreature;
|
|
+ this.world = entitycreature.world; // Paper
|
|
}
|
|
|
|
@Override
|
|
@@ -114,7 +116,9 @@ public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget {
|
|
|
|
@Nullable
|
|
private BlockPosition a(BlockPosition blockposition, IBlockAccess iblockaccess) {
|
|
- if (iblockaccess.getType(blockposition).getBlock() == this.g) {
|
|
+ Block block = world.getBlockIfLoaded(blockposition); // Paper
|
|
+ if (block == null) return null; // Paper
|
|
+ if (block == this.g) { // Paper
|
|
return blockposition;
|
|
} else {
|
|
BlockPosition[] ablockposition = new BlockPosition[]{blockposition.down(), blockposition.west(), blockposition.east(), blockposition.north(), blockposition.south(), blockposition.down().down()};
|
|
@@ -124,7 +128,7 @@ public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget {
|
|
for (int j = 0; j < i; ++j) {
|
|
BlockPosition blockposition1 = ablockposition1[j];
|
|
|
|
- if (iblockaccess.getType(blockposition1).getBlock() == this.g) {
|
|
+ if (world.getBlockIfLoaded(blockposition1) == this.g) { // Paper
|
|
return blockposition1;
|
|
}
|
|
}
|
|
@@ -135,7 +139,7 @@ public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget {
|
|
|
|
@Override
|
|
protected boolean a(IWorldReader iworldreader, BlockPosition blockposition) {
|
|
- IChunkAccess ichunkaccess = iworldreader.getChunkAt(blockposition.getX() >> 4, blockposition.getZ() >> 4, ChunkStatus.FULL, false);
|
|
+ IChunkAccess ichunkaccess = iworldreader.getChunkIfLoadedImmediately(blockposition.getX() >> 4, blockposition.getZ() >> 4); // Paper
|
|
|
|
return ichunkaccess == null ? false : ichunkaccess.getType(blockposition).getBlock() == this.g && ichunkaccess.getType(blockposition.up()).isAir() && ichunkaccess.getType(blockposition.up(2)).isAir();
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/RandomPositionGenerator.java b/src/main/java/net/minecraft/server/RandomPositionGenerator.java
|
|
index d4cd50918..d6a3b9933 100644
|
|
--- a/src/main/java/net/minecraft/server/RandomPositionGenerator.java
|
|
+++ b/src/main/java/net/minecraft/server/RandomPositionGenerator.java
|
|
@@ -109,6 +109,7 @@ public class RandomPositionGenerator {
|
|
}
|
|
|
|
blockposition2 = new BlockPosition((double) k1 + entitycreature.locX(), (double) l1 + entitycreature.locY(), (double) i2 + entitycreature.locZ());
|
|
+ if (!entitycreature.world.isLoaded(blockposition2)) continue; // Paper
|
|
if (blockposition2.getY() >= 0 && blockposition2.getY() <= entitycreature.world.getBuildHeight() && (!flag3 || entitycreature.a(blockposition2)) && (!flag2 || navigationabstract.a(blockposition2))) {
|
|
if (flag1) {
|
|
blockposition2 = a(blockposition2, random.nextInt(l + 1) + i1, entitycreature.world.getBuildHeight(), (blockposition3) -> {
|
|
@@ -116,7 +117,8 @@ public class RandomPositionGenerator {
|
|
});
|
|
}
|
|
|
|
- if (flag || !entitycreature.world.getFluid(blockposition2).a(TagsFluid.WATER)) {
|
|
+ Fluid fluid = entitycreature.world.getFluidIfLoaded(blockposition2); // Paper
|
|
+ if (flag || (fluid != null && !fluid.a(TagsFluid.WATER))) { // Paper
|
|
PathType pathtype = PathfinderNormal.b(entitycreature.world, blockposition2.getX(), blockposition2.getY(), blockposition2.getZ());
|
|
|
|
if (entitycreature.a(pathtype) == 0.0F) {
|
|
--
|
|
2.25.1
|
|
|