aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0612-Fix-curing-zombie-villager-discount-exploit.patch
blob: 638e5106691f34685b16c9e99957adfd09e85466 (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
46
47
48
49
50
51
52
53
54
55
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 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) {