PaperMC/Spigot-Server-Patches/0360-Prevent-Mob-AI-Rules-from-Loading-Chunks.patch

114 lines
5.4 KiB
Diff
Raw Normal View History

From 9007c1a310edb90546c5a3ff3c7bced3f4fd6f54 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/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
index 4e8eb137a..479a84a25 100644
--- a/src/main/java/net/minecraft/server/Chunk.java
+++ b/src/main/java/net/minecraft/server/Chunk.java
@@ -481,6 +481,7 @@ public class Chunk implements IChunkAccess {
}
}
+ public Fluid getFluid(BlockPosition blockposition) { return b(blockposition); } // Paper - OBFHELPER
public Fluid b(BlockPosition blockposition) {
return this.b(blockposition.getX(), blockposition.getY(), blockposition.getZ());
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalRemoveBlock.java b/src/main/java/net/minecraft/server/PathfinderGoalRemoveBlock.java
index 9c72848f1..d007d0387 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 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() {
@@ -99,7 +101,9 @@ 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()};
@@ -109,7 +113,7 @@ public class PathfinderGoalRemoveBlock extends PathfinderGoalGotoTarget {
for (int j = 0; j < i; ++j) {
BlockPosition blockposition1 = ablockposition1[j];
- if (iblockaccess.getType(blockposition1).getBlock() == this.f) {
+ if (world.getBlockIfLoaded(blockposition1) == this.f) { // Paper
return blockposition1;
}
}
@@ -119,7 +123,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();
}
diff --git a/src/main/java/net/minecraft/server/RandomPositionGenerator.java b/src/main/java/net/minecraft/server/RandomPositionGenerator.java
index 800e0046a..bfa6c2eef 100644
--- a/src/main/java/net/minecraft/server/RandomPositionGenerator.java
+++ b/src/main/java/net/minecraft/server/RandomPositionGenerator.java
@@ -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 {
}
private static boolean b(BlockPosition blockposition, EntityCreature entitycreature) {
- return entitycreature.world.b(blockposition).a(TagsFluid.WATER);
+ 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
index a5c655155..016d50d3c 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -763,6 +763,18 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
}
}
+ // Paper start
+ public Fluid getFluidIfLoaded(BlockPosition blockposition) {
+ if (blockposition.isInvalidYLocation()) { // Paper
+ return getFluid(blockposition);
+ } else {
+ Chunk chunk = this.getChunkIfLoaded(blockposition);
+
+ return chunk != null ? chunk.getFluid(blockposition) : null;
+ }
+ }
+ // Paper end
+ public Fluid getFluid(BlockPosition blockposition) { return b(blockposition); } // Paper - OBFHELPER
public Fluid b(BlockPosition blockposition) {
if (blockposition.isInvalidYLocation()) { // Paper
return FluidTypes.a.i();
--
2.19.1