mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-01 12:41:50 +01:00
b31089a929
Upstream has released updates that appear 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: d264e972 #591: Add option for a consumer before spawning an item 1c537fce #590: Add spawn and transform reasons for piglin zombification. CraftBukkit Changes: ee5006d1 #810: Add option for a consumer before spawning an item f6a39d3c #809: Add spawn and transform reasons for piglin zombification. 0c24068a Organise imports Spigot Changes: bff52619 Organise imports
153 lines
7.6 KiB
Diff
153 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/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java
|
|
index 419de8176a03acc061436d1f92079b6fafcb0ed6..650e373a925296f14150de5cbecc6b083679ba54 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.bD = 0;
|
|
}
|
|
|
|
+ public Reputation getReputation() { return this.fj(); } // Paper - OBFHELPER
|
|
public Reputation fj() {
|
|
return this.by;
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/Reputation.java b/src/main/java/net/minecraft/server/Reputation.java
|
|
index 3c6d6be4485cad4f2e9a395425b5837590853eee..09d2fc5769089f6d29971d10de5b8209829baae8 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() {}
|
|
|
|
@@ -140,11 +140,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();
|
|
}
|
|
|
|
@@ -198,6 +198,28 @@ 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) {
|
|
+ int val;
|
|
+ if ((val = rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.MAJOR_NEGATIVE)) != 0) this.a.put(ReputationType.MAJOR_NEGATIVE, val);
|
|
+ if ((val = rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.MAJOR_POSITIVE)) != 0) this.a.put(ReputationType.MAJOR_POSITIVE, val);
|
|
+ if ((val = rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.MINOR_NEGATIVE)) != 0) this.a.put(ReputationType.MINOR_NEGATIVE, val);
|
|
+ if ((val = rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.MINOR_POSITIVE)) != 0) this.a.put(ReputationType.MINOR_POSITIVE, val);
|
|
+ if ((val = rep.getReputation(com.destroystokyo.paper.entity.villager.ReputationType.TRADING)) != 0) this.a.put(ReputationType.TRADING, val);
|
|
+ }
|
|
+ // 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 0273cf7e2ec27b094a06e5ad1131585df9a0ae8b..a705e988e3379f1ab50c2d0be3ee559dd3d9d17f 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;
|
|
@@ -126,4 +130,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
|
|
}
|