mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-28 23:38:25 +01:00
69ee95fa42
PaperMC believes that 1.16.2 is now ready for general release as we fixed the main issue plagueing the 1.16.x release, the MapLike data conversion issues. Until now, it was not safe for a server to convert a world to 1.16.2 without data conversion issues around villages and potentially other things. If you did, those MapLike errors meant something went wrong. This is now resolved. Big thanks to all those that helped, notably @BillyGalbreath and @Proximyst who did large parts of the update process with me. Please as always, backup your worlds and test before updating to 1.16.2! If you update to 1.16.2, there is no going back to an older build than this. --------------------------------- Co-authored-by: William Blake Galbreath <Blake.Galbreath@GMail.com> Co-authored-by: Mariell Hoversholm <proximyst@proximyst.com> Co-authored-by: krolik-exe <69214078+krolik-exe@users.noreply.github.com> Co-authored-by: BillyGalbreath <BillyGalbreath@users.noreply.github.com> Co-authored-by: stonar96 <minecraft.stonar96@gmail.com> Co-authored-by: Shane Freeder <theboyetronic@gmail.com> Co-authored-by: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Co-authored-by: Riley Park <rileysebastianpark@gmail.com> Co-authored-by: Aurora <21148213+aurorasmiles@users.noreply.github.com> Co-authored-by: Nassim Jahnke <nassim@njahnke.dev> Co-authored-by: commandblockguy <commandblockguy1@gmail.com> Co-authored-by: DigitalRegent <misterwener@gmail.com> Co-authored-by: ishland <ishlandmc@yeah.net>
153 lines
7.5 KiB
Diff
153 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..0000000000000000000000000000000000000000
|
|
--- /dev/null
|
|
+++ b/src/main/java/com/destroystokyo/paper/entity/villager/ReputationConstructor.java
|
|
@@ -0,0 +0,0 @@
|
|
+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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityVillager.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityVillager.java
|
|
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/server/Reputation.java
|
|
+++ b/src/main/java/net/minecraft/server/Reputation.java
|
|
@@ -0,0 +0,0 @@ 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() {}
|
|
|
|
@@ -0,0 +0,0 @@ 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();
|
|
}
|
|
|
|
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
|
|
@@ -0,0 +0,0 @@
|
|
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;
|
|
@@ -0,0 +0,0 @@ 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
|
|
}
|