From d01b838fb6c2f58087ed4db20d5be437398739f4 Mon Sep 17 00:00:00 2001 From: Totorewa <76272501+totorewa@users.noreply.github.com> Date: Sun, 12 Jan 2025 14:25:36 -0800 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. --- ...nfigurable-minimum-demand-for-trades.patch | 61 ------------------- .../world/entity/npc/Villager.java.patch | 9 +++ .../item/trading/MerchantOffer.java.patch | 16 +++++ .../purpurmc/purpur/PurpurWorldConfig.java | 2 + 4 files changed, 27 insertions(+), 61 deletions(-) delete mode 100644 patches/server/0229-Configurable-minimum-demand-for-trades.patch create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/item/trading/MerchantOffer.java.patch diff --git a/patches/server/0229-Configurable-minimum-demand-for-trades.patch b/patches/server/0229-Configurable-minimum-demand-for-trades.patch deleted file mode 100644 index 4466ce0cb..000000000 --- a/patches/server/0229-Configurable-minimum-demand-for-trades.patch +++ /dev/null @@ -1,61 +0,0 @@ -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/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index fcaf3db893d14b8359bddc1cc69da82e533ebc87..e03066a9e336fb67f729a84404ef8b37208fa77d 100644 ---- a/net/minecraft/world/entity/npc/Villager.java -+++ b/net/minecraft/world/entity/npc/Villager.java -@@ -548,7 +548,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/net/minecraft/world/item/trading/MerchantOffer.java b/net/minecraft/world/item/trading/MerchantOffer.java -index 0efc8d997b34302c3e0a5d7ec73a11a940dbeefe..af157881d440b34cfe79fbc9b03cc9ef28515eb8 100644 ---- a/net/minecraft/world/item/trading/MerchantOffer.java -+++ b/net/minecraft/world/item/trading/MerchantOffer.java -@@ -131,7 +131,12 @@ public class MerchantOffer { - } - - public void updateDemand() { -- this.demand = Math.max(0, this.demand + this.uses - (this.maxUses - this.uses)); // Paper - Fix MC-163962 -+ // Purpur start -+ this.updateDemand(0); -+ } -+ public void updateDemand(int minimumDemand) { -+ this.demand = Math.max(minimumDemand, this.demand + this.uses - (this.maxUses - this.uses)); // Paper - Fix MC-163962 -+ // 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 fc11b643c938cf7d7bd088825dfd89afef15401d..fa09bd0e91d3c71d960e316f792323b763569b6e 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2914,6 +2914,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); -@@ -2936,6 +2937,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; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/Villager.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/Villager.java.patch index fdf7bff20..0ddf17a38 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/Villager.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/Villager.java.patch @@ -22,6 +22,15 @@ this.startTrading(player); } +@@ -503,7 +_,7 @@ + + private void updateDemand() { + for (MerchantOffer merchantOffer : this.getOffers()) { +- merchantOffer.updateDemand(); ++ merchantOffer.updateDemand(this.level().purpurConfig.villagerMinimumDemand); // Purpur - Configurable minimum demand for trades + } + } + @@ -707,7 +_,7 @@ @Override diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/trading/MerchantOffer.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/trading/MerchantOffer.java.patch new file mode 100644 index 000000000..6a3b114a8 --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/trading/MerchantOffer.java.patch @@ -0,0 +1,16 @@ +--- a/net/minecraft/world/item/trading/MerchantOffer.java ++++ b/net/minecraft/world/item/trading/MerchantOffer.java +@@ -143,7 +_,12 @@ + } + + public void updateDemand() { +- this.demand = Math.max(0, this.demand + this.uses - (this.maxUses - this.uses)); // Paper - Fix MC-163962 ++ // Purpur start - Configurable minimum demand for trades ++ this.updateDemand(0); ++ } ++ public void updateDemand(int minimumDemand) { ++ this.demand = Math.max(minimumDemand, this.demand + this.uses - (this.maxUses - this.uses)); // Paper - Fix MC-163962 ++ // Purpur end - Configurable minimum demand for trades + } + + public ItemStack assemble() { diff --git a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index ba4f03301..74cbef93f 100644 --- a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -2913,6 +2913,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); @@ -2935,6 +2936,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;