aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0664-Add-more-advancement-API.patch
diff options
context:
space:
mode:
authorSpottedleaf <[email protected]>2023-09-23 22:10:40 -0700
committerSpottedleaf <[email protected]>2023-09-23 22:31:42 -0700
commit84556f3cdae93799d34df9b9ad495fe59061b060 (patch)
treed78ff563dc71f3427eb486cf966edb7fbf40fcf0 /patches/server/0664-Add-more-advancement-API.patch
parent38dc3b25d8d7ff5a14fbcc70ef16541ed396db4f (diff)
downloadPaper-84556f3cdae93799d34df9b9ad495fe59061b060.tar.gz
Paper-84556f3cdae93799d34df9b9ad495fe59061b060.zip
Add lag compensation for breaking blocks
Diffstat (limited to 'patches/server/0664-Add-more-advancement-API.patch')
-rw-r--r--patches/server/0664-Add-more-advancement-API.patch219
1 files changed, 219 insertions, 0 deletions
diff --git a/patches/server/0664-Add-more-advancement-API.patch b/patches/server/0664-Add-more-advancement-API.patch
new file mode 100644
index 0000000000..1d9f8d9a4a
--- /dev/null
+++ b/patches/server/0664-Add-more-advancement-API.patch
@@ -0,0 +1,219 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: syldium <[email protected]>
+Date: Fri, 9 Jul 2021 18:50:40 +0200
+Subject: [PATCH] Add more advancement API
+
+== AT ==
+public net.minecraft.advancements.Advancement decorateName(Lnet/minecraft/advancements/DisplayInfo;)Lnet/minecraft/network/chat/Component;
+
+Co-authored-by: Jake Potrebic <[email protected]>
+
+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..1705f65d897114dd0813f6d366124cefafcb450e
+--- /dev/null
++++ b/src/main/java/io/papermc/paper/advancement/PaperAdvancementDisplay.java
+@@ -0,0 +1,69 @@
++package io.papermc.paper.advancement;
++
++import io.papermc.paper.adventure.PaperAdventure;
++import net.kyori.adventure.text.Component;
++import net.minecraft.advancements.Advancement;
++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());
++ }
++
++ @Override
++ public @NotNull Component displayName() {
++ return PaperAdventure.asAdventure(Advancement.decorateName(java.util.Objects.requireNonNull(this.handle, "cannot build display name for null handle, invalid state")));
++ }
++
++ 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 a6ea13198a2de14d57472681b5a2b30baf3c4280..11b26d14b863075d776884544629cdd23f219298 100644
+--- a/src/main/java/net/minecraft/advancements/DisplayInfo.java
++++ b/src/main/java/net/minecraft/advancements/DisplayInfo.java
+@@ -29,6 +29,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 52baf818579a6841b77ff80e42f4f1b9f635ea08..bd640e0d8d796ee114ff787def7e07edbeffc0a5 100644
+--- a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java
++++ b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java
+@@ -29,12 +29,47 @@ public class CraftAdvancement implements org.bukkit.advancement.Advancement {
+ return Collections.unmodifiableCollection(this.handle.value().criteria().keySet());
+ }
+
++ // Paper start
+ @Override
+- public AdvancementDisplay getDisplay() {
+- if (this.handle.value().display().isEmpty()) {
+- return null;
++ public io.papermc.paper.advancement.AdvancementDisplay getDisplay() {
++ return this.handle.value().display().map(d -> d.paper).orElse(null);
++ }
++
++ @Deprecated
++ @io.papermc.paper.annotation.DoNotUse
++ public AdvancementDisplay getDisplay0() { // May be called by plugins via Commodore
++ return this.handle.value().display().map(CraftAdvancementDisplay::new).orElse(null);
++ }
++
++ @Override
++ public net.kyori.adventure.text.Component displayName() {
++ return io.papermc.paper.adventure.PaperAdventure.asAdventure(net.minecraft.advancements.Advancement.name(this.handle));
++ }
++
++ @Override
++ public org.bukkit.advancement.Advancement getParent() {
++ return this.handle.value().parent()
++ .map(net.minecraft.server.MinecraftServer.getServer().getAdvancements()::get)
++ .map(AdvancementHolder::toBukkit)
++ .orElse(null);
++ }
++
++ @Override
++ public Collection<org.bukkit.advancement.Advancement> getChildren() {
++ final com.google.common.collect.ImmutableList.Builder<org.bukkit.advancement.Advancement> children = com.google.common.collect.ImmutableList.<org.bukkit.advancement.Advancement>builder();
++ final net.minecraft.advancements.AdvancementNode advancementNode = net.minecraft.server.MinecraftServer.getServer().getAdvancements().tree().get(this.handle);
++ if (advancementNode != null) {
++ for (final net.minecraft.advancements.AdvancementNode child : advancementNode.children()) {
++ children.add(child.holder().toBukkit());
++ }
+ }
++ return children.build();
++ }
+
+- return new CraftAdvancementDisplay(this.handle.value().display().get());
++ @Override
++ public org.bukkit.advancement.Advancement getRoot() {
++ final net.minecraft.advancements.AdvancementNode advancementNode = net.minecraft.server.MinecraftServer.getServer().getAdvancements().tree().get(this.handle);
++ return java.util.Objects.requireNonNull(advancementNode, "could not find internal advancement node for advancement " + this.handle.id()).root().holder().toBukkit();
+ }
++ // Paper end
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementDisplay.java b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementDisplay.java
+index 4aa8cda2bf72627b153e636a408fb3971caf2309..e29d7c6e1cef10a76c8630855fada11cee583d30 100644
+--- a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementDisplay.java
++++ b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementDisplay.java
+@@ -6,6 +6,7 @@ import org.bukkit.craftbukkit.inventory.CraftItemStack;
+ import org.bukkit.craftbukkit.util.CraftChatMessage;
+ import org.bukkit.inventory.ItemStack;
+
++@Deprecated // Paper
+ public class CraftAdvancementDisplay implements org.bukkit.advancement.AdvancementDisplay {
+
+ private final DisplayInfo handle;
+diff --git a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
+index 313cd180cbad5727433daae4c15ffa4e1e948eaa..8f8b14cb845bf1ba28276b3e3c0d8f8c56106c7d 100644
+--- a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
++++ b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
+@@ -56,6 +56,7 @@ public class Commodore
+ ) );
+
+ // Paper start - Plugin rewrites
++ private static final String CB_PACKAGE = org.bukkit.Bukkit.getServer().getClass().getPackageName().replace('.', '/');
+ private static final Map<String, String> SEARCH_AND_REMOVE = initReplacementsMap();
+ private static Map<String, String> initReplacementsMap()
+ {
+@@ -454,6 +455,11 @@ public class Commodore
+ super.visitMethodInsn(opcode, owner, name, "()Lcom/destroystokyo/paper/profile/PlayerProfile;", itf);
+ return;
+ }
++ if (owner.equals("org/bukkit/advancement/Advancement") && name.equals("getDisplay") && desc.endsWith(")Lorg/bukkit/advancement/AdvancementDisplay;")) {
++ super.visitTypeInsn(Opcodes.CHECKCAST, CB_PACKAGE + "/advancement/CraftAdvancement");
++ super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, CB_PACKAGE + "/advancement/CraftAdvancement", "getDisplay0", desc, false);
++ return;
++ }
+ // Paper end
+ if ( modern )
+ {
+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..4d043e0e43ef8bb75788e195f95b5a50a51a2a48
+--- /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.contents.TranslatableContents;
++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 = ((TranslatableContents) nmsFrameType.getDisplayName().getContents()).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));
++ }
++ }
++}