9147456fc9
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing CraftBukkit Changes: ab8ace685 SPIGOT-7236: Bone meal doesn't increase use statistic 7dcb59b8e Avoid switch on material in previous commit Spigot Changes: 19641c75 SPIGOT-7235: World.Spigot#strikeLightningEffect doesn't do anything
245 Zeilen
11 KiB
Diff
245 Zeilen
11 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: syldium <syldium@mailo.com>
|
|
Date: Fri, 9 Jul 2021 18:50:40 +0200
|
|
Subject: [PATCH] Add more advancement API
|
|
|
|
Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
|
|
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..b9c24b8d83b96d8c66cdf879650027f40eafb274
|
|
--- /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.constructDisplayComponent(null, this.handle));
|
|
+ }
|
|
+
|
|
+ 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/Advancement.java b/src/main/java/net/minecraft/advancements/Advancement.java
|
|
index 2c01231dcfbb992c9d2f034fcfd4af52fe8ac265..dd4409790524293be07483f00df05d8a8743e3d9 100644
|
|
--- a/src/main/java/net/minecraft/advancements/Advancement.java
|
|
+++ b/src/main/java/net/minecraft/advancements/Advancement.java
|
|
@@ -53,8 +53,16 @@ public class Advancement {
|
|
parent.addChild(this);
|
|
}
|
|
|
|
- if (display == null) {
|
|
- this.chatComponent = Component.literal(id.toString());
|
|
+ // Paper start - moved to static method
|
|
+ this.chatComponent = constructDisplayComponent(this.id, this.display);
|
|
+ }
|
|
+
|
|
+ public static Component constructDisplayComponent(final @Nullable ResourceLocation id, final @Nullable DisplayInfo display) {
|
|
+ if (id == null && display == null) {
|
|
+ throw new IllegalArgumentException("can't both be null");
|
|
+ } else if (display == null) {
|
|
+ return Component.literal(id.toString());
|
|
+ // Paper end
|
|
} else {
|
|
Component ichatbasecomponent = display.getTitle();
|
|
ChatFormatting enumchatformat = display.getFrame().getChatColor();
|
|
@@ -63,7 +71,7 @@ public class Advancement {
|
|
return chatmodifier.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, ichatmutablecomponent));
|
|
});
|
|
|
|
- this.chatComponent = ComponentUtils.wrapInSquareBrackets(ichatmutablecomponent1).withStyle(enumchatformat);
|
|
+ return ComponentUtils.wrapInSquareBrackets(ichatmutablecomponent1).withStyle(enumchatformat); // Paper
|
|
}
|
|
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/advancements/DisplayInfo.java b/src/main/java/net/minecraft/advancements/DisplayInfo.java
|
|
index 2e9e8b1f391a223cfb0fed9a100ae78004ad2f48..7909ba26bb7a883c74eda1ffd2d3e2bad286bc8b 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..1435251a4fb721b800e6a1f07b50c5f743e04081 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java
|
|
@@ -29,12 +29,43 @@ 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;
|
|
+ }
|
|
+
|
|
+ @Deprecated @io.papermc.paper.annotation.DoNotUse
|
|
+ public AdvancementDisplay getDisplay0() { // May be called by plugins via Commodore
|
|
+ return this.handle.getDisplay() == null ? null : new CraftAdvancementDisplay(this.handle.getDisplay());
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public net.kyori.adventure.text.Component displayName() {
|
|
+ return io.papermc.paper.adventure.PaperAdventure.asAdventure(Advancement.constructDisplayComponent(this.handle.getId(), this.handle.getDisplay()));
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public org.bukkit.advancement.Advancement getParent() {
|
|
+ return this.handle.getParent() == null ? null : this.handle.getParent().bukkit;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public Collection<org.bukkit.advancement.Advancement> getChildren() {
|
|
+ final var children = com.google.common.collect.ImmutableList.<org.bukkit.advancement.Advancement>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/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 0ef20dc6a43dc973183854a638d5f9f770583ec1..d7c1077f2eb2846a17a5872f01ebb8aabf0cb181 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
|
|
@@ -54,6 +54,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()
|
|
{
|
|
@@ -437,6 +438,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));
|
|
+ }
|
|
+ }
|
|
+}
|