From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: BillyGalbreath 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 6262246c4018c660705fbad028f297fc44e7197f..9ebe8771c2d5e843756868824740ef599ca8455f 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java @@ -715,4 +715,9 @@ public class PaperWorldConfig { private void fixClimbingBypassingCrammingRule() { 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); + } } diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java index 0388d1099f2a6d436a5a5e58bbbdae3ddab969e7..de9ea6770b8afc5e1020bef04ac6cca93b6b420c 100644 --- a/src/main/java/net/minecraft/server/EntityVillager.java +++ b/src/main/java/net/minecraft/server/EntityVillager.java @@ -923,6 +923,15 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation @Override public void a(ReputationEvent reputationevent, Entity entity) { if (reputationevent == ReputationEvent.a) { + // Paper start - fix MC-181190 + if (world.paperConfig.fixCuringZombieVillagerDiscountExploit) { + final Reputation.a playerReputation = this.getReputation().getReputations().get(entity.getUniqueID()); + if (playerReputation != null) { + playerReputation.removeReputationForType(ReputationType.MAJOR_POSITIVE); + playerReputation.removeReputationForType(ReputationType.MINOR_POSITIVE); + } + } + // Paper end this.by.a(entity.getUniqueID(), ReputationType.MAJOR_POSITIVE, 20); this.by.a(entity.getUniqueID(), ReputationType.MINOR_POSITIVE, 25); } else if (reputationevent == ReputationEvent.e) { diff --git a/src/main/java/net/minecraft/server/Reputation.java b/src/main/java/net/minecraft/server/Reputation.java index 7315cf5ee476ed45b4c2a56a723639b264672cb6..9ba1c10d1fda61221db399e0909cda5b0f57bc33 100644 --- a/src/main/java/net/minecraft/server/Reputation.java +++ b/src/main/java/net/minecraft/server/Reputation.java @@ -221,6 +221,7 @@ public class Reputation { } + public final void removeReputationForType(ReputationType reputationType) { this.b(reputationType); } // Paper - OBFHELPER public void b(ReputationType reputationtype) { this.a.removeInt(reputationtype); }