Skip to content

Commit eab2140

Browse files
authored
Add config to only lobotomize villagers that have been traded with (#1466)
1 parent 6aebd42 commit eab2140

5 files changed

Lines changed: 27 additions & 24 deletions

patches/server/0242-Lobotomize-stuck-villagers.patch

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Subject: [PATCH] Lobotomize stuck villagers
55

66

77
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
8-
index cb6ca99d429b395c0c79b57b1709eb1b8899da82..27e8f8bbaa25227c19399fab2bce8953d098e612 100644
8+
index af3af49f2965dbc3da7749bd9c6ae5e2d6b94cbe..fed066980b17d7c7fa773a00b314535c92fc53fd 100644
99
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
1010
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
1111
@@ -141,6 +141,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@@ -17,19 +17,20 @@ index cb6ca99d429b395c0c79b57b1709eb1b8899da82..27e8f8bbaa25227c19399fab2bce8953
1717

1818
public long nextGolemPanic = -1; // Pufferfish
1919

20-
@@ -200,6 +202,47 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
20+
@@ -200,6 +202,48 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
2121
return this.level().purpurConfig.villagerAlwaysDropExp;
2222
}
2323

2424
+ private boolean checkLobotomized() {
2525
+ int interval = this.level().purpurConfig.villagerLobotomizeCheckInterval;
26+
+ boolean shouldCheckForTradeLocked = this.level().purpurConfig.villagerLobotomizeWaitUntilTradeLocked;
2627
+ if (this.notLobotomizedCount > 3) {
2728
+ // check half as often if not lobotomized for the last 3+ consecutive checks
2829
+ interval *= 2;
2930
+ }
3031
+ if (this.level().getGameTime() % interval == 0) {
3132
+ // offset Y for short blocks like dirt_path/farmland
32-
+ this.isLobotomized = !canTravelFrom(BlockPos.containing(this.position().x, this.getBoundingBox().minY + 0.0625D, this.position().z));
33+
+ this.isLobotomized = !(shouldCheckForTradeLocked && this.getVillagerXp() == 0) && !canTravelFrom(BlockPos.containing(this.position().x, this.getBoundingBox().minY + 0.0625D, this.position().z));
3334
+
3435
+ if (this.isLobotomized) {
3536
+ this.notLobotomizedCount = 0;
@@ -65,7 +66,7 @@ index cb6ca99d429b395c0c79b57b1709eb1b8899da82..27e8f8bbaa25227c19399fab2bce8953
6566
@Override
6667
public Brain<Villager> getBrain() {
6768
return (Brain<Villager>) super.getBrain(); // CraftBukkit - decompile error
68-
@@ -297,13 +340,19 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
69+
@@ -297,13 +341,19 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
6970
// Paper start
7071
this.customServerAiStep(false);
7172
}
@@ -104,19 +105,20 @@ index 6c15d40979fd3e3d246a447c432b321fbf29ada3..6ace76a829c88e2e747dbbcce0a6582c
104105
+ // Purpur end
105106
}
106107
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
107-
index e320196cc5f7302377916d5402579632374de09c..39f373cfbe0228d2040a9e7616a0491b11ee67a1 100644
108+
index e320196cc5f7302377916d5402579632374de09c..26351f5ba9fd4f2e231481cfdd52341e0f4d96a4 100644
108109
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
109110
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
110-
@@ -2795,6 +2795,8 @@ public class PurpurWorldConfig {
111+
@@ -2795,6 +2795,9 @@ public class PurpurWorldConfig {
111112
public boolean villagerAllowTrading = true;
112113
public boolean villagerAlwaysDropExp = false;
113114
public int villagerMinimumDemand = 0;
114115
+ public boolean villagerLobotomizeEnabled = false;
115116
+ public int villagerLobotomizeCheckInterval = 100;
117+
+ public boolean villagerLobotomizeWaitUntilTradeLocked = false;
116118
private void villagerSettings() {
117119
villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable);
118120
villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater);
119-
@@ -2816,6 +2818,17 @@ public class PurpurWorldConfig {
121+
@@ -2816,6 +2819,18 @@ public class PurpurWorldConfig {
120122
villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading);
121123
villagerAlwaysDropExp = getBoolean("mobs.villager.always-drop-exp", villagerAlwaysDropExp);
122124
villagerMinimumDemand = getInt("mobs.villager.minimum-demand", villagerMinimumDemand);
@@ -131,6 +133,7 @@ index e320196cc5f7302377916d5402579632374de09c..39f373cfbe0228d2040a9e7616a0491b
131133
+ }
132134
+ villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled);
133135
+ villagerLobotomizeCheckInterval = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval);
136+
+ villagerLobotomizeWaitUntilTradeLocked = getBoolean("mobs.villager.lobotomize.wait-until-trade-locked", villagerLobotomizeWaitUntilTradeLocked);
134137
}
135138

