aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0545-Fix-curing-zombie-villager-discount-exploit.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0545-Fix-curing-zombie-villager-discount-exploit.patch')
-rw-r--r--patches/server/0545-Fix-curing-zombie-villager-discount-exploit.patch45
1 files changed, 45 insertions, 0 deletions
diff --git a/patches/server/0545-Fix-curing-zombie-villager-discount-exploit.patch b/patches/server/0545-Fix-curing-zombie-villager-discount-exploit.patch
new file mode 100644
index 0000000000..1fdd4122e7
--- /dev/null
+++ b/patches/server/0545-Fix-curing-zombie-villager-discount-exploit.patch
@@ -0,0 +1,45 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: BillyGalbreath <[email protected]>
+Date: Tue, 8 Dec 2020 20:14:20 -0600
+Subject: [PATCH] Fix curing zombie villager discount exploit
+
+This fixes the exploit used to gain absurd trading discounts with infecting
+and curing a villager on repeat by simply resetting the relevant part of
+the reputation when it is cured.
+
+diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+index 8a266d1276595d5b2bd0b60f08d99d4cceea929a..0dafb6b4837f9b68249e64a9f0b7f8f727d58327 100644
+--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
++++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+@@ -99,6 +99,11 @@ public class PaperWorldConfig {
+ fixClimbingBypassingCrammingRule = getBoolean("fix-climbing-bypassing-cramming-rule", fixClimbingBypassingCrammingRule);
+ }
+
++ public boolean fixCuringZombieVillagerDiscountExploit = true;
++ private void fixCuringExploit() {
++ fixCuringZombieVillagerDiscountExploit = getBoolean("game-mechanics.fix-curing-zombie-villager-discount-exploit", fixCuringZombieVillagerDiscountExploit);
++ }
++
+ public short keepLoadedRange;
+ private void keepLoadedRange() {
+ keepLoadedRange = (short) (getInt("keep-spawn-loaded-range", Math.min(spigotConfig.viewDistance, 10)) * 16);
+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 6cd297e66a7563bb8f2988302c657ac81fdd3d0f..0ac3d6b25857bc5af0a4909a70053eeb86ea48ea 100644
+--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
++++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
+@@ -1059,6 +1059,15 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+ @Override
+ public void onReputationEventFrom(ReputationEventType interaction, Entity entity) {
+ if (interaction == ReputationEventType.ZOMBIE_VILLAGER_CURED) {
++ // Paper start - fix MC-181190
++ if (level.paperConfig.fixCuringZombieVillagerDiscountExploit) {
++ final GossipContainer.EntityGossips playerReputation = this.getGossips().getReputations().get(entity.getUUID());
++ if (playerReputation != null) {
++ playerReputation.remove(GossipType.MAJOR_POSITIVE);
++ playerReputation.remove(GossipType.MINOR_POSITIVE);
++ }
++ }
++ // Paper end
+ this.gossips.add(entity.getUUID(), GossipType.MAJOR_POSITIVE, 20);
+ this.gossips.add(entity.getUUID(), GossipType.MINOR_POSITIVE, 25);
+ } else if (interaction == ReputationEventType.TRADE) {