diff --git a/Spigot-API-Patches/0020-Player-Tab-List-and-Title-APIs.patch b/Spigot-API-Patches/0020-Player-Tab-List-and-Title-APIs.patch index ba87978..6f28779 100644 --- a/Spigot-API-Patches/0020-Player-Tab-List-and-Title-APIs.patch +++ b/Spigot-API-Patches/0020-Player-Tab-List-and-Title-APIs.patch @@ -1,14 +1,24 @@ -From 42577385d23a22d17b6f80787db0bf27f8e970d7 Mon Sep 17 00:00:00 2001 -From: Jedediah Smith +From 9da88eae7c63d03c2303ddfa86cededaf1244d70 Mon Sep 17 00:00:00 2001 +From: Techcable Date: Tue, 16 Feb 2016 19:51:11 -0600 Subject: [PATCH] Player Tab List and Title APIs diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 9ebfa47..78fd6dc 100644 +index 9ebfa47..d02fe56 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -344,6 +344,78 @@ public interface Player extends HumanEntity, Conversable, CommandSender, Offline +@@ -19,6 +19,9 @@ import org.bukkit.conversations.Conversable; + import org.bukkit.map.MapView; + import org.bukkit.plugin.messaging.PluginMessageRecipient; + import org.bukkit.scoreboard.Scoreboard; ++// PaperSpigot start ++import org.github.paperspigot.Title; ++// PaperSpigot end + + /** + * Represents a player, connected or not +@@ -344,6 +347,112 @@ public interface Player extends HumanEntity, Conversable, CommandSender, Offline * @param components the components to send */ public void sendMessage(net.md_5.bungee.api.chat.BaseComponent... components); @@ -30,32 +40,42 @@ index 9ebfa47..78fd6dc 100644 + public void setPlayerListHeaderFooter(net.md_5.bungee.api.chat.BaseComponent header, net.md_5.bungee.api.chat.BaseComponent footer); + + /** -+ * Set the times for titles displayed to the player ++ * Update the times for titles displayed to the player + * + * @param fadeInTicks ticks to fade-in + * @param stayTicks ticks to stay visible + * @param fadeOutTicks ticks to fade-out ++ * @deprecated Use {@link #updateTitle(Title)} + */ ++ @Deprecated + public void setTitleTimes(int fadeInTicks, int stayTicks, int fadeOutTicks); + + /** -+ * Set the subtitle of titles displayed to the player ++ * Update the subtitle of titles displayed to the player ++ * @deprecated Use {@link #updateTitle(Title)} + */ ++ @Deprecated + public void setSubtitle(net.md_5.bungee.api.chat.BaseComponent[] subtitle); + + /** -+ * Set the subtitle of titles displayed to the player ++ * Update the subtitle of titles displayed to the player ++ * @deprecated Use {@link #updateTitle(Title)} + */ ++ @Deprecated + public void setSubtitle(net.md_5.bungee.api.chat.BaseComponent subtitle); + + /** + * Show the given title to the player, along with the last subtitle set, using the last set times ++ * @deprecated Use {@link #sendTitle(Title)} or {@link #updateTitle(Title)} + */ ++ @Deprecated + public void showTitle(net.md_5.bungee.api.chat.BaseComponent[] title); + + /** + * Show the given title to the player, along with the last subtitle set, using the last set times ++ * @deprecated Use {@link #sendTitle(Title)} or {@link #updateTitle(Title)} + */ ++ @Deprecated + public void showTitle(net.md_5.bungee.api.chat.BaseComponent title); + + /** @@ -66,7 +86,9 @@ index 9ebfa47..78fd6dc 100644 + * @param fadeInTicks ticks to fade-in + * @param stayTicks ticks to stay visible + * @param fadeOutTicks ticks to fade-out ++ * @deprecated Use {@link #sendTitle(Title)} or {@link #updateTitle(Title)} + */ ++ @Deprecated + public void showTitle(net.md_5.bungee.api.chat.BaseComponent[] title, net.md_5.bungee.api.chat.BaseComponent[] subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks); + + /** @@ -77,17 +99,39 @@ index 9ebfa47..78fd6dc 100644 + * @param fadeInTicks ticks to fade-in + * @param stayTicks ticks to stay visible + * @param fadeOutTicks ticks to fade-out ++ * @deprecated Use {@link #sendTitle(Title)} or {@link #updateTitle(Title)} + */ ++ @Deprecated + public void showTitle(net.md_5.bungee.api.chat.BaseComponent title, net.md_5.bungee.api.chat.BaseComponent subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks); + + /** ++ * Show the title to the player, overriding any previously displayed title. ++ * ++ *

