aboutsummaryrefslogtreecommitdiffhomepage
path: root/paper-server/patches/unapplied/net/minecraft/server/PlayerAdvancements.java.patch
diff options
context:
space:
mode:
Diffstat (limited to 'paper-server/patches/unapplied/net/minecraft/server/PlayerAdvancements.java.patch')
-rw-r--r--paper-server/patches/unapplied/net/minecraft/server/PlayerAdvancements.java.patch69
1 files changed, 69 insertions, 0 deletions
diff --git a/paper-server/patches/unapplied/net/minecraft/server/PlayerAdvancements.java.patch b/paper-server/patches/unapplied/net/minecraft/server/PlayerAdvancements.java.patch
new file mode 100644
index 0000000000..93d25149bd
--- /dev/null
+++ b/paper-server/patches/unapplied/net/minecraft/server/PlayerAdvancements.java.patch
@@ -0,0 +1,69 @@
+--- a/net/minecraft/server/PlayerAdvancements.java
++++ b/net/minecraft/server/PlayerAdvancements.java
+@@ -50,7 +50,7 @@
+ public class PlayerAdvancements {
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+- private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting().create();
++ private static final Gson GSON = (new GsonBuilder()).create(); // Paper - Remove pretty printing from advancements
+ private final PlayerList playerList;
+ private final Path playerSavePath;
+ private AdvancementTree tree;
+@@ -63,6 +63,7 @@
+ private AdvancementHolder lastSelectedTab;
+ private boolean isFirstPacket = true;
+ private final Codec<PlayerAdvancements.Data> codec;
++ public final Map<net.minecraft.advancements.critereon.SimpleCriterionTrigger<?>, Set<CriterionTrigger.Listener<?>>> criterionData = new java.util.IdentityHashMap<>(); // Paper - fix advancement data player leakage
+
+ public PlayerAdvancements(DataFixer dataFixer, PlayerList playerManager, ServerAdvancementManager advancementLoader, Path filePath, ServerPlayer owner) {
+ this.playerList = playerManager;
+@@ -162,6 +163,7 @@
+ }
+
+ public void save() {
++ if (org.spigotmc.SpigotConfig.disableAdvancementSaving) return; // Spigot
+ JsonElement jsonelement = (JsonElement) this.codec.encodeStart(JsonOps.INSTANCE, this.asData()).getOrThrow();
+
+ try {
+@@ -196,6 +198,7 @@
+ AdvancementHolder advancementholder = loader.get(minecraftkey);
+
+ if (advancementholder == null) {
++ if (!minecraftkey.getNamespace().equals("minecraft")) return; // CraftBukkit
+ PlayerAdvancements.LOGGER.warn("Ignored advancement '{}' in progress file {} - it doesn't exist anymore?", minecraftkey, this.playerSavePath);
+ } else {
+ this.startProgress(advancementholder, advancementprogress);
+@@ -223,14 +226,31 @@
+ boolean flag1 = advancementprogress.isDone();
+
+ if (advancementprogress.grantProgress(criterionName)) {
++ // Paper start - Add PlayerAdvancementCriterionGrantEvent
++ if (!new com.destroystokyo.paper.event.player.PlayerAdvancementCriterionGrantEvent(this.player.getBukkitEntity(), advancement.toBukkit(), criterionName).callEvent()) {
++ advancementprogress.revokeProgress(criterionName);
++ return false;
++ }
++ // Paper end - Add PlayerAdvancementCriterionGrantEvent
+ this.unregisterListeners(advancement);
+ this.progressChanged.add(advancement);
+ flag = true;
+ if (!flag1 && advancementprogress.isDone()) {
++ // Paper start - Add Adventure message to PlayerAdvancementDoneEvent
++ final net.kyori.adventure.text.Component message = advancement.value().display().flatMap(info -> {
++ return java.util.Optional.ofNullable(
++ info.shouldAnnounceChat() ? io.papermc.paper.adventure.PaperAdventure.asAdventure(info.getType().createAnnouncement(advancement, this.player)) : null
++ );
++ }).orElse(null);
++ final org.bukkit.event.player.PlayerAdvancementDoneEvent event = new org.bukkit.event.player.PlayerAdvancementDoneEvent(this.player.getBukkitEntity(), advancement.toBukkit(), message);
++ this.player.level().getCraftServer().getPluginManager().callEvent(event); // CraftBukkit
++ // Paper end
+ advancement.value().rewards().grant(this.player);
+ advancement.value().display().ifPresent((advancementdisplay) -> {
+- if (advancementdisplay.shouldAnnounceChat() && this.player.serverLevel().getGameRules().getBoolean(GameRules.RULE_ANNOUNCE_ADVANCEMENTS)) {
+- this.playerList.broadcastSystemMessage(advancementdisplay.getType().createAnnouncement(advancement, this.player), false);
++ // Paper start - Add Adventure message to PlayerAdvancementDoneEvent
++ if (event.message() != null && this.player.serverLevel().getGameRules().getBoolean(GameRules.RULE_ANNOUNCE_ADVANCEMENTS)) {
++ this.playerList.broadcastSystemMessage(io.papermc.paper.adventure.PaperAdventure.asVanilla(event.message()), false);
++ // Paper end
+ }
+
+ });