mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-31 00:20:44 +01:00
38be4f873b
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 Bukkit Changes: 2c64d8c4 SPIGOT-7309: Add API for jukebox inventories a6d7e4ca PR-826: Add Sniffer API CraftBukkit Changes: 93813509b SPIGOT-7309: Add API for jukebox inventories 2d5209e8d PR-1153: Handle teleport reason in spreadplayers command f5b61387e SPIGOT-7308: Fix NullPointerException when calling Jukebox#setRecord() 388d458a6 SPIGOT-7306: Fix reset of coords in default teleportTo in EntityPlayer 40b87e1af PR-1150: Add Sniffer API and handle EntityItemDropEvent Spigot Changes: 6ad4b93c SPIGOT-7298: Fix debug stick always permission left click toggle
4776 lines
197 KiB
Diff
4776 lines
197 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Riley Park <rileysebastianpark@gmail.com>
|
|
Date: Fri, 29 Jan 2021 17:21:55 +0100
|
|
Subject: [PATCH] Adventure
|
|
|
|
Co-authored-by: zml <zml@stellardrift.ca>
|
|
Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
|
|
diff --git a/build.gradle.kts b/build.gradle.kts
|
|
index 464a209dbf52ebdfa287a553778a37c382a5405c..b7aa72ae9a8b1f39e7bb355d4c6b3bf4bfaa030b 100644
|
|
--- a/build.gradle.kts
|
|
+++ b/build.gradle.kts
|
|
@@ -8,11 +8,24 @@ java {
|
|
withJavadocJar()
|
|
}
|
|
|
|
+val adventureVersion = "4.13.0"
|
|
+val apiAndDocs: Configuration by configurations.creating {
|
|
+ attributes {
|
|
+ attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION))
|
|
+ attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL))
|
|
+ attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType.SOURCES))
|
|
+ attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME))
|
|
+ }
|
|
+}
|
|
+configurations.api {
|
|
+ extendsFrom(apiAndDocs)
|
|
+}
|
|
+
|
|
dependencies {
|
|
// api dependencies are listed transitively to API consumers
|
|
api("com.google.guava:guava:31.1-jre")
|
|
api("com.google.code.gson:gson:2.10")
|
|
- api("net.md-5:bungeecord-chat:1.16-R0.4")
|
|
+ api("net.md-5:bungeecord-chat:1.16-R0.4-deprecated+build.9") // Paper
|
|
api("org.yaml:snakeyaml:1.33")
|
|
api("org.joml:joml:1.10.5")
|
|
// Paper start
|
|
@@ -20,6 +33,13 @@ dependencies {
|
|
isTransitive = false // includes junit
|
|
}
|
|
api("it.unimi.dsi:fastutil:8.5.6")
|
|
+ apiAndDocs(platform("net.kyori:adventure-bom:$adventureVersion"))
|
|
+ apiAndDocs("net.kyori:adventure-api")
|
|
+ apiAndDocs("net.kyori:adventure-text-minimessage")
|
|
+ apiAndDocs("net.kyori:adventure-text-serializer-gson")
|
|
+ apiAndDocs("net.kyori:adventure-text-serializer-legacy")
|
|
+ apiAndDocs("net.kyori:adventure-text-serializer-plain")
|
|
+ apiAndDocs("net.kyori:adventure-text-logger-slf4j")
|
|
// Paper end
|
|
|
|
compileOnly("org.apache.maven:maven-resolver-provider:3.8.5")
|
|
@@ -80,9 +100,24 @@ tasks.withType<Javadoc> {
|
|
"https://guava.dev/releases/31.0.1-jre/api/docs/",
|
|
"https://javadoc.io/doc/org.yaml/snakeyaml/1.33/",
|
|
"https://javadoc.io/doc/org.jetbrains/annotations/23.0.0/", // Paper - we don't want Java 5 annotations
|
|
- "https://javadoc.io/doc/net.md-5/bungeecord-chat/1.16-R0.4/",
|
|
+ // Paper start
|
|
+ //"https://javadoc.io/doc/net.md-5/bungeecord-chat/1.16-R0.4/", // don't link to bungee chat
|
|
+ "https://jd.advntr.dev/api/$adventureVersion/",
|
|
+ "https://jd.advntr.dev/text-minimessage/$adventureVersion/",
|
|
+ "https://jd.advntr.dev/text-serializer-gson/$adventureVersion/",
|
|
+ "https://jd.advntr.dev/text-serializer-legacy/$adventureVersion/",
|
|
+ "https://jd.advntr.dev/text-serializer-plain/$adventureVersion/",
|
|
+ // Paper end
|
|
)
|
|
|
|
+ inputs.files(apiAndDocs).ignoreEmptyDirectories().withPropertyName(apiAndDocs.name + "-configuration")
|
|
+ doFirst {
|
|
+ options.addStringOption(
|
|
+ "sourcepath",
|
|
+ apiAndDocs.resolvedConfiguration.files.joinToString(separator = File.pathSeparator, transform = File::getPath)
|
|
+ )
|
|
+ }
|
|
+
|
|
// workaround for https://github.com/gradle/gradle/issues/4046
|
|
inputs.dir("src/main/javadoc").withPropertyName("javadoc-sourceset")
|
|
doLast {
|
|
diff --git a/src/main/java/io/papermc/paper/chat/ChatRenderer.java b/src/main/java/io/papermc/paper/chat/ChatRenderer.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..ffe0a921cc1ebbb95104f22b57e0e3af85e287a6
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/chat/ChatRenderer.java
|
|
@@ -0,0 +1,71 @@
|
|
+package io.papermc.paper.chat;
|
|
+
|
|
+import net.kyori.adventure.audience.Audience;
|
|
+import net.kyori.adventure.text.Component;
|
|
+import org.bukkit.entity.Player;
|
|
+import org.jetbrains.annotations.ApiStatus;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+
|
|
+/**
|
|
+ * A chat renderer is responsible for rendering chat messages sent by {@link Player}s to the server.
|
|
+ */
|
|
+@FunctionalInterface
|
|
+public interface ChatRenderer {
|
|
+ /**
|
|
+ * Renders a chat message. This will be called once for each receiving {@link Audience}.
|
|
+ *
|
|
+ * @param source the message source
|
|
+ * @param sourceDisplayName the display name of the source player
|
|
+ * @param message the chat message
|
|
+ * @param viewer the receiving {@link Audience}
|
|
+ * @return a rendered chat message
|
|
+ */
|
|
+ @ApiStatus.OverrideOnly
|
|
+ @NotNull
|
|
+ Component render(@NotNull Player source, @NotNull Component sourceDisplayName, @NotNull Component message, @NotNull Audience viewer);
|
|
+
|
|
+ /**
|
|
+ * Create a new instance of the default {@link ChatRenderer}.
|
|
+ *
|
|
+ * @return a new {@link ChatRenderer}
|
|
+ */
|
|
+ @NotNull
|
|
+ static ChatRenderer defaultRenderer() {
|
|
+ return new ViewerUnawareImpl.Default((source, sourceDisplayName, message) -> Component.translatable("chat.type.text", sourceDisplayName, message));
|
|
+ }
|
|
+
|
|
+ @ApiStatus.Internal
|
|
+ sealed interface Default extends ChatRenderer, ViewerUnaware permits ViewerUnawareImpl.Default {
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Creates a new viewer-unaware {@link ChatRenderer}, which will render the chat message a single time,
|
|
+ * displaying the same rendered message to every viewing {@link Audience}.
|
|
+ *
|
|
+ * @param renderer the viewer unaware renderer
|
|
+ * @return a new {@link ChatRenderer}
|
|
+ */
|
|
+ @NotNull
|
|
+ static ChatRenderer viewerUnaware(final @NotNull ViewerUnaware renderer) {
|
|
+ return new ViewerUnawareImpl(renderer);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Similar to {@link ChatRenderer}, but without knowledge of the message viewer.
|
|
+ *
|
|
+ * @see ChatRenderer#viewerUnaware(ViewerUnaware)
|
|
+ */
|
|
+ interface ViewerUnaware {
|
|
+ /**
|
|
+ * Renders a chat message.
|
|
+ *
|
|
+ * @param source the message source
|
|
+ * @param sourceDisplayName the display name of the source player
|
|
+ * @param message the chat message
|
|
+ * @return a rendered chat message
|
|
+ */
|
|
+ @ApiStatus.OverrideOnly
|
|
+ @NotNull
|
|
+ Component render(@NotNull Player source, @NotNull Component sourceDisplayName, @NotNull Component message);
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/io/papermc/paper/chat/ViewerUnawareImpl.java b/src/main/java/io/papermc/paper/chat/ViewerUnawareImpl.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..2ad76b1751ba707f7ae0d283aa1cbaf6c9619da9
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/chat/ViewerUnawareImpl.java
|
|
@@ -0,0 +1,35 @@
|
|
+package io.papermc.paper.chat;
|
|
+
|
|
+import net.kyori.adventure.audience.Audience;
|
|
+import net.kyori.adventure.text.Component;
|
|
+import org.bukkit.entity.Player;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+import org.jetbrains.annotations.Nullable;
|
|
+
|
|
+sealed class ViewerUnawareImpl implements ChatRenderer, ChatRenderer.ViewerUnaware permits ViewerUnawareImpl.Default {
|
|
+ private final ViewerUnaware unaware;
|
|
+ private @Nullable Component message;
|
|
+
|
|
+ ViewerUnawareImpl(final ViewerUnaware unaware) {
|
|
+ this.unaware = unaware;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public @NotNull Component render(final @NotNull Player source, final @NotNull Component sourceDisplayName, final @NotNull Component message, final @NotNull Audience viewer) {
|
|
+ return this.render(source, sourceDisplayName, message);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public @NotNull Component render(final @NotNull Player source, final @NotNull Component sourceDisplayName, final @NotNull Component message) {
|
|
+ if (this.message == null) {
|
|
+ this.message = this.unaware.render(source, sourceDisplayName, message);
|
|
+ }
|
|
+ return this.message;
|
|
+ }
|
|
+
|
|
+ static final class Default extends ViewerUnawareImpl implements ChatRenderer.Default {
|
|
+ Default(final ViewerUnaware unaware) {
|
|
+ super(unaware);
|
|
+ }
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/io/papermc/paper/event/player/AbstractChatEvent.java b/src/main/java/io/papermc/paper/event/player/AbstractChatEvent.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..e7e13011c76285681ad420e6f356f6b83045d31a
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/event/player/AbstractChatEvent.java
|
|
@@ -0,0 +1,128 @@
|
|
+package io.papermc.paper.event.player;
|
|
+
|
|
+import io.papermc.paper.chat.ChatRenderer;
|
|
+import net.kyori.adventure.audience.Audience;
|
|
+import net.kyori.adventure.chat.SignedMessage;
|
|
+import net.kyori.adventure.text.Component;
|
|
+import org.bukkit.entity.Player;
|
|
+import org.bukkit.event.Cancellable;
|
|
+import org.bukkit.event.player.PlayerEvent;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+
|
|
+import java.util.Set;
|
|
+
|
|
+import static java.util.Objects.requireNonNull;
|
|
+
|
|
+/**
|
|
+ * An abstract implementation of a chat event, handling shared logic.
|
|
+ */
|
|
+public abstract class AbstractChatEvent extends PlayerEvent implements Cancellable {
|
|
+ private final Set<Audience> viewers;
|
|
+ private final Component originalMessage;
|
|
+ private final SignedMessage signedMessage;
|
|
+ private ChatRenderer renderer;
|
|
+ private Component message;
|
|
+ private boolean cancelled = false;
|
|
+
|
|
+ AbstractChatEvent(final boolean async, final @NotNull Player player, final @NotNull Set<Audience> viewers, final @NotNull ChatRenderer renderer, final @NotNull Component message, final @NotNull Component originalMessage, final @NotNull SignedMessage signedMessage) {
|
|
+ super(player, async);
|
|
+ this.viewers = viewers;
|
|
+ this.renderer = renderer;
|
|
+ this.message = message;
|
|
+ this.originalMessage = originalMessage;
|
|
+ this.signedMessage = signedMessage;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets a set of {@link Audience audiences} that this chat message will be displayed to.
|
|
+ *
|
|
+ * <p>The set returned is not guaranteed to be mutable and may auto-populate
|
|
+ * on access. Any listener accessing the returned set should be aware that
|
|
+ * it may reduce performance for a lazy set implementation.</p>
|
|
+ *
|
|
+ * <p>Listeners should be aware that modifying the list may throw {@link
|
|
+ * UnsupportedOperationException} if the event caller provides an
|
|
+ * unmodifiable set.</p>
|
|
+ *
|
|
+ * @return a set of {@link Audience audiences} who will receive the chat message
|
|
+ */
|
|
+ @NotNull
|
|
+ public final Set<Audience> viewers() {
|
|
+ return this.viewers;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the chat renderer.
|
|
+ *
|
|
+ * @param renderer the chat renderer
|
|
+ * @throws NullPointerException if {@code renderer} is {@code null}
|
|
+ */
|
|
+ public final void renderer(final @NotNull ChatRenderer renderer) {
|
|
+ this.renderer = requireNonNull(renderer, "renderer");
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the chat renderer.
|
|
+ *
|
|
+ * @return the chat renderer
|
|
+ */
|
|
+ @NotNull
|
|
+ public final ChatRenderer renderer() {
|
|
+ return this.renderer;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the user-supplied message.
|
|
+ * The return value will reflect changes made using {@link #message(Component)}.
|
|
+ *
|
|
+ * @return the user-supplied message
|
|
+ */
|
|
+ @NotNull
|
|
+ public final Component message() {
|
|
+ return this.message;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the user-supplied message.
|
|
+ *
|
|
+ * @param message the user-supplied message
|
|
+ * @throws NullPointerException if {@code message} is {@code null}
|
|
+ */
|
|
+ public final void message(final @NotNull Component message) {
|
|
+ this.message = requireNonNull(message, "message");
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the original and unmodified user-supplied message.
|
|
+ * The return value will <b>not</b> reflect changes made using
|
|
+ * {@link #message(Component)}.
|
|
+ *
|
|
+ * @return the original user-supplied message
|
|
+ */
|
|
+ @NotNull
|
|
+ public final Component originalMessage() {
|
|
+ return this.originalMessage;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the signed message.
|
|
+ * Changes made in this event will <b>not</b> update
|
|
+ * the signed message.
|
|
+ *
|
|
+ * @return the signed message
|
|
+ */
|
|
+ @NotNull
|
|
+ public final SignedMessage signedMessage() {
|
|
+ return this.signedMessage;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public final boolean isCancelled() {
|
|
+ return this.cancelled;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public final void setCancelled(final boolean cancelled) {
|
|
+ this.cancelled = cancelled;
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/io/papermc/paper/event/player/AsyncChatCommandDecorateEvent.java b/src/main/java/io/papermc/paper/event/player/AsyncChatCommandDecorateEvent.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..feece00981ebf932e64760e7a10a04ad080d0228
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/event/player/AsyncChatCommandDecorateEvent.java
|
|
@@ -0,0 +1,28 @@
|
|
+package io.papermc.paper.event.player;
|
|
+
|
|
+import net.kyori.adventure.text.Component;
|
|
+import org.bukkit.entity.Player;
|
|
+import org.bukkit.event.HandlerList;
|
|
+import org.jetbrains.annotations.ApiStatus;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+import org.jetbrains.annotations.Nullable;
|
|
+
|
|
+@ApiStatus.Experimental
|
|
+public class AsyncChatCommandDecorateEvent extends AsyncChatDecorateEvent {
|
|
+
|
|
+ private static final HandlerList HANDLER_LIST = new HandlerList();
|
|
+
|
|
+ @ApiStatus.Internal
|
|
+ public AsyncChatCommandDecorateEvent(boolean async, @Nullable Player player, @NotNull Component originalMessage, @NotNull Component result) {
|
|
+ super(async, player, originalMessage, result);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public @NotNull HandlerList getHandlers() {
|
|
+ return HANDLER_LIST;
|
|
+ }
|
|
+
|
|
+ public static @NotNull HandlerList getHandlerList() {
|
|
+ return HANDLER_LIST;
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/io/papermc/paper/event/player/AsyncChatDecorateEvent.java b/src/main/java/io/papermc/paper/event/player/AsyncChatDecorateEvent.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..9a962337948810b00ceae1124962fcc7058b70ad
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/event/player/AsyncChatDecorateEvent.java
|
|
@@ -0,0 +1,116 @@
|
|
+package io.papermc.paper.event.player;
|
|
+
|
|
+import net.kyori.adventure.text.Component;
|
|
+import org.bukkit.entity.Player;
|
|
+import org.bukkit.event.Cancellable;
|
|
+import org.bukkit.event.HandlerList;
|
|
+import org.bukkit.event.server.ServerEvent;
|
|
+import org.jetbrains.annotations.ApiStatus;
|
|
+import org.jetbrains.annotations.Contract;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+import org.jetbrains.annotations.Nullable;
|
|
+
|
|
+/**
|
|
+ * This event is fired when the server decorates a component for chat purposes. This is called
|
|
+ * before {@link AsyncChatEvent} and the other chat events. It is recommended that you modify the
|
|
+ * message here, and use the chat events for modifying receivers and later the chat type. If you
|
|
+ * want to keep the message as "signed" for the clients who get it, be sure to include the entire
|
|
+ * original message somewhere in the final message.
|
|
+ * @see AsyncChatCommandDecorateEvent for the decoration of messages sent via commands
|
|
+ */
|
|
+@ApiStatus.Experimental
|
|
+public class AsyncChatDecorateEvent extends ServerEvent implements Cancellable {
|
|
+
|
|
+ private static final HandlerList HANDLER_LIST = new HandlerList();
|
|
+
|
|
+ private final Player player;
|
|
+ private final Component originalMessage;
|
|
+ private Component result;
|
|
+ private boolean cancelled;
|
|
+
|
|
+ @ApiStatus.Internal
|
|
+ public AsyncChatDecorateEvent(final boolean async, final @Nullable Player player, final @NotNull Component originalMessage, final @NotNull Component result) {
|
|
+ super(async);
|
|
+ this.player = player;
|
|
+ this.originalMessage = originalMessage;
|
|
+ this.result = result;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the player (if available) associated with this event.
|
|
+ * <p>
|
|
+ * Certain commands request decorations without a player context
|
|
+ * which is why this is possibly null.
|
|
+ *
|
|
+ * @return the player or null
|
|
+ */
|
|
+ public @Nullable Player player() {
|
|
+ return this.player;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the original decoration input
|
|
+ *
|
|
+ * @return the input
|
|
+ */
|
|
+ public @NotNull Component originalMessage() {
|
|
+ return this.originalMessage;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the decoration result. This may already be different from
|
|
+ * {@link #originalMessage()} if some other listener to this event
|
|
+ * <b>OR</b> the legacy preview event ({@link org.bukkit.event.player.AsyncPlayerChatPreviewEvent}
|
|
+ * changed the result.
|
|
+ *
|
|
+ * @return the result
|
|
+ */
|
|
+ public @NotNull Component result() {
|
|
+ return this.result;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the resulting decorated component.
|
|
+ *
|
|
+ * @param result the result
|
|
+ */
|
|
+ public void result(@NotNull Component result) {
|
|
+ this.result = result;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * If this decorating is part of a preview request/response.
|
|
+ *
|
|
+ * @return true if part of previewing
|
|
+ * @deprecated chat preview was removed in 1.19.3
|
|
+ */
|
|
+ @Deprecated(forRemoval = true)
|
|
+ @Contract(value = "-> false", pure = true)
|
|
+ public boolean isPreview() {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean isCancelled() {
|
|
+ return this.cancelled;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * A cancelled decorating event means that no changes to the result component
|
|
+ * will have any effect. The decorated component will be equal to the original
|
|
+ * component.
|
|
+ */
|
|
+ @Override
|
|
+ public void setCancelled(boolean cancel) {
|
|
+ this.cancelled = cancel;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public @NotNull HandlerList getHandlers() {
|
|
+ return HANDLER_LIST;
|
|
+ }
|
|
+
|
|
+ public static @NotNull HandlerList getHandlerList() {
|
|
+ return HANDLER_LIST;
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/io/papermc/paper/event/player/AsyncChatEvent.java b/src/main/java/io/papermc/paper/event/player/AsyncChatEvent.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..975a767313247d3b1c2a6cfd42c7fa6cd1525c53
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/event/player/AsyncChatEvent.java
|
|
@@ -0,0 +1,32 @@
|
|
+package io.papermc.paper.event.player;
|
|
+
|
|
+import java.util.Set;
|
|
+import io.papermc.paper.chat.ChatRenderer;
|
|
+import net.kyori.adventure.audience.Audience;
|
|
+import net.kyori.adventure.chat.SignedMessage;
|
|
+import net.kyori.adventure.text.Component;
|
|
+import org.bukkit.entity.Player;
|
|
+import org.bukkit.event.HandlerList;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+
|
|
+/**
|
|
+ * An event fired when a {@link Player} sends a chat message to the server.
|
|
+ */
|
|
+public final class AsyncChatEvent extends AbstractChatEvent {
|
|
+ private static final HandlerList HANDLERS = new HandlerList();
|
|
+
|
|
+ public AsyncChatEvent(final boolean async, final @NotNull Player player, final @NotNull Set<Audience> viewers, final @NotNull ChatRenderer renderer, final @NotNull Component message, final @NotNull Component originalMessage, final @NotNull SignedMessage signedMessage) {
|
|
+ super(async, player, viewers, renderer, message, originalMessage, signedMessage);
|
|
+ }
|
|
+
|
|
+ @NotNull
|
|
+ @Override
|
|
+ public HandlerList getHandlers() {
|
|
+ return HANDLERS;
|
|
+ }
|
|
+
|
|
+ @NotNull
|
|
+ public static HandlerList getHandlerList() {
|
|
+ return HANDLERS;
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/io/papermc/paper/event/player/ChatEvent.java b/src/main/java/io/papermc/paper/event/player/ChatEvent.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..46c209f61135c7d37ccfbbc7bb1d74e608fac9d3
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/event/player/ChatEvent.java
|
|
@@ -0,0 +1,37 @@
|
|
+package io.papermc.paper.event.player;
|
|
+
|
|
+import java.util.Set;
|
|
+import io.papermc.paper.chat.ChatRenderer;
|
|
+import net.kyori.adventure.audience.Audience;
|
|
+import net.kyori.adventure.chat.SignedMessage;
|
|
+import net.kyori.adventure.text.Component;
|
|
+import org.bukkit.Warning;
|
|
+import org.bukkit.entity.Player;
|
|
+import org.bukkit.event.HandlerList;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+
|
|
+/**
|
|
+ * An event fired when a {@link Player} sends a chat message to the server.
|
|
+ *
|
|
+ * @deprecated Listening to this event forces chat to wait for the main thread, delaying chat messages. It is recommended to use {@link AsyncChatEvent} instead, wherever possible.
|
|
+ */
|
|
+@Deprecated
|
|
+@Warning(reason = "Listening to this event forces chat to wait for the main thread, delaying chat messages.")
|
|
+public final class ChatEvent extends AbstractChatEvent {
|
|
+ private static final HandlerList HANDLERS = new HandlerList();
|
|
+
|
|
+ public ChatEvent(final @NotNull Player player, final @NotNull Set<Audience> viewers, final @NotNull ChatRenderer renderer, final @NotNull Component message, final @NotNull Component originalMessage, final @NotNull SignedMessage signedMessage) {
|
|
+ super(false, player, viewers, renderer, message, originalMessage, signedMessage);
|
|
+ }
|
|
+
|
|
+ @NotNull
|
|
+ @Override
|
|
+ public HandlerList getHandlers() {
|
|
+ return HANDLERS;
|
|
+ }
|
|
+
|
|
+ @NotNull
|
|
+ public static HandlerList getHandlerList() {
|
|
+ return HANDLERS;
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/io/papermc/paper/text/PaperComponents.java b/src/main/java/io/papermc/paper/text/PaperComponents.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..6e94562d79206d88b74b53814f9423f12a2e6e06
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/text/PaperComponents.java
|
|
@@ -0,0 +1,177 @@
|
|
+package io.papermc.paper.text;
|
|
+
|
|
+import net.kyori.adventure.text.Component;
|
|
+import net.kyori.adventure.text.flattener.ComponentFlattener;
|
|
+import net.kyori.adventure.text.format.NamedTextColor;
|
|
+import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
|
+import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
|
+import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer;
|
|
+import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
|
|
+import org.bukkit.Bukkit;
|
|
+import org.bukkit.command.CommandSender;
|
|
+import org.bukkit.entity.Entity;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+import org.jetbrains.annotations.Nullable;
|
|
+
|
|
+import java.io.IOException;
|
|
+
|
|
+/**
|
|
+ * Paper API-specific methods for working with {@link Component}s and related.
|
|
+ */
|
|
+public final class PaperComponents {
|
|
+ private PaperComponents() {
|
|
+ throw new RuntimeException("PaperComponents is not to be instantiated!");
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Resolves a component with a specific command sender and subject.
|
|
+ * <p>
|
|
+ * Note that in Vanilla, elevated permissions are usually required to use
|
|
+ * '@' selectors in various component types, but this method should not
|
|
+ * check such permissions from the sender.
|
|
+ * <p>
|
|
+ * A {@link CommandSender} argument is required to resolve:
|
|
+ * <ul>
|
|
+ * <li>{@link net.kyori.adventure.text.NBTComponent}</li>
|
|
+ * <li>{@link net.kyori.adventure.text.ScoreComponent}</li>
|
|
+ * <li>{@link net.kyori.adventure.text.SelectorComponent}</li>
|
|
+ * </ul>
|
|
+ * A {@link Entity} argument is optional to help resolve:
|
|
+ * <ul>
|
|
+ * <li>{@link net.kyori.adventure.text.ScoreComponent}</li>
|
|
+ * </ul>
|
|
+ * {@link net.kyori.adventure.text.TranslatableComponent}s don't require any extra arguments.
|
|
+ *
|
|
+ * @param input the component to resolve
|
|
+ * @param context the command sender to resolve with
|
|
+ * @param scoreboardSubject the scoreboard subject to use (for use with {@link net.kyori.adventure.text.ScoreComponent}s)
|
|
+ * @return the resolved component
|
|
+ * @throws IOException if a syntax error tripped during resolving
|
|
+ */
|
|
+ public static @NotNull Component resolveWithContext(@NotNull Component input, @Nullable CommandSender context, @Nullable Entity scoreboardSubject) throws IOException {
|
|
+ return resolveWithContext(input, context, scoreboardSubject, true);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Resolves a component with a specific command sender and subject.
|
|
+ * <p>
|
|
+ * Note that in Vanilla, elevated permissions are required to use
|
|
+ * '@' selectors in various component types. If the boolean {@code bypassPermissions}
|
|
+ * argument is {@code false}, the {@link CommandSender} argument will be used to query
|
|
+ * those permissions.
|
|
+ * <p>
|
|
+ * A {@link CommandSender} argument is required to resolve:
|
|
+ * <ul>
|
|
+ * <li>{@link net.kyori.adventure.text.NBTComponent}</li>
|
|
+ * <li>{@link net.kyori.adventure.text.ScoreComponent}</li>
|
|
+ * <li>{@link net.kyori.adventure.text.SelectorComponent}</li>
|
|
+ * </ul>
|
|
+ * A {@link Entity} argument is optional to help resolve:
|
|
+ * <ul>
|
|
+ * <li>{@link net.kyori.adventure.text.ScoreComponent}</li>
|
|
+ * </ul>
|
|
+ * {@link net.kyori.adventure.text.TranslatableComponent}s don't require any extra arguments.
|
|
+ *
|
|
+ * @param input the component to resolve
|
|
+ * @param context the command sender to resolve with
|
|
+ * @param scoreboardSubject the scoreboard subject to use (for use with {@link net.kyori.adventure.text.ScoreComponent}s)
|
|
+ * @param bypassPermissions true to bypass permissions checks for resolving components
|
|
+ * @return the resolved component
|
|
+ * @throws IOException if a syntax error tripped during resolving
|
|
+ */
|
|
+ public static @NotNull Component resolveWithContext(@NotNull Component input, @Nullable CommandSender context, @Nullable Entity scoreboardSubject, boolean bypassPermissions) throws IOException {
|
|
+ return Bukkit.getUnsafe().resolveWithContext(input, context, scoreboardSubject, bypassPermissions);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Return a component flattener that can use game data to resolve extra information about components.
|
|
+ *
|
|
+ * @return a component flattener
|
|
+ */
|
|
+ public static @NotNull ComponentFlattener flattener() {
|
|
+ return Bukkit.getUnsafe().componentFlattener();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get a serializer for {@link Component}s that will convert components to
|
|
+ * a plain-text string.
|
|
+ *
|
|
+ * <p>Implementations may provide a serializer capable of processing any
|
|
+ * information that requires access to implementation details.</p>
|
|
+ *
|
|
+ * @return a serializer to plain text
|
|
+ * @deprecated will be removed in adventure 5.0.0, use {@link PlainTextComponentSerializer#plainText()}
|
|
+ */
|
|
+ @Deprecated(forRemoval = true)
|
|
+ public static @NotNull PlainComponentSerializer plainSerializer() {
|
|
+ return Bukkit.getUnsafe().plainComponentSerializer();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get a serializer for {@link Component}s that will convert components to
|
|
+ * a plain-text string.
|
|
+ *
|
|
+ * <p>Implementations may provide a serializer capable of processing any
|
|
+ * information that requires access to implementation details.</p>
|
|
+ *
|
|
+ * @return a serializer to plain text
|
|
+ * @deprecated use {@link PlainTextComponentSerializer#plainText()}
|
|
+ */
|
|
+ @Deprecated(forRemoval = true)
|
|
+ public static @NotNull PlainTextComponentSerializer plainTextSerializer() {
|
|
+ return Bukkit.getUnsafe().plainTextSerializer();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get a serializer for {@link Component}s that will convert to and from the
|
|
+ * standard JSON serialization format using Gson.
|
|
+ *
|
|
+ * <p>Implementations may provide a serializer capable of processing any
|
|
+ * information that requires implementation details, such as legacy
|
|
+ * (pre-1.16) hover events.</p>
|
|
+ *
|
|
+ * @return a json component serializer
|
|
+ * @deprecated use {@link GsonComponentSerializer#gson()}
|
|
+ */
|
|
+ @Deprecated(forRemoval = true)
|
|
+ public static @NotNull GsonComponentSerializer gsonSerializer() {
|
|
+ return Bukkit.getUnsafe().gsonComponentSerializer();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get a serializer for {@link Component}s that will convert to and from the
|
|
+ * standard JSON serialization format using Gson, downsampling any RGB colors
|
|
+ * to their nearest {@link NamedTextColor} counterpart.
|
|
+ *
|
|
+ * <p>Implementations may provide a serializer capable of processing any
|
|
+ * information that requires implementation details, such as legacy
|
|
+ * (pre-1.16) hover events.</p>
|
|
+ *
|
|
+ * @return a json component serializer
|
|
+ * @deprecated use {@link GsonComponentSerializer#colorDownsamplingGson()}
|
|
+ */
|
|
+ @Deprecated(forRemoval = true)
|
|
+ public static @NotNull GsonComponentSerializer colorDownsamplingGsonSerializer() {
|
|
+ return Bukkit.getUnsafe().colorDownsamplingGsonComponentSerializer();
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get a serializer for {@link Component}s that will convert to and from the
|
|
+ * legacy component format used by Bukkit. This serializer uses the
|
|
+ * {@link LegacyComponentSerializer.Builder#useUnusualXRepeatedCharacterHexFormat()}
|
|
+ * option to match upstream behavior.
|
|
+ *
|
|
+ * <p>This legacy serializer uses the standard section symbol to mark
|
|
+ * formatting characters.</p>
|
|
+ *
|
|
+ * <p>Implementations may provide a serializer capable of processing any
|
|
+ * information that requires access to implementation details.</p>
|
|
+ *
|
|
+ * @return a section serializer
|
|
+ * @deprecated use {@link LegacyComponentSerializer#legacySection()}
|
|
+ */
|
|
+ @Deprecated(forRemoval = true)
|
|
+ public static @NotNull LegacyComponentSerializer legacySectionSerializer() {
|
|
+ return Bukkit.getUnsafe().legacyComponentSerializer();
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
|
|
index 446e4d21c5b9b624e633875df62160a7351517d9..16ec0cd908659d6d53e565281b8db9f81951277d 100644
|
|
--- a/src/main/java/org/bukkit/Bukkit.java
|
|
+++ b/src/main/java/org/bukkit/Bukkit.java
|
|
@@ -358,7 +358,9 @@ public final class Bukkit {
|
|
*
|
|
* @param message the message
|
|
* @return the number of players
|
|
+ * @deprecated in favour of {@link Server#broadcast(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public static int broadcastMessage(@NotNull String message) {
|
|
return server.broadcastMessage(message);
|
|
}
|
|
@@ -1074,6 +1076,19 @@ public final class Bukkit {
|
|
server.shutdown();
|
|
}
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Broadcast a message to all players.
|
|
+ * <p>
|
|
+ * This is the same as calling {@link #broadcast(net.kyori.adventure.text.Component,
|
|
+ * java.lang.String)} with the {@link Server#BROADCAST_CHANNEL_USERS} permission.
|
|
+ *
|
|
+ * @param message the message
|
|
+ * @return the number of players
|
|
+ */
|
|
+ public static int broadcast(net.kyori.adventure.text.@NotNull Component message) {
|
|
+ return server.broadcast(message);
|
|
+ }
|
|
/**
|
|
* Broadcasts the specified message to every user with the given
|
|
* permission name.
|
|
@@ -1083,6 +1098,21 @@ public final class Bukkit {
|
|
* permissibles} must have to receive the broadcast
|
|
* @return number of message recipients
|
|
*/
|
|
+ public static int broadcast(net.kyori.adventure.text.@NotNull Component message, @NotNull String permission) {
|
|
+ return server.broadcast(message, permission);
|
|
+ }
|
|
+ // Paper end
|
|
+ /**
|
|
+ * Broadcasts the specified message to every user with the given
|
|
+ * permission name.
|
|
+ *
|
|
+ * @param message message to broadcast
|
|
+ * @param permission the required permission {@link Permissible
|
|
+ * permissibles} must have to receive the broadcast
|
|
+ * @return number of message recipients
|
|
+ * @deprecated in favour of {@link #broadcast(net.kyori.adventure.text.Component, String)}
|
|
+ */
|
|
+ @Deprecated // Paper
|
|
public static int broadcast(@NotNull String message, @NotNull String permission) {
|
|
return server.broadcast(message, permission);
|
|
}
|
|
@@ -1321,6 +1351,7 @@ public final class Bukkit {
|
|
return server.createInventory(owner, type);
|
|
}
|
|
|
|
+ // Paper start
|
|
/**
|
|
* Creates an empty inventory with the specified type and title. If the type
|
|
* is {@link InventoryType#CHEST}, the new inventory has a size of 27;
|
|
@@ -1346,6 +1377,38 @@ public final class Bukkit {
|
|
* @see InventoryType#isCreatable()
|
|
*/
|
|
@NotNull
|
|
+ public static Inventory createInventory(@Nullable InventoryHolder owner, @NotNull InventoryType type, net.kyori.adventure.text.@NotNull Component title) {
|
|
+ return server.createInventory(owner, type, title);
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
+ /**
|
|
+ * Creates an empty inventory with the specified type and title. If the type
|
|
+ * is {@link InventoryType#CHEST}, the new inventory has a size of 27;
|
|
+ * otherwise the new inventory has the normal size for its type.<br>
|
|
+ * It should be noted that some inventory types do not support titles and
|
|
+ * may not render with said titles on the Minecraft client.
|
|
+ * <br>
|
|
+ * {@link InventoryType#WORKBENCH} will not process crafting recipes if
|
|
+ * created with this method. Use
|
|
+ * {@link Player#openWorkbench(Location, boolean)} instead.
|
|
+ * <br>
|
|
+ * {@link InventoryType#ENCHANTING} will not process {@link ItemStack}s
|
|
+ * for possible enchanting results. Use
|
|
+ * {@link Player#openEnchanting(Location, boolean)} instead.
|
|
+ *
|
|
+ * @param owner The holder of the inventory; can be null if there's no holder.
|
|
+ * @param type The type of inventory to create.
|
|
+ * @param title The title of the inventory, to be displayed when it is viewed.
|
|
+ * @return The new inventory.
|
|
+ * @throws IllegalArgumentException if the {@link InventoryType} cannot be
|
|
+ * viewed.
|
|
+ * @deprecated in favour of {@link #createInventory(InventoryHolder, InventoryType, net.kyori.adventure.text.Component)}
|
|
+ *
|
|
+ * @see InventoryType#isCreatable()
|
|
+ */
|
|
+ @Deprecated // Paper
|
|
+ @NotNull
|
|
public static Inventory createInventory(@Nullable InventoryHolder owner, @NotNull InventoryType type, @NotNull String title) {
|
|
return server.createInventory(owner, type, title);
|
|
}
|
|
@@ -1364,6 +1427,7 @@ public final class Bukkit {
|
|
return server.createInventory(owner, size);
|
|
}
|
|
|
|
+ // Paper start
|
|
/**
|
|
* Creates an empty inventory of type {@link InventoryType#CHEST} with the
|
|
* specified size and title.
|
|
@@ -1376,10 +1440,30 @@ public final class Bukkit {
|
|
* @throws IllegalArgumentException if the size is not a multiple of 9
|
|
*/
|
|
@NotNull
|
|
+ public static Inventory createInventory(@Nullable InventoryHolder owner, int size, net.kyori.adventure.text.@NotNull Component title) throws IllegalArgumentException {
|
|
+ return server.createInventory(owner, size, title);
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
+ /**
|
|
+ * Creates an empty inventory of type {@link InventoryType#CHEST} with the
|
|
+ * specified size and title.
|
|
+ *
|
|
+ * @param owner the holder of the inventory, or null to indicate no holder
|
|
+ * @param size a multiple of 9 as the size of inventory to create
|
|
+ * @param title the title of the inventory, displayed when inventory is
|
|
+ * viewed
|
|
+ * @return a new inventory
|
|
+ * @throws IllegalArgumentException if the size is not a multiple of 9
|
|
+ * @deprecated in favour of {@link #createInventory(InventoryHolder, InventoryType, net.kyori.adventure.text.Component)}
|
|
+ */
|
|
+ @Deprecated // Paper
|
|
+ @NotNull
|
|
public static Inventory createInventory(@Nullable InventoryHolder owner, int size, @NotNull String title) throws IllegalArgumentException {
|
|
return server.createInventory(owner, size, title);
|
|
}
|
|
|
|
+ // Paper start
|
|
/**
|
|
* Creates an empty merchant.
|
|
*
|
|
@@ -1387,7 +1471,20 @@ public final class Bukkit {
|
|
* when the merchant inventory is viewed
|
|
* @return a new merchant
|
|
*/
|
|
+ public static @NotNull Merchant createMerchant(net.kyori.adventure.text.@Nullable Component title) {
|
|
+ return server.createMerchant(title);
|
|
+ }
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Creates an empty merchant.
|
|
+ *
|
|
+ * @param title the title of the corresponding merchant inventory, displayed
|
|
+ * when the merchant inventory is viewed
|
|
+ * @return a new merchant
|
|
+ * @deprecated in favour of {@link #createMerchant(net.kyori.adventure.text.Component)}
|
|
+ */
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public static Merchant createMerchant(@Nullable String title) {
|
|
return server.createMerchant(title);
|
|
}
|
|
@@ -1504,22 +1601,47 @@ public final class Bukkit {
|
|
return server.isPrimaryThread();
|
|
}
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the message that is displayed on the server list.
|
|
+ *
|
|
+ * @return the server's MOTD
|
|
+ */
|
|
+ @NotNull public static net.kyori.adventure.text.Component motd() {
|
|
+ return server.motd();
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Gets the message that is displayed on the server list.
|
|
*
|
|
* @return the servers MOTD
|
|
+ * @deprecated in favour of {@link #motd()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public static String getMotd() {
|
|
return server.getMotd();
|
|
}
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the default message that is displayed when the server is stopped.
|
|
+ *
|
|
+ * @return the shutdown message
|
|
+ */
|
|
+ public static net.kyori.adventure.text.@Nullable Component shutdownMessage() {
|
|
+ return server.shutdownMessage();
|
|
+ }
|
|
+ // Paper end
|
|
/**
|
|
* Gets the default message that is displayed when the server is stopped.
|
|
*
|
|
* @return the shutdown message
|
|
+ * @deprecated in favour of {@link #shutdownMessage()}
|
|
*/
|
|
@Nullable
|
|
+ @Deprecated // Paper
|
|
public static String getShutdownMessage() {
|
|
return server.getShutdownMessage();
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/Keyed.java b/src/main/java/org/bukkit/Keyed.java
|
|
index 32c92621c2c15eec14c50965f5ecda00c46e6c80..e076d447da62445764a9776ee2554c077637d270 100644
|
|
--- a/src/main/java/org/bukkit/Keyed.java
|
|
+++ b/src/main/java/org/bukkit/Keyed.java
|
|
@@ -5,7 +5,7 @@ import org.jetbrains.annotations.NotNull;
|
|
/**
|
|
* Represents an object which has a {@link NamespacedKey} attached to it.
|
|
*/
|
|
-public interface Keyed {
|
|
+public interface Keyed extends net.kyori.adventure.key.Keyed { // Paper -- extend Adventure Keyed
|
|
|
|
/**
|
|
* Return the namespaced identifier for this object.
|
|
@@ -14,4 +14,16 @@ public interface Keyed {
|
|
*/
|
|
@NotNull
|
|
NamespacedKey getKey();
|
|
+
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Returns the unique identifier for this object.
|
|
+ *
|
|
+ * @return this object's key
|
|
+ */
|
|
+ @Override
|
|
+ default net.kyori.adventure.key.@NotNull Key key() {
|
|
+ return this.getKey();
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/Nameable.java b/src/main/java/org/bukkit/Nameable.java
|
|
index fee814e01a653d2b53c56e8b566383ca44aa5346..4904a7ec9fcbbc5cb41e07267426b45c60ec655e 100644
|
|
--- a/src/main/java/org/bukkit/Nameable.java
|
|
+++ b/src/main/java/org/bukkit/Nameable.java
|
|
@@ -4,6 +4,30 @@ import org.jetbrains.annotations.Nullable;
|
|
|
|
public interface Nameable {
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the custom name.
|
|
+ *
|
|
+ * <p>This value has no effect on players, they will always use their real name.</p>
|
|
+ *
|
|
+ * @return the custom name
|
|
+ */
|
|
+ net.kyori.adventure.text.@Nullable Component customName();
|
|
+
|
|
+ /**
|
|
+ * Sets the custom name.
|
|
+ *
|
|
+ * <p>This name will be used in death messages and can be sent to the client as a nameplate over the mob.</p>
|
|
+ *
|
|
+ * <p>Setting the name to {@code null} will clear it.</p>
|
|
+ *
|
|
+ * <p>This value has no effect on players, they will always use their real name.</p>
|
|
+ *
|
|
+ * @param customName the custom name to set
|
|
+ */
|
|
+ void customName(final net.kyori.adventure.text.@Nullable Component customName);
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Gets the custom name on a mob or block. If there is no name this method
|
|
* will return null.
|
|
@@ -11,8 +35,10 @@ public interface Nameable {
|
|
* This value has no effect on players, they will always use their real
|
|
* name.
|
|
*
|
|
+ * @deprecated in favour of {@link #customName()}
|
|
* @return name of the mob/block or null
|
|
*/
|
|
+ @Deprecated // Paper
|
|
@Nullable
|
|
public String getCustomName();
|
|
|
|
@@ -25,7 +51,9 @@ public interface Nameable {
|
|
* This value has no effect on players, they will always use their real
|
|
* name.
|
|
*
|
|
+ * @deprecated in favour of {@link #customName(net.kyori.adventure.text.Component)}
|
|
* @param name the name to set
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setCustomName(@Nullable String name);
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/NamespacedKey.java b/src/main/java/org/bukkit/NamespacedKey.java
|
|
index c559f38fdb92cfee9f2e0ffb7088d1cf74a7f73d..a42f1d53340e4073038d46b7fabf5d44248d5b32 100644
|
|
--- a/src/main/java/org/bukkit/NamespacedKey.java
|
|
+++ b/src/main/java/org/bukkit/NamespacedKey.java
|
|
@@ -18,7 +18,7 @@ import org.jetbrains.annotations.Nullable;
|
|
* underscores, hyphens, and forward slashes.
|
|
*
|
|
*/
|
|
-public final class NamespacedKey {
|
|
+public final class NamespacedKey implements net.kyori.adventure.key.Key { // Paper - implement Key
|
|
|
|
/**
|
|
* The namespace representing all inbuilt keys.
|
|
@@ -129,10 +129,11 @@ public final class NamespacedKey {
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
- int hash = 5;
|
|
- hash = 47 * hash + this.namespace.hashCode();
|
|
- hash = 47 * hash + this.key.hashCode();
|
|
- return hash;
|
|
+ // Paper start
|
|
+ int result = this.namespace.hashCode();
|
|
+ result = (31 * result) + this.key.hashCode();
|
|
+ return result;
|
|
+ // Paper end
|
|
}
|
|
|
|
@Override
|
|
@@ -140,11 +141,10 @@ public final class NamespacedKey {
|
|
if (obj == null) {
|
|
return false;
|
|
}
|
|
- if (getClass() != obj.getClass()) {
|
|
- return false;
|
|
- }
|
|
- final NamespacedKey other = (NamespacedKey) obj;
|
|
- return this.namespace.equals(other.namespace) && this.key.equals(other.key);
|
|
+ // Paper start
|
|
+ if (!(obj instanceof net.kyori.adventure.key.Key key)) return false;
|
|
+ return this.namespace.equals(key.namespace()) && this.key.equals(key.value());
|
|
+ // Paper end
|
|
}
|
|
|
|
@Override
|
|
@@ -246,4 +246,24 @@ public final class NamespacedKey {
|
|
public static NamespacedKey fromString(@NotNull String key) {
|
|
return fromString(key, null);
|
|
}
|
|
+
|
|
+ // Paper start
|
|
+ @NotNull
|
|
+ @Override
|
|
+ public String namespace() {
|
|
+ return this.getNamespace();
|
|
+ }
|
|
+
|
|
+ @NotNull
|
|
+ @Override
|
|
+ public String value() {
|
|
+ return this.getKey();
|
|
+ }
|
|
+
|
|
+ @NotNull
|
|
+ @Override
|
|
+ public String asString() {
|
|
+ return this.namespace + ':' + this.key;
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
|
|
index 52dd3148ae2a3480982593dc627ef7eede52bc5a..0a333c1439b3623d38029b88ce6d5ff159ae1ddd 100644
|
|
--- a/src/main/java/org/bukkit/Server.java
|
|
+++ b/src/main/java/org/bukkit/Server.java
|
|
@@ -59,13 +59,13 @@ import org.jetbrains.annotations.Nullable;
|
|
/**
|
|
* Represents a server implementation.
|
|
*/
|
|
-public interface Server extends PluginMessageRecipient {
|
|
+public interface Server extends PluginMessageRecipient, net.kyori.adventure.audience.ForwardingAudience { // Paper
|
|
|
|
/**
|
|
* Used for all administrative messages, such as an operator using a
|
|
* command.
|
|
* <p>
|
|
- * For use in {@link #broadcast(java.lang.String, java.lang.String)}.
|
|
+ * For use in {@link #broadcast(net.kyori.adventure.text.Component, java.lang.String)}.
|
|
*/
|
|
public static final String BROADCAST_CHANNEL_ADMINISTRATIVE = "bukkit.broadcast.admin";
|
|
|
|
@@ -73,7 +73,7 @@ public interface Server extends PluginMessageRecipient {
|
|
* Used for all announcement messages, such as informing users that a
|
|
* player has joined.
|
|
* <p>
|
|
- * For use in {@link #broadcast(java.lang.String, java.lang.String)}.
|
|
+ * For use in {@link #broadcast(net.kyori.adventure.text.Component, java.lang.String)}.
|
|
*/
|
|
public static final String BROADCAST_CHANNEL_USERS = "bukkit.broadcast.user";
|
|
|
|
@@ -295,7 +295,9 @@ public interface Server extends PluginMessageRecipient {
|
|
*
|
|
* @param message the message
|
|
* @return the number of players
|
|
+ * @deprecated use {@link #broadcast(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public int broadcastMessage(@NotNull String message);
|
|
|
|
/**
|
|
@@ -913,8 +915,33 @@ public interface Server extends PluginMessageRecipient {
|
|
* @param permission the required permission {@link Permissible
|
|
* permissibles} must have to receive the broadcast
|
|
* @return number of message recipients
|
|
+ * @deprecated in favour of {@link #broadcast(net.kyori.adventure.text.Component, String)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public int broadcast(@NotNull String message, @NotNull String permission);
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Broadcast a message to all players.
|
|
+ * <p>
|
|
+ * This is the same as calling {@link #broadcast(net.kyori.adventure.text.Component,
|
|
+ * java.lang.String)} with the {@link #BROADCAST_CHANNEL_USERS} permission.
|
|
+ *
|
|
+ * @param message the message
|
|
+ * @return the number of players
|
|
+ */
|
|
+ int broadcast(net.kyori.adventure.text.@NotNull Component message);
|
|
+
|
|
+ /**
|
|
+ * Broadcasts the specified message to every user with the given
|
|
+ * permission name.
|
|
+ *
|
|
+ * @param message message to broadcast
|
|
+ * @param permission the required permission {@link Permissible
|
|
+ * permissibles} must have to receive the broadcast
|
|
+ * @return number of message recipients
|
|
+ */
|
|
+ int broadcast(net.kyori.adventure.text.@NotNull Component message, @NotNull String permission);
|
|
+ // Paper end
|
|
|
|
/**
|
|
* Gets the player by the given name, regardless if they are offline or
|
|
@@ -1112,6 +1139,7 @@ public interface Server extends PluginMessageRecipient {
|
|
@NotNull
|
|
Inventory createInventory(@Nullable InventoryHolder owner, @NotNull InventoryType type);
|
|
|
|
+ // Paper start
|
|
/**
|
|
* Creates an empty inventory with the specified type and title. If the type
|
|
* is {@link InventoryType#CHEST}, the new inventory has a size of 27;
|
|
@@ -1137,6 +1165,36 @@ public interface Server extends PluginMessageRecipient {
|
|
* @see InventoryType#isCreatable()
|
|
*/
|
|
@NotNull
|
|
+ Inventory createInventory(@Nullable InventoryHolder owner, @NotNull InventoryType type, net.kyori.adventure.text.@NotNull Component title);
|
|
+ // Paper end
|
|
+
|
|
+ /**
|
|
+ * Creates an empty inventory with the specified type and title. If the type
|
|
+ * is {@link InventoryType#CHEST}, the new inventory has a size of 27;
|
|
+ * otherwise the new inventory has the normal size for its type.<br>
|
|
+ * It should be noted that some inventory types do not support titles and
|
|
+ * may not render with said titles on the Minecraft client.
|
|
+ * <br>
|
|
+ * {@link InventoryType#WORKBENCH} will not process crafting recipes if
|
|
+ * created with this method. Use
|
|
+ * {@link Player#openWorkbench(Location, boolean)} instead.
|
|
+ * <br>
|
|
+ * {@link InventoryType#ENCHANTING} will not process {@link ItemStack}s
|
|
+ * for possible enchanting results. Use
|
|
+ * {@link Player#openEnchanting(Location, boolean)} instead.
|
|
+ *
|
|
+ * @param owner The holder of the inventory; can be null if there's no holder.
|
|
+ * @param type The type of inventory to create.
|
|
+ * @param title The title of the inventory, to be displayed when it is viewed.
|
|
+ * @return The new inventory.
|
|
+ * @throws IllegalArgumentException if the {@link InventoryType} cannot be
|
|
+ * viewed.
|
|
+ * @deprecated in favour of {@link #createInventory(InventoryHolder, InventoryType, net.kyori.adventure.text.Component)}
|
|
+ *
|
|
+ * @see InventoryType#isCreatable()
|
|
+ */
|
|
+ @Deprecated // Paper
|
|
+ @NotNull
|
|
Inventory createInventory(@Nullable InventoryHolder owner, @NotNull InventoryType type, @NotNull String title);
|
|
|
|
/**
|
|
@@ -1151,6 +1209,22 @@ public interface Server extends PluginMessageRecipient {
|
|
@NotNull
|
|
Inventory createInventory(@Nullable InventoryHolder owner, int size) throws IllegalArgumentException;
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Creates an empty inventory of type {@link InventoryType#CHEST} with the
|
|
+ * specified size and title.
|
|
+ *
|
|
+ * @param owner the holder of the inventory, or null to indicate no holder
|
|
+ * @param size a multiple of 9 as the size of inventory to create
|
|
+ * @param title the title of the inventory, displayed when inventory is
|
|
+ * viewed
|
|
+ * @return a new inventory
|
|
+ * @throws IllegalArgumentException if the size is not a multiple of 9
|
|
+ */
|
|
+ @NotNull
|
|
+ Inventory createInventory(@Nullable InventoryHolder owner, int size, net.kyori.adventure.text.@NotNull Component title) throws IllegalArgumentException;
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Creates an empty inventory of type {@link InventoryType#CHEST} with the
|
|
* specified size and title.
|
|
@@ -1161,10 +1235,13 @@ public interface Server extends PluginMessageRecipient {
|
|
* viewed
|
|
* @return a new inventory
|
|
* @throws IllegalArgumentException if the size is not a multiple of 9
|
|
+ * @deprecated in favour of {@link #createInventory(InventoryHolder, int, net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
@NotNull
|
|
Inventory createInventory(@Nullable InventoryHolder owner, int size, @NotNull String title) throws IllegalArgumentException;
|
|
|
|
+ // Paper start
|
|
/**
|
|
* Creates an empty merchant.
|
|
*
|
|
@@ -1172,7 +1249,18 @@ public interface Server extends PluginMessageRecipient {
|
|
* when the merchant inventory is viewed
|
|
* @return a new merchant
|
|
*/
|
|
+ @NotNull Merchant createMerchant(net.kyori.adventure.text.@Nullable Component title);
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Creates an empty merchant.
|
|
+ *
|
|
+ * @param title the title of the corresponding merchant inventory, displayed
|
|
+ * when the merchant inventory is viewed
|
|
+ * @return a new merchant
|
|
+ * @deprecated in favour of {@link #createMerchant(net.kyori.adventure.text.Component)}
|
|
+ */
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
Merchant createMerchant(@Nullable String title);
|
|
|
|
/**
|
|
@@ -1268,20 +1356,41 @@ public interface Server extends PluginMessageRecipient {
|
|
*/
|
|
boolean isPrimaryThread();
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the message that is displayed on the server list.
|
|
+ *
|
|
+ * @return the server's MOTD
|
|
+ */
|
|
+ net.kyori.adventure.text.@NotNull Component motd();
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Gets the message that is displayed on the server list.
|
|
*
|
|
* @return the servers MOTD
|
|
+ * @deprecated in favour of {@link #motd()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
String getMotd();
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the default message that is displayed when the server is stopped.
|
|
+ *
|
|
+ * @return the shutdown message
|
|
+ */
|
|
+ net.kyori.adventure.text.@Nullable Component shutdownMessage();
|
|
+ // Paper end
|
|
/**
|
|
* Gets the default message that is displayed when the server is stopped.
|
|
*
|
|
* @return the shutdown message
|
|
+ * @deprecated in favour of {@link #shutdownMessage()}
|
|
*/
|
|
@Nullable
|
|
+ @Deprecated // Paper
|
|
String getShutdownMessage();
|
|
|
|
/**
|
|
@@ -1663,7 +1772,9 @@ public interface Server extends PluginMessageRecipient {
|
|
* Sends the component to the player
|
|
*
|
|
* @param component the components to send
|
|
+ * @deprecated use {@link #broadcast(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void broadcast(@NotNull net.md_5.bungee.api.chat.BaseComponent component) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -1672,7 +1783,9 @@ public interface Server extends PluginMessageRecipient {
|
|
* Sends an array of components as a single message to the player
|
|
*
|
|
* @param components the components to send
|
|
+ * @deprecated use {@link #broadcast(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void broadcast(@NotNull net.md_5.bungee.api.chat.BaseComponent... components) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/Sound.java b/src/main/java/org/bukkit/Sound.java
|
|
index 5676389bb85607112194fd9a6741ab88254d18bb..5035c525ab40ebdde3da7fe85f5bdf6a26f6cfc0 100644
|
|
--- a/src/main/java/org/bukkit/Sound.java
|
|
+++ b/src/main/java/org/bukkit/Sound.java
|
|
@@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull;
|
|
* guarantee values will not be removed from this Enum. As such, you should not
|
|
* depend on the ordinal values of this class.
|
|
*/
|
|
-public enum Sound implements Keyed {
|
|
+public enum Sound implements Keyed, net.kyori.adventure.sound.Sound.Type { // Paper - implement Sound.Type
|
|
|
|
AMBIENT_BASALT_DELTAS_ADDITIONS("ambient.basalt_deltas.additions"),
|
|
AMBIENT_BASALT_DELTAS_LOOP("ambient.basalt_deltas.loop"),
|
|
@@ -1478,4 +1478,11 @@ public enum Sound implements Keyed {
|
|
public NamespacedKey getKey() {
|
|
return key;
|
|
}
|
|
+
|
|
+ // Paper start
|
|
+ @Override
|
|
+ public net.kyori.adventure.key.@NotNull Key key() {
|
|
+ return this.key;
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/SoundCategory.java b/src/main/java/org/bukkit/SoundCategory.java
|
|
index ac5e263d737973af077e3406a84a84baca4370db..2d91924b7f5ef16a91d40cdc1bfc3d68e0fda38d 100644
|
|
--- a/src/main/java/org/bukkit/SoundCategory.java
|
|
+++ b/src/main/java/org/bukkit/SoundCategory.java
|
|
@@ -3,7 +3,7 @@ package org.bukkit;
|
|
/**
|
|
* An Enum of categories for sounds.
|
|
*/
|
|
-public enum SoundCategory {
|
|
+public enum SoundCategory implements net.kyori.adventure.sound.Sound.Source.Provider { // Paper - implement Sound.Source.Provider
|
|
|
|
MASTER,
|
|
MUSIC,
|
|
@@ -15,4 +15,22 @@ public enum SoundCategory {
|
|
PLAYERS,
|
|
AMBIENT,
|
|
VOICE;
|
|
+
|
|
+ // Paper start - implement Sound.Source.Provider
|
|
+ @Override
|
|
+ public net.kyori.adventure.sound.Sound.@org.jetbrains.annotations.NotNull Source soundSource() {
|
|
+ return switch (this) {
|
|
+ case MASTER -> net.kyori.adventure.sound.Sound.Source.MASTER;
|
|
+ case MUSIC -> net.kyori.adventure.sound.Sound.Source.MUSIC;
|
|
+ case RECORDS -> net.kyori.adventure.sound.Sound.Source.RECORD;
|
|
+ case WEATHER -> net.kyori.adventure.sound.Sound.Source.WEATHER;
|
|
+ case BLOCKS -> net.kyori.adventure.sound.Sound.Source.BLOCK;
|
|
+ case HOSTILE -> net.kyori.adventure.sound.Sound.Source.HOSTILE;
|
|
+ case NEUTRAL -> net.kyori.adventure.sound.Sound.Source.NEUTRAL;
|
|
+ case PLAYERS -> net.kyori.adventure.sound.Sound.Source.PLAYER;
|
|
+ case AMBIENT -> net.kyori.adventure.sound.Sound.Source.AMBIENT;
|
|
+ case VOICE -> net.kyori.adventure.sound.Sound.Source.VOICE;
|
|
+ };
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
|
|
index ba69db36a2a7640fc2a63a1d9fd1b204e00d7ce7..876072a6c91bd02c9c7de53556419b8e1ac48f27 100644
|
|
--- a/src/main/java/org/bukkit/UnsafeValues.java
|
|
+++ b/src/main/java/org/bukkit/UnsafeValues.java
|
|
@@ -23,6 +23,15 @@ import org.bukkit.plugin.PluginDescriptionFile;
|
|
*/
|
|
@Deprecated
|
|
public interface UnsafeValues {
|
|
+ // Paper start
|
|
+ net.kyori.adventure.text.flattener.ComponentFlattener componentFlattener();
|
|
+ @Deprecated(forRemoval = true) net.kyori.adventure.text.serializer.plain.PlainComponentSerializer plainComponentSerializer();
|
|
+ @Deprecated(forRemoval = true) net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer plainTextSerializer();
|
|
+ @Deprecated(forRemoval = true) net.kyori.adventure.text.serializer.gson.GsonComponentSerializer gsonComponentSerializer();
|
|
+ @Deprecated(forRemoval = true) net.kyori.adventure.text.serializer.gson.GsonComponentSerializer colorDownsamplingGsonComponentSerializer();
|
|
+ @Deprecated(forRemoval = true) net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer legacyComponentSerializer();
|
|
+ net.kyori.adventure.text.Component resolveWithContext(net.kyori.adventure.text.Component component, org.bukkit.command.CommandSender context, org.bukkit.entity.Entity scoreboardSubject, boolean bypassPermissions) throws java.io.IOException;
|
|
+ // Paper end
|
|
|
|
Material toLegacy(Material material);
|
|
|
|
diff --git a/src/main/java/org/bukkit/Warning.java b/src/main/java/org/bukkit/Warning.java
|
|
index efb97712cc9dc7c1e12a59f5b94e4f2ad7c6b7d8..3024468af4c073324e536c1cb26beffb1e09f3f4 100644
|
|
--- a/src/main/java/org/bukkit/Warning.java
|
|
+++ b/src/main/java/org/bukkit/Warning.java
|
|
@@ -67,6 +67,7 @@ public @interface Warning {
|
|
* </ul>
|
|
*/
|
|
public boolean printFor(@Nullable Warning warning) {
|
|
+ if (Boolean.getBoolean("paper.alwaysPrintWarningState")) return true; // Paper
|
|
if (this == DEFAULT) {
|
|
return warning == null || warning.value();
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
|
|
index 98b9818fa10be7a36e862b3afafc9ed2d0a64209..ed57cd69d88504b78782271c9a3d423a29471674 100644
|
|
--- a/src/main/java/org/bukkit/World.java
|
|
+++ b/src/main/java/org/bukkit/World.java
|
|
@@ -43,7 +43,7 @@ import org.jetbrains.annotations.Nullable;
|
|
/**
|
|
* Represents a world, which may contain entities, chunks and blocks
|
|
*/
|
|
-public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient, Metadatable, PersistentDataHolder, Keyed {
|
|
+public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient, Metadatable, PersistentDataHolder, Keyed, net.kyori.adventure.audience.ForwardingAudience { // Paper
|
|
|
|
/**
|
|
* Gets the {@link Block} at the given coordinates
|
|
@@ -638,6 +638,14 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
|
|
@NotNull
|
|
public List<Player> getPlayers();
|
|
|
|
+ // Paper start
|
|
+ @NotNull
|
|
+ @Override
|
|
+ default Iterable<? extends net.kyori.adventure.audience.Audience> audiences() {
|
|
+ return this.getPlayers();
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Returns a list of entities within a bounding box centered around a
|
|
* Location.
|
|
diff --git a/src/main/java/org/bukkit/block/CommandBlock.java b/src/main/java/org/bukkit/block/CommandBlock.java
|
|
index 372c0bd5a4d7800a11c24c95e39fe376a96232bf..9c88be68b4f403d0500cb607394b3a1646675ef7 100644
|
|
--- a/src/main/java/org/bukkit/block/CommandBlock.java
|
|
+++ b/src/main/java/org/bukkit/block/CommandBlock.java
|
|
@@ -33,7 +33,9 @@ public interface CommandBlock extends TileState {
|
|
* by default is "@".
|
|
*
|
|
* @return Name of this CommandBlock.
|
|
+ * @deprecated in favour of {@link #name()}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
@NotNull
|
|
public String getName();
|
|
|
|
@@ -43,6 +45,28 @@ public interface CommandBlock extends TileState {
|
|
* same as setting it to "@".
|
|
*
|
|
* @param name New name for this CommandBlock.
|
|
+ * @deprecated in favour of {@link #name(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setName(@Nullable String name);
|
|
+
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the name of this CommandBlock. The name is used with commands
|
|
+ * that this CommandBlock executes. This name will never be null, and
|
|
+ * by default is a {@link net.kyori.adventure.text.TextComponent} containing {@code @}.
|
|
+ *
|
|
+ * @return Name of this CommandBlock.
|
|
+ */
|
|
+ public net.kyori.adventure.text.@NotNull Component name();
|
|
+
|
|
+ /**
|
|
+ * Sets the name of this CommandBlock. The name is used with commands
|
|
+ * that this CommandBlock executes. Setting the name to null is the
|
|
+ * same as setting it to a {@link net.kyori.adventure.text.TextComponent} containing {@code @}.
|
|
+ *
|
|
+ * @param name New name for this CommandBlock.
|
|
+ */
|
|
+ public void name(net.kyori.adventure.text.@Nullable Component name);
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/block/Sign.java b/src/main/java/org/bukkit/block/Sign.java
|
|
index ab6b0ec328e94bf65a0dafd0403e5ee3b870296c..f87bdb2757760d95038d1a1cf6e7f5b2cff91432 100644
|
|
--- a/src/main/java/org/bukkit/block/Sign.java
|
|
+++ b/src/main/java/org/bukkit/block/Sign.java
|
|
@@ -7,13 +7,48 @@ import org.jetbrains.annotations.NotNull;
|
|
* Represents a captured state of either a SignPost or a WallSign.
|
|
*/
|
|
public interface Sign extends TileState, Colorable {
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets all the lines of text currently on this sign.
|
|
+ *
|
|
+ * @return Array of Strings containing each line of text
|
|
+ */
|
|
+ @NotNull
|
|
+ public java.util.List<net.kyori.adventure.text.Component> lines();
|
|
+
|
|
+ /**
|
|
+ * Gets the line of text at the specified index.
|
|
+ * <p>
|
|
+ * For example, getLine(0) will return the first line of text.
|
|
+ *
|
|
+ * @param index Line number to get the text from, starting at 0
|
|
+ * @throws IndexOutOfBoundsException Thrown when the line does not exist
|
|
+ * @return Text on the given line
|
|
+ */
|
|
+ @NotNull
|
|
+ public net.kyori.adventure.text.Component line(int index) throws IndexOutOfBoundsException;
|
|
+
|
|
+ /**
|
|
+ * Sets the line of text at the specified index.
|
|
+ * <p>
|
|
+ * For example, setLine(0, "Line One") will set the first line of text to
|
|
+ * "Line One".
|
|
+ *
|
|
+ * @param index Line number to set the text at, starting from 0
|
|
+ * @param line New text to set at the specified index
|
|
+ * @throws IndexOutOfBoundsException If the index is out of the range 0..3
|
|
+ */
|
|
+ public void line(int index, net.kyori.adventure.text.@NotNull Component line) throws IndexOutOfBoundsException;
|
|
+ // Paper end
|
|
|
|
/**
|
|
* Gets all the lines of text currently on this sign.
|
|
*
|
|
* @return Array of Strings containing each line of text
|
|
+ * @deprecated in favour of {@link #lines()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public String[] getLines();
|
|
|
|
/**
|
|
@@ -24,8 +59,10 @@ public interface Sign extends TileState, Colorable {
|
|
* @param index Line number to get the text from, starting at 0
|
|
* @return Text on the given line
|
|
* @throws IndexOutOfBoundsException Thrown when the line does not exist
|
|
+ * @deprecated in favour of {@link #line(int)}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public String getLine(int index) throws IndexOutOfBoundsException;
|
|
|
|
/**
|
|
@@ -37,7 +74,9 @@ public interface Sign extends TileState, Colorable {
|
|
* @param index Line number to set the text at, starting from 0
|
|
* @param line New text to set at the specified index
|
|
* @throws IndexOutOfBoundsException If the index is out of the range 0..3
|
|
+ * @deprecated in favour of {@link #line(int, net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setLine(int index, @NotNull String line) throws IndexOutOfBoundsException;
|
|
|
|
/**
|
|
diff --git a/src/main/java/org/bukkit/command/Command.java b/src/main/java/org/bukkit/command/Command.java
|
|
index 80209bb88a0294d4eedc78509533a6257315d856..75759131bd94b672bec4cd8e271ebff1ad391cba 100644
|
|
--- a/src/main/java/org/bukkit/command/Command.java
|
|
+++ b/src/main/java/org/bukkit/command/Command.java
|
|
@@ -32,7 +32,7 @@ public abstract class Command {
|
|
protected String description;
|
|
protected String usageMessage;
|
|
private String permission;
|
|
- private String permissionMessage;
|
|
+ private net.kyori.adventure.text.Component permissionMessage; // Paper
|
|
public org.spigotmc.CustomTimingsHandler timings; // Spigot
|
|
|
|
protected Command(@NotNull String name) {
|
|
@@ -186,10 +186,10 @@ public abstract class Command {
|
|
|
|
if (permissionMessage == null) {
|
|
target.sendMessage(ChatColor.RED + "I'm sorry, but you do not have permission to perform this command. Please contact the server administrators if you believe that this is a mistake.");
|
|
- } else if (permissionMessage.length() != 0) {
|
|
- for (String line : permissionMessage.replace("<permission>", permission).split("\n")) {
|
|
- target.sendMessage(line);
|
|
- }
|
|
+ // Paper start - use components for permissionMessage
|
|
+ } else if (!permissionMessage.equals(net.kyori.adventure.text.Component.empty())) {
|
|
+ target.sendMessage(permissionMessage.replaceText(net.kyori.adventure.text.TextReplacementConfig.builder().matchLiteral("<permission>").replacement(permission).build()));
|
|
+ // Paper end
|
|
}
|
|
|
|
return false;
|
|
@@ -317,10 +317,12 @@ public abstract class Command {
|
|
* command
|
|
*
|
|
* @return Permission check failed message
|
|
+ * @deprecated use {@link #permissionMessage()}
|
|
*/
|
|
@Nullable
|
|
+ @Deprecated // Paper
|
|
public String getPermissionMessage() {
|
|
- return permissionMessage;
|
|
+ return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serializeOrNull(permissionMessage); // Paper
|
|
}
|
|
|
|
/**
|
|
@@ -381,10 +383,12 @@ public abstract class Command {
|
|
* @param permissionMessage new permission message, null to indicate
|
|
* default message, or an empty string to indicate no message
|
|
* @return this command object, for chaining
|
|
+ * @deprecated use {@link #permissionMessage(net.kyori.adventure.text.Component)}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public Command setPermissionMessage(@Nullable String permissionMessage) {
|
|
- this.permissionMessage = permissionMessage;
|
|
+ this.permissionMessage = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserializeOrNull(permissionMessage); // Paper
|
|
return this;
|
|
}
|
|
|
|
@@ -399,13 +403,47 @@ public abstract class Command {
|
|
this.usageMessage = (usage == null) ? "" : usage;
|
|
return this;
|
|
}
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the permission message.
|
|
+ *
|
|
+ * @return the permission message
|
|
+ */
|
|
+ public net.kyori.adventure.text.@Nullable Component permissionMessage() {
|
|
+ return this.permissionMessage;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the permission message.
|
|
+ *
|
|
+ * @param permissionMessage the permission message
|
|
+ */
|
|
+ public void permissionMessage(net.kyori.adventure.text.@Nullable Component permissionMessage) {
|
|
+ this.permissionMessage = permissionMessage;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
public static void broadcastCommandMessage(@NotNull CommandSender source, @NotNull String message) {
|
|
broadcastCommandMessage(source, message, true);
|
|
}
|
|
|
|
public static void broadcastCommandMessage(@NotNull CommandSender source, @NotNull String message, boolean sendToSource) {
|
|
- String result = source.getName() + ": " + message;
|
|
+ // Paper start
|
|
+ broadcastCommandMessage(source, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(message), sendToSource);
|
|
+ }
|
|
+
|
|
+ public static void broadcastCommandMessage(@NotNull CommandSender source, net.kyori.adventure.text.@NotNull Component message) {
|
|
+ broadcastCommandMessage(source, message, true);
|
|
+ }
|
|
+
|
|
+ public static void broadcastCommandMessage(@NotNull CommandSender source, net.kyori.adventure.text.@NotNull Component message, boolean sendToSource) {
|
|
+ net.kyori.adventure.text.TextComponent.Builder result = net.kyori.adventure.text.Component.text()
|
|
+ .color(net.kyori.adventure.text.format.NamedTextColor.WHITE)
|
|
+ .decoration(net.kyori.adventure.text.format.TextDecoration.ITALIC, false)
|
|
+ .append(source.name())
|
|
+ .append(net.kyori.adventure.text.Component.text(": "))
|
|
+ .append(message);
|
|
+ // Paper end
|
|
|
|
if (source instanceof BlockCommandSender) {
|
|
BlockCommandSender blockCommandSender = (BlockCommandSender) source;
|
|
@@ -424,7 +462,12 @@ public abstract class Command {
|
|
}
|
|
|
|
Set<Permissible> users = Bukkit.getPluginManager().getPermissionSubscriptions(Server.BROADCAST_CHANNEL_ADMINISTRATIVE);
|
|
- String colored = ChatColor.GRAY + "" + ChatColor.ITALIC + "[" + result + ChatColor.GRAY + ChatColor.ITALIC + "]";
|
|
+ // Paper start
|
|
+ net.kyori.adventure.text.TextComponent.Builder colored = net.kyori.adventure.text.Component.text()
|
|
+ .color(net.kyori.adventure.text.format.NamedTextColor.GRAY)
|
|
+ .decorate(net.kyori.adventure.text.format.TextDecoration.ITALIC)
|
|
+ .append(net.kyori.adventure.text.Component.text("["), result, net.kyori.adventure.text.Component.text("]"));
|
|
+ // Paper end
|
|
|
|
if (sendToSource && !(source instanceof ConsoleCommandSender)) {
|
|
source.sendMessage(message);
|
|
diff --git a/src/main/java/org/bukkit/command/CommandSender.java b/src/main/java/org/bukkit/command/CommandSender.java
|
|
index 284be63a125624a8ae43d2c164aede810ce6bfe5..63ec8f2b31e5040eb8d7c7edad011b1976e1e5a3 100644
|
|
--- a/src/main/java/org/bukkit/command/CommandSender.java
|
|
+++ b/src/main/java/org/bukkit/command/CommandSender.java
|
|
@@ -6,12 +6,13 @@ import org.bukkit.permissions.Permissible;
|
|
import org.jetbrains.annotations.NotNull;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
-public interface CommandSender extends Permissible {
|
|
+public interface CommandSender extends net.kyori.adventure.audience.Audience, Permissible { // Paper
|
|
|
|
/**
|
|
* Sends this sender a message
|
|
*
|
|
* @param message Message to be displayed
|
|
+ * @see #sendMessage(net.kyori.adventure.text.Component)
|
|
*/
|
|
public void sendMessage(@NotNull String message);
|
|
|
|
@@ -19,6 +20,7 @@ public interface CommandSender extends Permissible {
|
|
* Sends this sender multiple messages
|
|
*
|
|
* @param messages An array of messages to be displayed
|
|
+ * @see #sendMessage(net.kyori.adventure.text.Component)
|
|
*/
|
|
public void sendMessage(@NotNull String... messages);
|
|
|
|
@@ -27,6 +29,7 @@ public interface CommandSender extends Permissible {
|
|
*
|
|
* @param message Message to be displayed
|
|
* @param sender The sender of this message
|
|
+ * @see #sendMessage(net.kyori.adventure.identity.Identified, net.kyori.adventure.text.Component)
|
|
*/
|
|
public void sendMessage(@Nullable UUID sender, @NotNull String message);
|
|
|
|
@@ -35,6 +38,7 @@ public interface CommandSender extends Permissible {
|
|
*
|
|
* @param messages An array of messages to be displayed
|
|
* @param sender The sender of this message
|
|
+ * @see #sendMessage(net.kyori.adventure.identity.Identified, net.kyori.adventure.text.Component)
|
|
*/
|
|
public void sendMessage(@Nullable UUID sender, @NotNull String... messages);
|
|
|
|
@@ -61,7 +65,9 @@ public interface CommandSender extends Permissible {
|
|
* Sends this sender a chat component.
|
|
*
|
|
* @param component the components to send
|
|
+ * @deprecated use {@code sendMessage} methods that accept {@link net.kyori.adventure.text.Component}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void sendMessage(@NotNull net.md_5.bungee.api.chat.BaseComponent component) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -70,7 +76,9 @@ public interface CommandSender extends Permissible {
|
|
* Sends an array of components as a single message to the sender.
|
|
*
|
|
* @param components the components to send
|
|
+ * @deprecated use {@code sendMessage} methods that accept {@link net.kyori.adventure.text.Component}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void sendMessage(@NotNull net.md_5.bungee.api.chat.BaseComponent... components) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -80,7 +88,9 @@ public interface CommandSender extends Permissible {
|
|
*
|
|
* @param component the components to send
|
|
* @param sender the sender of the message
|
|
+ * @deprecated use {@code sendMessage} methods that accept {@link net.kyori.adventure.text.Component}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void sendMessage(@Nullable UUID sender, @NotNull net.md_5.bungee.api.chat.BaseComponent component) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -90,7 +100,9 @@ public interface CommandSender extends Permissible {
|
|
*
|
|
* @param components the components to send
|
|
* @param sender the sender of the message
|
|
+ * @deprecated use {@code sendMessage} methods that accept {@link net.kyori.adventure.text.Component}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void sendMessage(@Nullable UUID sender, @NotNull net.md_5.bungee.api.chat.BaseComponent... components) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -99,4 +111,39 @@ public interface CommandSender extends Permissible {
|
|
@NotNull
|
|
Spigot spigot();
|
|
// Spigot end
|
|
+
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the name of this command sender
|
|
+ *
|
|
+ * @return Name of the sender
|
|
+ */
|
|
+ public net.kyori.adventure.text.@NotNull Component name();
|
|
+
|
|
+ @Override
|
|
+ default void sendMessage(final net.kyori.adventure.identity.@NotNull Identity identity, final net.kyori.adventure.text.@NotNull Component message, final net.kyori.adventure.audience.@NotNull MessageType type) {
|
|
+ this.sendMessage(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(message));
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sends a message with the MiniMessage format to the command sender.
|
|
+ * <p>
|
|
+ * See <a href="https://docs.advntr.dev/minimessage/">MiniMessage docs</a>
|
|
+ * for more information on the format.
|
|
+ *
|
|
+ * @param message MiniMessage content
|
|
+ */
|
|
+ default void sendRichMessage(final @NotNull String message) {
|
|
+ this.sendMessage(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(message));
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sends a plain message to the command sender.
|
|
+ *
|
|
+ * @param message plain message
|
|
+ */
|
|
+ default void sendPlainMessage(final @NotNull String message) {
|
|
+ this.sendMessage(net.kyori.adventure.text.Component.text(message));
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/command/PluginCommandYamlParser.java b/src/main/java/org/bukkit/command/PluginCommandYamlParser.java
|
|
index a542c4bb3c973bbe4b976642feccde6a4d90cb7b..ef870b864c1e36032b54b31f3f85707edc06d764 100644
|
|
--- a/src/main/java/org/bukkit/command/PluginCommandYamlParser.java
|
|
+++ b/src/main/java/org/bukkit/command/PluginCommandYamlParser.java
|
|
@@ -67,7 +67,7 @@ public class PluginCommandYamlParser {
|
|
}
|
|
|
|
if (permissionMessage != null) {
|
|
- newCmd.setPermissionMessage(permissionMessage.toString());
|
|
+ newCmd.permissionMessage(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(permissionMessage.toString())); // Paper
|
|
}
|
|
|
|
pluginCmds.add(newCmd);
|
|
diff --git a/src/main/java/org/bukkit/command/ProxiedCommandSender.java b/src/main/java/org/bukkit/command/ProxiedCommandSender.java
|
|
index fcc34b640265f4dccb46b9f09466ab8e1d96043e..5c813ac024f675951159a59d88d8baa0d49840e9 100644
|
|
--- a/src/main/java/org/bukkit/command/ProxiedCommandSender.java
|
|
+++ b/src/main/java/org/bukkit/command/ProxiedCommandSender.java
|
|
@@ -3,7 +3,7 @@ package org.bukkit.command;
|
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
-public interface ProxiedCommandSender extends CommandSender {
|
|
+public interface ProxiedCommandSender extends CommandSender, net.kyori.adventure.audience.ForwardingAudience.Single { // Paper
|
|
|
|
/**
|
|
* Returns the CommandSender which triggered this proxied command
|
|
@@ -21,4 +21,16 @@ public interface ProxiedCommandSender extends CommandSender {
|
|
@NotNull
|
|
CommandSender getCallee();
|
|
|
|
+ // Paper start
|
|
+ @Override
|
|
+ default void sendMessage(final net.kyori.adventure.identity.@NotNull Identity source, final net.kyori.adventure.text.@NotNull Component message, final net.kyori.adventure.audience.@NotNull MessageType type) {
|
|
+ net.kyori.adventure.audience.ForwardingAudience.Single.super.sendMessage(source, message, type);
|
|
+ }
|
|
+
|
|
+ @NotNull
|
|
+ @Override
|
|
+ default net.kyori.adventure.audience.Audience audience() {
|
|
+ return this.getCaller();
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/enchantments/Enchantment.java b/src/main/java/org/bukkit/enchantments/Enchantment.java
|
|
index e2800dc97af5bbb02c555069285a0fa155a9799d..2dc749936df6168073a5bb9f9051d55f8589ac62 100644
|
|
--- a/src/main/java/org/bukkit/enchantments/Enchantment.java
|
|
+++ b/src/main/java/org/bukkit/enchantments/Enchantment.java
|
|
@@ -299,6 +299,19 @@ public abstract class Enchantment implements Keyed {
|
|
* @return True if the enchantment may be applied, otherwise False
|
|
*/
|
|
public abstract boolean canEnchantItem(@NotNull ItemStack item);
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Get the name of the enchantment with its applied level.
|
|
+ * <p>
|
|
+ * If the given {@code level} is either less than the {@link #getStartLevel()} or greater than the {@link #getMaxLevel()},
|
|
+ * the level may not be shown in the numeral format one may otherwise expect.
|
|
+ * </p>
|
|
+ *
|
|
+ * @param level the level of the enchantment to show
|
|
+ * @return the name of the enchantment with {@code level} applied
|
|
+ */
|
|
+ public abstract net.kyori.adventure.text.@NotNull Component displayName(int level);
|
|
+ // Paper end
|
|
|
|
@Override
|
|
public boolean equals(Object obj) {
|
|
diff --git a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java b/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java
|
|
index 9566e4306ada5e82dede0f002aa06da12c44996b..4d5f0837bd0e02a30c943d8969fb6b13452322e0 100644
|
|
--- a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java
|
|
+++ b/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java
|
|
@@ -63,4 +63,11 @@ public class EnchantmentWrapper extends Enchantment {
|
|
public boolean conflictsWith(@NotNull Enchantment other) {
|
|
return getEnchantment().conflictsWith(other);
|
|
}
|
|
+ // Paper start
|
|
+ @NotNull
|
|
+ @Override
|
|
+ public net.kyori.adventure.text.Component displayName(int level) {
|
|
+ return getEnchantment().displayName(level);
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
|
|
index 281518d6e1f67722134e22d89b71106aae0c4397..d5be25c62b2eb90f8e171646b460fef04cf2a470 100644
|
|
--- a/src/main/java/org/bukkit/entity/Entity.java
|
|
+++ b/src/main/java/org/bukkit/entity/Entity.java
|
|
@@ -26,7 +26,7 @@ import org.jetbrains.annotations.Nullable;
|
|
/**
|
|
* Represents a base entity in the world
|
|
*/
|
|
-public interface Entity extends Metadatable, CommandSender, Nameable, PersistentDataHolder {
|
|
+public interface Entity extends Metadatable, CommandSender, Nameable, PersistentDataHolder, net.kyori.adventure.text.event.HoverEventSource<net.kyori.adventure.text.event.HoverEvent.ShowEntity>, net.kyori.adventure.sound.Sound.Emitter { // Paper
|
|
|
|
/**
|
|
* Gets the entity's current position
|
|
@@ -709,4 +709,20 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
|
|
@Override
|
|
Spigot spigot();
|
|
// Spigot end
|
|
+
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the entity's display name formatted with their team prefix/suffix and
|
|
+ * the entity's default hover/click events.
|
|
+ *
|
|
+ * @return the team display name
|
|
+ */
|
|
+ net.kyori.adventure.text.@NotNull Component teamDisplayName();
|
|
+
|
|
+ @NotNull
|
|
+ @Override
|
|
+ default net.kyori.adventure.text.event.HoverEvent<net.kyori.adventure.text.event.HoverEvent.ShowEntity> asHoverEvent(final @NotNull java.util.function.UnaryOperator<net.kyori.adventure.text.event.HoverEvent.ShowEntity> op) {
|
|
+ return net.kyori.adventure.text.event.HoverEvent.showEntity(op.apply(net.kyori.adventure.text.event.HoverEvent.ShowEntity.of(this.getType().getKey(), this.getUniqueId(), this.customName())));
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
|
|
index c60e1fc1cad1b9889a508602df84840723b7b966..fbf56bcc4540f7f1a8ced7cc2cd96e291c1ac273 100644
|
|
--- a/src/main/java/org/bukkit/entity/Player.java
|
|
+++ b/src/main/java/org/bukkit/entity/Player.java
|
|
@@ -39,7 +39,28 @@ import org.jetbrains.annotations.Nullable;
|
|
/**
|
|
* Represents a player, connected or not
|
|
*/
|
|
-public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginMessageRecipient {
|
|
+public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginMessageRecipient, net.kyori.adventure.identity.Identified { // Paper
|
|
+
|
|
+ // Paper start
|
|
+ @Override
|
|
+ default net.kyori.adventure.identity.@NotNull Identity identity() {
|
|
+ return net.kyori.adventure.identity.Identity.identity(this.getUniqueId());
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the "friendly" name to display of this player.
|
|
+ *
|
|
+ * @return the display name
|
|
+ */
|
|
+ net.kyori.adventure.text.@NotNull Component displayName();
|
|
+
|
|
+ /**
|
|
+ * Sets the "friendly" name to display of this player.
|
|
+ *
|
|
+ * @param displayName the display name to set
|
|
+ */
|
|
+ void displayName(final net.kyori.adventure.text.@Nullable Component displayName);
|
|
+ // Paper end
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
@@ -56,7 +77,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* places defined by plugins.
|
|
*
|
|
* @return the friendly name
|
|
+ * @deprecated in favour of {@link #displayName()}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
@NotNull
|
|
public String getDisplayName();
|
|
|
|
@@ -68,15 +91,50 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* places defined by plugins.
|
|
*
|
|
* @param name The new display name.
|
|
+ * @deprecated in favour of {@link #displayName(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setDisplayName(@Nullable String name);
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Sets the name that is shown on the in-game player list.
|
|
+ * <p>
|
|
+ * If the value is null, the name will be identical to {@link #getName()}.
|
|
+ *
|
|
+ * @param name new player list name
|
|
+ */
|
|
+ void playerListName(net.kyori.adventure.text.@Nullable Component name);
|
|
+
|
|
+ /**
|
|
+ * Gets the name that is shown on the in-game player list.
|
|
+ *
|
|
+ * @return the player list name
|
|
+ */
|
|
+ net.kyori.adventure.text.@NotNull Component playerListName();
|
|
+
|
|
+ /**
|
|
+ * Gets the currently displayed player list header for this player.
|
|
+ *
|
|
+ * @return player list header or null
|
|
+ */
|
|
+ net.kyori.adventure.text.@Nullable Component playerListHeader();
|
|
+
|
|
+ /**
|
|
+ * Gets the currently displayed player list footer for this player.
|
|
+ *
|
|
+ * @return player list footer or null
|
|
+ */
|
|
+ net.kyori.adventure.text.@Nullable Component playerListFooter();
|
|
+ // Paper end
|
|
/**
|
|
* Gets the name that is shown on the player list.
|
|
*
|
|
* @return the player list name
|
|
+ * @deprecated in favour of {@link #playerListName()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public String getPlayerListName();
|
|
|
|
/**
|
|
@@ -85,14 +143,18 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* If the value is null, the name will be identical to {@link #getName()}.
|
|
*
|
|
* @param name new player list name
|
|
+ * @deprecated in favour of {@link #playerListName(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setPlayerListName(@Nullable String name);
|
|
|
|
/**
|
|
* Gets the currently displayed player list header for this player.
|
|
*
|
|
* @return player list header or null
|
|
+ * @deprecated in favour of {@link #playerListHeader()}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
@Nullable
|
|
public String getPlayerListHeader();
|
|
|
|
@@ -100,7 +162,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* Gets the currently displayed player list footer for this player.
|
|
*
|
|
* @return player list header or null
|
|
+ * @deprecated in favour of {@link #playerListFooter()}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
@Nullable
|
|
public String getPlayerListFooter();
|
|
|
|
@@ -108,14 +172,18 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* Sets the currently displayed player list header for this player.
|
|
*
|
|
* @param header player list header, null for empty
|
|
+ * @deprecated in favour of {@link #sendPlayerListHeader(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setPlayerListHeader(@Nullable String header);
|
|
|
|
/**
|
|
* Sets the currently displayed player list footer for this player.
|
|
*
|
|
* @param footer player list footer, null for empty
|
|
+ * @deprecated in favour of {@link #sendPlayerListFooter(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setPlayerListFooter(@Nullable String footer);
|
|
|
|
/**
|
|
@@ -124,7 +192,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
*
|
|
* @param header player list header, null for empty
|
|
* @param footer player list footer, null for empty
|
|
+ * @deprecated in favour of {@link #sendPlayerListHeaderAndFooter(net.kyori.adventure.text.Component, net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setPlayerListHeaderFooter(@Nullable String header, @Nullable String footer);
|
|
|
|
/**
|
|
@@ -162,9 +232,25 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* Kicks player with custom kick message.
|
|
*
|
|
* @param message kick message
|
|
+ * @deprecated in favour of {@link #kick(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void kickPlayer(@Nullable String message);
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Kicks the player with the default kick message.
|
|
+ * @see #kick(net.kyori.adventure.text.Component)
|
|
+ */
|
|
+ void kick();
|
|
+ /**
|
|
+ * Kicks player with custom kick message.
|
|
+ *
|
|
+ * @param message kick message
|
|
+ */
|
|
+ void kick(final net.kyori.adventure.text.@Nullable Component message);
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Says a message (or runs a command).
|
|
*
|
|
@@ -573,6 +659,90 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
*/
|
|
public void sendEquipmentChange(@NotNull LivingEntity entity, @NotNull Map<EquipmentSlot, ItemStack> items);
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Send a sign change. This fakes a sign change packet for a user at
|
|
+ * a certain location. This will not actually change the world in any way.
|
|
+ * This method will use a sign at the location's block or a faked sign
|
|
+ * sent via
|
|
+ * {@link #sendBlockChange(org.bukkit.Location, org.bukkit.Material, byte)}.
|
|
+ * <p>
|
|
+ * If the client does not have a sign at the given location it will
|
|
+ * display an error message to the user.
|
|
+ *
|
|
+ * @param loc the location of the sign
|
|
+ * @param lines the new text on the sign or null to clear it
|
|
+ * @throws IllegalArgumentException if location is null
|
|
+ * @throws IllegalArgumentException if lines is non-null and has a length less than 4
|
|
+ */
|
|
+ default void sendSignChange(@NotNull Location loc, @Nullable java.util.List<? extends net.kyori.adventure.text.Component> lines) throws IllegalArgumentException {
|
|
+ this.sendSignChange(loc, lines, DyeColor.BLACK);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Send a sign change. This fakes a sign change packet for a user at
|
|
+ * a certain location. This will not actually change the world in any way.
|
|
+ * This method will use a sign at the location's block or a faked sign
|
|
+ * sent via
|
|
+ * {@link #sendBlockChange(org.bukkit.Location, org.bukkit.Material, byte)}.
|
|
+ * <p>
|
|
+ * If the client does not have a sign at the given location it will
|
|
+ * display an error message to the user.
|
|
+ *
|
|
+ * @param loc the location of the sign
|
|
+ * @param lines the new text on the sign or null to clear it
|
|
+ * @param dyeColor the color of the sign
|
|
+ * @throws IllegalArgumentException if location is null
|
|
+ * @throws IllegalArgumentException if dyeColor is null
|
|
+ * @throws IllegalArgumentException if lines is non-null and has a length less than 4
|
|
+ */
|
|
+ default void sendSignChange(@NotNull Location loc, @Nullable java.util.List<? extends net.kyori.adventure.text.Component> lines, @NotNull DyeColor dyeColor) throws IllegalArgumentException {
|
|
+ this.sendSignChange(loc, lines, dyeColor, false);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Send a sign change. This fakes a sign change packet for a user at
|
|
+ * a certain location. This will not actually change the world in any way.
|
|
+ * This method will use a sign at the location's block or a faked sign
|
|
+ * sent via
|
|
+ * {@link #sendBlockChange(org.bukkit.Location, org.bukkit.Material, byte)}.
|
|
+ * <p>
|
|
+ * If the client does not have a sign at the given location it will
|
|
+ * display an error message to the user.
|
|
+ *
|
|
+ * @param loc the location of the sign
|
|
+ * @param lines the new text on the sign or null to clear it
|
|
+ * @param hasGlowingText whether the text of the sign should glow as if dyed with a glowing ink sac
|
|
+ * @throws IllegalArgumentException if location is null
|
|
+ * @throws IllegalArgumentException if dyeColor is null
|
|
+ * @throws IllegalArgumentException if lines is non-null and has a length less than 4
|
|
+ */
|
|
+ default void sendSignChange(@NotNull Location loc, @Nullable java.util.List<? extends net.kyori.adventure.text.Component> lines, boolean hasGlowingText) throws IllegalArgumentException {
|
|
+ this.sendSignChange(loc, lines, DyeColor.BLACK, hasGlowingText);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Send a sign change. This fakes a sign change packet for a user at
|
|
+ * a certain location. This will not actually change the world in any way.
|
|
+ * This method will use a sign at the location's block or a faked sign
|
|
+ * sent via
|
|
+ * {@link #sendBlockChange(org.bukkit.Location, org.bukkit.Material, byte)}.
|
|
+ * <p>
|
|
+ * If the client does not have a sign at the given location it will
|
|
+ * display an error message to the user.
|
|
+ *
|
|
+ * @param loc the location of the sign
|
|
+ * @param lines the new text on the sign or null to clear it
|
|
+ * @param dyeColor the color of the sign
|
|
+ * @param hasGlowingText whether the text of the sign should glow as if dyed with a glowing ink sac
|
|
+ * @throws IllegalArgumentException if location is null
|
|
+ * @throws IllegalArgumentException if dyeColor is null
|
|
+ * @throws IllegalArgumentException if lines is non-null and has a length less than 4
|
|
+ */
|
|
+ void sendSignChange(@NotNull Location loc, @Nullable java.util.List<? extends net.kyori.adventure.text.Component> lines, @NotNull DyeColor dyeColor, boolean hasGlowingText)
|
|
+ throws IllegalArgumentException;
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Send a sign change. This fakes a sign change packet for a user at
|
|
* a certain location. This will not actually change the world in any way.
|
|
@@ -587,7 +757,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* @param lines the new text on the sign or null to clear it
|
|
* @throws IllegalArgumentException if location is null
|
|
* @throws IllegalArgumentException if lines is non-null and has a length less than 4
|
|
+ * @deprecated in favour of {@link #sendSignChange(org.bukkit.Location, java.util.List)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void sendSignChange(@NotNull Location loc, @Nullable String[] lines) throws IllegalArgumentException;
|
|
|
|
/**
|
|
@@ -606,7 +778,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* @throws IllegalArgumentException if location is null
|
|
* @throws IllegalArgumentException if dyeColor is null
|
|
* @throws IllegalArgumentException if lines is non-null and has a length less than 4
|
|
+ * @deprecated in favour of {@link #sendSignChange(org.bukkit.Location, java.util.List, org.bukkit.DyeColor)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void sendSignChange(@NotNull Location loc, @Nullable String[] lines, @NotNull DyeColor dyeColor) throws IllegalArgumentException;
|
|
|
|
/**
|
|
@@ -626,7 +800,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* @throws IllegalArgumentException if location is null
|
|
* @throws IllegalArgumentException if dyeColor is null
|
|
* @throws IllegalArgumentException if lines is non-null and has a length less than 4
|
|
+ * @deprecated Deprecated in favour of {@link #sendSignChange(Location, java.util.List, DyeColor, boolean)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void sendSignChange(@NotNull Location loc, @Nullable String[] lines, @NotNull DyeColor dyeColor, boolean hasGlowingText) throws IllegalArgumentException;
|
|
|
|
/**
|
|
@@ -1089,6 +1265,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* pack correctly.
|
|
* </ul>
|
|
*
|
|
+ * @deprecated in favour of {@link #setResourcePack(String, byte[], Component)}
|
|
* @param url The URL from which the client will download the resource
|
|
* pack. The string must contain only US-ASCII characters and should
|
|
* be encoded as per RFC 1738.
|
|
@@ -1145,8 +1322,10 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* @throws IllegalArgumentException Thrown if the hash is not 20 bytes
|
|
* long.
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setResourcePack(@NotNull String url, @Nullable byte[] hash, @Nullable String prompt);
|
|
|
|
+ // Paper start
|
|
/**
|
|
* Request that the player's client download and switch resource packs.
|
|
* <p>
|
|
@@ -1182,6 +1361,54 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* @param hash The sha1 hash sum of the resource pack file which is used
|
|
* to apply a cached version of the pack directly without downloading
|
|
* if it is available. Hast to be 20 bytes long!
|
|
+ * @param prompt The optional custom prompt message to be shown to client.
|
|
+ * @throws IllegalArgumentException Thrown if the URL is null.
|
|
+ * @throws IllegalArgumentException Thrown if the URL is too long. The
|
|
+ * length restriction is an implementation specific arbitrary value.
|
|
+ * @throws IllegalArgumentException Thrown if the hash is not 20 bytes
|
|
+ * long.
|
|
+ */
|
|
+ default void setResourcePack(@NotNull String url, byte @Nullable [] hash, net.kyori.adventure.text.@Nullable Component prompt) {
|
|
+ this.setResourcePack(url, hash, prompt, false);
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
+ /**
|
|
+ * Request that the player's client download and switch resource packs.
|
|
+ * <p>
|
|
+ * The player's client will download the new resource pack asynchronously
|
|
+ * in the background, and will automatically switch to it once the
|
|
+ * download is complete. If the client has downloaded and cached a
|
|
+ * resource pack with the same hash in the past it will not download but
|
|
+ * directly apply the cached pack. If the hash is null and the client has
|
|
+ * downloaded and cached the same resource pack in the past, it will
|
|
+ * perform a file size check against the response content to determine if
|
|
+ * the resource pack has changed and needs to be downloaded again. When
|
|
+ * this request is sent for the very first time from a given server, the
|
|
+ * client will first display a confirmation GUI to the player before
|
|
+ * proceeding with the download.
|
|
+ * <p>
|
|
+ * Notes:
|
|
+ * <ul>
|
|
+ * <li>Players can disable server resources on their client, in which
|
|
+ * case this method will have no affect on them. Use the
|
|
+ * {@link PlayerResourcePackStatusEvent} to figure out whether or not
|
|
+ * the player loaded the pack!
|
|
+ * <li>There is no concept of resetting resource packs back to default
|
|
+ * within Minecraft, so players will have to relog to do so or you
|
|
+ * have to send an empty pack.
|
|
+ * <li>The request is sent with empty string as the hash when the hash is
|
|
+ * not provided. This might result in newer versions not loading the
|
|
+ * pack correctly.
|
|
+ * </ul>
|
|
+ *
|
|
+ * @deprecated in favour of {@link #setResourcePack(String, byte[], Component, boolean)}
|
|
+ * @param url The URL from which the client will download the resource
|
|
+ * pack. The string must contain only US-ASCII characters and should
|
|
+ * be encoded as per RFC 1738.
|
|
+ * @param hash The sha1 hash sum of the resource pack file which is used
|
|
+ * to apply a cached version of the pack directly without downloading
|
|
+ * if it is available. Hast to be 20 bytes long!
|
|
* @param force If true, the client will be disconnected from the server
|
|
* when it declines to use the resource pack.
|
|
* @throws IllegalArgumentException Thrown if the URL is null.
|
|
@@ -1236,8 +1463,57 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* @throws IllegalArgumentException Thrown if the hash is not 20 bytes
|
|
* long.
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setResourcePack(@NotNull String url, @Nullable byte[] hash, @Nullable String prompt, boolean force);
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Request that the player's client download and switch resource packs.
|
|
+ * <p>
|
|
+ * The player's client will download the new resource pack asynchronously
|
|
+ * in the background, and will automatically switch to it once the
|
|
+ * download is complete. If the client has downloaded and cached a
|
|
+ * resource pack with the same hash in the past it will not download but
|
|
+ * directly apply the cached pack. If the hash is null and the client has
|
|
+ * downloaded and cached the same resource pack in the past, it will
|
|
+ * perform a file size check against the response content to determine if
|
|
+ * the resource pack has changed and needs to be downloaded again. When
|
|
+ * this request is sent for the very first time from a given server, the
|
|
+ * client will first display a confirmation GUI to the player before
|
|
+ * proceeding with the download.
|
|
+ * <p>
|
|
+ * Notes:
|
|
+ * <ul>
|
|
+ * <li>Players can disable server resources on their client, in which
|
|
+ * case this method will have no affect on them. Use the
|
|
+ * {@link PlayerResourcePackStatusEvent} to figure out whether or not
|
|
+ * the player loaded the pack!
|
|
+ * <li>There is no concept of resetting resource packs back to default
|
|
+ * within Minecraft, so players will have to relog to do so or you
|
|
+ * have to send an empty pack.
|
|
+ * <li>The request is sent with empty string as the hash when the hash is
|
|
+ * not provided. This might result in newer versions not loading the
|
|
+ * pack correctly.
|
|
+ * </ul>
|
|
+ *
|
|
+ * @param url The URL from which the client will download the resource
|
|
+ * pack. The string must contain only US-ASCII characters and should
|
|
+ * be encoded as per RFC 1738.
|
|
+ * @param hash The sha1 hash sum of the resource pack file which is used
|
|
+ * to apply a cached version of the pack directly without downloading
|
|
+ * if it is available. Hast to be 20 bytes long!
|
|
+ * @param prompt The optional custom prompt message to be shown to client.
|
|
+ * @param force If true, the client will be disconnected from the server
|
|
+ * when it declines to use the resource pack.
|
|
+ * @throws IllegalArgumentException Thrown if the URL is null.
|
|
+ * @throws IllegalArgumentException Thrown if the URL is too long. The
|
|
+ * length restriction is an implementation specific arbitrary value.
|
|
+ * @throws IllegalArgumentException Thrown if the hash is not 20 bytes
|
|
+ * long.
|
|
+ */
|
|
+ public void setResourcePack(@NotNull String url, byte @Nullable [] hash, net.kyori.adventure.text.@Nullable Component prompt, boolean force);
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Gets the Scoreboard displayed to this player
|
|
*
|
|
@@ -1353,7 +1629,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
*
|
|
* @param title Title text
|
|
* @param subtitle Subtitle text
|
|
- * @deprecated API behavior subject to change
|
|
+ * @deprecated Use {@link #showTitle(net.kyori.adventure.title.Title)} or {@link #sendTitlePart(net.kyori.adventure.title.TitlePart, Object)}
|
|
*/
|
|
@Deprecated
|
|
public void sendTitle(@Nullable String title, @Nullable String subtitle);
|
|
@@ -1372,7 +1648,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* @param fadeIn time in ticks for titles to fade in. Defaults to 10.
|
|
* @param stay time in ticks for titles to stay. Defaults to 70.
|
|
* @param fadeOut time in ticks for titles to fade out. Defaults to 20.
|
|
+ * @deprecated Use {@link #showTitle(net.kyori.adventure.title.Title)} or {@link #sendTitlePart(net.kyori.adventure.title.TitlePart, Object)}
|
|
*/
|
|
+ @Deprecated // Paper - Adventure
|
|
public void sendTitle(@Nullable String title, @Nullable String subtitle, int fadeIn, int stay, int fadeOut);
|
|
|
|
/**
|
|
@@ -1599,6 +1877,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
*/
|
|
public int getClientViewDistance();
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the player's current locale.
|
|
+ *
|
|
+ * @return the player's locale
|
|
+ */
|
|
+ @NotNull java.util.Locale locale();
|
|
+ // Paper end
|
|
/**
|
|
* Gets the player's estimated ping in milliseconds.
|
|
*
|
|
@@ -1624,8 +1910,10 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* they wish.
|
|
*
|
|
* @return the player's locale
|
|
+ * @deprecated in favour of {@link #locale()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public String getLocale();
|
|
|
|
/**
|
|
@@ -1667,6 +1955,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
*/
|
|
public boolean isAllowingServerListings();
|
|
|
|
+ // Paper start
|
|
+ @NotNull
|
|
+ @Override
|
|
+ default net.kyori.adventure.text.event.HoverEvent<net.kyori.adventure.text.event.HoverEvent.ShowEntity> asHoverEvent(final @NotNull java.util.function.UnaryOperator<net.kyori.adventure.text.event.HoverEvent.ShowEntity> op) {
|
|
+ return net.kyori.adventure.text.event.HoverEvent.showEntity(op.apply(net.kyori.adventure.text.event.HoverEvent.ShowEntity.of(this.getType().getKey(), this.getUniqueId(), this.displayName())));
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
// Spigot start
|
|
public class Spigot extends Entity.Spigot {
|
|
|
|
@@ -1721,11 +2017,13 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
|
|
+ @Deprecated // Paper
|
|
@Override
|
|
public void sendMessage(@NotNull net.md_5.bungee.api.chat.BaseComponent component) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
|
|
+ @Deprecated // Paper
|
|
@Override
|
|
public void sendMessage(@NotNull net.md_5.bungee.api.chat.BaseComponent... components) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
@@ -1736,7 +2034,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
*
|
|
* @param position the screen position
|
|
* @param component the components to send
|
|
+ * @deprecated use {@code sendMessage} methods that accept {@link net.kyori.adventure.text.Component}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void sendMessage(@NotNull net.md_5.bungee.api.ChatMessageType position, @NotNull net.md_5.bungee.api.chat.BaseComponent component) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -1746,7 +2046,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
*
|
|
* @param position the screen position
|
|
* @param components the components to send
|
|
+ * @deprecated use {@code sendMessage} methods that accept {@link net.kyori.adventure.text.Component}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void sendMessage(@NotNull net.md_5.bungee.api.ChatMessageType position, @NotNull net.md_5.bungee.api.chat.BaseComponent... components) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -1757,7 +2059,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* @param position the screen position
|
|
* @param sender the sender of the message
|
|
* @param component the components to send
|
|
+ * @deprecated use {@code sendMessage} methods that accept {@link net.kyori.adventure.text.Component}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void sendMessage(@NotNull net.md_5.bungee.api.ChatMessageType position, @Nullable java.util.UUID sender, @NotNull net.md_5.bungee.api.chat.BaseComponent component) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -1768,7 +2072,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
|
|
* @param position the screen position
|
|
* @param sender the sender of the message
|
|
* @param components the components to send
|
|
+ * @deprecated use {@code sendMessage} methods that accept {@link net.kyori.adventure.text.Component}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void sendMessage(@NotNull net.md_5.bungee.api.ChatMessageType position, @Nullable java.util.UUID sender, @NotNull net.md_5.bungee.api.chat.BaseComponent... components) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/entity/TextDisplay.java b/src/main/java/org/bukkit/entity/TextDisplay.java
|
|
index a0ee539a46bcdf49ea750318374d393e9ef3ce68..fc4fe1ca764050dbdb0bb697cf4c147bd60f5a81 100644
|
|
--- a/src/main/java/org/bukkit/entity/TextDisplay.java
|
|
+++ b/src/main/java/org/bukkit/entity/TextDisplay.java
|
|
@@ -13,17 +13,37 @@ public interface TextDisplay extends Display {
|
|
* Gets the displayed text.
|
|
*
|
|
* @return the displayed text.
|
|
+ * @deprecated in favour of {@link #text()}
|
|
*/
|
|
@Nullable
|
|
+ @Deprecated // Paper
|
|
String getText();
|
|
|
|
/**
|
|
* Sets the displayed text.
|
|
*
|
|
* @param text the new text
|
|
+ * @deprecated in favour of {@link #text(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
void setText(@Nullable String text);
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the displayed text.
|
|
+ *
|
|
+ * @return the displayed text
|
|
+ */
|
|
+ net.kyori.adventure.text.@NotNull Component text();
|
|
+
|
|
+ /**
|
|
+ * Sets the displayed text.
|
|
+ *
|
|
+ * @param text the new text
|
|
+ */
|
|
+ void text(net.kyori.adventure.text.@Nullable Component text);
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Gets the maximum line width before wrapping.
|
|
*
|
|
diff --git a/src/main/java/org/bukkit/entity/minecart/CommandMinecart.java b/src/main/java/org/bukkit/entity/minecart/CommandMinecart.java
|
|
index 63c80b4ee1f7adc8a9efc3b607993104b1991f90..91cab8b13d5bba34007f124838b32a1df58c5ac7 100644
|
|
--- a/src/main/java/org/bukkit/entity/minecart/CommandMinecart.java
|
|
+++ b/src/main/java/org/bukkit/entity/minecart/CommandMinecart.java
|
|
@@ -32,7 +32,9 @@ public interface CommandMinecart extends Minecart {
|
|
* same as setting it to "@".
|
|
*
|
|
* @param name New name for this CommandMinecart.
|
|
+ * @deprecated in favour of {@link #customName(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setName(@Nullable String name);
|
|
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/event/block/SignChangeEvent.java b/src/main/java/org/bukkit/event/block/SignChangeEvent.java
|
|
index 7190db11eff7d48df8a99f405a9dbaefdfa76e3d..c40536f781393cb39e6a1a4ba6e780713d5dc126 100644
|
|
--- a/src/main/java/org/bukkit/event/block/SignChangeEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/block/SignChangeEvent.java
|
|
@@ -16,12 +16,25 @@ public class SignChangeEvent extends BlockEvent implements Cancellable {
|
|
private static final HandlerList handlers = new HandlerList();
|
|
private boolean cancel = false;
|
|
private final Player player;
|
|
- private final String[] lines;
|
|
+ // Paper start
|
|
+ private final java.util.List<net.kyori.adventure.text.Component> adventure$lines;
|
|
|
|
+ public SignChangeEvent(@NotNull final Block theBlock, @NotNull final Player player, @NotNull final java.util.List<net.kyori.adventure.text.Component> adventure$lines) {
|
|
+ super(theBlock);
|
|
+ this.player = player;
|
|
+ this.adventure$lines = adventure$lines;
|
|
+ }
|
|
+
|
|
+ @Deprecated // Paper end
|
|
public SignChangeEvent(@NotNull final Block theBlock, @NotNull final Player thePlayer, @NotNull final String[] theLines) {
|
|
super(theBlock);
|
|
this.player = thePlayer;
|
|
- this.lines = theLines;
|
|
+ // Paper start
|
|
+ this.adventure$lines = new java.util.ArrayList<>();
|
|
+ for (String theLine : theLines) {
|
|
+ this.adventure$lines.add(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(theLine));
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
|
|
/**
|
|
@@ -34,14 +47,52 @@ public class SignChangeEvent extends BlockEvent implements Cancellable {
|
|
return player;
|
|
}
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets all of the lines of text from the sign involved in this event.
|
|
+ *
|
|
+ * @return the String array for the sign's lines new text
|
|
+ */
|
|
+ public @NotNull java.util.List<net.kyori.adventure.text.Component> lines() {
|
|
+ return this.adventure$lines;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets a single line of text from the sign involved in this event.
|
|
+ *
|
|
+ * @param index index of the line to get
|
|
+ * @return the String containing the line of text associated with the
|
|
+ * provided index
|
|
+ * @throws IndexOutOfBoundsException thrown when the provided index is {@literal > 3
|
|
+ * or < 0}
|
|
+ */
|
|
+ public net.kyori.adventure.text.@Nullable Component line(int index) throws IndexOutOfBoundsException {
|
|
+ return this.adventure$lines.get(index);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets a single line for the sign involved in this event
|
|
+ *
|
|
+ * @param index index of the line to set
|
|
+ * @param line text to set
|
|
+ * @throws IndexOutOfBoundsException thrown when the provided index is {@literal > 3
|
|
+ * or < 0}
|
|
+ */
|
|
+ public void line(int index, net.kyori.adventure.text.@Nullable Component line) throws IndexOutOfBoundsException {
|
|
+ this.adventure$lines.set(index, line);
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Gets all of the lines of text from the sign involved in this event.
|
|
*
|
|
* @return the String array for the sign's lines new text
|
|
+ * @deprecated in favour of {@link #lines()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public String[] getLines() {
|
|
- return lines;
|
|
+ return adventure$lines.stream().map(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection()::serialize).toArray(String[]::new); // Paper
|
|
}
|
|
|
|
/**
|
|
@@ -52,10 +103,12 @@ public class SignChangeEvent extends BlockEvent implements Cancellable {
|
|
* provided index
|
|
* @throws IndexOutOfBoundsException thrown when the provided index is {@literal > 3
|
|
* or < 0}
|
|
+ * @deprecated in favour of {@link #line(int)}
|
|
*/
|
|
@Nullable
|
|
+ @Deprecated // Paper
|
|
public String getLine(int index) throws IndexOutOfBoundsException {
|
|
- return lines[index];
|
|
+ return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(this.adventure$lines.get(index)); // Paper
|
|
}
|
|
|
|
/**
|
|
@@ -65,9 +118,11 @@ public class SignChangeEvent extends BlockEvent implements Cancellable {
|
|
* @param line text to set
|
|
* @throws IndexOutOfBoundsException thrown when the provided index is {@literal > 3
|
|
* or < 0}
|
|
+ * @deprecated in favour of {@link #line(int, net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setLine(int index, @Nullable String line) throws IndexOutOfBoundsException {
|
|
- lines[index] = line;
|
|
+ adventure$lines.set(index, line != null ? net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(line) : null); // Paper
|
|
}
|
|
|
|
@Override
|
|
diff --git a/src/main/java/org/bukkit/event/entity/PlayerDeathEvent.java b/src/main/java/org/bukkit/event/entity/PlayerDeathEvent.java
|
|
index 3c2ea8fec3a748cab7f5ad9100d12bd8213ec6c9..a803bfea5400b3578bb4cf3261874e873b6467d9 100644
|
|
--- a/src/main/java/org/bukkit/event/entity/PlayerDeathEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/entity/PlayerDeathEvent.java
|
|
@@ -12,25 +12,48 @@ import org.jetbrains.annotations.Nullable;
|
|
public class PlayerDeathEvent extends EntityDeathEvent {
|
|
private int newExp = 0;
|
|
private String deathMessage = "";
|
|
+ private net.kyori.adventure.text.Component adventure$deathMessage; // Paper
|
|
private int newLevel = 0;
|
|
private int newTotalExp = 0;
|
|
private boolean keepLevel = false;
|
|
private boolean keepInventory = false;
|
|
+ // Paper start
|
|
+ public PlayerDeathEvent(@NotNull final Player player, @NotNull final List<ItemStack> drops, final int droppedExp, @Nullable final net.kyori.adventure.text.Component adventure$deathMessage) {
|
|
+ this(player, drops, droppedExp, 0, adventure$deathMessage, null);
|
|
+ }
|
|
+
|
|
+ public PlayerDeathEvent(@NotNull final Player player, @NotNull final List<ItemStack> drops, final int droppedExp, final int newExp, @Nullable final net.kyori.adventure.text.Component adventure$deathMessage, @Nullable String deathMessage) {
|
|
+ this(player, drops, droppedExp, newExp, 0, 0, adventure$deathMessage, deathMessage);
|
|
+ }
|
|
|
|
+ public PlayerDeathEvent(@NotNull final Player player, @NotNull final List<ItemStack> drops, final int droppedExp, final int newExp, final int newTotalExp, final int newLevel, @Nullable final net.kyori.adventure.text.Component adventure$deathMessage, @Nullable String deathMessage) {
|
|
+ super(player, drops, droppedExp);
|
|
+ this.newExp = newExp;
|
|
+ this.newTotalExp = newTotalExp;
|
|
+ this.newLevel = newLevel;
|
|
+ this.deathMessage = deathMessage;
|
|
+ this.adventure$deathMessage = adventure$deathMessage;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
+ @Deprecated // Paper
|
|
public PlayerDeathEvent(@NotNull final Player player, @NotNull final List<ItemStack> drops, final int droppedExp, @Nullable final String deathMessage) {
|
|
this(player, drops, droppedExp, 0, deathMessage);
|
|
}
|
|
|
|
+ @Deprecated // Paper
|
|
public PlayerDeathEvent(@NotNull final Player player, @NotNull final List<ItemStack> drops, final int droppedExp, final int newExp, @Nullable final String deathMessage) {
|
|
this(player, drops, droppedExp, newExp, 0, 0, deathMessage);
|
|
}
|
|
|
|
+ @Deprecated // Paper
|
|
public PlayerDeathEvent(@NotNull final Player player, @NotNull final List<ItemStack> drops, final int droppedExp, final int newExp, final int newTotalExp, final int newLevel, @Nullable final String deathMessage) {
|
|
super(player, drops, droppedExp);
|
|
this.newExp = newExp;
|
|
this.newTotalExp = newTotalExp;
|
|
this.newLevel = newLevel;
|
|
this.deathMessage = deathMessage;
|
|
+ this.adventure$deathMessage = deathMessage != null ? net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(deathMessage) : null; // Paper
|
|
}
|
|
|
|
@NotNull
|
|
@@ -39,25 +62,55 @@ public class PlayerDeathEvent extends EntityDeathEvent {
|
|
return (Player) entity;
|
|
}
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Set the death message that will appear to everyone on the server.
|
|
+ *
|
|
+ * @param deathMessage Message to appear to other players on the server.
|
|
+ */
|
|
+ public void deathMessage(net.kyori.adventure.text.@Nullable Component deathMessage) {
|
|
+ this.deathMessage = null;
|
|
+ this.adventure$deathMessage = deathMessage;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get the death message that will appear to everyone on the server.
|
|
+ *
|
|
+ * @return Message to appear to other players on the server.
|
|
+ */
|
|
+ public net.kyori.adventure.text.@Nullable Component deathMessage() {
|
|
+ return this.adventure$deathMessage;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Set the death message that will appear to everyone on the server.
|
|
*
|
|
* @param deathMessage Message to appear to other players on the server.
|
|
+ * @deprecated in favour of {@link #deathMessage(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setDeathMessage(@Nullable String deathMessage) {
|
|
this.deathMessage = deathMessage;
|
|
+ this.adventure$deathMessage = deathMessage != null ? net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(deathMessage) : null; // Paper
|
|
}
|
|
|
|
/**
|
|
* Get the death message that will appear to everyone on the server.
|
|
*
|
|
* @return Message to appear to other players on the server.
|
|
+ * @deprecated in favour of {@link #deathMessage()}
|
|
*/
|
|
@Nullable
|
|
+ @Deprecated // Paper
|
|
public String getDeathMessage() {
|
|
- return deathMessage;
|
|
+ return this.deathMessage != null ? this.deathMessage : (this.adventure$deathMessage != null ? getDeathMessageString(this.adventure$deathMessage) : null); // Paper
|
|
}
|
|
-
|
|
+ // Paper start //TODO: add translation API to drop String deathMessage in favor of just Adventure
|
|
+ private static String getDeathMessageString(net.kyori.adventure.text.Component component) {
|
|
+ return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(component);
|
|
+ }
|
|
+ // Paper end
|
|
/**
|
|
* Gets how much EXP the Player should have at respawn.
|
|
* <p>
|
|
diff --git a/src/main/java/org/bukkit/event/inventory/InventoryType.java b/src/main/java/org/bukkit/event/inventory/InventoryType.java
|
|
index 629c1bf79ca3577c51d17ef8c9d36f84b1a2c360..2186507089384cb9805057c7cc1795fba7de1df3 100644
|
|
--- a/src/main/java/org/bukkit/event/inventory/InventoryType.java
|
|
+++ b/src/main/java/org/bukkit/event/inventory/InventoryType.java
|
|
@@ -155,6 +155,18 @@ public enum InventoryType {
|
|
private final String title;
|
|
private final boolean isCreatable;
|
|
|
|
+ // Paper start
|
|
+ private final net.kyori.adventure.text.Component defaultTitleComponent;
|
|
+
|
|
+ /**
|
|
+ * Gets the inventory's default title.
|
|
+ *
|
|
+ * @return the inventory's default title
|
|
+ */
|
|
+ public net.kyori.adventure.text.@NotNull Component defaultTitle() {
|
|
+ return defaultTitleComponent;
|
|
+ }
|
|
+ // Paper end
|
|
private InventoryType(int defaultSize, /*@NotNull*/ String defaultTitle) {
|
|
this(defaultSize, defaultTitle, true);
|
|
}
|
|
@@ -163,6 +175,7 @@ public enum InventoryType {
|
|
size = defaultSize;
|
|
title = defaultTitle;
|
|
this.isCreatable = isCreatable;
|
|
+ this.defaultTitleComponent = net.kyori.adventure.text.Component.text(defaultTitle); // Paper - Adventure
|
|
}
|
|
|
|
public int getDefaultSize() {
|
|
@@ -170,6 +183,7 @@ public enum InventoryType {
|
|
}
|
|
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public String getDefaultTitle() {
|
|
return title;
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/event/player/AsyncPlayerChatEvent.java b/src/main/java/org/bukkit/event/player/AsyncPlayerChatEvent.java
|
|
index 9c68c3f2d61500479f48b80264f625aaae2f3204..399afcd19fcb6acd24857ed6ab48cf0d105a01a3 100644
|
|
--- a/src/main/java/org/bukkit/event/player/AsyncPlayerChatEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/player/AsyncPlayerChatEvent.java
|
|
@@ -22,7 +22,11 @@ import org.jetbrains.annotations.NotNull;
|
|
* <p>
|
|
* Care should be taken to check {@link #isAsynchronous()} and treat the event
|
|
* appropriately.
|
|
+ *
|
|
+ * @deprecated use {@link io.papermc.paper.event.player.AsyncChatEvent} instead
|
|
*/
|
|
+@Deprecated // Paper
|
|
+@org.bukkit.Warning(value = false, reason = "Don't nag on old event yet") // Paper
|
|
public class AsyncPlayerChatEvent extends PlayerEvent implements Cancellable {
|
|
private static final HandlerList handlers = new HandlerList();
|
|
private boolean cancel = false;
|
|
diff --git a/src/main/java/org/bukkit/event/player/AsyncPlayerPreLoginEvent.java b/src/main/java/org/bukkit/event/player/AsyncPlayerPreLoginEvent.java
|
|
index 9866c07c999f46cb585709804aaad710c3031d5a..c7c45e2de8cca1bf8b8e12752e08db62403efa6a 100644
|
|
--- a/src/main/java/org/bukkit/event/player/AsyncPlayerPreLoginEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/player/AsyncPlayerPreLoginEvent.java
|
|
@@ -14,7 +14,7 @@ import org.jetbrains.annotations.NotNull;
|
|
public class AsyncPlayerPreLoginEvent extends Event {
|
|
private static final HandlerList handlers = new HandlerList();
|
|
private Result result;
|
|
- private String message;
|
|
+ private net.kyori.adventure.text.Component message; // Paper
|
|
private final String name;
|
|
private final InetAddress ipAddress;
|
|
private final UUID uniqueId;
|
|
@@ -27,7 +27,7 @@ public class AsyncPlayerPreLoginEvent extends Event {
|
|
public AsyncPlayerPreLoginEvent(@NotNull final String name, @NotNull final InetAddress ipAddress, @NotNull final UUID uniqueId) {
|
|
super(true);
|
|
this.result = Result.ALLOWED;
|
|
- this.message = "";
|
|
+ this.message = net.kyori.adventure.text.Component.empty(); // Paper
|
|
this.name = name;
|
|
this.ipAddress = ipAddress;
|
|
this.uniqueId = uniqueId;
|
|
@@ -79,6 +79,7 @@ public class AsyncPlayerPreLoginEvent extends Event {
|
|
this.result = result == null ? null : Result.valueOf(result.name());
|
|
}
|
|
|
|
+ // Paper start
|
|
/**
|
|
* Gets the current kick message that will be used if getResult() !=
|
|
* Result.ALLOWED
|
|
@@ -86,7 +87,7 @@ public class AsyncPlayerPreLoginEvent extends Event {
|
|
* @return Current kick message
|
|
*/
|
|
@NotNull
|
|
- public String getKickMessage() {
|
|
+ public net.kyori.adventure.text.Component kickMessage() {
|
|
return message;
|
|
}
|
|
|
|
@@ -95,16 +96,66 @@ public class AsyncPlayerPreLoginEvent extends Event {
|
|
*
|
|
* @param message New kick message
|
|
*/
|
|
- public void setKickMessage(@NotNull final String message) {
|
|
+ public void kickMessage(@NotNull final net.kyori.adventure.text.Component message) {
|
|
+ this.message = message;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Disallows the player from logging in, with the given reason
|
|
+ *
|
|
+ * @param result New result for disallowing the player
|
|
+ * @param message Kick message to display to the user
|
|
+ */
|
|
+ public void disallow(@NotNull final Result result, @NotNull final net.kyori.adventure.text.Component message) {
|
|
+ this.result = result;
|
|
this.message = message;
|
|
}
|
|
|
|
+ /**
|
|
+ * Disallows the player from logging in, with the given reason
|
|
+ *
|
|
+ * @param result New result for disallowing the player
|
|
+ * @param message Kick message to display to the user
|
|
+ * @deprecated This method uses a deprecated enum from {@link
|
|
+ * PlayerPreLoginEvent}
|
|
+ * @see #disallow(Result, String)
|
|
+ */
|
|
+ @Deprecated
|
|
+ public void disallow(@NotNull final PlayerPreLoginEvent.Result result, @NotNull final net.kyori.adventure.text.Component message) {
|
|
+ this.result = result == null ? null : Result.valueOf(result.name());
|
|
+ this.message = message;
|
|
+ }
|
|
+ // Paper end
|
|
+ /**
|
|
+ * Gets the current kick message that will be used if getResult() !=
|
|
+ * Result.ALLOWED
|
|
+ *
|
|
+ * @return Current kick message
|
|
+ * @deprecated in favour of {@link #kickMessage()}
|
|
+ */
|
|
+ @NotNull
|
|
+ @Deprecated // Paper
|
|
+ public String getKickMessage() {
|
|
+ return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(this.message); // Paper
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the kick message to display if getResult() != Result.ALLOWED
|
|
+ *
|
|
+ * @param message New kick message
|
|
+ * @deprecated in favour of {@link #kickMessage(net.kyori.adventure.text.Component)}
|
|
+ */
|
|
+ @Deprecated // Paper
|
|
+ public void setKickMessage(@NotNull final String message) {
|
|
+ this.message = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(message); // Paper
|
|
+ }
|
|
+
|
|
/**
|
|
* Allows the player to log in
|
|
*/
|
|
public void allow() {
|
|
result = Result.ALLOWED;
|
|
- message = "";
|
|
+ message = net.kyori.adventure.text.Component.empty(); // Paper
|
|
}
|
|
|
|
/**
|
|
@@ -112,10 +163,12 @@ public class AsyncPlayerPreLoginEvent extends Event {
|
|
*
|
|
* @param result New result for disallowing the player
|
|
* @param message Kick message to display to the user
|
|
+ * @deprecated in favour of {@link #disallow(org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result, net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void disallow(@NotNull final Result result, @NotNull final String message) {
|
|
this.result = result;
|
|
- this.message = message;
|
|
+ this.message = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(message); // Paper
|
|
}
|
|
|
|
/**
|
|
@@ -130,7 +183,7 @@ public class AsyncPlayerPreLoginEvent extends Event {
|
|
@Deprecated
|
|
public void disallow(@NotNull final PlayerPreLoginEvent.Result result, @NotNull final String message) {
|
|
this.result = result == null ? null : Result.valueOf(result.name());
|
|
- this.message = message;
|
|
+ this.message = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(message); // Paper
|
|
}
|
|
|
|
/**
|
|
diff --git a/src/main/java/org/bukkit/event/player/PlayerChatEvent.java b/src/main/java/org/bukkit/event/player/PlayerChatEvent.java
|
|
index a1f4261eaa1497554f1e51d1d5a072c2eb9226df..3a1da86e3dbf18c6e1040086c1df4b8976bc2b9d 100644
|
|
--- a/src/main/java/org/bukkit/event/player/PlayerChatEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/player/PlayerChatEvent.java
|
|
@@ -18,6 +18,7 @@ import org.jetbrains.annotations.NotNull;
|
|
* Listening to this event forces chat to wait for the main thread which
|
|
* causes delays for chat. {@link AsyncPlayerChatEvent} is the encouraged
|
|
* alternative for thread safe implementations.
|
|
+ * @deprecated use {@link io.papermc.paper.event.player.ChatEvent} instead
|
|
*/
|
|
@Deprecated
|
|
@Warning(reason = "Listening to this event forces chat to wait for the main thread, delaying chat messages.")
|
|
diff --git a/src/main/java/org/bukkit/event/player/PlayerEvent.java b/src/main/java/org/bukkit/event/player/PlayerEvent.java
|
|
index 793b661b6d2d05de3d7f4fc26a4c018a2af58e62..f6d3b817de3001f04ea4554c7c39a1290af3fd6d 100644
|
|
--- a/src/main/java/org/bukkit/event/player/PlayerEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/player/PlayerEvent.java
|
|
@@ -14,7 +14,7 @@ public abstract class PlayerEvent extends Event {
|
|
player = who;
|
|
}
|
|
|
|
- PlayerEvent(@NotNull final Player who, boolean async) {
|
|
+ public PlayerEvent(@NotNull final Player who, boolean async) { // Paper - public
|
|
super(async);
|
|
player = who;
|
|
|
|
diff --git a/src/main/java/org/bukkit/event/player/PlayerJoinEvent.java b/src/main/java/org/bukkit/event/player/PlayerJoinEvent.java
|
|
index d06684aba7688ce06777dbd837a46856a9d7767f..3e1e7cd0415509da4dd887db59efa55011b1dab4 100644
|
|
--- a/src/main/java/org/bukkit/event/player/PlayerJoinEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/player/PlayerJoinEvent.java
|
|
@@ -10,30 +10,60 @@ import org.jetbrains.annotations.Nullable;
|
|
*/
|
|
public class PlayerJoinEvent extends PlayerEvent {
|
|
private static final HandlerList handlers = new HandlerList();
|
|
- private String joinMessage;
|
|
+ // Paper start
|
|
+ private net.kyori.adventure.text.Component joinMessage;
|
|
+ public PlayerJoinEvent(@NotNull final Player playerJoined, @Nullable final net.kyori.adventure.text.Component joinMessage) {
|
|
+ super(playerJoined);
|
|
+ this.joinMessage = joinMessage;
|
|
+ }
|
|
|
|
+ @Deprecated // Paper end
|
|
public PlayerJoinEvent(@NotNull final Player playerJoined, @Nullable final String joinMessage) {
|
|
super(playerJoined);
|
|
+ this.joinMessage = joinMessage != null ? net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(joinMessage) : null; // Paper end
|
|
+ }
|
|
+
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the join message to send to all online players
|
|
+ *
|
|
+ * @return string join message. Can be null
|
|
+ */
|
|
+ public net.kyori.adventure.text.@Nullable Component joinMessage() {
|
|
+ return this.joinMessage;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the join message to send to all online players
|
|
+ *
|
|
+ * @param joinMessage join message. If null, no message will be sent
|
|
+ */
|
|
+ public void joinMessage(net.kyori.adventure.text.@Nullable Component joinMessage) {
|
|
this.joinMessage = joinMessage;
|
|
}
|
|
+ // Paper end
|
|
|
|
/**
|
|
* Gets the join message to send to all online players
|
|
*
|
|
* @return string join message. Can be null
|
|
+ * @deprecated in favour of {@link #joinMessage()}
|
|
*/
|
|
@Nullable
|
|
+ @Deprecated // Paper
|
|
public String getJoinMessage() {
|
|
- return joinMessage;
|
|
+ return this.joinMessage == null ? null : net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(this.joinMessage); // Paper
|
|
}
|
|
|
|
/**
|
|
* Sets the join message to send to all online players
|
|
*
|
|
* @param joinMessage join message. If null, no message will be sent
|
|
+ * @deprecated in favour of {@link #joinMessage(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setJoinMessage(@Nullable String joinMessage) {
|
|
- this.joinMessage = joinMessage;
|
|
+ this.joinMessage = joinMessage != null ? net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(joinMessage) : null; // Paper
|
|
}
|
|
|
|
@NotNull
|
|
diff --git a/src/main/java/org/bukkit/event/player/PlayerKickEvent.java b/src/main/java/org/bukkit/event/player/PlayerKickEvent.java
|
|
index 2f6ca42330675733b2b4132cbb66e433788d05d5..997b06c19a5277656521e0e298f2958c209f1da1 100644
|
|
--- a/src/main/java/org/bukkit/event/player/PlayerKickEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/player/PlayerKickEvent.java
|
|
@@ -10,35 +10,84 @@ import org.jetbrains.annotations.NotNull;
|
|
*/
|
|
public class PlayerKickEvent extends PlayerEvent implements Cancellable {
|
|
private static final HandlerList handlers = new HandlerList();
|
|
- private String leaveMessage;
|
|
- private String kickReason;
|
|
+ private net.kyori.adventure.text.Component leaveMessage; // Paper
|
|
+ private net.kyori.adventure.text.Component kickReason; // Paper
|
|
private boolean cancel;
|
|
|
|
+ @Deprecated // Paper
|
|
public PlayerKickEvent(@NotNull final Player playerKicked, @NotNull final String kickReason, @NotNull final String leaveMessage) {
|
|
+ super(playerKicked);
|
|
+ this.kickReason = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(kickReason); // Paper
|
|
+ this.leaveMessage = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(leaveMessage); // Paper
|
|
+ this.cancel = false;
|
|
+ }
|
|
+ // Paper start
|
|
+ public PlayerKickEvent(@NotNull final Player playerKicked, @NotNull final net.kyori.adventure.text.Component kickReason, @NotNull final net.kyori.adventure.text.Component leaveMessage) {
|
|
super(playerKicked);
|
|
this.kickReason = kickReason;
|
|
this.leaveMessage = leaveMessage;
|
|
this.cancel = false;
|
|
}
|
|
|
|
+ /**
|
|
+ * Gets the leave message send to all online players
|
|
+ *
|
|
+ * @return string kick reason
|
|
+ */
|
|
+ public net.kyori.adventure.text.@NotNull Component leaveMessage() {
|
|
+ return this.leaveMessage;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the leave message send to all online players
|
|
+ *
|
|
+ * @param leaveMessage leave message
|
|
+ */
|
|
+ public void leaveMessage(net.kyori.adventure.text.@NotNull Component leaveMessage) {
|
|
+ this.leaveMessage = leaveMessage;
|
|
+ }
|
|
+
|
|
/**
|
|
* Gets the reason why the player is getting kicked
|
|
*
|
|
* @return string kick reason
|
|
*/
|
|
+ public net.kyori.adventure.text.@NotNull Component reason() {
|
|
+ return this.kickReason;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the reason why the player is getting kicked
|
|
+ *
|
|
+ * @param kickReason kick reason
|
|
+ */
|
|
+ public void reason(net.kyori.adventure.text.@NotNull Component kickReason) {
|
|
+ this.kickReason = kickReason;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
+ /**
|
|
+ * Gets the reason why the player is getting kicked
|
|
+ *
|
|
+ * @return string kick reason
|
|
+ * @deprecated in favour of {@link #reason()}
|
|
+ */
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public String getReason() {
|
|
- return kickReason;
|
|
+ return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(this.kickReason); // Paper
|
|
}
|
|
|
|
/**
|
|
* Gets the leave message send to all online players
|
|
*
|
|
* @return string kick reason
|
|
+ * @deprecated in favour of {@link #leaveMessage()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public String getLeaveMessage() {
|
|
- return leaveMessage;
|
|
+ return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(this.leaveMessage); // Paper
|
|
}
|
|
|
|
@Override
|
|
@@ -55,18 +104,22 @@ public class PlayerKickEvent extends PlayerEvent implements Cancellable {
|
|
* Sets the reason why the player is getting kicked
|
|
*
|
|
* @param kickReason kick reason
|
|
+ * @deprecated in favour of {@link #reason(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setReason(@NotNull String kickReason) {
|
|
- this.kickReason = kickReason;
|
|
+ this.kickReason = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(kickReason); // Paper
|
|
}
|
|
|
|
/**
|
|
* Sets the leave message send to all online players
|
|
*
|
|
* @param leaveMessage leave message
|
|
+ * @deprecated in favour of {@link #leaveMessage(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setLeaveMessage(@NotNull String leaveMessage) {
|
|
- this.leaveMessage = leaveMessage;
|
|
+ this.leaveMessage = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(leaveMessage); // Paper
|
|
}
|
|
|
|
@NotNull
|
|
diff --git a/src/main/java/org/bukkit/event/player/PlayerLocaleChangeEvent.java b/src/main/java/org/bukkit/event/player/PlayerLocaleChangeEvent.java
|
|
index 36b436e145a7215682b692a87ab894df25752c1d..ebd499c1a2d11ea068e8c374edbc3967e4cece3d 100644
|
|
--- a/src/main/java/org/bukkit/event/player/PlayerLocaleChangeEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/player/PlayerLocaleChangeEvent.java
|
|
@@ -12,17 +12,31 @@ public class PlayerLocaleChangeEvent extends PlayerEvent {
|
|
private static final HandlerList handlers = new HandlerList();
|
|
//
|
|
private final String locale;
|
|
+ // Paper start
|
|
+ private final java.util.Locale adventure$locale;
|
|
+ /**
|
|
+ * @see Player#getLocale()
|
|
+ *
|
|
+ * @return the player's new locale
|
|
+ */
|
|
+ public @NotNull java.util.Locale locale() {
|
|
+ return this.adventure$locale;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
public PlayerLocaleChangeEvent(@NotNull Player who, @NotNull String locale) {
|
|
super(who);
|
|
this.locale = locale;
|
|
+ this.adventure$locale = net.kyori.adventure.translation.Translator.parseLocale(locale); // Paper
|
|
}
|
|
|
|
/**
|
|
* @return the player's new locale
|
|
* @see Player#getLocale()
|
|
+ * @deprecated in favour of {@link #locale()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public String getLocale() {
|
|
return locale;
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/event/player/PlayerLoginEvent.java b/src/main/java/org/bukkit/event/player/PlayerLoginEvent.java
|
|
index 084ca8cfcb7381bfa4fa6280748cf9b81210a9c1..62fb782baad5c80a3daaa557c0faa674c58a98cf 100644
|
|
--- a/src/main/java/org/bukkit/event/player/PlayerLoginEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/player/PlayerLoginEvent.java
|
|
@@ -17,7 +17,7 @@ public class PlayerLoginEvent extends PlayerEvent {
|
|
private final InetAddress address;
|
|
private final String hostname;
|
|
private Result result = Result.ALLOWED;
|
|
- private String message = "";
|
|
+ private net.kyori.adventure.text.Component message = net.kyori.adventure.text.Component.empty();
|
|
private final InetAddress realAddress; // Spigot
|
|
|
|
/**
|
|
@@ -53,12 +53,52 @@ public class PlayerLoginEvent extends PlayerEvent {
|
|
* @param result The result status for this event
|
|
* @param message The message to be displayed if result denies login
|
|
* @param realAddress the actual, unspoofed connecting address
|
|
+ * @deprecated in favour of {@link #PlayerLoginEvent(Player, String, InetAddress, Result, net.kyori.adventure.text.Component, InetAddress)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public PlayerLoginEvent(@NotNull final Player player, @NotNull String hostname, @NotNull final InetAddress address, @NotNull final Result result, @NotNull final String message, @NotNull final InetAddress realAddress) { // Spigot
|
|
this(player, hostname, address, realAddress); // Spigot
|
|
this.result = result;
|
|
+ this.message = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(message); // Paper
|
|
+ }
|
|
+
|
|
+ // Paper start
|
|
+ /**
|
|
+ * This constructor pre-configures the event with a result and message
|
|
+ *
|
|
+ * @param player The {@link Player} for this event
|
|
+ * @param hostname The hostname that was used to connect to the server
|
|
+ * @param address The address the player used to connect, provided for
|
|
+ * timing issues
|
|
+ * @param result The result status for this event
|
|
+ * @param message The message to be displayed if result denies login
|
|
+ * @param realAddress the actual, unspoofed connecting address
|
|
+ */
|
|
+ public PlayerLoginEvent(@NotNull final Player player, @NotNull String hostname, @NotNull final InetAddress address, @NotNull final Result result, @NotNull final net.kyori.adventure.text.Component message, @NotNull final InetAddress realAddress) { // Spigot
|
|
+ this(player, hostname, address, realAddress); // Spigot
|
|
+ this.result = result;
|
|
+ this.message = message;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the current kick message that will be used if getResult() !=
|
|
+ * Result.ALLOWED
|
|
+ *
|
|
+ * @return Current kick message
|
|
+ */
|
|
+ public net.kyori.adventure.text.@NotNull Component kickMessage() {
|
|
+ return this.message;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the kick message to display if getResult() != Result.ALLOWED
|
|
+ *
|
|
+ * @param message New kick message
|
|
+ */
|
|
+ public void kickMessage(net.kyori.adventure.text.@NotNull Component message) {
|
|
this.message = message;
|
|
}
|
|
+ // Paper end
|
|
|
|
// Spigot start
|
|
/**
|
|
@@ -96,19 +136,23 @@ public class PlayerLoginEvent extends PlayerEvent {
|
|
* Result.ALLOWED
|
|
*
|
|
* @return Current kick message
|
|
+ * @deprecated in favour of {@link #kickMessage()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public String getKickMessage() {
|
|
- return message;
|
|
+ return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(this.message); // Paper
|
|
}
|
|
|
|
/**
|
|
* Sets the kick message to display if getResult() != Result.ALLOWED
|
|
*
|
|
* @param message New kick message
|
|
+ * @deprecated in favour of {@link #kickMessage(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setKickMessage(@NotNull final String message) {
|
|
- this.message = message;
|
|
+ this.message = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(message); // Paper
|
|
}
|
|
|
|
/**
|
|
@@ -127,7 +171,7 @@ public class PlayerLoginEvent extends PlayerEvent {
|
|
*/
|
|
public void allow() {
|
|
result = Result.ALLOWED;
|
|
- message = "";
|
|
+ message = net.kyori.adventure.text.Component.empty(); // Paper
|
|
}
|
|
|
|
/**
|
|
@@ -135,8 +179,21 @@ public class PlayerLoginEvent extends PlayerEvent {
|
|
*
|
|
* @param result New result for disallowing the player
|
|
* @param message Kick message to display to the user
|
|
+ * @deprecated in favour of {@link #disallow(Result, net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper start
|
|
public void disallow(@NotNull final Result result, @NotNull final String message) {
|
|
+ this.result = result;
|
|
+ this.message = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(message);
|
|
+ }
|
|
+ /**
|
|
+ * Disallows the player from logging in, with the given reason
|
|
+ *
|
|
+ * @param result New result for disallowing the player
|
|
+ * @param message Kick message to display to the user
|
|
+ */
|
|
+ public void disallow(@NotNull final Result result, @NotNull final net.kyori.adventure.text.Component message) {
|
|
+ // Paper end
|
|
this.result = result;
|
|
this.message = message;
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/event/player/PlayerPreLoginEvent.java b/src/main/java/org/bukkit/event/player/PlayerPreLoginEvent.java
|
|
index fb066251f793ec3b41bfc075b9478901b15ee549..6800132c6288b4588fd02b08d26f016c38f27129 100644
|
|
--- a/src/main/java/org/bukkit/event/player/PlayerPreLoginEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/player/PlayerPreLoginEvent.java
|
|
@@ -19,7 +19,7 @@ import org.jetbrains.annotations.NotNull;
|
|
public class PlayerPreLoginEvent extends Event {
|
|
private static final HandlerList handlers = new HandlerList();
|
|
private Result result;
|
|
- private String message;
|
|
+ private net.kyori.adventure.text.Component message; // Paper
|
|
private final String name;
|
|
private final InetAddress ipAddress;
|
|
private final UUID uniqueId;
|
|
@@ -31,7 +31,7 @@ public class PlayerPreLoginEvent extends Event {
|
|
|
|
public PlayerPreLoginEvent(@NotNull final String name, @NotNull final InetAddress ipAddress, @NotNull final UUID uniqueId) {
|
|
this.result = Result.ALLOWED;
|
|
- this.message = "";
|
|
+ this.message = net.kyori.adventure.text.Component.empty(); // Paper
|
|
this.name = name;
|
|
this.ipAddress = ipAddress;
|
|
this.uniqueId = uniqueId;
|
|
@@ -56,6 +56,7 @@ public class PlayerPreLoginEvent extends Event {
|
|
this.result = result;
|
|
}
|
|
|
|
+ // Paper start
|
|
/**
|
|
* Gets the current kick message that will be used if getResult() !=
|
|
* Result.ALLOWED
|
|
@@ -63,7 +64,7 @@ public class PlayerPreLoginEvent extends Event {
|
|
* @return Current kick message
|
|
*/
|
|
@NotNull
|
|
- public String getKickMessage() {
|
|
+ public net.kyori.adventure.text.Component kickMessage() {
|
|
return message;
|
|
}
|
|
|
|
@@ -72,16 +73,51 @@ public class PlayerPreLoginEvent extends Event {
|
|
*
|
|
* @param message New kick message
|
|
*/
|
|
- public void setKickMessage(@NotNull final String message) {
|
|
+ public void kickMessage(@NotNull final net.kyori.adventure.text.Component message) {
|
|
this.message = message;
|
|
}
|
|
|
|
+ /**
|
|
+ * Disallows the player from logging in, with the given reason
|
|
+ *
|
|
+ * @param result New result for disallowing the player
|
|
+ * @param message Kick message to display to the user
|
|
+ */
|
|
+ public void disallow(@NotNull final Result result, @NotNull final net.kyori.adventure.text.Component message) {
|
|
+ this.result = result;
|
|
+ this.message = message;
|
|
+ }
|
|
+ // Paper end
|
|
+ /**
|
|
+ * Gets the current kick message that will be used if getResult() !=
|
|
+ * Result.ALLOWED
|
|
+ *
|
|
+ * @return Current kick message
|
|
+ * @deprecated in favour of {@link #kickMessage()}
|
|
+ */
|
|
+ @Deprecated // Paper
|
|
+ @NotNull
|
|
+ public String getKickMessage() {
|
|
+ return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(this.message); // Paper
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the kick message to display if getResult() != Result.ALLOWED
|
|
+ *
|
|
+ * @param message New kick message
|
|
+ * @deprecated in favour of {@link #kickMessage(net.kyori.adventure.text.Component)}
|
|
+ */
|
|
+ @Deprecated // Paper
|
|
+ public void setKickMessage(@NotNull final String message) {
|
|
+ this.message = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(message); // Paper
|
|
+ }
|
|
+
|
|
/**
|
|
* Allows the player to log in
|
|
*/
|
|
public void allow() {
|
|
result = Result.ALLOWED;
|
|
- message = "";
|
|
+ message = net.kyori.adventure.text.Component.empty(); // Paper
|
|
}
|
|
|
|
/**
|
|
@@ -89,10 +125,12 @@ public class PlayerPreLoginEvent extends Event {
|
|
*
|
|
* @param result New result for disallowing the player
|
|
* @param message Kick message to display to the user
|
|
+ * @deprecated in favour of {@link #disallow(org.bukkit.event.player.PlayerPreLoginEvent.Result, net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void disallow(@NotNull final Result result, @NotNull final String message) {
|
|
this.result = result;
|
|
- this.message = message;
|
|
+ this.message = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(message); // Paper
|
|
}
|
|
|
|
/**
|
|
diff --git a/src/main/java/org/bukkit/event/player/PlayerQuitEvent.java b/src/main/java/org/bukkit/event/player/PlayerQuitEvent.java
|
|
index d70c25f404e994766a9ebce89a917c8d0719777c..14b27eaaf744736b3e56bb1383481df98a218c43 100644
|
|
--- a/src/main/java/org/bukkit/event/player/PlayerQuitEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/player/PlayerQuitEvent.java
|
|
@@ -10,30 +10,59 @@ import org.jetbrains.annotations.Nullable;
|
|
*/
|
|
public class PlayerQuitEvent extends PlayerEvent {
|
|
private static final HandlerList handlers = new HandlerList();
|
|
- private String quitMessage;
|
|
+ private net.kyori.adventure.text.Component quitMessage; // Paper
|
|
|
|
+ @Deprecated // Paper
|
|
public PlayerQuitEvent(@NotNull final Player who, @Nullable final String quitMessage) {
|
|
super(who);
|
|
+ this.quitMessage = quitMessage != null ? net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(quitMessage) : null; // Paper
|
|
+ }
|
|
+ // Paper start
|
|
+ public PlayerQuitEvent(@NotNull final Player who, @Nullable final net.kyori.adventure.text.Component quitMessage) {
|
|
+ super(who);
|
|
+ this.quitMessage = quitMessage;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Gets the quit message to send to all online players
|
|
+ *
|
|
+ * @return string quit message
|
|
+ */
|
|
+ public net.kyori.adventure.text.@Nullable Component quitMessage() {
|
|
+ return quitMessage;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Sets the quit message to send to all online players
|
|
+ *
|
|
+ * @param quitMessage quit message
|
|
+ */
|
|
+ public void quitMessage(net.kyori.adventure.text.@Nullable Component quitMessage) {
|
|
this.quitMessage = quitMessage;
|
|
}
|
|
+ // Paper end
|
|
|
|
/**
|
|
* Gets the quit message to send to all online players
|
|
*
|
|
* @return string quit message
|
|
+ * @deprecated in favour of {@link #quitMessage()}
|
|
*/
|
|
@Nullable
|
|
+ @Deprecated // Paper
|
|
public String getQuitMessage() {
|
|
- return quitMessage;
|
|
+ return this.quitMessage == null ? null : net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(this.quitMessage); // Paper
|
|
}
|
|
|
|
/**
|
|
* Sets the quit message to send to all online players
|
|
*
|
|
* @param quitMessage quit message
|
|
+ * @deprecated in favour of {@link #quitMessage(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setQuitMessage(@Nullable String quitMessage) {
|
|
- this.quitMessage = quitMessage;
|
|
+ this.quitMessage = quitMessage != null ? net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(quitMessage) : null; // Paper
|
|
}
|
|
|
|
@NotNull
|
|
diff --git a/src/main/java/org/bukkit/event/server/BroadcastMessageEvent.java b/src/main/java/org/bukkit/event/server/BroadcastMessageEvent.java
|
|
index 03bfca9d368bbe4b7c1353d52c883e756bf69bda..1bfd8ba2a9fa16f2084ad36515644f6af79fdced 100644
|
|
--- a/src/main/java/org/bukkit/event/server/BroadcastMessageEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/server/BroadcastMessageEvent.java
|
|
@@ -18,7 +18,7 @@ import org.jetbrains.annotations.NotNull;
|
|
public class BroadcastMessageEvent extends ServerEvent implements Cancellable {
|
|
|
|
private static final HandlerList handlers = new HandlerList();
|
|
- private String message;
|
|
+ private net.kyori.adventure.text.Component message; // Paper
|
|
private final Set<CommandSender> recipients;
|
|
private boolean cancelled = false;
|
|
|
|
@@ -27,29 +27,66 @@ public class BroadcastMessageEvent extends ServerEvent implements Cancellable {
|
|
this(false, message, recipients);
|
|
}
|
|
|
|
+ @Deprecated // Paper
|
|
public BroadcastMessageEvent(boolean isAsync, @NotNull String message, @NotNull Set<CommandSender> recipients) {
|
|
+ // Paper start
|
|
+ super(isAsync);
|
|
+ this.message = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(message);
|
|
+ this.recipients = recipients;
|
|
+ }
|
|
+
|
|
+ @Deprecated
|
|
+ public BroadcastMessageEvent(net.kyori.adventure.text.@NotNull Component message, @NotNull Set<CommandSender> recipients) {
|
|
+ this(false, message, recipients);
|
|
+ }
|
|
+
|
|
+ public BroadcastMessageEvent(boolean isAsync, net.kyori.adventure.text.@NotNull Component message, @NotNull Set<CommandSender> recipients) {
|
|
+ // Paper end
|
|
super(isAsync);
|
|
this.message = message;
|
|
this.recipients = recipients;
|
|
}
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Get the broadcast message.
|
|
+ *
|
|
+ * @return Message to broadcast
|
|
+ */
|
|
+ public net.kyori.adventure.text.@NotNull Component message() {
|
|
+ return this.message;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Set the broadcast message.
|
|
+ *
|
|
+ * @param message New message to broadcast
|
|
+ */
|
|
+ public void message(net.kyori.adventure.text.@NotNull Component message) {
|
|
+ this.message = message;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
/**
|
|
* Get the message to broadcast.
|
|
*
|
|
* @return Message to broadcast
|
|
+ * @deprecated in favour of {@link #message()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public String getMessage() {
|
|
- return message;
|
|
+ return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(this.message); // Paper
|
|
}
|
|
|
|
/**
|
|
* Set the message to broadcast.
|
|
*
|
|
* @param message New message to broadcast
|
|
+ * @deprecated in favour of {@link #message(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setMessage(@NotNull String message) {
|
|
- this.message = message;
|
|
+ this.message = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(message); // Paper
|
|
}
|
|
|
|
/**
|
|
diff --git a/src/main/java/org/bukkit/event/server/ServerListPingEvent.java b/src/main/java/org/bukkit/event/server/ServerListPingEvent.java
|
|
index 5adbe0514129abf3cfbc4b29a213f522359fe2e1..72ebc29db42d08d1d0361dba462fc8a573fbf918 100644
|
|
--- a/src/main/java/org/bukkit/event/server/ServerListPingEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/server/ServerListPingEvent.java
|
|
@@ -22,7 +22,7 @@ public class ServerListPingEvent extends ServerEvent implements Iterable<Player>
|
|
private static final HandlerList handlers = new HandlerList();
|
|
private final String hostname;
|
|
private final InetAddress address;
|
|
- private String motd;
|
|
+ private net.kyori.adventure.text.Component motd; // Paper
|
|
private final int numPlayers;
|
|
private int maxPlayers;
|
|
|
|
@@ -31,7 +31,7 @@ public class ServerListPingEvent extends ServerEvent implements Iterable<Player>
|
|
Preconditions.checkArgument(numPlayers >= 0, "Cannot have negative number of players online", numPlayers);
|
|
this.hostname = hostname;
|
|
this.address = address;
|
|
- this.motd = motd;
|
|
+ this.motd = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(motd); // Paper
|
|
this.numPlayers = numPlayers;
|
|
this.maxPlayers = maxPlayers;
|
|
}
|
|
@@ -45,15 +45,80 @@ public class ServerListPingEvent extends ServerEvent implements Iterable<Player>
|
|
* @param address the address of the pinger
|
|
* @param motd the message of the day
|
|
* @param maxPlayers the max number of players
|
|
+ * @deprecated in favour of {@link #ServerListPingEvent(String, java.net.InetAddress, net.kyori.adventure.text.Component, int)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
protected ServerListPingEvent(@NotNull final String hostname, @NotNull final InetAddress address, @NotNull final String motd, final int maxPlayers) {
|
|
super(true);
|
|
this.numPlayers = MAGIC_PLAYER_COUNT;
|
|
this.hostname = hostname;
|
|
this.address = address;
|
|
+ this.motd = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(motd); // Paper
|
|
+ this.maxPlayers = maxPlayers;
|
|
+ }
|
|
+ // Paper start
|
|
+ @Deprecated
|
|
+ public ServerListPingEvent(@NotNull final InetAddress address, @NotNull final net.kyori.adventure.text.Component motd, final int numPlayers, final int maxPlayers) {
|
|
+ this("", address, motd, numPlayers, maxPlayers);
|
|
+ }
|
|
+ public ServerListPingEvent(@NotNull final String hostname, @NotNull final InetAddress address, @NotNull final net.kyori.adventure.text.Component motd, final int numPlayers, final int maxPlayers) {
|
|
+ super(true);
|
|
+ Preconditions.checkArgument(numPlayers >= 0, "Cannot have negative number of players online (%s)", numPlayers);
|
|
+ this.hostname = hostname;
|
|
+ this.address = address;
|
|
this.motd = motd;
|
|
+ this.numPlayers = numPlayers;
|
|
this.maxPlayers = maxPlayers;
|
|
}
|
|
+ /**
|
|
+ * This constructor is intended for implementations that provide the
|
|
+ * {@link #iterator()} method, thus provided the {@link #getNumPlayers()}
|
|
+ * count.
|
|
+ *
|
|
+ * @param address the address of the pinger
|
|
+ * @param motd the message of the day
|
|
+ * @param maxPlayers the max number of players
|
|
+ * @deprecated in favour of {@link #ServerListPingEvent(String, java.net.InetAddress, net.kyori.adventure.text.Component, int)}
|
|
+ */
|
|
+ @Deprecated
|
|
+ protected ServerListPingEvent(@NotNull final InetAddress address, @NotNull final net.kyori.adventure.text.Component motd, final int maxPlayers) {
|
|
+ this("", address, motd, maxPlayers);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * This constructor is intended for implementations that provide the
|
|
+ * {@link #iterator()} method, thus provided the {@link #getNumPlayers()}
|
|
+ * count.
|
|
+ *
|
|
+ * @param hostname The hostname that was used to connect to the server
|
|
+ * @param address the address of the pinger
|
|
+ * @param motd the message of the day
|
|
+ * @param maxPlayers the max number of players
|
|
+ */
|
|
+ protected ServerListPingEvent(final @NotNull String hostname, final @NotNull InetAddress address, final net.kyori.adventure.text.@NotNull Component motd, final int maxPlayers) {
|
|
+ this.numPlayers = MAGIC_PLAYER_COUNT;
|
|
+ this.hostname = hostname;
|
|
+ this.address = address;
|
|
+ this.motd = motd;
|
|
+ this.maxPlayers = maxPlayers;
|
|
+ }
|
|
+ /**
|
|
+ * Get the message of the day message.
|
|
+ *
|
|
+ * @return the message of the day
|
|
+ */
|
|
+ public net.kyori.adventure.text.@NotNull Component motd() {
|
|
+ return motd;
|
|
+ }
|
|
+ /**
|
|
+ * Change the message of the day message.
|
|
+ *
|
|
+ * @param motd the message of the day
|
|
+ */
|
|
+ public void motd(net.kyori.adventure.text.@NotNull Component motd) {
|
|
+ this.motd = motd;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
/**
|
|
* Gets the hostname that the player used to connect to the server, or
|
|
@@ -80,19 +145,23 @@ public class ServerListPingEvent extends ServerEvent implements Iterable<Player>
|
|
* Get the message of the day message.
|
|
*
|
|
* @return the message of the day
|
|
+ * @deprecated in favour of {@link #motd()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public String getMotd() {
|
|
- return motd;
|
|
+ return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(this.motd); // Paper
|
|
}
|
|
|
|
/**
|
|
* Change the message of the day message.
|
|
*
|
|
* @param motd the message of the day
|
|
+ * @deprecated in favour of {@link #motd(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setMotd(@NotNull String motd) {
|
|
- this.motd = motd;
|
|
+ this.motd = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(motd); // Paper
|
|
}
|
|
|
|
/**
|
|
diff --git a/src/main/java/org/bukkit/inventory/InventoryView.java b/src/main/java/org/bukkit/inventory/InventoryView.java
|
|
index 5fc95b83dbcd8e533afe6539f97829ce7a52224f..dbf316b63bf3d0c0695ceca84985d67f0f95c906 100644
|
|
--- a/src/main/java/org/bukkit/inventory/InventoryView.java
|
|
+++ b/src/main/java/org/bukkit/inventory/InventoryView.java
|
|
@@ -447,11 +447,25 @@ public abstract class InventoryView {
|
|
return getPlayer().setWindowProperty(prop, value);
|
|
}
|
|
|
|
+ // Paper start
|
|
/**
|
|
* Get the title of this inventory window.
|
|
*
|
|
* @return The title.
|
|
*/
|
|
@NotNull
|
|
+ public /*abstract*/ net.kyori.adventure.text.Component title() {
|
|
+ return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(this.getTitle());
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
+ /**
|
|
+ * Get the title of this inventory window.
|
|
+ *
|
|
+ * @return The title.
|
|
+ * @deprecated in favour of {@link #title()}
|
|
+ */
|
|
+ @Deprecated // Paper
|
|
+ @NotNull
|
|
public abstract String getTitle();
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/inventory/ItemFactory.java b/src/main/java/org/bukkit/inventory/ItemFactory.java
|
|
index f89d71b77d1200314df6ca23614d5ca6fb15ceb3..af4a7ce37eb10bab06eadb6583c7894b3ec55ae6 100644
|
|
--- a/src/main/java/org/bukkit/inventory/ItemFactory.java
|
|
+++ b/src/main/java/org/bukkit/inventory/ItemFactory.java
|
|
@@ -159,4 +159,24 @@ public interface ItemFactory {
|
|
@Deprecated
|
|
@NotNull
|
|
Material updateMaterial(@NotNull final ItemMeta meta, @NotNull final Material material) throws IllegalArgumentException;
|
|
+
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Creates a hover event for the given item.
|
|
+ *
|
|
+ * @param item The item
|
|
+ * @return A hover event
|
|
+ */
|
|
+ @NotNull
|
|
+ net.kyori.adventure.text.event.HoverEvent<net.kyori.adventure.text.event.HoverEvent.ShowItem> asHoverEvent(final @NotNull ItemStack item, final @NotNull java.util.function.UnaryOperator<net.kyori.adventure.text.event.HoverEvent.ShowItem> op);
|
|
+
|
|
+ /**
|
|
+ * Get the formatted display name of the {@link ItemStack}.
|
|
+ *
|
|
+ * @param itemStack the {@link ItemStack}
|
|
+ * @return display name of the {@link ItemStack}
|
|
+ */
|
|
+ @NotNull
|
|
+ net.kyori.adventure.text.Component displayName(@NotNull ItemStack itemStack);
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java
|
|
index d80b0a52968920b990a75cff85e436a16d782500..9d327f0832c40d4a8d212346284274f6cf78834f 100644
|
|
--- a/src/main/java/org/bukkit/inventory/ItemStack.java
|
|
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java
|
|
@@ -23,7 +23,7 @@ import org.jetbrains.annotations.Nullable;
|
|
* use this class to encapsulate Materials for which {@link Material#isItem()}
|
|
* returns false.</b>
|
|
*/
|
|
-public class ItemStack implements Cloneable, ConfigurationSerializable, Translatable {
|
|
+public class ItemStack implements Cloneable, ConfigurationSerializable, Translatable, net.kyori.adventure.text.event.HoverEventSource<net.kyori.adventure.text.event.HoverEvent.ShowItem> { // Paper
|
|
private Material type = Material.AIR;
|
|
private int amount = 0;
|
|
private MaterialData data = null;
|
|
@@ -602,4 +602,21 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
|
|
public String getTranslationKey() {
|
|
return Bukkit.getUnsafe().getTranslationKey(this);
|
|
}
|
|
+
|
|
+ // Paper start
|
|
+ @NotNull
|
|
+ @Override
|
|
+ public net.kyori.adventure.text.event.HoverEvent<net.kyori.adventure.text.event.HoverEvent.ShowItem> asHoverEvent(final @NotNull java.util.function.UnaryOperator<net.kyori.adventure.text.event.HoverEvent.ShowItem> op) {
|
|
+ return org.bukkit.Bukkit.getServer().getItemFactory().asHoverEvent(this, op);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get the formatted display name of the {@link ItemStack}.
|
|
+ *
|
|
+ * @return display name of the {@link ItemStack}
|
|
+ */
|
|
+ public net.kyori.adventure.text.@NotNull Component displayName() {
|
|
+ return Bukkit.getServer().getItemFactory().displayName(this);
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/inventory/meta/BookMeta.java b/src/main/java/org/bukkit/inventory/meta/BookMeta.java
|
|
index 94852d50e88d0594b84b581cd627174043629995..be7c2cfc757e4dd15927be850739d401958fb227 100644
|
|
--- a/src/main/java/org/bukkit/inventory/meta/BookMeta.java
|
|
+++ b/src/main/java/org/bukkit/inventory/meta/BookMeta.java
|
|
@@ -10,7 +10,7 @@ import org.jetbrains.annotations.Nullable;
|
|
* Represents a book ({@link Material#WRITABLE_BOOK} or {@link
|
|
* Material#WRITTEN_BOOK}) that can have a title, an author, and pages.
|
|
*/
|
|
-public interface BookMeta extends ItemMeta {
|
|
+public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book { // Paper
|
|
|
|
/**
|
|
* Represents the generation (or level of copying) of a written book
|
|
@@ -119,6 +119,109 @@ public interface BookMeta extends ItemMeta {
|
|
*/
|
|
boolean hasPages();
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the title of the book.
|
|
+ * <p>
|
|
+ * Plugins should check that hasTitle() returns true before calling this
|
|
+ * method.
|
|
+ *
|
|
+ * @return the title of the book
|
|
+ */
|
|
+ @Override
|
|
+ net.kyori.adventure.text.@Nullable Component title();
|
|
+
|
|
+ /**
|
|
+ * Sets the title of the book.
|
|
+ * <p>
|
|
+ * Limited to 32 characters. Removes title when given null.
|
|
+ *
|
|
+ * @param title the title to set
|
|
+ * @return the same {@link BookMeta} instance
|
|
+ */
|
|
+ @org.jetbrains.annotations.Contract(value = "_ -> this", pure = false)
|
|
+ @Override
|
|
+ @NotNull BookMeta title(net.kyori.adventure.text.@Nullable Component title);
|
|
+
|
|
+ /**
|
|
+ * Gets the author of the book.
|
|
+ * <p>
|
|
+ * Plugins should check that hasAuthor() returns true before calling this
|
|
+ * method.
|
|
+ *
|
|
+ * @return the author of the book
|
|
+ */
|
|
+ @Override
|
|
+ net.kyori.adventure.text.@Nullable Component author();
|
|
+
|
|
+ /**
|
|
+ * Sets the author of the book. Removes author when given null.
|
|
+ *
|
|
+ * @param author the author to set
|
|
+ * @return the same {@link BookMeta} instance
|
|
+ */
|
|
+ @org.jetbrains.annotations.Contract(value = "_ -> this", pure = false)
|
|
+ @Override
|
|
+ @NotNull BookMeta author(net.kyori.adventure.text.@Nullable Component author);
|
|
+
|
|
+ /**
|
|
+ * Gets the specified page in the book. The page must exist.
|
|
+ * <p>
|
|
+ * Pages are 1-indexed.
|
|
+ *
|
|
+ * @param page the page number to get, in range [1, getPageCount()]
|
|
+ * @return the page from the book
|
|
+ */
|
|
+ net.kyori.adventure.text.@NotNull Component page(int page);
|
|
+
|
|
+ /**
|
|
+ * Sets the specified page in the book. Pages of the book must be
|
|
+ * contiguous.
|
|
+ * <p>
|
|
+ * The data can be up to 256 characters in length, additional characters
|
|
+ * are truncated.
|
|
+ * <p>
|
|
+ * Pages are 1-indexed.
|
|
+ *
|
|
+ * @param page the page number to set, in range [1, getPageCount()]
|
|
+ * @param data the data to set for that page
|
|
+ */
|
|
+ void page(int page, net.kyori.adventure.text.@NotNull Component data);
|
|
+
|
|
+ /**
|
|
+ * Adds new pages to the end of the book. Up to a maximum of 50 pages with
|
|
+ * 256 characters per page.
|
|
+ *
|
|
+ * @param pages A list of strings, each being a page
|
|
+ */
|
|
+ void addPages(net.kyori.adventure.text.@NotNull Component @NotNull ... pages);
|
|
+
|
|
+ interface BookMetaBuilder extends Builder {
|
|
+
|
|
+ @Override
|
|
+ @NotNull BookMetaBuilder title(net.kyori.adventure.text.@Nullable Component title);
|
|
+
|
|
+ @Override
|
|
+ @NotNull BookMetaBuilder author(net.kyori.adventure.text.@Nullable Component author);
|
|
+
|
|
+ @Override
|
|
+ @NotNull BookMetaBuilder addPage(net.kyori.adventure.text.@NotNull Component page);
|
|
+
|
|
+ @Override
|
|
+ @NotNull BookMetaBuilder pages(net.kyori.adventure.text.@NotNull Component @NotNull ... pages);
|
|
+
|
|
+ @Override
|
|
+ @NotNull BookMetaBuilder pages(java.util.@NotNull Collection<net.kyori.adventure.text.Component> pages);
|
|
+
|
|
+ @Override
|
|
+ @NotNull BookMeta build();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ @NotNull BookMetaBuilder toBuilder();
|
|
+
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Gets the specified page in the book. The given page must exist.
|
|
* <p>
|
|
@@ -126,8 +229,10 @@ public interface BookMeta extends ItemMeta {
|
|
*
|
|
* @param page the page number to get, in range [1, getPageCount()]
|
|
* @return the page from the book
|
|
+ * @deprecated in favour of {@link #page(int)}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
String getPage(int page);
|
|
|
|
/**
|
|
@@ -141,15 +246,19 @@ public interface BookMeta extends ItemMeta {
|
|
*
|
|
* @param page the page number to set, in range [1, getPageCount()]
|
|
* @param data the data to set for that page
|
|
+ * @deprecated in favour of {@link #page(int, net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
void setPage(int page, @NotNull String data);
|
|
|
|
/**
|
|
* Gets all the pages in the book.
|
|
*
|
|
* @return list of all the pages in the book
|
|
+ * @deprecated in favour of {@link #pages()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
List<String> getPages();
|
|
|
|
/**
|
|
@@ -157,7 +266,9 @@ public interface BookMeta extends ItemMeta {
|
|
* pages. Maximum 100 pages with 256 characters per page.
|
|
*
|
|
* @param pages A list of pages to set the book to use
|
|
+ * @deprecated in favour of {@link #pages(List)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
void setPages(@NotNull List<String> pages);
|
|
|
|
/**
|
|
@@ -165,7 +276,9 @@ public interface BookMeta extends ItemMeta {
|
|
* pages. Maximum 50 pages with 256 characters per page.
|
|
*
|
|
* @param pages A list of strings, each being a page
|
|
+ * @deprecated in favour of {@link #pages(net.kyori.adventure.text.Component...)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
void setPages(@NotNull String... pages);
|
|
|
|
/**
|
|
@@ -173,7 +286,9 @@ public interface BookMeta extends ItemMeta {
|
|
* 256 characters per page.
|
|
*
|
|
* @param pages A list of strings, each being a page
|
|
+ * @deprecated in favour of {@link #addPages(net.kyori.adventure.text.Component...)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
void addPage(@NotNull String... pages);
|
|
|
|
/**
|
|
@@ -195,8 +310,10 @@ public interface BookMeta extends ItemMeta {
|
|
*
|
|
* @param page the page number to get
|
|
* @return the page from the book
|
|
+ * @deprecated in favour of {@link #page(int)}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public BaseComponent[] getPage(int page) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -210,7 +327,9 @@ public interface BookMeta extends ItemMeta {
|
|
*
|
|
* @param page the page number to set
|
|
* @param data the data to set for that page
|
|
+ * @deprecated in favour of {@link #page(int, net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setPage(int page, @Nullable BaseComponent... data) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -219,8 +338,10 @@ public interface BookMeta extends ItemMeta {
|
|
* Gets all the pages in the book.
|
|
*
|
|
* @return list of all the pages in the book
|
|
+ * @deprecated in favour of {@link #pages()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
public List<BaseComponent[]> getPages() {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -230,7 +351,9 @@ public interface BookMeta extends ItemMeta {
|
|
* pages. Maximum 50 pages with 256 characters per page.
|
|
*
|
|
* @param pages A list of pages to set the book to use
|
|
+ * @deprecated in favour of {@link #pages(java.util.List)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setPages(@NotNull List<BaseComponent[]> pages) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -240,7 +363,9 @@ public interface BookMeta extends ItemMeta {
|
|
* pages. Maximum 50 pages with 256 characters per page.
|
|
*
|
|
* @param pages A list of component arrays, each being a page
|
|
+ * @deprecated in favour of {@link #pages(net.kyori.adventure.text.Component...)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setPages(@NotNull BaseComponent[]... pages) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
@@ -250,7 +375,9 @@ public interface BookMeta extends ItemMeta {
|
|
* with 256 characters per page.
|
|
*
|
|
* @param pages A list of component arrays, each being a page
|
|
+ * @deprecated in favour of {@link #addPages(net.kyori.adventure.text.Component...)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void addPage(@NotNull BaseComponent[]... pages) {
|
|
throw new UnsupportedOperationException("Not supported yet.");
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/inventory/meta/ItemMeta.java b/src/main/java/org/bukkit/inventory/meta/ItemMeta.java
|
|
index 2fbb0b7640dd9b9b0e70d4bc60fbb0310d5ec250..049c70c935fd7a781280d223f74bbbf87223f505 100644
|
|
--- a/src/main/java/org/bukkit/inventory/meta/ItemMeta.java
|
|
+++ b/src/main/java/org/bukkit/inventory/meta/ItemMeta.java
|
|
@@ -31,6 +31,24 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
|
|
*/
|
|
boolean hasDisplayName();
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the display name.
|
|
+ *
|
|
+ * <p>Plugins should check that {@link #hasDisplayName()} returns <code>true</code> before calling this method.</p>
|
|
+ *
|
|
+ * @return the display name
|
|
+ */
|
|
+ net.kyori.adventure.text.@Nullable Component displayName();
|
|
+
|
|
+ /**
|
|
+ * Sets the display name.
|
|
+ *
|
|
+ * @param displayName the display name to set
|
|
+ */
|
|
+ void displayName(final net.kyori.adventure.text.@Nullable Component displayName);
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Gets the display name that is set.
|
|
* <p>
|
|
@@ -38,7 +56,9 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
|
|
* before calling this method.
|
|
*
|
|
* @return the display name that is set
|
|
+ * @deprecated in favour of {@link #displayName()}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
@NotNull
|
|
String getDisplayName();
|
|
|
|
@@ -46,7 +66,9 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
|
|
* Sets the display name.
|
|
*
|
|
* @param name the name to set
|
|
+ * @deprecated in favour of {@link #displayName(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
void setDisplayName(@Nullable String name);
|
|
|
|
/**
|
|
@@ -81,6 +103,24 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
|
|
*/
|
|
boolean hasLore();
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the lore.
|
|
+ *
|
|
+ * <p>Plugins should check that {@link #hasLore()} returns <code>true</code> before calling this method.</p>
|
|
+ *
|
|
+ * @return the lore
|
|
+ */
|
|
+ @Nullable List<net.kyori.adventure.text.Component> lore();
|
|
+
|
|
+ /**
|
|
+ * Sets the lore.
|
|
+ *
|
|
+ * @param lore the lore to set
|
|
+ */
|
|
+ void lore(final @Nullable List<? extends net.kyori.adventure.text.Component> lore);
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Gets the lore that is set.
|
|
* <p>
|
|
@@ -88,7 +128,9 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
|
|
* calling this method.
|
|
*
|
|
* @return a list of lore that is set
|
|
+ * @deprecated in favour of {@link #lore()}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
@Nullable
|
|
List<String> getLore();
|
|
|
|
@@ -97,7 +139,9 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
|
|
* Removes lore when given null.
|
|
*
|
|
* @param lore the lore that will be set
|
|
+ * @deprecated in favour of {@link #lore(List)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
void setLore(@Nullable List<String> lore);
|
|
|
|
/**
|
|
diff --git a/src/main/java/org/bukkit/map/MapCursor.java b/src/main/java/org/bukkit/map/MapCursor.java
|
|
index 83354b2a38b6261b172b91c1008dcf3313cc4a8f..762d8a53bbfa82edcd725a52d630b61c40503d67 100644
|
|
--- a/src/main/java/org/bukkit/map/MapCursor.java
|
|
+++ b/src/main/java/org/bukkit/map/MapCursor.java
|
|
@@ -10,7 +10,7 @@ public final class MapCursor {
|
|
private byte x, y;
|
|
private byte direction, type;
|
|
private boolean visible;
|
|
- private String caption;
|
|
+ private net.kyori.adventure.text.Component caption; // Paper
|
|
|
|
/**
|
|
* Initialize the map cursor.
|
|
@@ -24,7 +24,7 @@ public final class MapCursor {
|
|
*/
|
|
@Deprecated
|
|
public MapCursor(byte x, byte y, byte direction, byte type, boolean visible) {
|
|
- this(x, y, direction, type, visible, null);
|
|
+ this(x, y, direction, type, visible, (String) null); // Paper
|
|
}
|
|
|
|
/**
|
|
@@ -37,7 +37,7 @@ public final class MapCursor {
|
|
* @param visible Whether the cursor is visible by default.
|
|
*/
|
|
public MapCursor(byte x, byte y, byte direction, @NotNull Type type, boolean visible) {
|
|
- this(x, y, direction, type, visible, null);
|
|
+ this(x, y, direction, type, visible, (String) null); // Paper
|
|
}
|
|
|
|
/**
|
|
@@ -49,7 +49,7 @@ public final class MapCursor {
|
|
* @param type The type (color/style) of the map cursor.
|
|
* @param visible Whether the cursor is visible by default.
|
|
* @param caption cursor caption
|
|
- * @deprecated Magic value
|
|
+ * @deprecated Magic value. Use {@link #MapCursor(byte, byte, byte, byte, boolean, net.kyori.adventure.text.Component)}
|
|
*/
|
|
@Deprecated
|
|
public MapCursor(byte x, byte y, byte direction, byte type, boolean visible, @Nullable String caption) {
|
|
@@ -58,8 +58,42 @@ public final class MapCursor {
|
|
setDirection(direction);
|
|
setRawType(type);
|
|
this.visible = visible;
|
|
- this.caption = caption;
|
|
+ this.caption = caption == null ? null : net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(caption); // Paper
|
|
}
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Initialize the map cursor.
|
|
+ *
|
|
+ * @param x The x coordinate, from -128 to 127.
|
|
+ * @param y The y coordinate, from -128 to 127.
|
|
+ * @param direction The facing of the cursor, from 0 to 15.
|
|
+ * @param type The type (color/style) of the map cursor.
|
|
+ * @param visible Whether the cursor is visible by default.
|
|
+ * @param caption cursor caption
|
|
+ * @deprecated Magic value
|
|
+ */
|
|
+ @Deprecated
|
|
+ public MapCursor(byte x, byte y, byte direction, byte type, boolean visible, net.kyori.adventure.text.@Nullable Component caption) {
|
|
+ this.x = x; this.y = y; this.visible = visible; this.caption = caption;
|
|
+ setDirection(direction);
|
|
+ setRawType(type);
|
|
+ }
|
|
+ /**
|
|
+ * Initialize the map cursor.
|
|
+ *
|
|
+ * @param x The x coordinate, from -128 to 127.
|
|
+ * @param y The y coordinate, from -128 to 127.
|
|
+ * @param direction The facing of the cursor, from 0 to 15.
|
|
+ * @param type The type (color/style) of the map cursor.
|
|
+ * @param visible Whether the cursor is visible by default.
|
|
+ * @param caption cursor caption
|
|
+ */
|
|
+ public MapCursor(byte x, byte y, byte direction, @NotNull Type type, boolean visible, net.kyori.adventure.text.@Nullable Component caption) {
|
|
+ this.x = x; this.y = y; this.visible = visible; this.caption = caption;
|
|
+ setDirection(direction);
|
|
+ setType(type);
|
|
+ }
|
|
+ // Paper end
|
|
|
|
/**
|
|
* Initialize the map cursor.
|
|
@@ -77,7 +111,7 @@ public final class MapCursor {
|
|
setDirection(direction);
|
|
setType(type);
|
|
this.visible = visible;
|
|
- this.caption = caption;
|
|
+ this.caption = caption == null ? null : net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(caption); // Paper
|
|
}
|
|
|
|
/**
|
|
@@ -200,23 +234,45 @@ public final class MapCursor {
|
|
this.visible = visible;
|
|
}
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the caption on this cursor.
|
|
+ *
|
|
+ * @return caption
|
|
+ */
|
|
+ public net.kyori.adventure.text.@Nullable Component caption() {
|
|
+ return this.caption;
|
|
+ }
|
|
+ /**
|
|
+ * Sets the caption on this cursor.
|
|
+ *
|
|
+ * @param caption new caption
|
|
+ */
|
|
+ public void caption(net.kyori.adventure.text.@Nullable Component caption) {
|
|
+ this.caption = caption;
|
|
+ }
|
|
+ // Paper end
|
|
/**
|
|
* Gets the caption on this cursor.
|
|
*
|
|
* @return caption
|
|
+ * @deprecated in favour of {@link #caption()}
|
|
*/
|
|
@Nullable
|
|
+ @Deprecated // Paper
|
|
public String getCaption() {
|
|
- return caption;
|
|
+ return this.caption == null ? null : net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(this.caption); // Paper
|
|
}
|
|
|
|
/**
|
|
* Sets the caption on this cursor.
|
|
*
|
|
* @param caption new caption
|
|
+ * @deprecated in favour of {@link #caption(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
public void setCaption(@Nullable String caption) {
|
|
- this.caption = caption;
|
|
+ this.caption = caption == null ? null : net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(caption); // Paper
|
|
}
|
|
|
|
/**
|
|
diff --git a/src/main/java/org/bukkit/map/MapCursorCollection.java b/src/main/java/org/bukkit/map/MapCursorCollection.java
|
|
index 4dba721aefe4fc6699b3b4bfa7ecb0b19c2a2a1a..6bc28d000f538ecbf249467ff3e87e3f4fea963e 100644
|
|
--- a/src/main/java/org/bukkit/map/MapCursorCollection.java
|
|
+++ b/src/main/java/org/bukkit/map/MapCursorCollection.java
|
|
@@ -117,4 +117,22 @@ public final class MapCursorCollection {
|
|
public MapCursor addCursor(int x, int y, byte direction, byte type, boolean visible, @Nullable String caption) {
|
|
return addCursor(new MapCursor((byte) x, (byte) y, direction, type, visible, caption));
|
|
}
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Add a cursor to the collection.
|
|
+ *
|
|
+ * @param x The x coordinate, from -128 to 127.
|
|
+ * @param y The y coordinate, from -128 to 127.
|
|
+ * @param direction The facing of the cursor, from 0 to 15.
|
|
+ * @param type The type (color/style) of the map cursor.
|
|
+ * @param visible Whether the cursor is visible.
|
|
+ * @param caption banner caption
|
|
+ * @return The newly added MapCursor.
|
|
+ * @deprecated Magic value
|
|
+ */
|
|
+ @Deprecated
|
|
+ public @NotNull MapCursor addCursor(int x, int y, byte direction, byte type, boolean visible, net.kyori.adventure.text.@Nullable Component caption) {
|
|
+ return addCursor(new MapCursor((byte) x, (byte) y, direction, type, visible, caption));
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/permissions/Permissible.java b/src/main/java/org/bukkit/permissions/Permissible.java
|
|
index 228421154913116069c20323afb519bdde2134df..26791db3c267670d5782f1d2b67ff7d5b55b9dac 100644
|
|
--- a/src/main/java/org/bukkit/permissions/Permissible.java
|
|
+++ b/src/main/java/org/bukkit/permissions/Permissible.java
|
|
@@ -126,4 +126,34 @@ public interface Permissible extends ServerOperator {
|
|
*/
|
|
@NotNull
|
|
public Set<PermissionAttachmentInfo> getEffectivePermissions();
|
|
+
|
|
+ // Paper start - add TriState permission checks
|
|
+ /**
|
|
+ * Checks if this object has a permission set and, if it is set, the value of the permission.
|
|
+ *
|
|
+ * @param permission the permission to check
|
|
+ * @return a tri-state of if the permission is set and, if it is set, it's value
|
|
+ */
|
|
+ default net.kyori.adventure.util.@NotNull TriState permissionValue(final @NotNull Permission permission) {
|
|
+ if (this.isPermissionSet(permission)) {
|
|
+ return net.kyori.adventure.util.TriState.byBoolean(this.hasPermission(permission));
|
|
+ } else {
|
|
+ return net.kyori.adventure.util.TriState.NOT_SET;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Checks if this object has a permission set and, if it is set, the value of the permission.
|
|
+ *
|
|
+ * @param permission the permission to check
|
|
+ * @return a tri-state of if the permission is set and, if it is set, it's value
|
|
+ */
|
|
+ default net.kyori.adventure.util.@NotNull TriState permissionValue(final @NotNull String permission) {
|
|
+ if (this.isPermissionSet(permission)) {
|
|
+ return net.kyori.adventure.util.TriState.byBoolean(this.hasPermission(permission));
|
|
+ } else {
|
|
+ return net.kyori.adventure.util.TriState.NOT_SET;
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/plugin/Plugin.java b/src/main/java/org/bukkit/plugin/Plugin.java
|
|
index 03ca87a1cbace2459174bb7bb8847bda766e80c5..b37938745f916b5f0111b07b1a1c97527f026e9d 100644
|
|
--- a/src/main/java/org/bukkit/plugin/Plugin.java
|
|
+++ b/src/main/java/org/bukkit/plugin/Plugin.java
|
|
@@ -179,6 +179,13 @@ public interface Plugin extends TabExecutor {
|
|
@NotNull
|
|
public Logger getLogger();
|
|
|
|
+ // Paper start - Adventure component logger
|
|
+ @NotNull
|
|
+ default net.kyori.adventure.text.logger.slf4j.ComponentLogger getComponentLogger() {
|
|
+ return net.kyori.adventure.text.logger.slf4j.ComponentLogger.logger(getLogger().getName());
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Returns the name of the plugin.
|
|
* <p>
|
|
diff --git a/src/main/java/org/bukkit/scoreboard/Objective.java b/src/main/java/org/bukkit/scoreboard/Objective.java
|
|
index 2ff3a11f1f9c115722ea224873e7eb6dc6dc63e6..86a0a6f9e8487d6dfaf60876ace3dcc9b4722826 100644
|
|
--- a/src/main/java/org/bukkit/scoreboard/Objective.java
|
|
+++ b/src/main/java/org/bukkit/scoreboard/Objective.java
|
|
@@ -19,14 +19,35 @@ public interface Objective {
|
|
*/
|
|
@NotNull
|
|
String getName() throws IllegalStateException;
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the name displayed to players for this objective
|
|
+ *
|
|
+ * @return this objective's display name
|
|
+ * @throws IllegalStateException if this objective has been unregistered
|
|
+ */
|
|
+ net.kyori.adventure.text.@NotNull Component displayName() throws IllegalStateException;
|
|
+ /**
|
|
+ * Sets the name displayed to players for this objective.
|
|
+ *
|
|
+ * @param displayName Display name to set
|
|
+ * @throws IllegalStateException if this objective has been unregistered
|
|
+ * @throws IllegalArgumentException if displayName is null
|
|
+ * @throws IllegalArgumentException if displayName is longer than 128
|
|
+ * characters.
|
|
+ */
|
|
+ void displayName(net.kyori.adventure.text.@Nullable Component displayName) throws IllegalStateException, IllegalArgumentException;
|
|
+ // Paper end
|
|
|
|
/**
|
|
* Gets the name displayed to players for this objective
|
|
*
|
|
* @return this objective's display name
|
|
* @throws IllegalStateException if this objective has been unregistered
|
|
+ * @deprecated in favour of {@link #displayName()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
String getDisplayName() throws IllegalStateException;
|
|
|
|
/**
|
|
@@ -37,7 +58,9 @@ public interface Objective {
|
|
* @throws IllegalArgumentException if displayName is null
|
|
* @throws IllegalArgumentException if displayName is longer than 128
|
|
* characters.
|
|
+ * @deprecated in favour of {@link #displayName(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
void setDisplayName(@NotNull String displayName) throws IllegalStateException, IllegalArgumentException;
|
|
|
|
/**
|
|
diff --git a/src/main/java/org/bukkit/scoreboard/Scoreboard.java b/src/main/java/org/bukkit/scoreboard/Scoreboard.java
|
|
index a15183f302de42956d8965efe5f0585fc2cd030e..ebb72912c1f8431606162b0643f6289203331253 100644
|
|
--- a/src/main/java/org/bukkit/scoreboard/Scoreboard.java
|
|
+++ b/src/main/java/org/bukkit/scoreboard/Scoreboard.java
|
|
@@ -27,6 +27,92 @@ public interface Scoreboard {
|
|
@Deprecated
|
|
@NotNull
|
|
Objective registerNewObjective(@NotNull String name, @NotNull String criteria) throws IllegalArgumentException;
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Registers an Objective on this Scoreboard
|
|
+ *
|
|
+ * @param name Name of the Objective
|
|
+ * @param criteria Criteria for the Objective
|
|
+ * @param displayName Name displayed to players for the Objective.
|
|
+ * @return The registered Objective
|
|
+ * @throws IllegalArgumentException if name is null
|
|
+ * @throws IllegalArgumentException if name is longer than 32767
|
|
+ * characters.
|
|
+ * @throws IllegalArgumentException if criteria is null
|
|
+ * @throws IllegalArgumentException if displayName is null
|
|
+ * @throws IllegalArgumentException if displayName is longer than 128
|
|
+ * characters.
|
|
+ * @throws IllegalArgumentException if an objective by that name already
|
|
+ * exists
|
|
+ * @deprecated use {@link #registerNewObjective(String, Criteria, net.kyori.adventure.text.Component)}
|
|
+ */
|
|
+ @NotNull
|
|
+ @Deprecated
|
|
+ Objective registerNewObjective(@NotNull String name, @NotNull String criteria, net.kyori.adventure.text.@Nullable Component displayName) throws IllegalArgumentException;
|
|
+ /**
|
|
+ * Registers an Objective on this Scoreboard
|
|
+ *
|
|
+ * @param name Name of the Objective
|
|
+ * @param criteria Criteria for the Objective
|
|
+ * @param displayName Name displayed to players for the Objective.
|
|
+ * @param renderType Manner of rendering the Objective
|
|
+ * @return The registered Objective
|
|
+ * @throws IllegalArgumentException if name is null
|
|
+ * @throws IllegalArgumentException if name is longer than 32767
|
|
+ * characters.
|
|
+ * @throws IllegalArgumentException if criteria is null
|
|
+ * @throws IllegalArgumentException if displayName is null
|
|
+ * @throws IllegalArgumentException if displayName is longer than 128
|
|
+ * characters.
|
|
+ * @throws IllegalArgumentException if renderType is null
|
|
+ * @throws IllegalArgumentException if an objective by that name already
|
|
+ * exists
|
|
+ * @deprecated use {@link #registerNewObjective(String, Criteria, net.kyori.adventure.text.Component, RenderType)}
|
|
+ */
|
|
+ @NotNull
|
|
+ @Deprecated
|
|
+ Objective registerNewObjective(@NotNull String name, @NotNull String criteria, net.kyori.adventure.text.@Nullable Component displayName, @NotNull RenderType renderType) throws IllegalArgumentException;
|
|
+ /**
|
|
+ * Registers an Objective on this Scoreboard
|
|
+ *
|
|
+ * @param name Name of the Objective
|
|
+ * @param criteria Criteria for the Objective
|
|
+ * @param displayName Name displayed to players for the Objective.
|
|
+ * @return The registered Objective
|
|
+ * @throws IllegalArgumentException if name is null
|
|
+ * @throws IllegalArgumentException if name is longer than 32767
|
|
+ * characters.
|
|
+ * @throws IllegalArgumentException if criteria is null
|
|
+ * @throws IllegalArgumentException if displayName is null
|
|
+ * @throws IllegalArgumentException if displayName is longer than 128
|
|
+ * characters.
|
|
+ * @throws IllegalArgumentException if an objective by that name already
|
|
+ * exists
|
|
+ */
|
|
+ @NotNull
|
|
+ Objective registerNewObjective(@NotNull String name, @NotNull Criteria criteria, net.kyori.adventure.text.@Nullable Component displayName) throws IllegalArgumentException;
|
|
+ /**
|
|
+ * Registers an Objective on this Scoreboard
|
|
+ *
|
|
+ * @param name Name of the Objective
|
|
+ * @param criteria Criteria for the Objective
|
|
+ * @param displayName Name displayed to players for the Objective.
|
|
+ * @param renderType Manner of rendering the Objective
|
|
+ * @return The registered Objective
|
|
+ * @throws IllegalArgumentException if name is null
|
|
+ * @throws IllegalArgumentException if name is longer than 32767
|
|
+ * characters.
|
|
+ * @throws IllegalArgumentException if criteria is null
|
|
+ * @throws IllegalArgumentException if displayName is null
|
|
+ * @throws IllegalArgumentException if displayName is longer than 128
|
|
+ * characters.
|
|
+ * @throws IllegalArgumentException if renderType is null
|
|
+ * @throws IllegalArgumentException if an objective by that name already
|
|
+ * exists
|
|
+ */
|
|
+ @NotNull
|
|
+ Objective registerNewObjective(@NotNull String name, @NotNull Criteria criteria, net.kyori.adventure.text.@Nullable Component displayName, @NotNull RenderType renderType) throws IllegalArgumentException;
|
|
+ // Paper end
|
|
|
|
/**
|
|
* Registers an Objective on this Scoreboard
|
|
@@ -47,6 +133,7 @@ public interface Scoreboard {
|
|
* @deprecated use {@link #registerNewObjective(String, Criteria, String)}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
Objective registerNewObjective(@NotNull String name, @NotNull String criteria, @NotNull String displayName) throws IllegalArgumentException;
|
|
|
|
/**
|
|
@@ -70,6 +157,7 @@ public interface Scoreboard {
|
|
* @deprecated use {@link #registerNewObjective(String, Criteria, String, RenderType)}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
Objective registerNewObjective(@NotNull String name, @NotNull String criteria, @NotNull String displayName, @NotNull RenderType renderType) throws IllegalArgumentException;
|
|
|
|
/**
|
|
@@ -88,8 +176,10 @@ public interface Scoreboard {
|
|
* characters.
|
|
* @throws IllegalArgumentException if an objective by that name already
|
|
* exists
|
|
+ * @deprecated in favour of {@link #registerNewObjective(String, Criteria, net.kyori.adventure.text.Component)}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
Objective registerNewObjective(@NotNull String name, @NotNull Criteria criteria, @NotNull String displayName) throws IllegalArgumentException;
|
|
|
|
/**
|
|
@@ -110,8 +200,10 @@ public interface Scoreboard {
|
|
* @throws IllegalArgumentException if renderType is null
|
|
* @throws IllegalArgumentException if an objective by that name already
|
|
* exists
|
|
+ * @deprecated in favour of {@link #registerNewObjective(String, Criteria, net.kyori.adventure.text.Component, RenderType)}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
Objective registerNewObjective(@NotNull String name, @NotNull Criteria criteria, @NotNull String displayName, @NotNull RenderType renderType) throws IllegalArgumentException;
|
|
|
|
/**
|
|
diff --git a/src/main/java/org/bukkit/scoreboard/Team.java b/src/main/java/org/bukkit/scoreboard/Team.java
|
|
index 0db7fe1b9fe5621ceed3f4f046691e359f5949dd..4d625f79ba2e3fe074feade98f7c1bc2798cb82e 100644
|
|
--- a/src/main/java/org/bukkit/scoreboard/Team.java
|
|
+++ b/src/main/java/org/bukkit/scoreboard/Team.java
|
|
@@ -22,14 +22,100 @@ public interface Team {
|
|
*/
|
|
@NotNull
|
|
String getName() throws IllegalStateException;
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Gets the name displayed to entries for this team
|
|
+ *
|
|
+ * @return Team display name
|
|
+ * @throws IllegalStateException if this team has been unregistered
|
|
+ */
|
|
+ net.kyori.adventure.text.@NotNull Component displayName() throws IllegalStateException;
|
|
+
|
|
+ /**
|
|
+ * Sets the name displayed to entries for this team
|
|
+ *
|
|
+ * @param displayName New display name
|
|
+ * @throws IllegalStateException if this team has been unregistered
|
|
+ */
|
|
+ void displayName(net.kyori.adventure.text.@Nullable Component displayName) throws IllegalStateException, IllegalArgumentException;
|
|
+
|
|
+ /**
|
|
+ * Gets the prefix prepended to the display of entries on this team.
|
|
+ *
|
|
+ * @return Team prefix
|
|
+ * @throws IllegalStateException if this team has been unregistered
|
|
+ */
|
|
+ net.kyori.adventure.text.@NotNull Component prefix() throws IllegalStateException;
|
|
+
|
|
+ /**
|
|
+ * Sets the prefix prepended to the display of entries on this team.
|
|
+ *
|
|
+ * @param prefix New prefix
|
|
+ * @throws IllegalArgumentException if prefix is null
|
|
+ * characters
|
|
+ * @throws IllegalStateException if this team has been unregistered
|
|
+ */
|
|
+ void prefix(net.kyori.adventure.text.@Nullable Component prefix) throws IllegalStateException, IllegalArgumentException;
|
|
+
|
|
+ /**
|
|
+ * Gets the suffix appended to the display of entries on this team.
|
|
+ *
|
|
+ * @return the team's current suffix
|
|
+ * @throws IllegalStateException if this team has been unregistered
|
|
+ */
|
|
+ net.kyori.adventure.text.@NotNull Component suffix() throws IllegalStateException;
|
|
+
|
|
+ /**
|
|
+ * Sets the suffix appended to the display of entries on this team.
|
|
+ *
|
|
+ * @param suffix the new suffix for this team.
|
|
+ * @throws IllegalArgumentException if suffix is null
|
|
+ * characters
|
|
+ * @throws IllegalStateException if this team has been unregistered
|
|
+ */
|
|
+ void suffix(net.kyori.adventure.text.@Nullable Component suffix) throws IllegalStateException, IllegalArgumentException;
|
|
+
|
|
+ /**
|
|
+ * Checks if the team has a color specified
|
|
+ *
|
|
+ * @return true if it has a <b>color</b>
|
|
+ * @throws IllegalStateException if this team has been unregistered
|
|
+ */
|
|
+ boolean hasColor();
|
|
+
|
|
+ /**
|
|
+ * Gets the color of the team.
|
|
+ * <br>
|
|
+ * This only sets the team outline, other occurrences of colors such as in
|
|
+ * names are handled by prefixes / suffixes.
|
|
+ *
|
|
+ * @return team color
|
|
+ * @throws IllegalStateException if this team has been unregistered
|
|
+ * @throws IllegalStateException if the team doesn't have a color
|
|
+ * @see #hasColor()
|
|
+ */
|
|
+ net.kyori.adventure.text.format.@NotNull TextColor color() throws IllegalStateException;
|
|
+
|
|
+ /**
|
|
+ * Sets the color of the team.
|
|
+ * <br>
|
|
+ * This only sets the team outline, other occurrences of colors such as in
|
|
+ * names are handled by prefixes / suffixes.
|
|
+ *
|
|
+ * @param color new color, null for no color
|
|
+ */
|
|
+ void color(net.kyori.adventure.text.format.@Nullable NamedTextColor color);
|
|
+ // Paper end
|
|
|
|
/**
|
|
* Gets the name displayed to entries for this team
|
|
*
|
|
* @return Team display name
|
|
* @throws IllegalStateException if this team has been unregistered
|
|
+ * @deprecated in favour of {@link #displayName()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
String getDisplayName() throws IllegalStateException;
|
|
|
|
/**
|
|
@@ -39,7 +125,9 @@ public interface Team {
|
|
* @throws IllegalArgumentException if displayName is longer than 128
|
|
* characters.
|
|
* @throws IllegalStateException if this team has been unregistered
|
|
+ * @deprecated in favour of {@link #displayName(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
void setDisplayName(@NotNull String displayName) throws IllegalStateException, IllegalArgumentException;
|
|
|
|
/**
|
|
@@ -47,8 +135,10 @@ public interface Team {
|
|
*
|
|
* @return Team prefix
|
|
* @throws IllegalStateException if this team has been unregistered
|
|
+ * @deprecated in favour of {@link #prefix()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
String getPrefix() throws IllegalStateException;
|
|
|
|
/**
|
|
@@ -59,7 +149,9 @@ public interface Team {
|
|
* @throws IllegalArgumentException if prefix is longer than 64
|
|
* characters
|
|
* @throws IllegalStateException if this team has been unregistered
|
|
+ * @deprecated in favour of {@link #prefix(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
void setPrefix(@NotNull String prefix) throws IllegalStateException, IllegalArgumentException;
|
|
|
|
/**
|
|
@@ -67,8 +159,10 @@ public interface Team {
|
|
*
|
|
* @return the team's current suffix
|
|
* @throws IllegalStateException if this team has been unregistered
|
|
+ * @deprecated in favour of {@link #suffix()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
String getSuffix() throws IllegalStateException;
|
|
|
|
/**
|
|
@@ -79,7 +173,9 @@ public interface Team {
|
|
* @throws IllegalArgumentException if suffix is longer than 64
|
|
* characters
|
|
* @throws IllegalStateException if this team has been unregistered
|
|
+ * @deprecated in favour of {@link #suffix(net.kyori.adventure.text.Component)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
void setSuffix(@NotNull String suffix) throws IllegalStateException, IllegalArgumentException;
|
|
|
|
/**
|
|
@@ -90,8 +186,10 @@ public interface Team {
|
|
*
|
|
* @return team color, defaults to {@link ChatColor#RESET}
|
|
* @throws IllegalStateException if this team has been unregistered
|
|
+ * @deprecated in favour of {@link #color()}
|
|
*/
|
|
@NotNull
|
|
+ @Deprecated // Paper
|
|
ChatColor getColor() throws IllegalStateException;
|
|
|
|
/**
|
|
@@ -102,7 +200,9 @@ public interface Team {
|
|
*
|
|
* @param color new color, must be non-null. Use {@link ChatColor#RESET} for
|
|
* no color
|
|
+ * @deprecated in favour of {@link #color(net.kyori.adventure.text.format.NamedTextColor)}
|
|
*/
|
|
+ @Deprecated // Paper
|
|
void setColor(@NotNull ChatColor color);
|
|
|
|
/**
|
|
diff --git a/src/test/java/io/papermc/paper/adventure/KeyTest.java b/src/test/java/io/papermc/paper/adventure/KeyTest.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..70c575077d204e4b36d07559f6a8d952b84af1cf
|
|
--- /dev/null
|
|
+++ b/src/test/java/io/papermc/paper/adventure/KeyTest.java
|
|
@@ -0,0 +1,31 @@
|
|
+package io.papermc.paper.adventure;
|
|
+
|
|
+import java.util.HashSet;
|
|
+import java.util.Set;
|
|
+import net.kyori.adventure.key.Key;
|
|
+import org.bukkit.NamespacedKey;
|
|
+import org.junit.Test;
|
|
+
|
|
+import static org.junit.Assert.assertEquals;
|
|
+import static org.junit.Assert.assertTrue;
|
|
+
|
|
+public class KeyTest {
|
|
+
|
|
+ @Test
|
|
+ public void equalsTest() {
|
|
+ Key key = new NamespacedKey("test", "key");
|
|
+ Key key1 = Key.key("test", "key");
|
|
+ assertEquals(key, key1);
|
|
+ assertEquals(key1, key);
|
|
+ }
|
|
+
|
|
+ @Test
|
|
+ public void setTest() {
|
|
+ Key key = new NamespacedKey("test", "key");
|
|
+ Key key1 = Key.key("test", "key");
|
|
+ Set<Key> set = new HashSet<>(Set.of(key));
|
|
+ Set<Key> set1 = new HashSet<>(Set.of(key1));
|
|
+ assertTrue(set.contains(key1));
|
|
+ assertTrue(set1.contains(key));
|
|
+ }
|
|
+}
|