aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0521-Fix-curing-zombie-villager-discount-exploit.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0521-Fix-curing-zombie-villager-discount-exploit.patch')
-rw-r--r--patches/server/0521-Fix-curing-zombie-villager-discount-exploit.patch29
1 files changed, 29 insertions, 0 deletions
diff --git a/patches/server/0521-Fix-curing-zombie-villager-discount-exploit.patch b/patches/server/0521-Fix-curing-zombie-villager-discount-exploit.patch
new file mode 100644
index 0000000000..c6cb27bebe
--- /dev/null
+++ b/patches/server/0521-Fix-curing-zombie-villager-discount-exploit.patch
@@ -0,0 +1,29 @@
+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/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
+index 1d2b7950e3c498945a2ff85fda0e3bb30acd22cb..10b45ec24a5a0867106d1694312385ad1e267f43 100644
+--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
++++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
+@@ -976,6 +976,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().fixes.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) {