136139
public boolean vindicatorRidable = false;

patches/server/0243-Option-for-villager-display-trade-item.patch

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,21 @@ index c3e0b1f11b58668f9f24eb421abc340e1b49dfac..d809fa4f96e2c528075f544355397903
1717
}
1818

1919
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
20-
index 39f373cfbe0228d2040a9e7616a0491b11ee67a1..7f91d3d56f6c4077e773c82da0f96103c892b82b 100644
20+
index 26351f5ba9fd4f2e231481cfdd52341e0f4d96a4..38ebf581f6abc16b7556057c05cead5c2bfaa0f7 100644
2121
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
2222
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
23-
@@ -2797,6 +2797,7 @@ public class PurpurWorldConfig {
24-
public int villagerMinimumDemand = 0;
23+
@@ -2798,6 +2798,7 @@ public class PurpurWorldConfig {
2524
public boolean villagerLobotomizeEnabled = false;
2625
public int villagerLobotomizeCheckInterval = 100;
26+
public boolean villagerLobotomizeWaitUntilTradeLocked = false;
2727
+ public boolean villagerDisplayTradeItem = true;
2828
private void villagerSettings() {
2929
villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable);
3030
villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater);
31-
@@ -2829,6 +2830,7 @@ public class PurpurWorldConfig {
32-
}
31+
@@ -2831,6 +2832,7 @@ public class PurpurWorldConfig {
3332
villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled);
3433
villagerLobotomizeCheckInterval = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval);
34+
villagerLobotomizeWaitUntilTradeLocked = getBoolean("mobs.villager.lobotomize.wait-until-trade-locked", villagerLobotomizeWaitUntilTradeLocked);
3535
+ villagerDisplayTradeItem = getBoolean("mobs.villager.display-trade-item", villagerDisplayTradeItem);
3636
}
3737

patches/server/0250-Implement-configurable-search-radius-for-villagers-t.patch

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ Subject: [PATCH] Implement configurable search radius for villagers to spawn
66

77

88
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
9-
index 27e8f8bbaa25227c19399fab2bce8953d098e612..576ac084a97a59f2bd3a1be3d70515649091e593 100644
9+
index fed066980b17d7c7fa773a00b314535c92fc53fd..857d1d80afd35d30a2947b0a6f953e5af1516048 100644
1010
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
1111
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
12-
@@ -1100,6 +1100,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
12+
@@ -1101,6 +1101,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
1313
}
1414

