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 db939a754e9308ad68f1b09a970f7a1b00a673bf..538f19f15b553d14ad95f09b1c81359f4c68b17f 100644 --- a/src/main/java/net/minecraft/advancements/DisplayInfo.java +++ b/src/main/java/net/minecraft/advancements/DisplayInfo.java @@ -28,6 +28,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 c47cae84f3b6970247d78382f48ae8ddbc202b59..0a46eeefa7d704350321828166f0049d497e3e41 100644 --- a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java +++ b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java @@ -29,12 +29,33 @@ public class CraftAdvancement implements org.bukkit.advancement.Advancement { return Collections.unmodifiableCollection(this.handle.getCriteria().keySet()); } + // Paper start @Override - public AdvancementDisplay getDisplay() { - if (this.handle.getDisplay() == null) { - return null; + 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(); + } - return new CraftAdvancementDisplay(this.handle.getDisplay()); + @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)); + } + } +}