This method overrides any previous title, use {@link #updateTitle(Title)} to change the existing one.

++ * ++ * @param title the title to send ++ * @throws NullPointerException if the title is null ++ */ ++ void sendTitle(Title title); ++ ++ /** ++ * Show the title to the player, overriding any previously displayed title. ++ * ++ *

This method doesn't override previous titles, but changes their values.

++ * ++ * @param title the title to send ++ * @throws NullPointerException if title is null ++ */ ++ void updateTitle(Title title); ++ ++ /** + * Hide any title that is currently visible to the player + */ + public void hideTitle(); // Paper end /** -@@ -1086,9 +1158,8 @@ public interface Player extends HumanEntity, Conversable, CommandSender, Offline +@@ -1086,9 +1195,8 @@ public interface Player extends HumanEntity, Conversable, CommandSender, Offline /** * Resets the title displayed to the player. @@ -98,6 +142,371 @@ index 9ebfa47..78fd6dc 100644 public void resetTitle(); // Spigot start +diff --git a/src/main/java/org/github/paperspigot/Title.java b/src/main/java/org/github/paperspigot/Title.java +new file mode 100644 +index 0000000..27f9bc2 +--- /dev/null ++++ b/src/main/java/org/github/paperspigot/Title.java +@@ -0,0 +1,358 @@ ++package org.github.paperspigot; ++ ++import net.md_5.bungee.api.chat.BaseComponent; ++import net.md_5.bungee.api.chat.TextComponent; ++ ++import org.bukkit.entity.Player; ++ ++import static com.google.common.base.Preconditions.checkArgument; ++import static com.google.common.base.Preconditions.checkNotNull; ++import static com.google.common.base.Preconditions.checkState; ++ ++/** ++ * Represents a title to may be sent to a {@link Player}. ++ *

++ *

A title can be sent without subtitle text.

++ */ ++public final class Title { ++ ++ /** ++ * The default number of ticks for the title to fade in. ++ */ ++ public static final int DEFAULT_FADE_IN = 20; ++ /** ++ * The default number of ticks for the title to stay. ++ */ ++ public static final int DEFAULT_STAY = 200; ++ /** ++ * The default number of ticks for the title to fade out. ++ */ ++ public static final int DEFAULT_FADE_OUT = 20; ++ ++ private final BaseComponent[] title; ++ private final BaseComponent[] subtitle; ++ private final int fadeIn; ++ private final int stay; ++ private final int fadeOut; ++ ++ /** ++ * Create a title with the default time values and no subtitle. ++ *

++ *

Times use default values.

++ * ++ * @param title the main text of the title ++ * @throws NullPointerException if the title is null ++ */ ++ public Title(BaseComponent title) { ++ this(title, null); ++ } ++ ++ /** ++ * Create a title with the default time values and no subtitle. ++ *

++ *

Times use default values.

++ * ++ * @param title the main text of the title ++ * @throws NullPointerException if the title is null ++ */ ++ public Title(BaseComponent[] title) { ++ this(title, null); ++ } ++ ++ /** ++ * Create a title with the default time values and no subtitle. ++ *

++ *

Times use default values.

++ * ++ * @param title the main text of the title ++ * @throws NullPointerException if the title is null ++ */ ++ public Title(String title) { ++ this(title, null); ++ } ++ ++ /** ++ * Create a title with the default time values. ++ *

++ *

Times use default values.

++ * ++ * @param title the main text of the title ++ * @param subtitle the secondary text of the title ++ */ ++ public Title(BaseComponent title, BaseComponent subtitle) { ++ this(title, subtitle, DEFAULT_FADE_IN, DEFAULT_STAY, DEFAULT_FADE_OUT); ++ } ++ ++ /** ++ * Create a title with the default time values. ++ *

++ *

Times use default values.

++ * ++ * @param title the main text of the title ++ * @param subtitle the secondary text of the title ++ */ ++ public Title(BaseComponent[] title, BaseComponent[] subtitle) { ++ this(title, subtitle, DEFAULT_FADE_IN, DEFAULT_STAY, DEFAULT_FADE_OUT); ++ } ++ ++ /** ++ * Create a title with the default time values. ++ *

++ *

Times use default values.

++ * ++ * @param title the main text of the title ++ * @param subtitle the secondary text of the title ++ */ ++ public Title(String title, String subtitle) { ++ this(title, subtitle, DEFAULT_FADE_IN, DEFAULT_STAY, DEFAULT_FADE_OUT); ++ } ++ ++ /** ++ * Creates a new title. ++ * ++ * @param title the main text of the title ++ * @param subtitle the secondary text of the title ++ * @param fadeIn the number of ticks for the title to fade in ++ * @param stay the number of ticks for the title to stay on screen ++ * @param fadeOut the number of ticks for the title to fade out ++ * @throws IllegalArgumentException if any of the times are negative ++ */ ++ public Title(BaseComponent title, BaseComponent subtitle, int fadeIn, int stay, int fadeOut) { ++ this( ++ new BaseComponent[]{checkNotNull(title, "title")}, ++ subtitle == null ? null : new BaseComponent[]{subtitle}, ++ fadeIn, ++ stay, ++ fadeOut ++ ); ++ } ++ ++ /** ++ * Creates a new title. ++ * ++ * @param title the main text of the title ++ * @param subtitle the secondary text of the title ++ * @param fadeIn the number of ticks for the title to fade in ++ * @param stay the number of ticks for the title to stay on screen ++ * @param fadeOut the number of ticks for the title to fade out ++ * @throws IllegalArgumentException if any of the times are negative ++ */ ++ public Title(BaseComponent[] title, BaseComponent[] subtitle, int fadeIn, int stay, int fadeOut) { ++ checkArgument(fadeIn >= 0, "Negative fadeIn: %s", fadeIn); ++ checkArgument(stay >= 0, "Negative stay: %s", stay); ++ checkArgument(fadeOut >= 0, "Negative fadeOut: %s", fadeOut); ++ this.title = checkNotNull(title, "title"); ++ this.subtitle = subtitle; ++ this.fadeIn = fadeIn; ++ this.stay = stay; ++ this.fadeOut = fadeOut; ++ } ++ ++ /** ++ * Creates a new title. ++ *

++ *

It is recommended to the {@link BaseComponent} constrctors.

++ * ++ * @param title the main text of the title ++ * @param subtitle the secondary text of the title ++ * @param fadeIn the number of ticks for the title to fade in ++ * @param stay the number of ticks for the title to stay on screen ++ * @param fadeOut the number of ticks for the title to fade out ++ */ ++ public Title(String title, String subtitle, int fadeIn, int stay, int fadeOut) { ++ this( ++ TextComponent.fromLegacyText(checkNotNull(title, "title")), ++ subtitle == null ? null : TextComponent.fromLegacyText(subtitle), ++ fadeIn, ++ stay, ++ fadeOut ++ ); ++ } ++ ++ /** ++ * Gets the text of this title ++ * ++ * @return the text ++ */ ++ public BaseComponent[] getTitle() { ++ return this.title; ++ } ++ ++ /** ++ * Gets the text of this title's subtitle ++ * ++ * @return the text ++ */ ++ public BaseComponent[] getSubtitle() { ++ return this.subtitle; ++ } ++ ++ /** ++ * Gets the number of ticks to fade in. ++ *

++ *

The returned value is never negative.

++ * ++ * @return the number of ticks to fade in ++ */ ++ public int getFadeIn() { ++ return this.fadeIn; ++ } ++ ++ /** ++ * Gets the number of ticks to stay. ++ *

++ *

The returned value is never negative.

++ * ++ * @return the number of ticks to stay ++ */ ++ public int getStay() { ++ return this.stay; ++ } ++ ++ /** ++ * Gets the number of ticks to fade out. ++ *

++ *

The returned value is never negative.

++ * ++ * @return the number of ticks to fade out ++ */ ++ public int getFadeOut() { ++ return this.fadeOut; ++ } ++ ++ public static Builder builder() { ++ return new Builder(); ++ } ++ ++ /** ++ * A builder for creating titles ++ */ ++ public static final class Builder { ++ ++ private BaseComponent[] title; ++ private BaseComponent[] subtitle; ++ private int fadeIn = DEFAULT_FADE_IN; ++ private int stay = DEFAULT_STAY; ++ private int fadeOut = DEFAULT_FADE_OUT; ++ ++ /** ++ * Sets the title to the given text. ++ * ++ * @param title the title text ++ * @return this builder instance ++ * @throws NullPointerException if the title is null ++ */ ++ public Builder title(BaseComponent title) { ++ return this.title(new BaseComponent[]{checkNotNull(title, "title")}); ++ } ++ ++ /** ++ * Sets the title to the given text. ++ * ++ * @param title the title text ++ * @return this builder instance ++ * @throws NullPointerException if the title is null ++ */ ++ public Builder title(BaseComponent[] title) { ++ this.title = checkNotNull(title, "title"); ++ return this; ++ } ++ ++ /** ++ * Sets the title to the given text. ++ *

++ *

It is recommended to the {@link BaseComponent} methods.

++ * ++ * @param title the title text ++ * @return this builder instance ++ * @throws NullPointerException if the title is null ++ */ ++ public Builder title(String title) { ++ return this.title(TextComponent.fromLegacyText(checkNotNull(title, "title"))); ++ } ++ ++ /** ++ * Sets the subtitle to the given text. ++ * ++ * @param subtitle the title text ++ * @return this builder instance ++ */ ++ public Builder subtitle(BaseComponent subtitle) { ++ return this.subtitle(subtitle == null ? null : new BaseComponent[]{subtitle}); ++ } ++ ++ /** ++ * Sets the subtitle to the given text. ++ * ++ * @param subtitle the title text ++ * @return this builder instance ++ */ ++ public Builder subtitle(BaseComponent[] subtitle) { ++ this.subtitle = subtitle; ++ return this; ++ } ++ ++ /** ++ * Sets the subtitle to the given text. ++ *

++ *

It is recommended to the {@link BaseComponent} methods.

++ * ++ * @param subtitle the title text ++ * @return this builder instance ++ */ ++ public Builder subtitle(String subtitle) { ++ return this.subtitle(subtitle == null ? null : TextComponent.fromLegacyText(subtitle)); ++ } ++ ++ /** ++ * Sets the number of ticks for the title to fade in ++ * ++ * @param fadeIn the number of ticks to fade in ++ * @return this builder instance ++ * @throws IllegalArgumentException if it is negative ++ */ ++ public Builder fadeIn(int fadeIn) { ++ checkArgument(fadeIn >= 0, "Negative fadeIn: %s", fadeIn); ++ this.fadeIn = fadeIn; ++ return this; ++ } ++ ++ ++ /** ++ * Sets the number of ticks for the title to stay. ++ * ++ * @param stay the number of ticks to stay ++ * @return this builder instance ++ * @throws IllegalArgumentException if it is negative ++ */ ++ public Builder stay(int stay) { ++ checkArgument(stay >= 0, "Negative stay: %s", stay); ++ this.stay = stay; ++ return this; ++ } ++ ++ /** ++ * Sets the number of ticks for the title to fade out. ++ * ++ * @param fadeOut the number of ticks to fade out ++ * @return this builder instance ++ * @throws IllegalArgumentException if it is negative ++ */ ++ public Builder fadeOut(int fadeOut) { ++ checkArgument(fadeOut >= 0, "Negative fadeOut: %s", fadeOut); ++ this.fadeOut = fadeOut; ++ return this; ++ } ++ ++ /** ++ * Create a title based on the values in the builder. ++ * ++ * @return a title from the values in this builder ++ * @throws IllegalStateException if title isn't specified ++ */ ++ public Title build() { ++ checkState(title != null, "Title not specified"); ++ return new Title(this.title, this.subtitle, this.fadeIn, this.stay, this.fadeOut); ++ } ++ } ++} +\ No newline at end of file -- 2.7.1 diff --git a/Spigot-Server-Patches/0094-Player-Tab-List-and-Title-APIs.patch b/Spigot-Server-Patches/0094-Player-Tab-List-and-Title-APIs.patch index c2a282b..adc33af 100644 --- a/Spigot-Server-Patches/0094-Player-Tab-List-and-Title-APIs.patch +++ b/Spigot-Server-Patches/0094-Player-Tab-List-and-Title-APIs.patch @@ -1,11 +1,11 @@ -From c27a95f1caa97ff1b026429367c16abd20e46ed2 Mon Sep 17 00:00:00 2001 -From: Jedediah Smith +From 88944a9edb0263524b98a1f1731831a360de0bd9 Mon Sep 17 00:00:00 2001 +From: Techcable Date: Tue, 16 Feb 2016 19:45:55 -0600 Subject: [PATCH] Player Tab List and Title APIs diff --git a/src/main/java/net/minecraft/server/PacketPlayOutPlayerListHeaderFooter.java b/src/main/java/net/minecraft/server/PacketPlayOutPlayerListHeaderFooter.java -index 1606d6d..89a5056 100644 +index 1606d6d..795e70a 100644 --- a/src/main/java/net/minecraft/server/PacketPlayOutPlayerListHeaderFooter.java +++ b/src/main/java/net/minecraft/server/PacketPlayOutPlayerListHeaderFooter.java @@ -4,6 +4,8 @@ import java.io.IOException; @@ -17,7 +17,7 @@ index 1606d6d..89a5056 100644 private IChatBaseComponent a; private IChatBaseComponent b; -@@ -19,15 +21,22 @@ public class PacketPlayOutPlayerListHeaderFooter implements Packet { @@ -84,22 +88,35 @@ index 2711298..071215e 100644 } if (this.a == EnumTitleAction.TIMES) { -@@ -60,10 +78,6 @@ public class PacketPlayOutTitle implements Packet { +@@ -60,9 +78,13 @@ public class PacketPlayOutTitle implements Packet { packetlistenerplayout.a(this); } -- public void a(PacketListener packetlistener) { -- this.a((PacketListenerPlayOut) packetlistener); -- } -- ++ // PaperSpigot start - fix compile error ++ /* + public void a(PacketListener packetlistener) { + this.a((PacketListenerPlayOut) packetlistener); + } ++ */ ++ // PaperSpigot end + public static enum EnumTitleAction { - TITLE, SUBTITLE, TIMES, CLEAR, RESET; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index dba0520..cabef35 100644 +index dba0520..3075076 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -176,6 +176,65 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -64,6 +64,9 @@ import org.bukkit.metadata.MetadataValue; + import org.bukkit.plugin.Plugin; + import org.bukkit.plugin.messaging.StandardMessenger; + import org.bukkit.scoreboard.Scoreboard; ++// PaperSpigot start ++import org.github.paperspigot.Title; ++// PaperSpigot end + + @DelegateDeserialization(CraftOfflinePlayer.class) + public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -176,6 +179,83 @@ public class CraftPlayer extends CraftHumanEntity implements Player { packet.components = components; getHandle().playerConnection.sendPacket(packet); } @@ -159,6 +176,24 @@ index dba0520..cabef35 100644 + } + + @Override ++ public void sendTitle(Title title) { ++ Preconditions.checkNotNull(title, "Title is null"); ++ setTitleTimes(title.getFadeIn(), title.getStay(), title.getFadeOut()); ++ setSubtitle(title.getSubtitle() == null ? new BaseComponent[0] : title.getSubtitle()); ++ showTitle(title.getTitle()); ++ } ++ ++ @Override ++ public void updateTitle(Title title) { ++ Preconditions.checkNotNull(title, "Title is null"); ++ setTitleTimes(title.getFadeIn(), title.getStay(), title.getFadeOut()); ++ if (title.getSubtitle() != null) { ++ setSubtitle(title.getSubtitle()); ++ } ++ showTitle(title.getTitle()); ++ } ++ ++ @Override + public void hideTitle() { + getHandle().playerConnection.sendPacket(new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.CLEAR, (BaseComponent[]) null, 0, 0, 0)); + }