1515
public void spawnGolemIfNeeded(ServerLevel world, long time, int requiredCount) {
@@ -18,21 +18,21 @@ index 27e8f8bbaa25227c19399fab2bce8953d098e612..576ac084a97a59f2bd3a1be3d7051564
1818
AABB axisalignedbb = this.getBoundingBox().inflate(10.0D, 10.0D, 10.0D);
1919
List<Villager> list = world.getEntitiesOfClass(Villager.class, axisalignedbb);
2020
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
21-
index 2a898817bff68402631fbcf9318bed76548c9e21..05d82f9555b8836b48d076ec38f3aab6c070e58b 100644
21+
index 1beb9285414e3c178c95ef9ea404fcf34f9cdcac..a0b5c0819541a2924bf29ded4d1842b0e19b4e7b 100644
2222
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
2323
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
24-
@@ -2808,6 +2808,8 @@ public class PurpurWorldConfig {
25-
public boolean villagerLobotomizeEnabled = false;
24+
@@ -2809,6 +2809,8 @@ public class PurpurWorldConfig {
2625
public int villagerLobotomizeCheckInterval = 100;
26+
public boolean villagerLobotomizeWaitUntilTradeLocked = false;
2727
public boolean villagerDisplayTradeItem = true;
2828
+ public int villagerSpawnIronGolemRadius = 0;
2929
+ public int villagerSpawnIronGolemLimit = 0;
3030
private void villagerSettings() {
3131
villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable);
3232
villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater);
33-
@@ -2841,6 +2843,8 @@ public class PurpurWorldConfig {
34-
villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled);
33+
@@ -2843,6 +2845,8 @@ public class PurpurWorldConfig {
3534
villagerLobotomizeCheckInterval = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval);
35+
villagerLobotomizeWaitUntilTradeLocked = getBoolean("mobs.villager.lobotomize.wait-until-trade-locked", villagerLobotomizeWaitUntilTradeLocked);
3636
villagerDisplayTradeItem = getBoolean("mobs.villager.display-trade-item", villagerDisplayTradeItem);
3737
+ villagerSpawnIronGolemRadius = getInt("mobs.villager.spawn-iron-golem.radius", villagerSpawnIronGolemRadius);
3838
+ villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit);

patches/server/0265-Remove-Mojang-Profiler.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,10 +1777,10 @@ index 384e7b29215cadfa40af07a183a9c9c6a5b4a80a..bf7ef72a7d92db8f11789a6958327064
17771777
if ((this.tickCount + this.getId()) % 120 == 0) {
17781778
Warden.applyDarknessAround(worldserver, this.position(), this, 20);
17791779
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
1780-
index ceda40e0246830155d13f36073b0ba45a5146de6..795a91cf05dc4f5fba84eaa501e8163fd99bf2c5 100644
1780+
index 857d1d80afd35d30a2947b0a6f953e5af1516048..18f92478f07de7c941ff8bbe0ec2ef2fe3617fd7 100644
17811781
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
17821782
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
1783-
@@ -342,7 +342,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
1783+
@@ -343,7 +343,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
17841784
}
17851785
protected void customServerAiStep(boolean inactive) { // Purpur - not final
17861786
// Paper end
@@ -1789,7 +1789,7 @@ index ceda40e0246830155d13f36073b0ba45a5146de6..795a91cf05dc4f5fba84eaa501e8163f
17891789
// Purpur start
17901790
if (this.level().purpurConfig.villagerLobotomizeEnabled) {
17911791
// treat as inactive if lobotomized
1792-
@@ -354,7 +354,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
1792+
@@ -355,7 +355,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
17931793
this.getBrain().tick((ServerLevel) this.level(), this); // Paper
17941794
} else if (this.isLobotomized && shouldRestock()) restock();
17951795
// Purpur end

patches/server/0298-Shears-can-defuse-TNT.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ index cd7b955754b809826048b80723e2e9055b373a4a..b929bef749397797203eb6fb7a7e817d
4242
+ // Purpur end - Shears can defuse TNT
4343
}
4444
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
45-
index 4fa20bdc2a9ca0906f4fd32d7b1d2590da6094a3..4d6679eba841dc6d9b2d227d99ab5842adb1caeb 100644
45+
index 51540ca96e7ce0706afbb0644f5b8e699fb79cfc..d7b7e3adb55224adec5f11a98d77e93ebdbb5c2d 100644
4646
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
4747
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
48-
@@ -3284,4 +3284,11 @@ public class PurpurWorldConfig {
48+
@@ -3286,4 +3286,11 @@ public class PurpurWorldConfig {
4949
cauldronDripstoneWaterFillChance = (float) getDouble("blocks.cauldron.fill-chances.dripstone-water", cauldronDripstoneWaterFillChance);
5050
cauldronDripstoneLavaFillChance = (float) getDouble("blocks.cauldron.fill-chances.dripstone-lava", cauldronDripstoneLavaFillChance);
5151
}

0 commit comments

Comments
 (0)