4d40e87b33
Had to drop some hunks modifying getEntities, as those methods were rewritten by Mojang in 1.17
139 lines
7.6 KiB
Diff
139 lines
7.6 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/world/entity/ai/gossip/GossipContainer.java b/src/main/java/net/minecraft/world/entity/ai/gossip/GossipContainer.java
|
|
index 2e342e1c258180dc02080f76385351c0a65eade2..39c0fbae8b94dabd27ee8687015557c6a9279813 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
|
|
@@ -29,7 +29,7 @@ import net.minecraft.util.VisibleForDebug;
|
|
|
|
public class GossipContainer {
|
|
public static final int DISCARD_THRESHOLD = 2;
|
|
- private final Map<UUID, GossipContainer.EntityGossips> gossips = Maps.newHashMap();
|
|
+ private final Map<UUID, GossipContainer.EntityGossips> gossips = Maps.newHashMap(); public Map<UUID, GossipContainer.EntityGossips> getReputations() { return this.gossips; } // Paper - add getter for reputations
|
|
|
|
@VisibleForDebug
|
|
public Map<UUID, Object2IntMap<GossipType>> getGossipEntries() {
|
|
@@ -228,6 +228,28 @@ public class GossipContainer {
|
|
public void remove(GossipType gossipType) {
|
|
this.entries.removeInt(gossipType);
|
|
}
|
|
+
|
|
+ // 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()] = entries.getOrDefault(GossipType.MAJOR_NEGATIVE, 0);
|
|
+ reputation[com.destroystokyo.paper.entity.villager.ReputationType.MAJOR_POSITIVE.ordinal()] = entries.getOrDefault(GossipType.MAJOR_POSITIVE, 0);
|
|
+ reputation[com.destroystokyo.paper.entity.villager.ReputationType.MINOR_NEGATIVE.ordinal()] = entries.getOrDefault(GossipType.MINOR_NEGATIVE, 0);
|
|
+ reputation[com.destroystokyo.paper.entity.villager.ReputationType.MINOR_POSITIVE.ordinal()] = entries.getOrDefault(GossipType.MINOR_POSITIVE, 0);
|
|
+ reputation[com.destroystokyo.paper.entity.villager.ReputationType.TRADING.ordinal()] = entries.getOrDefault(GossipType.TRADING, 0);
|
|
+ return com.destroystokyo.paper.entity.villager.ReputationConstructor.construct(reputation);
|
|
+ }
|
|
+
|
|
+ public void assignFromPaperReputation(com.destroystokyo.paper.entity.villager.Reputation rep) {
|
|
+ int val;
|
|
+ if ((val = rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.MAJOR_NEGATIVE)) != 0) this.entries.put(GossipType.MAJOR_NEGATIVE, val);
|
|
+ if ((val = rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.MAJOR_POSITIVE)) != 0) this.entries.put(GossipType.MAJOR_POSITIVE, val);
|
|
+ if ((val = rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.MINOR_NEGATIVE)) != 0) this.entries.put(GossipType.MINOR_NEGATIVE, val);
|
|
+ if ((val = rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.MINOR_POSITIVE)) != 0) this.entries.put(GossipType.MINOR_POSITIVE, val);
|
|
+ if ((val = rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.TRADING)) != 0) this.entries.put(GossipType.TRADING, val);
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
|
|
static class GossipEntry {
|
|
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 124a8eb24bc9428011075925092e99f8159ee1c2..23ea91449a04e8457273db34c4a388bdf85d7dfc 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
|
@@ -1080,6 +1080,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
|
this.numberOfRestocksToday = 0;
|
|
}
|
|
|
|
+ public GossipContainer getReputation() { return this.getGossips(); } // Paper - OBFHELPER
|
|
public GossipContainer getGossips() {
|
|
return this.gossips;
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
|
|
index 6b16bb1226515b8cbb477e62b617ee1a7f5ef8ed..f2cfce5cc18776c4dfd162b699661c9bee725f01 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
|
|
@@ -16,6 +16,13 @@ import org.bukkit.entity.Villager;
|
|
import org.bukkit.entity.Villager.Profession;
|
|
import org.bukkit.entity.Villager.Type;
|
|
|
|
+// Paper start
|
|
+import com.destroystokyo.paper.entity.villager.Reputation;
|
|
+import com.google.common.collect.Maps;
|
|
+import java.util.Map;
|
|
+import java.util.UUID;
|
|
+// Paper end
|
|
+
|
|
public class CraftVillager extends CraftAbstractVillager implements Villager {
|
|
|
|
public CraftVillager(CraftServer server, net.minecraft.world.entity.npc.Villager entity) {
|
|
@@ -130,4 +137,45 @@ public class CraftVillager extends CraftAbstractVillager implements Villager {
|
|
public static VillagerProfession bukkitToNmsProfession(Profession bukkit) {
|
|
return Registry.VILLAGER_PROFESSION.get(CraftNamespacedKey.toMinecraft(bukkit.getKey()));
|
|
}
|
|
+
|
|
+ // Paper start - Add villager reputation API
|
|
+ @Override
|
|
+ public Reputation getReputation(UUID uniqueId) {
|
|
+ net.minecraft.world.entity.ai.gossip.GossipContainer.EntityGossips 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.world.entity.ai.gossip.GossipContainer.EntityGossips nmsReputation =
|
|
+ getHandle().getReputation().getReputations().computeIfAbsent(
|
|
+ uniqueId,
|
|
+ key -> new net.minecraft.world.entity.ai.gossip.GossipContainer.EntityGossips()
|
|
+ );
|
|
+ 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
|
|
}
|