aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0291-Prevent-Mob-AI-Rules-from-Loading-Chunks.patch
blob: 147617e735a63fea3aea6a154e6c4ec8a0a64b7d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
From 0000000000000000000000000000000000000000 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 ed29186791ac615c7d23ef8e7b8aea6a3ab8222d..29efbdd2ca77833e6be59e5b5b4c38633e43588d 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).a(this.g)) {
+        Block block = world.getBlockIfLoaded(blockposition); // Paper
+        if (block == null) return null; // Paper
+        if (block.a(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).a(this.g)) {
+                if (iblockaccess.getBlockIfLoaded(blockposition1).a(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).a(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 39b08086d111f614286675fd4a993da12cf24ccc..dc89c707b10c5544eca06a634a625bce0dd778f0 100644
--- a/src/main/java/net/minecraft/server/RandomPositionGenerator.java
+++ b/src/main/java/net/minecraft/server/RandomPositionGenerator.java
@@ -116,6 +116,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) -> {
@@ -123,7 +124,8 @@ public class RandomPositionGenerator {
                         });
                     }
 
-                    if (flag || !entitycreature.world.getFluid(blockposition2).a((Tag) TagsFluid.WATER)) {
+                    Fluid fluid = entitycreature.world.getFluidIfLoaded(blockposition2); // Paper
+                    if (flag || (fluid != null && !fluid.a((Tag) TagsFluid.WATER))) { // Paper
                         PathType pathtype = PathfinderNormal.a((IBlockAccess) entitycreature.world, blockposition2.i());
 
                         if (entitycreature.a(pathtype) == 0.0F) {