2018-12-15 02:17:27 +01:00
|
|
|
From c739c5c8647c3b59c5f2c04827e8853d8e60b088 Mon Sep 17 00:00:00 2001
|
2018-09-11 06:07:19 +02:00
|
|
|
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
|
2018-12-08 11:09:55 +01:00
|
|
|
index 2b15aa6c9..3ca32123b 100644
|
2018-09-11 06:07:19 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/PathfinderGoalRemoveBlock.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/PathfinderGoalRemoveBlock.java
|
2018-11-12 19:23:18 +01:00
|
|
|
@@ -12,11 +12,13 @@ public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget {
|
2018-09-11 06:07:19 +02:00
|
|
|
private final Block f;
|
2018-12-08 11:09:55 +01:00
|
|
|
private final EntityInsentient entity;
|
2018-09-11 06:07:19 +02:00
|
|
|
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;
|
2018-12-08 11:09:55 +01:00
|
|
|
this.entity = entitycreature;
|
2018-09-11 06:07:19 +02:00
|
|
|
+ this.world = entitycreature.world; // Paper
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean a() {
|
2018-11-12 19:23:18 +01:00
|
|
|
@@ -99,7 +101,9 @@ public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget {
|
2018-09-11 06:07:19 +02:00
|
|
|
|
|
|
|
@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 {
|
2018-11-12 19:23:18 +01:00
|
|
|
BlockPosition[] ablockposition = new BlockPosition[] { blockposition.down(), blockposition.west(), blockposition.east(), blockposition.north(), blockposition.south(), blockposition.down().down()};
|
|
|
|
@@ -109,7 +113,7 @@ public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget {
|
|
|
|
for (int j = 0; j < i; ++j) {
|
|
|
|
BlockPosition blockposition1 = ablockposition1[j];
|
2018-09-11 06:07:19 +02:00
|
|
|
|
|
|
|
- if (iblockaccess.getType(blockposition1).getBlock() == this.f) {
|
|
|
|
+ if (world.getBlockIfLoaded(blockposition1) == this.f) { // Paper
|
|
|
|
return blockposition1;
|
|
|
|
}
|
|
|
|
}
|
2018-11-12 19:23:18 +01:00
|
|
|
@@ -119,7 +123,8 @@ public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget {
|
2018-09-11 06:07:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
2018-11-12 19:23:18 +01:00
|
|
|
|
2018-09-11 06:07:19 +02:00
|
|
|
return block == this.f && iworldreader.getType(blockposition.up()).isAir() && iworldreader.getType(blockposition.up(2)).isAir();
|
|
|
|
}
|
2018-09-13 03:25:02 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/RandomPositionGenerator.java b/src/main/java/net/minecraft/server/RandomPositionGenerator.java
|
2018-12-08 11:09:55 +01:00
|
|
|
index f252ef243..bfa6c2eef 100644
|
2018-09-13 03:25:02 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/RandomPositionGenerator.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/RandomPositionGenerator.java
|
2018-09-13 03:58:38 +02:00
|
|
|
@@ -78,6 +78,7 @@ public class RandomPositionGenerator {
|
|
|
|
}
|
|
|
|
|
|
|
|
BlockPosition blockposition2 = new BlockPosition((double)j1 + entitycreature.locX, (double)k1 + entitycreature.locY, (double)l1 + entitycreature.locZ);
|
|
|
|
+ if (!entitycreature.world.isLoaded(blockposition2)) continue; // Paper
|
|
|
|
if ((!flag1 || entitycreature.f(blockposition2)) && navigationabstract.a(blockposition2)) {
|
|
|
|
if (!flag) {
|
|
|
|
blockposition2 = a(blockposition2, entitycreature);
|
|
|
|
@@ -141,6 +142,7 @@ public class RandomPositionGenerator {
|
2018-09-13 03:25:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private static boolean b(BlockPosition blockposition, EntityCreature entitycreature) {
|
2018-12-08 11:09:55 +01:00
|
|
|
- return entitycreature.world.getFluid(blockposition).a(TagsFluid.WATER);
|
2018-09-13 03:25:02 +02:00
|
|
|
+ Fluid fluid = entitycreature.world.getFluidIfLoaded(blockposition); // Paper
|
|
|
|
+ return fluid != null && fluid.a(TagsFluid.WATER); // Paper
|
|
|
|
}
|
|
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
2018-12-08 11:09:55 +01:00
|
|
|
index 5fe4734e3..eabf50e24 100644
|
2018-09-13 03:25:02 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
2018-12-08 11:09:55 +01:00
|
|
|
@@ -762,7 +762,17 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
|
|
|
return chunk.getType(blockposition);
|
2018-09-13 03:25:02 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
+ // Paper start
|
|
|
|
+ public Fluid getFluidIfLoaded(BlockPosition blockposition) {
|
|
|
|
+ if (blockposition.isInvalidYLocation()) { // Paper
|
|
|
|
+ return getFluid(blockposition);
|
|
|
|
+ } else {
|
|
|
|
+ Chunk chunk = this.getChunkIfLoaded(blockposition);
|
2018-12-08 11:09:55 +01:00
|
|
|
|
2018-09-13 03:25:02 +02:00
|
|
|
+ return chunk != null ? chunk.getFluid(blockposition) : null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
2018-12-08 11:09:55 +01:00
|
|
|
public Fluid getFluid(BlockPosition blockposition) {
|
2018-09-13 03:25:02 +02:00
|
|
|
if (blockposition.isInvalidYLocation()) { // Paper
|
|
|
|
return FluidTypes.a.i();
|
2018-09-11 06:07:19 +02:00
|
|
|
--
|
2018-12-15 02:17:27 +01:00
|
|
|
2.20.0
|
2018-09-11 06:07:19 +02:00
|
|
|
|