aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0545-Fix-curing-zombie-villager-discount-exploit.patch
blob: 1fdd4122e743cfd5966b7970173b18b50673a0ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: BillyGalbreath <blake.galbreath@gmail.com>
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) {