diff --git a/patches/server/0159-Lobotomize-stuck-villagers.patch b/patches/server/0159-Lobotomize-stuck-villagers.patch new file mode 100644 index 000000000..9d0bb8516 --- /dev/null +++ b/patches/server/0159-Lobotomize-stuck-villagers.patch @@ -0,0 +1,79 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Thu, 3 Dec 2020 17:56:18 -0600 +Subject: [PATCH] Lobotomize stuck villagers + + +diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java +index 13227c558b..330ac6cf85 100644 +--- a/src/main/java/net/minecraft/server/Entity.java ++++ b/src/main/java/net/minecraft/server/Entity.java +@@ -114,7 +114,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke + public double lastY; + public double lastZ; + private Vec3D loc; +- private BlockPosition locBlock; ++ private BlockPosition locBlock; public BlockPosition getBlockLocation() { return locBlock; } // Purpur + private Vec3D mot; + public float yaw; + public float pitch; +diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java +index 823155821b..d882c1136a 100644 +--- a/src/main/java/net/minecraft/server/EntityVillager.java ++++ b/src/main/java/net/minecraft/server/EntityVillager.java +@@ -187,11 +187,23 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation + } + // Spigot End + ++ // Purpur start ++ private boolean canTravelFrom(BlockPosition pos) { ++ return canTravelTo(pos.east()) || canTravelTo(pos.west()) || canTravelTo(pos.north()) || canTravelTo(pos.south()); ++ } ++ ++ private boolean canTravelTo(BlockPosition pos) { ++ PathEntity to = navigation.calculateDestination(pos, 0); ++ return to != null && to.getPoints().size() > 1; ++ } ++ // Purpur end ++ + @Override + protected void mobTick() { mobTick(false); } + protected void mobTick(boolean inactive) { + this.world.getMethodProfiler().enter("villagerBrain"); + // Purpur start ++ if (world.purpurConfig.villagerLobotomize1x1) inactive = inactive || !canTravelFrom(getBlockLocation().up()); + boolean tick = (world.getTime() + brainTickOffset) % world.purpurConfig.villagerBrainTicks == 0; + if (((WorldServer) world).getMinecraftServer().lagging ? tick : world.purpurConfig.villagerUseBrainTicksOnlyWhenLagging || tick) + // Purpur end +diff --git a/src/main/java/net/minecraft/server/NavigationAbstract.java b/src/main/java/net/minecraft/server/NavigationAbstract.java +index b92ca4a6de..1208464fba 100644 +--- a/src/main/java/net/minecraft/server/NavigationAbstract.java ++++ b/src/main/java/net/minecraft/server/NavigationAbstract.java +@@ -101,6 +101,7 @@ public abstract class NavigationAbstract { + } + + @Nullable ++ public PathEntity calculateDestination(BlockPosition blockposition, int i) { return a(blockposition, i); } // Purpur - OBFHELPER + public PathEntity a(BlockPosition blockposition, int i) { + // Paper start - add target parameter + return this.a(blockposition, null, i); +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 5375c6c9ca..020a42a5e5 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -1056,6 +1056,7 @@ public class PurpurWorldConfig { + public int villagerSpawnIronGolemRadius = 0; + public int villagerSpawnIronGolemLimit = 0; + public boolean villagerCanBreed = true; ++ public boolean villagerLobotomize1x1 = false; + private void villagerSettings() { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -1067,6 +1068,7 @@ public class PurpurWorldConfig { + villagerSpawnIronGolemRadius = getInt("mobs.villager.spawn-iron-golem.radius", villagerSpawnIronGolemRadius); + villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit); + villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); ++ villagerLobotomize1x1 = getBoolean("mobs.villager.lobotomize-1x1", villagerLobotomize1x1); + } + + public boolean villagerTraderRidable = false;