diff --git a/patches/server/0263-Configurable-minimum-demand-for-trades.patch b/patches/server/0263-Configurable-minimum-demand-for-trades.patch new file mode 100644 index 000000000..742a3f0bc --- /dev/null +++ b/patches/server/0263-Configurable-minimum-demand-for-trades.patch @@ -0,0 +1,61 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Totorewa <76272501+totorewa@users.noreply.github.com> +Date: Fri, 7 Jan 2022 21:34:57 +1300 +Subject: [PATCH] Configurable minimum demand for trades + +Addresses MC-163962 where villager demand decreases indefinitely. Paper +adds a patch to fix this by preventing demand from going below zero. +This patch adds a config option to allow the minimum demand to instead +be configurable. + +diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java +index 9755517f0c1d66db5bfd00946114fab5db6776d6..b9f228d660b2279284e64fc3bbfa90fc7d2d20b0 100644 +--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java ++++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java +@@ -532,7 +532,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + while (iterator.hasNext()) { + MerchantOffer merchantrecipe = (MerchantOffer) iterator.next(); + +- merchantrecipe.updateDemand(); ++ merchantrecipe.updateDemand(this.level.purpurConfig.villagerMinimumDemand); // Purpur + } + + } +diff --git a/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java b/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java +index c9cb0717c2793acd5b5870a6cc4d672d69a40026..9a402505375af2051673245ec0a1daf9f3a66dc7 100644 +--- a/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java ++++ b/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java +@@ -132,7 +132,12 @@ public class MerchantOffer { + } + + public void updateDemand() { +- this.demand = Math.max(0, this.demand + this.uses - (this.maxUses - this.uses)); // Paper ++ // Purpur start ++ this.updateDemand(0); ++ } ++ public void updateDemand(int minimumDemand) { ++ this.demand = Math.max(minimumDemand, this.demand + this.uses - (this.maxUses - this.uses)); ++ // Purpur end + } + + public ItemStack assemble() { +diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +index 8a2ecb3a3728cc603017a1d5f06be1d5fb3d47a8..287941dc162c47303ec12c18c0ea4747169ffcd6 100644 +--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java ++++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +@@ -2663,6 +2663,7 @@ public class PurpurWorldConfig { + public boolean villagerTakeDamageFromWater = false; + public boolean villagerAllowTrading = true; + public boolean villagerAlwaysDropExp = false; ++ public int villagerMinimumDemand = 0; + private void villagerSettings() { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -2687,6 +2688,7 @@ public class PurpurWorldConfig { + villagerTakeDamageFromWater = getBoolean("mobs.villager.takes-damage-from-water", villagerTakeDamageFromWater); + villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading); + villagerAlwaysDropExp = getBoolean("mobs.villager.always-drop-exp", villagerAlwaysDropExp); ++ villagerMinimumDemand = getInt("mobs.villager.minimum-demand", villagerMinimumDemand); + } + + public boolean vindicatorRidable = false;