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 7d3207a9af8360ddad228281d6aa65e1a0d24157..a3b3e3e04b7a5e3a351992e06870cc91fbd8adc8 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java @@ -717,4 +717,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/GossipContainer.java b/src/main/java/net/minecraft/world/entity/ai/gossip/GossipContainer.java index 57832c392910d22aa81ac2b4816d043dd7ac867a..9a68201bab4fcbad69c85e2469a103634b65d7b3 100644 --- a/src/main/java/net/minecraft/world/entity/ai/gossip/GossipContainer.java +++ b/src/main/java/net/minecraft/world/entity/ai/gossip/GossipContainer.java @@ -223,6 +223,7 @@ public class GossipContainer { } + public final void removeReputationForType(GossipType reputationType) { this.remove(reputationType); } // Paper - OBFHELPER public void remove(GossipType gossipType) { this.entries.removeInt(gossipType); } 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 415fa3591add1f1ab22dd5866e110dbfccd0ec93..7817071b1964b962c8f4017d5bb39d74ca0ca3e4 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -1013,6 +1013,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.getReputation().getReputations().get(entity.getUUID()); + if (playerReputation != null) { + playerReputation.removeReputationForType(GossipType.MAJOR_POSITIVE); + playerReputation.removeReputationForType(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) {