mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-19 17:37:42 +01:00
Upstream has released updates that appear to apply and compile correctly Paper Changes: 8fa15382b [Auto] Updated Upstream (CraftBukkit) 732b2f6b5 [CI-SKIP] [Auto] Rebuild Patches c5a39ffa2 Add BlockPreDispenseEvent (#5075) 8aeb4c9c3 Correctly skip pathfinder ticks for inactive entities (#5085) 0e420049c Fix console spam when removing chests in water 56b7935bb Add PlayerChangeBeaconEffectEvent 2eda45c34 added Wither API 97d0c571b Added Vanilla Entity Tags fccac282a fix NPE in getDisplayNameComponent 24e140372 Configurable max leash distance Tuinity Changes: d3ee22224 Merge dev/lighting
117 lines
6.0 KiB
Diff
117 lines
6.0 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: BillyGalbreath <blake.galbreath@gmail.com>
|
|
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 e4f2e51b6306fcaf161b7dfb734d9d28947e964b..cb4856e3bbb25e1077f5b4832f359549d57acd7e 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 548a993a1de939396d075f9176e0d60eebc7b010..b3f71c9dcada0ae14172c5694564a9f54a6e556e 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityVillager.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityVillager.java
|
|
@@ -187,15 +187,37 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
|
|
}
|
|
// Spigot End
|
|
|
|
+ // Purpur start
|
|
+ boolean lobotomized = false;
|
|
+
|
|
+ private boolean isLobotomized() {
|
|
+ if ((world.getTime() + brainTickOffset) % world.purpurConfig.villagerLobotomizeCheck == 0) {
|
|
+ this.lobotomized = !canTravelFrom(getBlockLocation().up());
|
|
+ }
|
|
+ return this.lobotomized;
|
|
+ }
|
|
+
|
|
+ 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.villagerLobotomizeEnabled) inactive = inactive || isLobotomized();
|
|
boolean tick = (world.getTime() + brainTickOffset) % world.purpurConfig.villagerBrainTicks == 0;
|
|
if (((WorldServer) world).getMinecraftServer().lagging ? tick : world.purpurConfig.villagerUseBrainTicksOnlyWhenLagging || tick)
|
|
// Purpur end
|
|
if (!inactive) this.getBehaviorController().a((WorldServer) this.world, this); // CraftBukkit - decompile error // Paper
|
|
+ else if (shouldRestock()) doRestock(); // Purpur
|
|
this.world.getMethodProfiler().exit();
|
|
if (this.bF) {
|
|
this.bF = false;
|
|
@@ -327,6 +349,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
|
|
return true;
|
|
}
|
|
|
|
+ public void doRestock() { fb(); } // Purpur - OBFHELPER
|
|
public void fb() {
|
|
this.fp();
|
|
Iterator iterator = this.getOffers().iterator();
|
|
@@ -361,6 +384,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
|
|
return this.bD == 0 || this.bD < 2 && this.world.getTime() > this.bC + 2400L;
|
|
}
|
|
|
|
+ public boolean shouldRestock() { return fc(); } // Purpur - OBFHELPER
|
|
public boolean fc() {
|
|
long i = this.bC + 12000L;
|
|
long j = this.world.getTime();
|
|
diff --git a/src/main/java/net/minecraft/server/NavigationAbstract.java b/src/main/java/net/minecraft/server/NavigationAbstract.java
|
|
index b92ca4a6de01f3f86367fb8dfe3591b08a3e9218..1208464fba96daf276c9cc0c1c9b18db75b03abc 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 860a2bd0d776edf65f51658379621762a496ddcd..f4f1ff35f98d0ab461266aff82b2a913499a474d 100644
|
|
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
|
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
|
@@ -1063,6 +1063,8 @@ public class PurpurWorldConfig {
|
|
public int villagerSpawnIronGolemRadius = 0;
|
|
public int villagerSpawnIronGolemLimit = 0;
|
|
public boolean villagerCanBreed = true;
|
|
+ public boolean villagerLobotomizeEnabled = false;
|
|
+ public int villagerLobotomizeCheck = 60;
|
|
private void villagerSettings() {
|
|
villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable);
|
|
villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater);
|
|
@@ -1074,6 +1076,13 @@ 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);
|
|
+ if (PurpurConfig.version < 9) {
|
|
+ boolean oldValue = getBoolean("mobs.villager.lobotomize-1x1", villagerLobotomizeEnabled);
|
|
+ set("mobs.villager.lobotomize.enabled", oldValue);
|
|
+ set("mobs.villager.lobotomize-1x1", null);
|
|
+ }
|
|
+ villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled);
|
|
+ villagerLobotomizeCheck = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheck);
|
|
}
|
|
|
|
public boolean villagerTraderRidable = false;
|