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/world/entity/ai/gossip/Reputation.java b/src/main/java/net/minecraft/world/entity/ai/gossip/Reputation.java index 7d34d1157786227ac210edc1595a024ccb61a3e9..ce8a4cc9f642a740947c4e63d6eb78ad93a0fd44 100644 --- a/src/main/java/net/minecraft/world/entity/ai/gossip/Reputation.java +++ b/src/main/java/net/minecraft/world/entity/ai/gossip/Reputation.java @@ -223,6 +223,7 @@ public class Reputation { } + public final void removeReputationForType(ReputationType reputationType) { this.b(reputationType); } // Paper - OBFHELPER public void b(ReputationType reputationtype) { this.a.removeInt(reputationtype); } diff --git a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java index 382059b2c2b6a7b8231b3c3a5c9a401091b1ad18..2d0b83923d58cc7b6918b4e2ff2bece13ca26899 100644 --- a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java +++ b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java @@ -1007,6 +1007,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) {