From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: syldium Date: Fri, 9 Jul 2021 18:50:40 +0200 Subject: [PATCH] Add advancement display API diff --git a/src/main/java/io/papermc/paper/advancement/PaperAdvancementDisplay.java b/src/main/java/io/papermc/paper/advancement/PaperAdvancementDisplay.java new file mode 100644 index 0000000000000000000000000000000000000000..0567e500c40d3d424ddc19062c4f6da902e8586e --- /dev/null +++ b/src/main/java/io/papermc/paper/advancement/PaperAdvancementDisplay.java @@ -0,0 +1,63 @@ +package io.papermc.paper.advancement; + +import io.papermc.paper.adventure.PaperAdventure; +import net.kyori.adventure.text.Component; +import net.minecraft.advancements.DisplayInfo; +import net.minecraft.advancements.FrameType; +import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public record PaperAdvancementDisplay(DisplayInfo handle) implements AdvancementDisplay { + + @Override + public @NotNull Frame frame() { + return asPaperFrame(this.handle.getFrame()); + } + + @Override + public @NotNull Component title() { + return PaperAdventure.asAdventure(this.handle.getTitle()); + } + + @Override + public @NotNull Component description() { + return PaperAdventure.asAdventure(this.handle.getDescription()); + } + + @Override + public @NotNull ItemStack icon() { + return CraftItemStack.asBukkitCopy(this.handle.getIcon()); + } + + @Override + public boolean doesShowToast() { + return this.handle.shouldShowToast(); + } + + @Override + public boolean doesAnnounceToChat() { + return this.handle.shouldAnnounceChat(); + } + + @Override + public boolean isHidden() { + return this.handle.isHidden(); + } + + @Override + public @Nullable NamespacedKey backgroundPath() { + return this.handle.getBackground() == null ? null : CraftNamespacedKey.fromMinecraft(this.handle.getBackground()); + } + + public static @NotNull Frame asPaperFrame(@NotNull FrameType frameType) { + return switch (frameType) { + case TASK -> Frame.TASK; + case CHALLENGE -> Frame.CHALLENGE; + case GOAL -> Frame.GOAL; + }; + } +} diff --git a/src/main/java/net/minecraft/advancements/DisplayInfo.java b/src/main/java/net/minecraft/advancements/DisplayInfo.java index dea17bc7a6e4db470afaaad3c98940297a50e4e4..0b78ccceb55a1c0fa1f27f9ff1e303396c8f447d 100644 --- a/src/main/java/net/minecraft/advancements/DisplayInfo.java +++ b/src/main/java/net/minecraft/advancements/DisplayInfo.java @@ -27,6 +27,7 @@ public class DisplayInfo { private final boolean hidden; private float x; private float y; + public final io.papermc.paper.advancement.AdvancementDisplay paper = new io.papermc.paper.advancement.PaperAdvancementDisplay(this); // Paper public DisplayInfo(ItemStack icon, Component title, Component description, @Nullable ResourceLocation background, FrameType frame, boolean showToast, boolean announceToChat, boolean hidden) { this.title = title; diff --git a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java index 20d51358b4b47cbf43c3d172765243e96aa1966c..fd42cf61699337acde751249131c016555fd1ea5 100644 --- a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java +++ b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java @@ -27,4 +27,33 @@ public class CraftAdvancement implements org.bukkit.advancement.Advancement { public Collection getCriteria() { return Collections.unmodifiableCollection(this.handle.getCriteria().keySet()); } + // Paper start + @Override + public io.papermc.paper.advancement.AdvancementDisplay getDisplay() { + return this.handle.getDisplay() == null ? null : this.handle.getDisplay().paper; + } + + @Override + public org.bukkit.advancement.Advancement getParent() { + return this.handle.getParent() == null ? null : this.handle.getParent().bukkit; + } + + @Override + public Collection getChildren() { + final var children = com.google.common.collect.ImmutableList.builder(); + for (Advancement advancement : this.handle.getChildren()) { + children.add(advancement.bukkit); + } + return children.build(); + } + + @Override + public org.bukkit.advancement.Advancement getRoot() { + Advancement advancement = this.handle; + while (advancement.getParent() != null) { + advancement = advancement.getParent(); + } + return advancement.bukkit; + } + // Paper end } diff --git a/src/test/java/io/papermc/paper/advancement/AdvancementFrameTest.java b/src/test/java/io/papermc/paper/advancement/AdvancementFrameTest.java new file mode 100644 index 0000000000000000000000000000000000000000..520801e294a33ae62d9aa24dc0247591e379311d --- /dev/null +++ b/src/test/java/io/papermc/paper/advancement/AdvancementFrameTest.java @@ -0,0 +1,24 @@ +package io.papermc.paper.advancement; + +import io.papermc.paper.adventure.PaperAdventure; +import net.kyori.adventure.text.format.TextColor; +import net.minecraft.advancements.FrameType; +import net.minecraft.network.chat.TranslatableComponent; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class AdvancementFrameTest { + + @Test + public void test() { + for (FrameType nmsFrameType : FrameType.values()) { + final TextColor expectedColor = PaperAdventure.asAdventure(nmsFrameType.getChatColor()); + final String expectedTranslationKey = ((TranslatableComponent) nmsFrameType.getDisplayName()).getKey(); + final var frame = PaperAdvancementDisplay.asPaperFrame(nmsFrameType); + assertEquals("The translation keys should be the same", expectedTranslationKey, frame.translationKey()); + assertEquals("The frame colors should be the same", expectedColor, frame.color()); + assertEquals(nmsFrameType.getName(), AdvancementDisplay.Frame.NAMES.key(frame)); + } + } +}