ce270e1412
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: b2f1908c SPIGOT-5783: Add helpful info to UnknownDependencyException e4f46260 SPIGOT-2623: Add EntityEquipment methods to get/set ItemStacks by slot. 529a9a69 SPIGOT-5751: Clarify behaviour of block drop-related API methods CraftBukkit Changes: 8ea9b138 Remove outdated build delay. ffc2b251 Revert "#675: Fix redirected CommandNodes sometimes not being properly redirected" cb701f6b #675: Fix redirected CommandNodes sometimes not being properly redirected c9d7c16b SPIGOT-2623: Add EntityEquipment methods to get/set ItemStacks by slot. fad2494a #673: Fix Craftworld#isChunkLoaded 8637ec00 SPIGOT-5751: Made breakNaturally and getDrops returns the correct item if no argument is given Spigot Changes: a99063f7 Rebuild patches Fixes #3602
152 lines
7.5 KiB
Diff
152 lines
7.5 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Mariell Hoversholm <proximyst@proximyst.com>
|
|
Date: Wed, 22 Apr 2020 23:29:20 +0200
|
|
Subject: [PATCH] Add villager reputation API
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/entity/villager/ReputationConstructor.java b/src/main/java/com/destroystokyo/paper/entity/villager/ReputationConstructor.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..0f10c333d88f2e1c56a6c7f22d421084adfd3789
|
|
--- /dev/null
|
|
+++ b/src/main/java/com/destroystokyo/paper/entity/villager/ReputationConstructor.java
|
|
@@ -0,0 +1,9 @@
|
|
+package com.destroystokyo.paper.entity.villager;
|
|
+// Must have own package due to package-level constructor.
|
|
+
|
|
+public final class ReputationConstructor {
|
|
+ // Abuse the package-level constructor.
|
|
+ public static Reputation construct(int[] values) {
|
|
+ return new Reputation(values);
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java
|
|
index eeb76bc0298711ac3ea24440a172e812925f875e..7da267d287eb338d32a8cace82bacc4ce2c47182 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityVillager.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityVillager.java
|
|
@@ -960,6 +960,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
|
|
this.bL = 0;
|
|
}
|
|
|
|
+ public Reputation getReputation() { return this.eN(); } // Paper - OBFHELPER
|
|
public Reputation eN() {
|
|
return this.bG;
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/Reputation.java b/src/main/java/net/minecraft/server/Reputation.java
|
|
index 0b6f91ac1206089654a6745bccb038fba8c13d98..4ae31599664ee8478ca1acf68f7253eb02eb45ed 100644
|
|
--- a/src/main/java/net/minecraft/server/Reputation.java
|
|
+++ b/src/main/java/net/minecraft/server/Reputation.java
|
|
@@ -25,7 +25,7 @@ import java.util.stream.Stream;
|
|
|
|
public class Reputation {
|
|
|
|
- private final Map<UUID, Reputation.a> a = Maps.newHashMap();
|
|
+ private final Map<UUID, Reputation.a> a = Maps.newHashMap(); public Map<UUID, Reputation.a> getReputations() { return this.a; } // Paper - add getter for reputations
|
|
|
|
public Reputation() {}
|
|
|
|
@@ -138,11 +138,11 @@ public class Reputation {
|
|
return k > reputationtype.h ? Math.max(reputationtype.h, i) : k;
|
|
}
|
|
|
|
- static class a {
|
|
+ public static class a { // Paper - make public
|
|
|
|
private final Object2IntMap<ReputationType> a;
|
|
|
|
- private a() {
|
|
+ public a() { // Paper - make public - update CraftVillager setReputation on change
|
|
this.a = new Object2IntOpenHashMap();
|
|
}
|
|
|
|
@@ -196,6 +196,27 @@ public class Reputation {
|
|
public void b(ReputationType reputationtype) {
|
|
this.a.removeInt(reputationtype);
|
|
}
|
|
+
|
|
+ // Paper start - Add villager reputation API
|
|
+ private static final com.destroystokyo.paper.entity.villager.ReputationType[] REPUTATION_TYPES = com.destroystokyo.paper.entity.villager.ReputationType.values();
|
|
+ public com.destroystokyo.paper.entity.villager.Reputation getPaperReputation() {
|
|
+ int[] reputation = new int[REPUTATION_TYPES.length];
|
|
+ reputation[com.destroystokyo.paper.entity.villager.ReputationType.MAJOR_NEGATIVE.ordinal()] = a.getOrDefault(ReputationType.MAJOR_NEGATIVE, 0);
|
|
+ reputation[com.destroystokyo.paper.entity.villager.ReputationType.MAJOR_POSITIVE.ordinal()] = a.getOrDefault(ReputationType.MAJOR_POSITIVE, 0);
|
|
+ reputation[com.destroystokyo.paper.entity.villager.ReputationType.MINOR_NEGATIVE.ordinal()] = a.getOrDefault(ReputationType.MINOR_NEGATIVE, 0);
|
|
+ reputation[com.destroystokyo.paper.entity.villager.ReputationType.MINOR_POSITIVE.ordinal()] = a.getOrDefault(ReputationType.MINOR_POSITIVE, 0);
|
|
+ reputation[com.destroystokyo.paper.entity.villager.ReputationType.TRADING.ordinal()] = a.getOrDefault(ReputationType.TRADING, 0);
|
|
+ return com.destroystokyo.paper.entity.villager.ReputationConstructor.construct(reputation);
|
|
+ }
|
|
+
|
|
+ public void assignFromPaperReputation(com.destroystokyo.paper.entity.villager.Reputation rep) {
|
|
+ this.a.put(net.minecraft.server.ReputationType.MAJOR_NEGATIVE, rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.MAJOR_NEGATIVE));
|
|
+ this.a.put(net.minecraft.server.ReputationType.MAJOR_POSITIVE, rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.MAJOR_POSITIVE));
|
|
+ this.a.put(net.minecraft.server.ReputationType.MINOR_NEGATIVE, rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.MINOR_NEGATIVE));
|
|
+ this.a.put(net.minecraft.server.ReputationType.MINOR_POSITIVE, rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.MINOR_POSITIVE));
|
|
+ this.a.put(net.minecraft.server.ReputationType.TRADING, rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.TRADING));
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
|
|
static class b {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
|
|
index a8384081c03884c86578dca677914d77441c1863..d24a892c498d7ee58741c9358748a117f01d8a8d 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
|
|
@@ -1,9 +1,13 @@
|
|
package org.bukkit.craftbukkit.entity;
|
|
|
|
+import com.destroystokyo.paper.entity.villager.Reputation; // Paper
|
|
import com.google.common.base.Preconditions;
|
|
+import com.google.common.collect.Maps; // Paper
|
|
import java.util.Locale;
|
|
import net.minecraft.server.BlockBed;
|
|
import net.minecraft.server.BlockPosition;
|
|
+import java.util.Map; // Paper
|
|
+import java.util.UUID; // Paper
|
|
import net.minecraft.server.EntityVillager;
|
|
import net.minecraft.server.IBlockData;
|
|
import net.minecraft.server.IRegistry;
|
|
@@ -124,4 +128,45 @@ public class CraftVillager extends CraftAbstractVillager implements Villager {
|
|
public static VillagerProfession bukkitToNmsProfession(Profession bukkit) {
|
|
return IRegistry.VILLAGER_PROFESSION.get(CraftNamespacedKey.toMinecraft(bukkit.getKey()));
|
|
}
|
|
+
|
|
+ // Paper start - Add villager reputation API
|
|
+ @Override
|
|
+ public Reputation getReputation(UUID uniqueId) {
|
|
+ net.minecraft.server.Reputation.a rep = getHandle().getReputation().getReputations().get(uniqueId);
|
|
+ if (rep == null) {
|
|
+ return new Reputation(Maps.newHashMap());
|
|
+ }
|
|
+
|
|
+ return rep.getPaperReputation();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public Map<UUID, Reputation> getReputations() {
|
|
+ return getHandle().getReputation().getReputations().entrySet()
|
|
+ .stream()
|
|
+ .collect(java.util.stream.Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().getPaperReputation()));
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setReputation(UUID uniqueId, Reputation reputation) {
|
|
+ net.minecraft.server.Reputation.a nmsReputation =
|
|
+ getHandle().getReputation().getReputations().computeIfAbsent(
|
|
+ uniqueId,
|
|
+ key -> new net.minecraft.server.Reputation.a()
|
|
+ );
|
|
+ nmsReputation.assignFromPaperReputation(reputation);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setReputations(Map<UUID, Reputation> reputations) {
|
|
+ for (Map.Entry<UUID, Reputation> entry : reputations.entrySet()) {
|
|
+ setReputation(entry.getKey(), entry.getValue());
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void clearReputations() {
|
|
+ getHandle().getReputation().getReputations().clear();
|
|
+ }
|
|
+ // Paper end
|
|
}
|